diff --git a/Cargo.lock b/Cargo.lock
index ac15184f71f54d46c88ff719d55b0d08c77c16cc..04bd17bdde15ece8ef6b465d86445f96f24e34c8 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -36,7 +36,7 @@ dependencies = [
 [[package]]
 name = "redox_syscall"
 version = "0.5.1"
-source = "git+https://gitlab.redox-os.org/4lDO2/syscall.git?branch=schemev2#495a0adbd8333fd21fae2d97129b094607878ba7"
+source = "git+https://gitlab.redox-os.org/4lDO2/syscall.git?branch=schemev2plus#35600d6c9c46a4d54ec17d80c9ff5d17ef79a052"
 dependencies = [
  "bitflags",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index fb1469ee5c31d51f61a152ce87da3b0fe04e5832..38e3adeed7879352f90b1cdfae30b0b4b430026e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -15,4 +15,4 @@ redox_syscall = "0.5"
 libredox = { version = "0.1.3", default-features = false, features = ["redox_syscall", "call"] }
 
 [patch.crates-io]
-redox_syscall = { git = "https://gitlab.redox-os.org/4lDO2/syscall.git", branch = "schemev2", features = ["std"] }
+redox_syscall = { git = "https://gitlab.redox-os.org/4lDO2/syscall.git", branch = "schemev2plus", features = ["std"] }
diff --git a/src/lib.rs b/src/lib.rs
index 3d8ce194432d93120f1aac70f581dd7efe30087c..5a71e12c50740667f2137b42666ef71188a60d08 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -314,11 +314,11 @@ impl CallRequest<V2> {
                         result: fd as u64,
                     }),
                 }
-                Opcode::Read => scheme.read(a, slice::from_raw_parts_mut(b as *mut u8, c)),
-                Opcode::Write => scheme.write(a, slice::from_raw_parts(b as *const u8, c)),
+                Opcode::Read => scheme.read(a, slice::from_raw_parts_mut(b as *mut u8, c), args[3], args[4] as u32),
+                Opcode::Write => scheme.write(a, slice::from_raw_parts(b as *const u8, c), args[3], args[4] as u32),
 
                 // TODO: 64-bit offset on 32-bit platforms
-                Opcode::Lseek => scheme.seek(a, b as isize, c).map(|o| o as usize),
+                Opcode::Fsize => scheme.fsize(a).map(|o| o as usize),
                 Opcode::Fchmod => scheme.fchmod(a, b as u16),
                 Opcode::Fchown => scheme.fchown(a, b as u32, c as u32),
                 Opcode::Fcntl => scheme.fcntl(a, b, c),
@@ -391,11 +391,11 @@ impl CallRequest<V2> {
                         result: fd as u64,
                     })),
                 }
-                Opcode::Read => scheme.read(a, slice::from_raw_parts_mut(b as *mut u8, c)).transpose()?,
-                Opcode::Write => scheme.write(a, slice::from_raw_parts(b as *const u8, c)).transpose()?,
+                Opcode::Read => scheme.read(a, slice::from_raw_parts_mut(b as *mut u8, c), args[3], args[4] as u32).transpose()?,
+                Opcode::Write => scheme.write(a, slice::from_raw_parts(b as *const u8, c), args[3], args[4] as u32).transpose()?,
 
                 // TODO: 64-bit offset on 32-bit platforms
-                Opcode::Lseek => scheme.seek(a, b as isize, c).transpose()?.map(|o| o as usize),
+                Opcode::Fsize => scheme.fsize(a).transpose()?.map(|o| o as usize),
                 Opcode::Fchmod => scheme.fchmod(a, b as u16).transpose()?,
                 Opcode::Fchown => scheme.fchown(a, b as u32, c as u32).transpose()?,
                 Opcode::Fcntl => scheme.fcntl(a, b, c).transpose()?,
diff --git a/src/scheme.rs b/src/scheme.rs
index e039d4355e9bfd2fe0624cee99159fbec85ded09..fa0ccf3b8ea80831036ddec5695a254eb2ef90db 100644
--- a/src/scheme.rs
+++ b/src/scheme.rs
@@ -42,15 +42,12 @@ pub trait Scheme {
                     &CallerCtx::from_packet(&packet),
                 ),
             ),
-            SYS_READ => self.read(packet.b, {
+            SYS_READ => self.read_old(packet.b, {
                 slice::from_raw_parts_mut(packet.c as *mut u8, packet.d)
             }),
-            SYS_WRITE => self.write(packet.b, {
+            SYS_WRITE => self.write_old(packet.b, {
                 slice::from_raw_parts(packet.c as *const u8, packet.d)
             }),
-            SYS_LSEEK => self
-                .seek(packet.b, packet.c as isize, packet.d)
-                .map(|o| o as usize),
             SYS_FCHMOD => self.fchmod(packet.b, packet.c as u16),
             SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32),
             SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d),
@@ -154,18 +151,26 @@ pub trait Scheme {
     }
 
     #[allow(unused_variables)]
-    fn read(&self, id: usize, buf: &mut [u8]) -> Result<usize> {
+    fn read_old(&self, id: usize, buf: &mut [u8]) -> Result<usize> {
         Err(Error::new(EBADF))
     }
+    #[allow(unused_variables)]
+    fn read(&self, id: usize, buf: &mut [u8], offset: u64, fcntl_flags: u32) -> Result<usize> {
+        self.read_old(id, buf)
+    }
 
     #[allow(unused_variables)]
-    fn write(&self, id: usize, buf: &[u8]) -> Result<usize> {
+    fn write_old(&self, id: usize, buf: &[u8]) -> Result<usize> {
         Err(Error::new(EBADF))
     }
+    #[allow(unused_variables)]
+    fn write(&self, id: usize, buf: &[u8], offset: u64, fcntl_flags: u32) -> Result<usize> {
+        self.write_old(id, buf)
+    }
 
     #[allow(unused_variables)]
-    fn seek(&self, id: usize, pos: isize, whence: usize) -> Result<isize> {
-        Err(Error::new(EBADF))
+    fn fsize(&self, id: usize) -> Result<u64> {
+        Err(Error::new(ESPIPE))
     }
 
     #[allow(unused_variables)]
diff --git a/src/scheme_block.rs b/src/scheme_block.rs
index 2be3e2f2c76198a509f8defda79fccdbb5344ae8..8e274e827dfd9391eee9afa456ca0bc98c433986 100644
--- a/src/scheme_block.rs
+++ b/src/scheme_block.rs
@@ -42,15 +42,12 @@ pub trait SchemeBlock {
                     &CallerCtx::from_packet(&packet),
                 ),
             ),
-            SYS_READ => self.read(packet.b, {
+            SYS_READ => self.read_old(packet.b, {
                 slice::from_raw_parts_mut(packet.c as *mut u8, packet.d)
             }),
-            SYS_WRITE => self.write(packet.b, {
+            SYS_WRITE => self.write_old(packet.b, {
                 slice::from_raw_parts(packet.c as *const u8, packet.d)
             }),
-            SYS_LSEEK => self
-                .seek(packet.b, packet.c as isize, packet.d)
-                .map(|o| o.map(|o| o as usize)),
             SYS_FCHMOD => self.fchmod(packet.b, packet.c as u16),
             SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32),
             SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d),
@@ -154,18 +151,26 @@ pub trait SchemeBlock {
     }
 
     #[allow(unused_variables)]
-    fn read(&self, id: usize, buf: &mut [u8]) -> Result<Option<usize>> {
+    fn read_old(&self, id: usize, buf: &mut [u8]) -> Result<Option<usize>> {
         Err(Error::new(EBADF))
     }
+    #[allow(unused_variables)]
+    fn read(&self, id: usize, buf: &mut [u8], offset: u64, fcntl_flags: u32) -> Result<Option<usize>> {
+        self.read_old(id, buf)
+    }
 
     #[allow(unused_variables)]
-    fn write(&self, id: usize, buf: &[u8]) -> Result<Option<usize>> {
+    fn write_old(&self, id: usize, buf: &[u8]) -> Result<Option<usize>> {
         Err(Error::new(EBADF))
     }
+    #[allow(unused_variables)]
+    fn write(&self, id: usize, buf: &[u8], offset: u64, fcntl_flags: u32) -> Result<Option<usize>> {
+        self.write_old(id, buf)
+    }
 
     #[allow(unused_variables)]
-    fn seek(&self, id: usize, pos: isize, whence: usize) -> Result<Option<isize>> {
-        Err(Error::new(EBADF))
+    fn fsize(&self, id: usize) -> Result<Option<u64>> {
+        Err(Error::new(ESPIPE))
     }
 
     #[allow(unused_variables)]
@@ -229,24 +234,12 @@ pub trait SchemeBlock {
     }
 
     #[allow(unused_variables)]
-    fn mmap_prep(
-        &self,
-        id: usize,
-        offset: u64,
-        size: usize,
-        flags: MapFlags,
-    ) -> Result<Option<usize>> {
+    fn mmap_prep(&self, id: usize, offset: u64, size: usize, flags: MapFlags) -> Result<Option<usize>> {
         Err(Error::new(EOPNOTSUPP))
     }
 
     #[allow(unused_variables)]
-    fn munmap(
-        &self,
-        id: usize,
-        offset: u64,
-        size: usize,
-        flags: MunmapFlags,
-    ) -> Result<Option<usize>> {
+    fn munmap(&self, id: usize, offset: u64, size: usize, flags: MunmapFlags) -> Result<Option<usize>> {
         Err(Error::new(EOPNOTSUPP))
     }
 }
diff --git a/src/scheme_block_mut.rs b/src/scheme_block_mut.rs
index eeca6cbc3e7c74280bf8f649a9eca90046a602dc..fa6a8222b707b6f9482e7cf248d8d935155b350c 100644
--- a/src/scheme_block_mut.rs
+++ b/src/scheme_block_mut.rs
@@ -42,15 +42,12 @@ pub trait SchemeBlockMut {
                     &CallerCtx::from_packet(&packet),
                 ),
             ),
-            SYS_READ => self.read(packet.b, {
+            SYS_READ => self.read_old(packet.b, {
                 slice::from_raw_parts_mut(packet.c as *mut u8, packet.d)
             }),
-            SYS_WRITE => self.write(packet.b, {
+            SYS_WRITE => self.write_old(packet.b, {
                 slice::from_raw_parts(packet.c as *const u8, packet.d)
             }),
-            SYS_LSEEK => self
-                .seek(packet.b, packet.c as isize, packet.d)
-                .map(|o| o.map(|o| o as usize)),
             SYS_FCHMOD => self.fchmod(packet.b, packet.c as u16),
             SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32),
             SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d),
@@ -154,18 +151,26 @@ pub trait SchemeBlockMut {
     }
 
     #[allow(unused_variables)]
-    fn read(&mut self, id: usize, buf: &mut [u8]) -> Result<Option<usize>> {
+    fn read_old(&mut self, id: usize, buf: &mut [u8]) -> Result<Option<usize>> {
         Err(Error::new(EBADF))
     }
+    #[allow(unused_variables)]
+    fn read(&mut self, id: usize, buf: &mut [u8], offset: u64, fcntl_flags: u32) -> Result<Option<usize>> {
+        self.read_old(id, buf)
+    }
 
     #[allow(unused_variables)]
-    fn write(&mut self, id: usize, buf: &[u8]) -> Result<Option<usize>> {
+    fn write_old(&mut self, id: usize, buf: &[u8]) -> Result<Option<usize>> {
         Err(Error::new(EBADF))
     }
+    #[allow(unused_variables)]
+    fn write(&mut self, id: usize, buf: &[u8], offset: u64, fcntl_flags: u32) -> Result<Option<usize>> {
+        self.write_old(id, buf)
+    }
 
     #[allow(unused_variables)]
-    fn seek(&mut self, id: usize, pos: isize, whence: usize) -> Result<Option<isize>> {
-        Err(Error::new(EBADF))
+    fn fsize(&mut self, id: usize) -> Result<Option<u64>> {
+        Err(Error::new(ESPIPE))
     }
 
     #[allow(unused_variables)]
@@ -229,24 +234,12 @@ pub trait SchemeBlockMut {
     }
 
     #[allow(unused_variables)]
-    fn mmap_prep(
-        &mut self,
-        id: usize,
-        offset: u64,
-        size: usize,
-        flags: MapFlags,
-    ) -> Result<Option<usize>> {
+    fn mmap_prep(&mut self, id: usize, offset: u64, size: usize, flags: MapFlags) -> Result<Option<usize>> {
         Err(Error::new(EOPNOTSUPP))
     }
 
     #[allow(unused_variables)]
-    fn munmap(
-        &mut self,
-        id: usize,
-        offset: u64,
-        size: usize,
-        flags: MunmapFlags,
-    ) -> Result<Option<usize>> {
+    fn munmap(&mut self, id: usize, offset: u64, size: usize, flags: MunmapFlags) -> Result<Option<usize>> {
         Err(Error::new(EOPNOTSUPP))
     }
 }
diff --git a/src/scheme_mut.rs b/src/scheme_mut.rs
index 05ead9ec5709c9f0f16fe14c1c5ff95cb3ab0feb..4899dbb15e66d1d29f2edccc7ef648003ea72435 100644
--- a/src/scheme_mut.rs
+++ b/src/scheme_mut.rs
@@ -42,15 +42,12 @@ pub trait SchemeMut {
                     &CallerCtx::from_packet(&packet),
                 ),
             ),
-            SYS_READ => self.read(packet.b, {
+            SYS_READ => self.read_old(packet.b, {
                 slice::from_raw_parts_mut(packet.c as *mut u8, packet.d)
             }),
-            SYS_WRITE => self.write(packet.b, {
+            SYS_WRITE => self.write_old(packet.b, {
                 slice::from_raw_parts(packet.c as *const u8, packet.d)
             }),
-            SYS_LSEEK => self
-                .seek(packet.b, packet.c as isize, packet.d)
-                .map(|o| o as usize),
             SYS_FCHMOD => self.fchmod(packet.b, packet.c as u16),
             SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32),
             SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d),
@@ -154,18 +151,26 @@ pub trait SchemeMut {
     }
 
     #[allow(unused_variables)]
-    fn read(&mut self, id: usize, buf: &mut [u8]) -> Result<usize> {
+    fn read_old(&mut self, id: usize, buf: &mut [u8]) -> Result<usize> {
         Err(Error::new(EBADF))
     }
+    #[allow(unused_variables)]
+    fn read(&mut self, id: usize, buf: &mut [u8], offset: u64, fcntl_flags: u32) -> Result<usize> {
+        self.read_old(id, buf)
+    }
 
     #[allow(unused_variables)]
-    fn write(&mut self, id: usize, buf: &[u8]) -> Result<usize> {
+    fn write_old(&mut self, id: usize, buf: &[u8]) -> Result<usize> {
         Err(Error::new(EBADF))
     }
+    #[allow(unused_variables)]
+    fn write(&mut self, id: usize, buf: &[u8], offset: u64, fcntl_flags: u32) -> Result<usize> {
+        self.write_old(id, buf)
+    }
 
     #[allow(unused_variables)]
-    fn seek(&mut self, id: usize, pos: isize, whence: usize) -> Result<isize> {
-        Err(Error::new(EBADF))
+    fn fsize(&mut self, id: usize) -> Result<u64> {
+        Err(Error::new(ESPIPE))
     }
 
     #[allow(unused_variables)]