diff --git a/.bumpversion.cfg b/.bumpversion.cfg
index 8403ec135..035c1e0aa 100644
--- a/.bumpversion.cfg
+++ b/.bumpversion.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.11.4
+current_version = 0.11.5rc1
 commit = True
 tag = True
 parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)((?P<release>[a-z]+)(?P<candidate>\d+))?
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1a7f237d2..253d97ad0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,8 +16,10 @@ Web UI version numbers should always match the corresponding version of LBRY App
   *
 
 ### Fixed
-  *
-  *
+  * Eliminated instance of costs being double fetched
+  * Fixed issue preventing file re-download
+  * Fixed race condition that could prevent file playbac
+  * Fixed issue with batch actions and thunk
 
 ### Deprecated
   *
diff --git a/app/package.json b/app/package.json
index a3c2e86fd..d33d9adca 100644
--- a/app/package.json
+++ b/app/package.json
@@ -1,6 +1,6 @@
 {
   "name": "LBRY",
-  "version": "0.11.4",
+  "version": "0.11.5rc1",
   "main": "main.js",
   "description": "LBRY is a fully decentralized, open-source protocol facilitating the discovery, access, and (sometimes) purchase of data.",
   "author": {
diff --git a/ui/js/component/fileActions/index.js b/ui/js/component/fileActions/index.js
index a570cd413..e9dc10705 100644
--- a/ui/js/component/fileActions/index.js
+++ b/ui/js/component/fileActions/index.js
@@ -16,6 +16,9 @@ import {
 import {
   selectCurrentModal,
 } from 'selectors/app'
+import {
+  makeSelectCostInfoForUri,
+} from 'selectors/cost_info'
 import {
   doCloseModal,
   doOpenModal,
@@ -39,6 +42,7 @@ const makeSelect = () => {
   const selectFileInfoForUri = makeSelectFileInfoForUri()
   const selectIsAvailableForUri = makeSelectIsAvailableForUri()
   const selectDownloadingForUri = makeSelectDownloadingForUri()
+  const selectCostInfoForUri = makeSelectCostInfoForUri()
 
   const select = (state, props) => ({
     fileInfo: selectFileInfoForUri(state, props),
@@ -46,6 +50,7 @@ const makeSelect = () => {
     platform: selectPlatform(state),
     modal: selectCurrentModal(state),
     downloading: selectDownloadingForUri(state, props),
+    costInfo: selectCostInfoForUri(state, props),
   })
 
   return select
@@ -62,7 +67,7 @@ const perform = (dispatch) => ({
   },
   openModal: (modal) => dispatch(doOpenModal(modal)),
   startDownload: (uri) => dispatch(doPurchaseUri(uri)),
-  loadVideo: (uri) => dispatch(doLoadVideo(uri))
+  loadVideo: (uri) => dispatch(doLoadVideo(uri)),
 })
 
 export default connect(makeSelect, perform)(FileActions)
\ No newline at end of file
diff --git a/ui/js/component/fileActions/view.jsx b/ui/js/component/fileActions/view.jsx
index f72893df1..686dfd98f 100644
--- a/ui/js/component/fileActions/view.jsx
+++ b/ui/js/component/fileActions/view.jsx
@@ -62,6 +62,7 @@ class FileActions extends React.Component {
       openModal,
       closeModal,
       startDownload,
+      costInfo,
     } = this.props
 
     const deleteChecked = this.state.deleteChecked,
@@ -99,8 +100,11 @@ class FileActions extends React.Component {
       </div>
 
     } else if (fileInfo === null && !downloading) {
-
-      content = <Link button="text" label={__("Download")} icon="icon-download" onClick={() => { startDownload(uri) } } />;
+      if (!costInfo) {
+        content = <BusyMessage message="Fetching cost info" />
+      } else {
+        content = <Link button="text" label="Download" icon="icon-download" onClick={() => { startDownload(uri) } } />;
+      }
 
     } else if (fileInfo && fileInfo.download_path) {
       content  = <Link label={__("Open")} button="text" icon="icon-folder-open" onClick={() => openInShell(fileInfo)} />;
diff --git a/ui/js/component/filePrice/index.js b/ui/js/component/filePrice/index.js
index 726ceb3ee..65e870a58 100644
--- a/ui/js/component/filePrice/index.js
+++ b/ui/js/component/filePrice/index.js
@@ -7,14 +7,17 @@ import {
 } from 'actions/cost_info'
 import {
   makeSelectCostInfoForUri,
+  makeSelectFetchingCostInfoForUri,
 } from 'selectors/cost_info'
 import FilePrice from './view'
 
 const makeSelect = () => {
   const selectCostInfoForUri = makeSelectCostInfoForUri()
+  const selectFetchingCostInfoForUri = makeSelectFetchingCostInfoForUri()
 
   const select = (state, props) => ({
     costInfo: selectCostInfoForUri(state, props),
+    fetching: selectFetchingCostInfoForUri(state, props),
   })
 
   return select
diff --git a/ui/js/component/filePrice/view.jsx b/ui/js/component/filePrice/view.jsx
index 4edc3a3e7..2a0872492 100644
--- a/ui/js/component/filePrice/view.jsx
+++ b/ui/js/component/filePrice/view.jsx
@@ -16,10 +16,11 @@ class FilePrice extends React.Component{
     const {
       costInfo,
       fetchCostInfo,
-      uri
+      uri,
+      fetching,
     } = props
 
-    if (costInfo === undefined) {
+    if (costInfo === undefined && !fetching) {
       fetchCostInfo(uri)
     }
   }
diff --git a/ui/js/component/video/view.jsx b/ui/js/component/video/view.jsx
index 431c2ee82..8f0c99720 100644
--- a/ui/js/component/video/view.jsx
+++ b/ui/js/component/video/view.jsx
@@ -101,7 +101,9 @@ class Video extends React.Component {
 
     let loadStatusMessage = ''
 
-    if (isLoading) {
+    if(fileInfo && fileInfo.completed && !fileInfo.written_bytes) {
+      loadStatusMessage = "It looks like you deleted or moved this file. We're rebuilding it now. It will only take a few seconds."
+    } else if (isLoading) {
       loadStatusMessage = __("Requesting stream... it may sit here for like 15-20 seconds in a really awkward way... we're working on it")
     } else if (isDownloading) {
       loadStatusMessage = __("Downloading stream... not long left now!")
diff --git a/ui/js/main.js b/ui/js/main.js
index e50f6f6c0..957921563 100644
--- a/ui/js/main.js
+++ b/ui/js/main.js
@@ -12,7 +12,6 @@ import lighthouse from './lighthouse.js';
 import App from 'component/app/index.js';
 import SnackBar from 'component/snackBar';
 import { Provider } from 'react-redux';
-import batchActions from 'util/batchActions'
 import store from 'store.js';
 import SplashScreen from 'component/splash.js';
 import {AuthOverlay} from 'component/auth.js';
@@ -86,12 +85,10 @@ var init = function() {
     window.sessionStorage.setItem('loaded', 'y'); //once we've made it here once per session, we don't need to show splash again
     const actions = []
 
-    actions.push(doDaemonReady())
-    actions.push(doChangePath('/discover'))
-    actions.push(doFetchDaemonSettings())
-    actions.push(doFileList())
-
-    app.store.dispatch(batchActions(actions))
+    app.store.dispatch(doDaemonReady())
+    app.store.dispatch(doChangePath('/discover'))
+    app.store.dispatch(doFetchDaemonSettings())
+    app.store.dispatch(doFileList())
 
     ReactDOM.render(<Provider store={store}><div>{ lbryio.enabled ? <AuthOverlay/> : '' }<App /><SnackBar /></div></Provider>, canvas)
   }
diff --git a/ui/js/selectors/cost_info.js b/ui/js/selectors/cost_info.js
index 242ec6b0d..84bbb5f02 100644
--- a/ui/js/selectors/cost_info.js
+++ b/ui/js/selectors/cost_info.js
@@ -17,3 +17,19 @@ export const makeSelectCostInfoForUri = () => {
     (costInfo) => costInfo
   )
 }
+
+export const selectFetchingCostInfo = createSelector(
+  _selectState,
+  (state) => state.fetching || {}
+)
+
+const selectFetchingCostInfoForUri = (state, props) => {
+  return selectFetchingCostInfo(state)[props.uri]
+}
+
+export const makeSelectFetchingCostInfoForUri = () => {
+  return createSelector(
+    selectFetchingCostInfoForUri,
+    (fetching) => !!fetching
+  )
+}
diff --git a/ui/package.json b/ui/package.json
index 7ee6d6272..18519d144 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -1,6 +1,6 @@
 {
   "name": "lbry-web-ui",
-  "version": "0.11.4",
+  "version": "0.11.5rc1",
   "description": "LBRY UI",
   "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1",