diff --git a/assets/src/components/Editor.vue b/assets/src/components/Editor.vue
index dd1b2a09..144605c5 100644
--- a/assets/src/components/Editor.vue
+++ b/assets/src/components/Editor.vue
@@ -38,6 +38,10 @@ export default {
     document.getElementById('save-button').removeEventListener('click', this.save)
   },
   mounted: function () {
+    if (this.req.content === undefined || this.req.content === null) {
+      this.req.content = ''
+    }
+
     // Set up the main content editor.
     this.content = CodeMirror(document.getElementById('editor'), {
       value: this.req.content,
diff --git a/assets/src/components/Files.vue b/assets/src/components/Files.vue
index 317b0a8b..b5fcbc94 100644
--- a/assets/src/components/Files.vue
+++ b/assets/src/components/Files.vue
@@ -70,7 +70,6 @@ export default {
   },
   created () {
     this.fetchData()
-    console.log('created')
   },
   watch: {
     '$route': 'fetchData',
@@ -96,16 +95,16 @@ export default {
       if (url[0] !== '/') url = '/' + url
 
       api.fetch(url)
-      .then((trueURL) => {
-        if (!url.endsWith('/') && trueURL.endsWith('/')) {
-          console.log(trueURL)
+      .then((req) => {
+        if (!url.endsWith('/') && req.url.endsWith('/')) {
           window.history.replaceState(window.history.state, document.title, window.location.pathname + '/')
         }
 
+        this.$store.commit('updateRequest', req)
+        document.title = req.name
         this.setLoading(false)
       })
       .catch(error => {
-        console.log(error)
         this.error = error
         this.setLoading(false)
       })
@@ -130,9 +129,13 @@ export default {
 
       // Del!
       if (event.keyCode === 46) {
-        if (this.showDeleteButton && this.req.kind !== 'editor') {
-          this.$store.commit('showHover', 'delete')
-        }
+        if (this.req.kind === 'editor' ||
+          this.$route.name !== 'Files' ||
+          this.loading ||
+          !this.user.allowEdit ||
+          (this.req.kind === 'listing' && this.selectedCount === 0)) return
+
+        this.$store.commit('showHover', 'delete')
       }
 
       // F1!
@@ -143,9 +146,14 @@ export default {
 
       // F2!
       if (event.keyCode === 113) {
-        if (this.showRenameButton) {
-          this.$store.commit('showHover', 'rename')
-        }
+        if (this.req.kind === 'editor' ||
+          this.$route.name !== 'Files' ||
+          this.loading ||
+          !this.user.allowEdit ||
+          (this.req.kind === 'listing' && this.selectedCount === 0) ||
+          (this.req.kind === 'listing' && this.selectedCount > 1)) return
+
+        this.$store.commit('showHover', 'rename')
       }
 
       // CTRL + S
diff --git a/assets/src/components/Header.vue b/assets/src/components/Header.vue
index efd8f3a0..aad20f71 100644
--- a/assets/src/components/Header.vue
+++ b/assets/src/components/Header.vue
@@ -69,7 +69,7 @@ export default {
       return this.req.kind === 'listing' && !this.loading && this.$route.name === 'Files'
     },
     showSaveButton () {
-      return (this.req.kind === 'editor' && !this.loading) || this.$route.name === 'User'
+      return (this.req.kind === 'editor' && !this.loading)
     },
     showSwitchButton () {
       return this.req.kind === 'listing' && this.$route.name === 'Files' && !this.loading
diff --git a/assets/src/components/prompts/Move.vue b/assets/src/components/prompts/Move.vue
index 6db0005a..1c543d8c 100644
--- a/assets/src/components/prompts/Move.vue
+++ b/assets/src/components/prompts/Move.vue
@@ -4,7 +4,7 @@
     
Choose new house for your file(s)/folder(s):
 
     
-      - {{ item.name }}
 
+      - {{ item.name }}
 
     
 
     Currently navigating on: {{ current }}.
@@ -27,45 +27,36 @@ export default {
   data: function () {
     return {
       items: [],
-      current: window.location.pathname
+      current: window.location.pathname,
+      moveTo: null
     }
   },
   computed: mapState(['req', 'selected', 'baseURL']),
-  mounted: function () {
-    if (this.$route.path !== '/files/') {
-      this.items.push({
-        name: '..',
-        url: url.removeLastDir(this.$route.path) + '/'
-      })
-    }
-
+  mounted () {
+    // If we're showing this on a listing,
+    // we can use the current request object
+    // to fill the move options.
     if (this.req.kind === 'listing') {
-      for (let item of this.req.items) {
-        if (!item.isDir) continue
-
-        this.items.push({
-          name: item.name,
-          url: item.url
-        })
-      }
-
+      this.fillOptions(this.req)
       return
     }
+
+    // Otherwise, we must be on a preview or editor
+    // so we fetch the data from the previous directory.
+    api.fetch(url.removeLastDir(this.$rute.path))
+      .then(this.fillOptions)
+      .catch(this.showError)
   },
   methods: {
     move: function (event) {
       event.preventDefault()
 
-      let el = event.currentTarget
+      // Set the destination and create the promises array.
       let promises = []
-      let dest = this.current
+      let dest = (this.moveTo === null) ? this.current : this.moveTo
       buttons.loading('move')
 
-      let selected = el.querySelector('li[aria-selected=true]')
-      if (selected !== null) {
-        dest = selected.dataset.url
-      }
-
+      // Create a new promise for each file.
       for (let item of this.selected) {
         let from = this.req.items[item].url
         let to = dest + '/' + encodeURIComponent(this.req.items[item].name)
@@ -74,75 +65,69 @@ export default {
         promises.push(api.move(from, to))
       }
 
-      this.$store.commit('showMove', false)
-
+      // Execute the promises.
       Promise.all(promises)
         .then(() => {
           buttons.done('move')
-          this.$router.push({page: dest})
+          this.$router.push({ path: dest })
         })
         .catch(error => {
           buttons.done('move')
           this.$store.commit('showError', error)
         })
     },
-    next: function (event) {
-      let uri = event.currentTarget.dataset.url
-      this.json(uri)
-        .then((data) => {
-          this.current = uri
-          this.items = []
+    fillOptions (req) {
+      // Sets the current path and resets
+      // the current items.
+      this.current = req.url
+      this.items = []
 
-          if (uri !== this.baseURL + '/') {
-            this.items.push({
-              name: '..',
-              url: url.removeLastDir(uri) + '/'
-            })
-          }
-
-          let req = JSON.parse(data)
-          for (let item of req.items) {
-            if (!item.isDir) continue
-
-            this.items.push({
-              name: item.name,
-              url: item.uri
-            })
-          }
+      // If the path isn't the root path,
+      // show a button to navigate to the previous
+      // directory.
+      if (req.url !== '/files/') {
+        this.items.push({
+          name: '..',
+          url: url.removeLastDir(req.url) + '/'
         })
-        .catch(e => console.log(e))
+      }
+
+      // If this folder is empty, finish here.
+      if (req.items === null) return
+
+      // Otherwise we add every directory to the
+      // move options.
+      for (let item of req.items) {
+        if (!item.isDir) continue
+
+        this.items.push({
+          name: item.name,
+          url: item.url
+        })
+      }
     },
-    json: function (url) {
-      return new Promise((resolve, reject) => {
-        let request = new XMLHttpRequest()
-        request.open('GET', url)
-        request.setRequestHeader('Accept', 'application/json')
-        request.onload = () => {
-          if (request.status === 200) {
-            resolve(request.responseText)
-          } else {
-            reject(request.statusText)
-          }
-        }
-        request.onerror = () => reject(request.statusText)
-        request.send()
-      })
+    showError (error) {
+      this.$store.commit('showError', error)
+    },
+    next: function (event) {
+      // Retrieves the URL of the directory the user
+      // just clicked in and fill the options with its
+      // content.
+      let uri = event.currentTarget.dataset.url
+
+      api.fetch(uri)
+        .then(this.fillOptions)
+        .catch(this.showError)
     },
     select: function (event) {
-      let el = event.currentTarget
-
-      if (el.getAttribute('aria-selected') === 'true') {
-        el.setAttribute('aria-selected', false)
+      // If the element is already selected, unselect it.
+      if (this.moveTo === event.currentTarget.dataset.url) {
+        this.moveTo = null
         return
       }
 
-      let el2 = this.$el.querySelector('li[aria-selected=true]')
-      if (el2) {
-        el2.setAttribute('aria-selected', false)
-      }
-
-      el.setAttribute('aria-selected', true)
-      return
+      // Otherwise select the element.
+      this.moveTo = event.currentTarget.dataset.url
     }
   }
 }
diff --git a/assets/src/utils/api.js b/assets/src/utils/api.js
index f7132f3f..a3357e85 100644
--- a/assets/src/utils/api.js
+++ b/assets/src/utils/api.js
@@ -21,13 +21,10 @@ function fetch (url) {
     request.onload = () => {
       switch (request.status) {
         case 200:
-          let req = JSON.parse(request.responseText)
-          store.commit('updateRequest', req)
-          document.title = req.name
-          resolve(req.url)
+          resolve(JSON.parse(request.responseText))
           break
         default:
-          reject(request.status)
+          reject(request.responseText)
           break
       }
     }