diff --git a/programs/netutils b/programs/netutils
index a0b3c34ce201a9e160441ac507e5a414b1cc421c..b51d92633b63e75024f2e0d093fb7708b6e129b8 160000
--- a/programs/netutils
+++ b/programs/netutils
@@ -1 +1 @@
-Subproject commit a0b3c34ce201a9e160441ac507e5a414b1cc421c
+Subproject commit b51d92633b63e75024f2e0d093fb7708b6e129b8
diff --git a/schemes/ipd/src/interface/loopback.rs b/schemes/ipd/src/interface/loopback.rs
index 842e96a29328be281515f8e1679f4e37e3c380af..61c7e8c7693a8d7160d9c7cd24bd1685ced45ac7 100644
--- a/schemes/ipd/src/interface/loopback.rs
+++ b/schemes/ipd/src/interface/loopback.rs
@@ -22,10 +22,6 @@ impl Interface for LoopbackInterface {
         self.ip
     }
 
-    fn arp_event(&mut self) -> Result<()> {
-        Ok(())
-    }
-
     fn recv(&mut self) -> Result<Vec<Ipv4>> {
         let mut ips = Vec::new();
 
@@ -41,4 +37,12 @@ impl Interface for LoopbackInterface {
 
         Ok(0)
     }
+
+    fn arp_event(&mut self) -> Result<()> {
+        Ok(())
+    }
+
+    fn has_loopback_data(&self) -> bool {
+        ! self.packets.is_empty()
+    }
 }
diff --git a/schemes/ipd/src/interface/mod.rs b/schemes/ipd/src/interface/mod.rs
index 36458dc983d495c2496bf0030f25d545526fdd0f..279e2beab93d3cb2c7c6df5d4e951692b01d6814 100644
--- a/schemes/ipd/src/interface/mod.rs
+++ b/schemes/ipd/src/interface/mod.rs
@@ -9,7 +9,10 @@ mod loopback;
 
 pub trait Interface {
     fn ip(&self) -> Ipv4Addr;
-    fn arp_event(&mut self) -> Result<()>;
     fn recv(&mut self) -> Result<Vec<Ipv4>>;
     fn send(&mut self, ip: Ipv4) -> Result<usize>;
+
+    fn arp_event(&mut self) -> Result<()>;
+
+    fn has_loopback_data(&self) -> bool { false }
 }
diff --git a/schemes/ipd/src/main.rs b/schemes/ipd/src/main.rs
index a9cd02443d951ab966068e3566d68ebab1870b0c..7c4fcaf646bfab1bd93b6595bad3847d902f60d1 100644
--- a/schemes/ipd/src/main.rs
+++ b/schemes/ipd/src/main.rs
@@ -110,6 +110,20 @@ impl Ipd {
 
         Ok(())
     }
+
+    fn loopback_event(&mut self, loopback_id: usize) -> io::Result<()> {
+        let handle_loopback = if let Some(interface) = self.interfaces.get(loopback_id) {
+            interface.has_loopback_data()
+        } else {
+            false
+        };
+
+        if handle_loopback {
+            self.ip_event(loopback_id)?;
+        }
+
+        Ok(())
+    }
 }
 
 impl SchemeMut for Ipd {
@@ -251,13 +265,6 @@ fn main() {
 
         let mut event_queue = EventQueue::<()>::new().expect("ipd: failed to create event queue");
 
-        let loopback_id = {
-            let mut ipd = ipd.borrow_mut();
-            let if_id = ipd.interfaces.len();
-            ipd.interfaces.push(Box::new(LoopbackInterface::new()));
-            if_id
-        };
-
         //TODO: Multiple interfaces
         {
             let arp_fd = syscall::open("ethernet:806", syscall::O_RDWR | syscall::O_NONBLOCK).expect("ipd: failed to open ethernet:806");
@@ -286,10 +293,20 @@ fn main() {
             }).expect("ipd: failed to listen to events on ethernet:800");
         }
 
+        let loopback_id = {
+            let mut ipd = ipd.borrow_mut();
+            let if_id = ipd.interfaces.len();
+            ipd.interfaces.push(Box::new(LoopbackInterface::new()));
+            if_id
+        };
+
         event_queue.add(scheme_fd, move |_count: usize| -> io::Result<Option<()>> {
-            ipd.borrow_mut().ip_event(loopback_id)?;
-            ipd.borrow_mut().scheme_event()?;
-            ipd.borrow_mut().ip_event(loopback_id)?;
+            let mut ipd = ipd.borrow_mut();
+
+            ipd.loopback_event(loopback_id)?;
+            ipd.scheme_event()?;
+            ipd.loopback_event(loopback_id)?;
+
             Ok(None)
         }).expect("ipd: failed to listen to events on :ip");