diff --git a/.circleci/config.yml b/.circleci/config.yml
index 02db88d0db8d4835a4ac3dae183d29ff3e207d49..4e82a0d88ee1ed884742ab40733bacd41c2ec10a 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -198,13 +198,14 @@ workflows:
                 - master
                 - develop
                 - /^hotfix\/.*/
-      # - deploy-gh-pages:
-      #     requires:
-      #       - lint
-      #       - unit
-      #       - integration
-      #       - build
-      #     filters:
-      #       branches:
-      #         ignore:
-      #           - ^dependabot/.*/
+      - deploy-gh-pages:
+          requires:
+            - lint
+            - unit
+            - integration
+            - build
+          filters:
+            branches:
+              only: /^(?!pull\/).*$/ # don't deploy to gh pages on PRs.
+              ignore:
+                - ^dependabot/.*/
diff --git a/.travis.yml b/.travis.yml
index f8c867727d9b938c44fde6d91883afc2964b4952..1c7e8de238ceb9ac2943f65b74fd6bab680aa52d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -51,13 +51,14 @@ deploy:
     condition: $TRAVIS_EVENT_TYPE != cron
   skip_cleanup: true
   script: if npm info scratch-gui | grep -q $RELEASE_VERSION; then git tag $RELEASE_VERSION && git push https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git $RELEASE_VERSION; fi
-- provider: script
-  on:
-    all_branches: true
-    condition: $TRAVIS_EVENT_TYPE != cron && ! $TRAVIS_BRANCH =~ ^dependabot/
-    tags: false # Don't push tags to gh-pages
-  skip_cleanup: true
-  script: npm run deploy -- -x -e $TRAVIS_BRANCH -r https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git
+# Skip deploy to gh pages. Circle will do it instead.
+# - provider: script
+#   on:
+#     all_branches: true
+#     condition: $TRAVIS_EVENT_TYPE != cron && ! $TRAVIS_BRANCH =~ ^dependabot/
+#     tags: false # Don't push tags to gh-pages
+#   skip_cleanup: true
+#   script: npm run deploy -- -x -e $TRAVIS_BRANCH -r https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git
 - provider: script
   on:
     branch: develop
diff --git a/package-lock.json b/package-lock.json
index 8e736e4633d5c2a4d43b393bdaa55721d1ba54cb..135134ecf0eb9e3a1aeb5b5b6e236640c26b1bf4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13985,9 +13985,9 @@
       }
     },
     "scratch-paint": {
-      "version": "0.2.0-prerelease.20200813210710",
-      "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-0.2.0-prerelease.20200813210710.tgz",
-      "integrity": "sha512-zvQIp3P0P6vN68z6h5aQKvUYXYX+f6vM3Wyw1wrieMXwQ3G7VKRGteM5q43VzNbpniN3NfRcYkQGw7385+jA7Q==",
+      "version": "0.2.0-prerelease.20200831213104",
+      "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-0.2.0-prerelease.20200831213104.tgz",
+      "integrity": "sha512-SIZ6+POlAd5M3WtVHWJ+s8fpLTan/JXx9LmBvWZqaASknyWQyJxOPPEU7DNnpWNqJ/NfaWxgoAw48lQmKupa+g==",
       "requires": {
         "@scratch/paper": "0.11.20200728195508",
         "classnames": "2.2.5",
@@ -14088,9 +14088,9 @@
       }
     },
     "scratch-render": {
-      "version": "0.1.0-prerelease.20200826001335",
-      "resolved": "https://registry.npmjs.org/scratch-render/-/scratch-render-0.1.0-prerelease.20200826001335.tgz",
-      "integrity": "sha512-UeHqSeHfHlRn7YttbxfagJtSC8g8pLQLZ8dp7Ox1HdfFBiMUn/mRzH3Y/YTv+znA7fPH4MoNAuIotzVjkoYlyg==",
+      "version": "0.1.0-prerelease.20200827214414",
+      "resolved": "https://registry.npmjs.org/scratch-render/-/scratch-render-0.1.0-prerelease.20200827214414.tgz",
+      "integrity": "sha512-8J4+70+0Rdk4Cff7AZwje/ilkqKqML9rphT2JYOJ6wUE+YgNAS3h4DOxpmAaXK+O7Ldkbb30CW1rL4b52aHT8Q==",
       "requires": {
         "grapheme-breaker": "0.3.2",
         "hull.js": "0.2.10",
diff --git a/package.json b/package.json
index 83397e8d361aa19a840f0bb2f9eda44edf3d6a4e..24c565f77bc1b1e6b9bea6a2243653a09f5dce8f 100644
--- a/package.json
+++ b/package.json
@@ -74,8 +74,8 @@
     "scratch-audio": "0.1.0-prerelease.20200528195344",
     "scratch-blocks": "0.1.0-prerelease.20200818140148",
     "scratch-l10n": "3.10.20200826030836",
-    "scratch-paint": "0.2.0-prerelease.20200813210710",
-    "scratch-render": "0.1.0-prerelease.20200826001335",
+    "scratch-paint": "0.2.0-prerelease.20200831213104",
+    "scratch-render": "0.1.0-prerelease.20200827214414",
     "scratch-storage": "1.3.3",
     "scratch-svg-renderer": "0.2.0-prerelease.20200610220938",
     "scratch-vm": "0.2.0-prerelease.20200820211625",
diff --git a/src/components/drag-layer/drag-layer.css b/src/components/drag-layer/drag-layer.css
index af6ae5dac2cb920bebbc6ee83351894e60826aa8..926c0ee9fc694ef3b7e09a1420cb379664681bf8 100644
--- a/src/components/drag-layer/drag-layer.css
+++ b/src/components/drag-layer/drag-layer.css
@@ -9,7 +9,8 @@
     left: 0;
     top: 0;
     width: 100%;
-    height: 100%
+    height: 100%;
+    direction: ltr;
 }
 
 .image-wrapper {
diff --git a/src/containers/costume-tab.jsx b/src/containers/costume-tab.jsx
index 6be2cf26849361758013e13d98a800e9a7b8ab9a..c201efb8f982382c505e95347be33b56626d6f60 100644
--- a/src/containers/costume-tab.jsx
+++ b/src/containers/costume-tab.jsx
@@ -158,14 +158,17 @@ class CostumeTab extends React.Component {
         const blob = new Blob([item.asset.data], {type: item.asset.assetType.contentType});
         downloadBlob(`${item.name}.${item.asset.dataFormat}`, blob);
     }
-    handleNewCostume (costume, fromCostumeLibrary) {
+    handleNewCostume (costume, fromCostumeLibrary, targetId) {
         const costumes = Array.isArray(costume) ? costume : [costume];
 
         return Promise.all(costumes.map(c => {
             if (fromCostumeLibrary) {
                 return this.props.vm.addCostumeFromLibrary(c.md5, c);
             }
-            return this.props.vm.addCostume(c.md5, c);
+            // If targetId is falsy, VM should default it to editingTarget.id
+            // However, targetId should be provided to prevent #5876,
+            // if making new costume takes a while
+            return this.props.vm.addCostume(c.md5, c, targetId);
         }));
     }
     handleNewBlankCostume () {
@@ -204,13 +207,14 @@ class CostumeTab extends React.Component {
     }
     handleCostumeUpload (e) {
         const storage = this.props.vm.runtime.storage;
+        const targetId = this.props.vm.editingTarget.id;
         this.props.onShowImporting();
         handleFileUpload(e.target, (buffer, fileType, fileName, fileIndex, fileCount) => {
             costumeUpload(buffer, fileType, storage, vmCostumes => {
                 vmCostumes.forEach((costume, i) => {
                     costume.name = `${fileName}${i ? i + 1 : ''}`;
                 });
-                this.handleNewCostume(vmCostumes).then(() => {
+                this.handleNewCostume(vmCostumes, false, targetId).then(() => {
                     if (fileIndex === fileCount - 1) {
                         this.props.onCloseImporting();
                     }
@@ -220,9 +224,10 @@ class CostumeTab extends React.Component {
     }
     handleCameraBuffer (buffer) {
         const storage = this.props.vm.runtime.storage;
+        const targetId = this.props.vm.editingTarget.id;
         costumeUpload(buffer, 'image/png', storage, vmCostumes => {
             vmCostumes[0].name = this.props.intl.formatMessage(messages.costume, {index: 1});
-            this.handleNewCostume(vmCostumes);
+            this.handleNewCostume(vmCostumes, false, targetId);
         });
     }
     handleFileUploadClick () {
diff --git a/src/containers/sound-tab.jsx b/src/containers/sound-tab.jsx
index 984975e0d3136c132e9714e3f99607bb08e272ca..8d42e8e910cd0cdf78b9b04567706c3e78235b38 100644
--- a/src/containers/sound-tab.jsx
+++ b/src/containers/sound-tab.jsx
@@ -130,11 +130,12 @@ class SoundTab extends React.Component {
 
     handleSoundUpload (e) {
         const storage = this.props.vm.runtime.storage;
+        const targetId = this.props.vm.editingTarget.id;
         this.props.onShowImporting();
         handleFileUpload(e.target, (buffer, fileType, fileName, fileIndex, fileCount) => {
             soundUpload(buffer, fileType, storage, newSound => {
                 newSound.name = fileName;
-                this.props.vm.addSound(newSound).then(() => {
+                this.props.vm.addSound(newSound, targetId).then(() => {
                     this.handleNewSound();
                     if (fileIndex === fileCount - 1) {
                         this.props.onCloseImporting();