diff --git a/scheme/debug.rs b/scheme/debug.rs
index 52b88e52c886f91e740f5ac70efd5c1944d6c187..eed44ede96005fca72466ea1fbb882c9f9360105 100644
--- a/scheme/debug.rs
+++ b/scheme/debug.rs
@@ -72,7 +72,7 @@ impl Scheme for DebugScheme {
         Ok(buffer.len())
     }
 
-    fn fevent(&self, _file: usize, flags: usize) -> Result<usize> {
+    fn fevent(&self, _file: usize, _flags: usize) -> Result<usize> {
         Ok(0)
     }
 
diff --git a/syscall/mod.rs b/syscall/mod.rs
index 1bb5a56e7ab755ef344488bb5ad23946de813bfc..2815091d57268da90301ecc20dab4caa8da9d36e 100644
--- a/syscall/mod.rs
+++ b/syscall/mod.rs
@@ -47,8 +47,11 @@ pub extern fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize
             SYS_GETCWD => getcwd(validate_slice_mut(b as *mut u8, c)?),
             SYS_FEVENT => fevent(b, c),
             SYS_FPATH => fpath(b, validate_slice_mut(c as *mut u8, d)?),
+            SYS_PHYSALLOC => physalloc(b),
+            SYS_PHYSFREE => physfree(b, c),
             SYS_PHYSMAP => physmap(b, c, d),
             SYS_PHYSUNMAP => physunmap(b),
+            SYS_VIRTTOPHYS => virttophys(b),
             _ => {
                 println!("Unknown syscall {}", a);
                 Err(Error::new(ENOSYS))
diff --git a/syscall/process.rs b/syscall/process.rs
index 5150b95d88f911e8c431d1caedeaf8a784979466..d953e42bd688ce3e5d05b33d45be3648ba6babaf 100644
--- a/syscall/process.rs
+++ b/syscall/process.rs
@@ -8,7 +8,7 @@ use spin::Mutex;
 
 use arch;
 use arch::externs::memcpy;
-use arch::memory::allocate_frame;
+use arch::memory::{allocate_frame, allocate_frames, deallocate_frames, Frame};
 use arch::paging::{ActivePageTable, InactivePageTable, Page, PhysicalAddress, VirtualAddress, entry};
 use arch::paging::temporary_page::TemporaryPage;
 use arch::start::usermode;
@@ -535,6 +535,16 @@ pub fn iopl(_level: usize) -> Result<usize> {
     Ok(0)
 }
 
+pub fn physalloc(size: usize) -> Result<usize> {
+    allocate_frames((size + 4095)/4096).ok_or(Error::new(ENOMEM)).map(|frame| frame.start_address().get())
+}
+
+pub fn physfree(physical_address: usize, size: usize) -> Result<usize> {
+    deallocate_frames(Frame::containing_address(PhysicalAddress::new(physical_address)), (size + 4095)/4096);
+    //TODO: Check that no double free occured
+    Ok(0)
+}
+
 //TODO: verify exlusive access to physical memory
 pub fn physmap(physical_address: usize, size: usize, flags: usize) -> Result<usize> {
     if size == 0 {
@@ -617,6 +627,14 @@ pub fn sched_yield() -> Result<usize> {
     Ok(0)
 }
 
+pub fn virttophys(virtual_address: usize) -> Result<usize> {
+    let active_table = unsafe { ActivePageTable::new() };
+    match active_table.translate(VirtualAddress::new(virtual_address)) {
+        Some(physical_address) => Ok(physical_address.get()),
+        None => Err(Error::new(EFAULT))
+    }
+}
+
 pub fn waitpid(pid: usize, status_ptr: usize, flags: usize) -> Result<usize> {
     loop {
         {