Index: server/src/netdevice.c
===================================================================
--- server/src/netdevice.c	(revision 120)
+++ server/src/netdevice.c	(working copy)
@@ -38,7 +38,7 @@
 /*****************************************************************************
  * Open the "real" network devices. Return the number of opened interfaces.
  *****************************************************************************/
-l4_int32_t open_network_devices(void)
+l4_int32_t open_network_devices(int promisc)
 {
   struct net_device *dev;
   l4_int32_t err, cnt = 0;
@@ -52,6 +52,7 @@
       // beam us to promiscuous mode, so that we can receive packets that
       // are not meant for the NIC's MAC address --> we need that, because
       // ORe clients have different MAC addresses
+	  if (promisc) {
       if ((err = dev_change_flags(dev, dev->flags | IFF_PROMISC)) != 0)
         {
           LOGd(ORE_DEBUG_INIT, "%s could not be set to promiscuous mode.",
@@ -61,6 +62,7 @@
         {
           LOGd(ORE_DEBUG_INIT, "set interface to promiscuous mode: %d", err);
         }
+	  }
 
       err = dev_open(dev);
       if (err)
Index: server/src/ore-local.h
===================================================================
--- server/src/ore-local.h	(revision 120)
+++ server/src/ore-local.h	(working copy)
@@ -159,7 +159,7 @@
 
 /* netdevice handling */
 extern l4_int32_t list_network_devices(void);
-extern l4_int32_t open_network_devices(void);
+extern l4_int32_t open_network_devices(int promisc);
 
 /* in a multithreaded server we need to lock hard_start_xmit for every
  * device
Index: server/src/main.c
===================================================================
--- server/src/main.c	(revision 120)
+++ server/src/main.c	(working copy)
@@ -39,6 +39,7 @@
 static   int  use_events;
 static   int  unittest = 0;
 int loopback_only = 0;
+static int promisc = 1;
 
 ore_connection_t ore_connection_table[ORE_CONFIG_MAX_CONNECTIONS];
 l4_threadid_t ore_main_server   = L4_INVALID_ID;
@@ -137,6 +138,8 @@
   if (parse_cmdline(&argc, &argv,
                     'd', "debug", "debug on",
                     PARSE_CMD_SWITCH, 1, &ore_debug,
+                    'p', "nopromiscuous", "promiscuous off",
+                    PARSE_CMD_SWITCH, 0, &promisc,
                     'e', "events", "use events to detect broken connections",
                     PARSE_CMD_SWITCH, 1, &use_events,
                     'l', "loopback-only", "use only a loopback device",
@@ -171,7 +174,7 @@
 
   LOG("loopback: %d", loopback_only);
   // initialize network devices
-  ret = open_network_devices();
+  ret = open_network_devices(promisc);
   LOG("Initialized %d network devices.", ret);
 
   // always list devices at start time
Index: examples/arping/main.c
===================================================================
--- examples/arping/main.c	(revision 120)
+++ examples/arping/main.c	(working copy)
@@ -28,7 +28,7 @@
 #define ICMP_REQ          8
 #define ETH_ALEN          6
 
-#define REPLY_PACKET_LEN  80
+#define REPLY_PACKET_LEN  500
 #define RECV_PACKET_LEN   500
 #define DATASPACE_SIZE    (1024 * 1024)
 
@@ -150,12 +150,33 @@
     return 0;
 }
 
+static u_short mip_cksum_update(u_short sum, u_short old_val, u_short new_val)
+{
+    u_long x = sum ^ 0xffff;
+
+    x -= old_val;
+
+    while( (x & 0xffff0000) != 0) {
+	    x &= 0xffff;
+	    x--;
+	}
+
+	x += new_val;
+
+    while( (x & 0xffff0000) != 0) {
+		x &= 0xffff;
+		x++;
+	}
+    return ~(u_short)x;
+}
+
 static void create_icmp_reply(void *buf, struct ethernet_hdr *eth,
                               struct ip_hdr *ip, struct icmp_hdr *icmp)
 {
     struct ethernet_hdr *e;
     struct ip_hdr       *iphdr;
     struct icmp_hdr     *i;
+	char				*d;
 
     // ETHERNET HEADER
     e = (struct ethernet_hdr *)buf;
@@ -172,9 +193,10 @@
     iphdr->src_ip  = ip->dest_ip;
     iphdr->dest_ip = ip->src_ip;
 
-    i = (struct icmp_hdr *)(iphdr + sizeof(struct ip_hdr));
+    i = (struct icmp_hdr *)(iphdr + 1);
     *i         = *icmp;
     i->type    = ICMP_REPLY;
+	i->checksum = mip_cksum_update(i->checksum, ICMP_REQ, ICMP_REPLY);
 }
 
 int main(int argc, const char **argv)
@@ -320,9 +342,10 @@
             }
 #endif
             LOGd(arping_verbose, "correctly parsed ICMP packet.");
+			memcpy(next_addr, rx_buf, REPLY_PACKET_LEN);
             create_icmp_reply((char *)next_addr, &eth, &ip, &icmp);
             LOGd(arping_verbose, "sending ICMP reply %p", next_addr);
-            retval[3] = l4ore_send(handle, next_addr, REPLY_PACKET_LEN);
+            retval[3] = l4ore_send(handle, next_addr, size);
             next_addr += REPLY_PACKET_LEN;
             if (next_addr >= (send_start + DATASPACE_SIZE - REPLY_PACKET_LEN))
                 next_addr = send_start;
