diff --git a/src/context/memory.rs b/src/context/memory.rs
index 24dd53b0ef2bbf4cdb01e160c203a18e67403211..3dd8140e436feb7f18acd756e269c13a9fa859d5 100644
--- a/src/context/memory.rs
+++ b/src/context/memory.rs
@@ -226,7 +226,8 @@ impl AddrSpace {
             // Same here, we don't really care about errors when schemes respond to unmap events.
             // The caller wants the memory to be unmapped, period. When already unmapped, what
             // would we do with error codes anyway?
-            let _ = scheme.funmap(intersection.base.start_address().data(), intersection.count * PAGE_SIZE);
+            // FIXME
+            //let _ = scheme.funmap(intersection.base.start_address().data(), intersection.count * PAGE_SIZE);
 
             if let Ok(desc) = Arc::try_unwrap(file_ref.description) {
                 let _ = desc.into_inner().try_close();
@@ -664,7 +665,7 @@ impl Grant {
                 page_count: span.count,
                 mapped: true,
                 flags,
-                provider: Provider::FmapBorrowed { fmap }
+                provider: Provider::FmapBorrowed { fmap },
             }
         }
     }
diff --git a/src/scheme/memory.rs b/src/scheme/memory.rs
index ad5b4def6c1125028d086104481513d9f0579a1c..aa4d91a4eac94aca839a03a4265fde3ae8b4e7fc 100644
--- a/src/scheme/memory.rs
+++ b/src/scheme/memory.rs
@@ -129,10 +129,6 @@ impl Scheme for MemoryScheme {
         Ok(intended_handle as usize)
     }
 
-    fn fmap(&self, id: usize, map: &Map) -> Result<usize> {
-        self.kfmap(id, &AddrSpace::current()?, map, false)
-    }
-
     fn fcntl(&self, _id: usize, _cmd: usize, _arg: usize) -> Result<usize> {
         Ok(0)
     }
diff --git a/src/scheme/proc.rs b/src/scheme/proc.rs
index 6dbcf1111a708d80af3f9188decba4c4f64a3319..5dc12e32b1963b3fcae1759286862c9473a160fc 100644
--- a/src/scheme/proc.rs
+++ b/src/scheme/proc.rs
@@ -649,9 +649,6 @@ impl Scheme for ProcScheme {
         }
         Ok(0)
     }
-    fn fmap(&self, id: usize, map: &Map) -> Result<usize> {
-        self.kfmap(id, &AddrSpace::current()?, map, false)
-    }
 }
 impl KernelScheme for ProcScheme {
     fn as_addrspace(&self, number: usize) -> Result<Arc<RwLock<AddrSpace>>> {
diff --git a/src/scheme/user.rs b/src/scheme/user.rs
index 83247f42cf6021bbdc50c5722707956ef07c3b3c..e0227f4c17a83902fa6ffd4eab64da94eb3b678c 100644
--- a/src/scheme/user.rs
+++ b/src/scheme/user.rs
@@ -1,7 +1,7 @@
 use alloc::sync::{Arc, Weak};
 use alloc::boxed::Box;
 use alloc::collections::BTreeMap;
-use syscall::{SKMSG_FRETURNFD, CallerCtx};
+use syscall::{SKMSG_FRETURNFD, CallerCtx, SKMSG_PROVIDE_MMAP};
 use core::num::NonZeroUsize;
 use core::sync::atomic::{AtomicBool, Ordering};
 use core::{mem, usize};
@@ -359,6 +359,17 @@ impl UserInner {
 
                     self.done.send(packet.id, Response::Fd(desc));
                 }
+                SKMSG_PROVIDE_MMAP => {
+                    let offset = u64::from(packet.uid) | (u64::from(packet.gid) << 32);
+
+                    if offset % PAGE_SIZE as u64 != 0 {
+                        return Err(Error::new(EINVAL));
+                    }
+
+                    let page_count = packet.c;
+
+                    todo!("respond to SKMSG_PROVIDE_MMAP")
+                }
                 _ => return Err(Error::new(EINVAL)),
             }
         } else {
@@ -395,12 +406,10 @@ impl UserInner {
             return Err(Error::new(EINVAL));
         }
 
-        let mode = if map.flags.contains(MapFlags::MAP_PRIVATE) {
-            MmapMode::Cow
-        } else if map.flags.contains(MapFlags::MAP_SHARED) {
+        let mode = if map.flags.contains(MapFlags::MAP_SHARED) {
             MmapMode::Shared
         } else {
-            return Err(Error::new(EINVAL));
+            MmapMode::Cow
         };
 
         let (pid, desc) = {
@@ -430,11 +439,11 @@ impl UserInner {
             pid: pid.into(),
             a: KSMSG_MMAP_PREP,
             b: file,
-            c: map.offset,
+            c: map.flags.bits(),
             d: page_count,
             // The uid and gid can be obtained by the proc scheme anyway, if the pid is provided.
-            uid: map.flags.bits() as u32,
-            gid: (map.flags.bits() >> 32) as u32,
+            uid: map.offset as u32,
+            gid: (map.offset >> 32) as u32,
         })?;
 
         let _ = match response {
@@ -607,12 +616,7 @@ impl Scheme for UserScheme {
         inner.call(SYS_FEVENT, file, flags.bits(), 0).map(EventFlags::from_bits_truncate)
     }
 
-    fn fmap(&self, file: usize, map: &Map) -> Result<usize> {
-        let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?;
-
-        inner.fmap_inner(AddrSpace::current()?, file, map)
-    }
-
+    /*
     fn funmap(&self, grant_address: usize, size: usize) -> Result<usize> {
         let requested_span = PageSpan::validate_nonempty(VirtualAddress::new(grant_address), size).ok_or(Error::new(EINVAL))?;
 
@@ -655,6 +659,7 @@ impl Scheme for UserScheme {
             Err(Error::new(EINVAL))
         }
     }
+    */
 
     fn frename(&self, file: usize, path: &str, _uid: u32, _gid: u32) -> Result<usize> {
         let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?;
diff --git a/src/syscall/mod.rs b/src/syscall/mod.rs
index ed269bdfd833de4d986252c16555fc602f0d9bd0..8c731d238228060d891fd925fa855e1939a69e33 100644
--- a/src/syscall/mod.rs
+++ b/src/syscall/mod.rs
@@ -75,11 +75,12 @@ pub fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize, stack
                     SYS_ARG_SLICE => match a {
                         SYS_WRITE => file_op_generic(fd, |scheme, _, number| scheme.kwrite(number, UserSlice::ro(c, d)?)),
                         SYS_FMAP => {
+                            let addrspace = AddrSpace::current()?;
                             let map = unsafe { UserSlice::ro(c, d)?.read_exact::<Map>()? };
                             if b == !0 {
-                                MemoryScheme::fmap_anonymous(&AddrSpace::current()?, &map)
+                                MemoryScheme::fmap_anonymous(&addrspace, &map)
                             } else {
-                                file_op_generic(fd, |scheme, _, number| scheme.fmap(number, &map))
+                                file_op_generic(fd, |scheme, _, number| scheme.kfmap(number, &addrspace, &map, false))
                             }
                         },
                         // SYS_FMAP_OLD is ignored
@@ -179,7 +180,7 @@ pub fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize, stack
         let contexts = crate::context::contexts();
         if let Some(context_lock) = contexts.current() {
             let context = context_lock.read();
-            if false && context.name.contains("bootstrap") {
+            if context.name.contains("orbital") {
                 if a == SYS_CLOCK_GETTIME || a == SYS_YIELD {
                     false
                 } else if (a == SYS_WRITE || a == SYS_FSYNC) && (b == 1 || b == 2) {
diff --git a/syscall b/syscall
index eab01c8621e10fe8f0d8208a0a806f643919ad0e..6024e1e1fa0fdd9d31b1afbe034ebb0d84c1a98c 160000
--- a/syscall
+++ b/syscall
@@ -1 +1 @@
-Subproject commit eab01c8621e10fe8f0d8208a0a806f643919ad0e
+Subproject commit 6024e1e1fa0fdd9d31b1afbe034ebb0d84c1a98c