diff --git a/Cargo.toml b/Cargo.toml
index 3fb711a3d01cc27e9358c79d0ddf616a85a73da9..215f8ccc649894008538b5fcb93fcc11eeb0e50b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -2,7 +2,7 @@
 name = "redoxfs"
 description = "The Redox Filesystem"
 repository = "https://gitlab.redox-os.org/redox-os/redoxfs"
-version = "0.4.0"
+version = "0.4.1"
 license-file = "LICENSE"
 readme = "README.md"
 authors = ["Jeremy Soller <jackpot51@gmail.com>"]
diff --git a/src/mount/fuse.rs b/src/mount/fuse.rs
index b7ec66ae5fa06ce7d7807e79f94e9dc44809bee9..3ae71fdac6bd4606db9d6eaac155b6f97f933b95 100644
--- a/src/mount/fuse.rs
+++ b/src/mount/fuse.rs
@@ -493,4 +493,38 @@ impl<D: Disk> Filesystem for Fuse<D> {
             }
         }
     }
+
+    fn rename(&mut self, _req: &Request, orig_parent: u64, name: &OsStr, new_parent: u64, new_name: &OsStr, reply: ReplyEmpty) {
+        let rename_inner = |fs: &mut filesystem::FileSystem<D>| -> syscall::Result<()> {
+            let mut orig = fs.find_node(name.to_str().unwrap(), orig_parent)?;
+
+            if new_parent != orig_parent {
+                fs.remove_blocks(orig.0, 1, orig_parent)?;
+            }
+
+            if let Ok(node) = fs.find_node(new_name.to_str().unwrap(), new_parent) {
+                if node.0 != orig.0 {
+                    fs.node_set_len(node.0, 0)?;
+                    fs.remove_blocks(node.0, 1, new_parent)?;
+                    fs.write_at(node.0, &Node::default())?;
+                    fs.deallocate(node.0, BLOCK_SIZE)?;
+                }
+            }
+
+            orig.1.set_name(&new_name.to_str().unwrap())?;
+            orig.1.parent = new_parent;
+            fs.write_at(orig.0, &orig.1)?;
+
+            if new_parent != orig_parent {
+                fs.insert_blocks(orig.0, BLOCK_SIZE, new_parent)?;
+            }
+
+            Ok(())
+        };
+
+        match rename_inner(&mut self.fs) {
+            Ok(()) => reply.ok(),
+            Err(err) => reply.error(err.errno as i32),
+        }
+    }
 }
diff --git a/src/mount/redox/scheme.rs b/src/mount/redox/scheme.rs
index d12398cbdb520f52559b3e235de9554169e98a57..1ea47d257ea473969d53a3e8cf67cd8a6dea5b2a 100644
--- a/src/mount/redox/scheme.rs
+++ b/src/mount/redox/scheme.rs
@@ -632,15 +632,10 @@ impl<D: Disk> Scheme for FileScheme<D> {
 
                 let orig_parent = orig.1.parent;
 
-                orig.1.set_name(&last_part)?;
-                orig.1.parent = parent.0;
-
                 if parent.0 != orig_parent {
                     fs.remove_blocks(orig.0, 1, orig_parent)?;
                 }
 
-                fs.write_at(orig.0, &orig.1)?;
-
                 if let Some(node) = node_opt {
                     if node.0 != orig.0 {
                         fs.node_set_len(node.0, 0)?;
@@ -650,6 +645,10 @@ impl<D: Disk> Scheme for FileScheme<D> {
                     }
                 }
 
+                orig.1.set_name(&last_part)?;
+                orig.1.parent = parent.0;
+                fs.write_at(orig.0, &orig.1)?;
+
                 if parent.0 != orig_parent {
                     fs.insert_blocks(orig.0, BLOCK_SIZE, parent.0)?;
                 }