diff --git a/lib/dpdkdevice.cc b/lib/dpdkdevice.cc
index 773db76a8548a4619cbfbb277b4735715b70a6d2..b2411e191133e88148edfee5feb92d4efba83bf0 100644
--- a/lib/dpdkdevice.cc
+++ b/lib/dpdkdevice.cc
@@ -69,7 +69,7 @@ extern "C" {
 #define DEV_TX_OFFLOAD_TCP_TSO RTE_ETH_TX_OFFLOAD_TCP_TSO
 #define DEV_TX_OFFLOAD_MULTI_SEGS RTE_ETH_TX_OFFLOAD_MULTI_SEGS
 #ifndef RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE
-# define RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE
+# define RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE DEV_TX_OFFLOAD_MBUF_FAST_FREE
 #endif
 
 //#define DEF_DEV_RXDESC DEF_RTE_ETH_RXDESC
@@ -703,7 +703,8 @@ int DPDKDevice::initialize_device(ErrorHandler *errh)
     sprintf(vendor_and_dev, "%x:%x", info.vendor_id, info.device_id);
 
     // Retrieve more information about the vendor of this NIC
-    String dev_pci = shell_command_output_string("lspci -d " + String(vendor_and_dev), "", errh);
+
+    String dev_pci = shell_command_output_string("lspci -d " + String(vendor_and_dev) + " 2>/dev/null", "", errh);
     String long_vendor_name = parse_pci_info(dev_pci, "Ethernet controller");
     if (!long_vendor_name.empty()) {
         info.vendor_name = keep_token_left(long_vendor_name, ' ');
diff --git a/lib/packet.cc b/lib/packet.cc
index 6e9987a3ccb5102d8dbbaa84a3f4e67577efea7e..9fad169fcec0e68becebfbc557a8cb2c37a3345c 100644
--- a/lib/packet.cc
+++ b/lib/packet.cc
@@ -1065,6 +1065,8 @@ Packet::clone(bool fast)
 # endif
     Packet* p = reinterpret_cast<Packet *>(
     rte_pktmbuf_clone(mb(), DPDKDevice::get_mpool(rte_socket_id())));
+    if (likely(!p))
+        return 0;
     p->copy_annotations(this,true);
     p->copy_headers(this);
     return p;
@@ -1406,7 +1408,6 @@ Packet::expensive_push(uint32_t nbytes)
     __skb_push(q->skb(), nbytes);
 #elif CLICK_PACKET_USE_DPDK
     rte_pktmbuf_prepend(q->mb(), nbytes);
-    click_chatter("New head : %d",q->headroom());
 #else				/* User-space and BSD kernel module */
     q->_data -= nbytes;
 # ifdef CLICK_BSDMODULE
@@ -1423,9 +1424,6 @@ Packet::expensive_push(uint32_t nbytes)
 WritablePacket *
 Packet::expensive_put(uint32_t nbytes)
 {
-#if CLICK_PACKET_USE_DPDK
-    assert(false);
-#endif
   static int chatter = 0;
   if (tailroom() < nbytes && chatter < 5) {
     click_chatter("expensive Packet::put; have %d wanted %d",
diff --git a/lib/userutils.cc b/lib/userutils.cc
index 3d67b9aad69e11d7e7d158666322520b1a127f21..858977f82fd8921cf78eaa650404343e945f2991 100644
--- a/lib/userutils.cc
+++ b/lib/userutils.cc
@@ -260,51 +260,51 @@ shell_command_output_string(String cmdline, const String &input, ErrorHandler *e
     StringAccum sa;
 
     if (!(f = tmpfile())) {
-	errh->error("%<%s%>: tmpfile: %s", cmdline.c_str(), strerror(errno));
-	goto out;
+	    errh->error("%<%s%>: tmpfile: %s", cmdline.c_str(), strerror(errno));
+	    goto out;
     }
     ignore_result(fwrite(input.data(), 1, input.length(), f));
     fflush(f);
     rewind(f);
 
     if (pipe(pfd) == -1) {
-	errh->error("%<%s%>: pipe: %s", cmdline.c_str(), strerror(errno));
-	fclose(f);
-	goto out;
+	    errh->error("%<%s%>: pipe: %s", cmdline.c_str(), strerror(errno));
+	    fclose(f);
+	    goto out;
     }
 
     child = fork();
     if (child == -1)
-	errh->error("%<%s%>: fork: %s", cmdline.c_str(), strerror(errno));
+	    errh->error("%<%s%>: fork: %s", cmdline.c_str(), strerror(errno));
     else if (child == 0) {
-	close(0);
-	close(1);
-	close(pfd[0]);
-	dup2(fileno(f), 0);
-	dup2(pfd[1], 1);
-	close(fileno(f));
-	close(pfd[1]);
-
-	execl("/bin/sh", "sh", "-c", cmdline.c_str(), (char *) 0);
-	exit(127);
+	    close(0);
+        close(1);
+        close(pfd[0]);
+        dup2(fileno(f), 0);
+        dup2(pfd[1], 1);
+        close(fileno(f));
+        close(pfd[1]);
+
+        execl("/bin/sh", "sh", "-c", cmdline.c_str(), (char *) 0);
+        exit(127);
     }
 
     close(pfd[1]);
     fclose(f);
     while (1) {
-	char *s = sa.reserve(4096);
-	if (!s) {
-	    errh->error("%<%s%>: out of memory", cmdline.c_str());
-	    sa.clear();
-	    break;
-	}
-	ssize_t r = read(pfd[0], s, 4096);
-	if (r == 0 || (r == -1 && errno != EAGAIN && errno != EINTR)) {
-	    if (r == -1)
-		errh->error("%<%s%>: %s", cmdline.c_str(), strerror(errno));
-	    break;
-	} else if (r != -1)
-	    sa.adjust_length(r);
+        char *s = sa.reserve(4096);
+        if (!s) {
+            errh->error("%<%s%>: out of memory", cmdline.c_str());
+            sa.clear();
+            break;
+        }
+        ssize_t r = read(pfd[0], s, 4096);
+        if (r == 0 || (r == -1 && errno != EAGAIN && errno != EINTR)) {
+            if (r == -1)
+            errh->error("%<%s%>: %s", cmdline.c_str(), strerror(errno));
+            break;
+        } else if (r != -1)
+            sa.adjust_length(r);
     }
 
     close(pfd[0]);
diff --git a/test/flow/flowipnat-01.clicktest b/test/flow/flowipnat-01.clicktest
index 2f4af392f18acb8faa3e7fff7707ca2571e17d13..d2f1bfea23001ecabc27709c885a15621f9acaa1 100644
--- a/test/flow/flowipnat-01.clicktest
+++ b/test/flow/flowipnat-01.clicktest
@@ -12,6 +12,9 @@ test ! $NODPDKTEST
 $VALGRIND click --dpdk --no-huge --no-pci -m 128MB -- CONFIG
 
 %file CONFIG
+
+DPDKInfo(4095)
+
 FromIPSummaryDump(IN1, STOP true, CHECKSUM true)
 	-> CheckIPHeader(VERBOSE true)
 	-> CheckTCPHeader(VERBOSE true)
diff --git a/test/threads/affinity-01.clicktest b/test/threads/affinity-01.clicktest
index ee6165377ee03e6a786c6a23c05781a0ced2830a..64be90a458087c0a1419d1df1cb2c75586164924 100644
--- a/test/threads/affinity-01.clicktest
+++ b/test/threads/affinity-01.clicktest
@@ -11,31 +11,47 @@ taskset -c 1 sleep 0.2 >/dev/null 2>/dev/null &
 pid=$!
 sleep 0.1
 [ $(taskset -p $pid | rev | cut -d' ' -f1) -eq 2 ]
+command -v bc
 
 %script
+start=`date +%s.%N`
+click -e 'Script(wait 200ms, stop)' >/dev/null 2>/dev/null
+end=`date +%s.%N`
+st=$(echo "$end - $start" | bc)
+
 #Affinity to core 0
 click --affinity=0 -e 'Script(wait 400ms,stop)' >/dev/null 2>/dev/null &
 pid=$!
-sleep 0.2
+sleep $st
 taskset -p $pid | rev | cut -d' ' -f1
+wait
 
 #Affinity to core 1
 click --affinity=1 -e 'Script(wait 400ms,stop)' >/dev/null 2>/dev/null &
 pid=$!
-sleep 0.2
+sleep $st
 taskset -p $pid | rev | cut -d' ' -f1
+wait
 
-#No affinity
-click --no-affinity -e 'Script(wait 400ms,stop)' >/dev/null 2>/dev/null &
-pid=$!
-sleep 0.2
-[ "$(taskset -p $pid | rev | cut -d' ' -f1)" = "$(taskset -p 1 | rev | cut -d' ' -f1)" ] && echo "match"
+if ! click-buildtool provides dpdk-packet ; then
+    #No affinity
+    click --no-affinity -e 'Script(wait 400ms,stop)' >/dev/null 2>/dev/null &
+    pid=$!
+    sleep $st
+    [ "$(taskset -p $pid | rev | cut -d' ' -f1)" = "$(taskset -p 1 | rev | cut -d' ' -f1)" ] && echo "match"
+    wait
 
-#Default is no affinity
-click -e 'Script(wait 400ms,stop)' >/dev/null 2>/dev/null &
-pid=$!
-sleep 0.2
-[ "$(taskset -p $pid | rev | cut -d' ' -f1)" = "$(taskset -p 1 | rev | cut -d' ' -f1)" ] && echo "match"
+    #Default is no affinity
+    click -e 'Script(wait 400ms,stop)' >/dev/null 2>/dev/null &
+    pid=$!
+    sleep $st
+    [ "$(taskset -p $pid | rev | cut -d' ' -f1)" = "$(taskset -p 1 | rev | cut -d' ' -f1)" ] && echo "match"
+    wait
+else
+    #dpdk-packet will force DPDK initialization that always has affinity
+    echo "match"
+    echo "match"
+fi
 
 %expect stdout
 1
diff --git a/test/userlevel/dpdk.clicktest b/test/userlevel/dpdk.clicktest
index d76a689840bc6f3a0078b1541ccd91cb8bd5830f..c9abc700a3b4f74a4caaf20a1ad96094535ab80d 100644
--- a/test/userlevel/dpdk.clicktest
+++ b/test/userlevel/dpdk.clicktest
@@ -7,7 +7,7 @@ test ! $TRAVIS
 test ! $NODPDKTEST
 
 %script
-click --dpdk --no-huge -m 128MB -c 0x3 -n 1 --log-level=1 --vdev=eth_ring0 -- CONFIG
+click --dpdk --no-pci --no-huge -m 128MB -c 0x3 -n 1 --log-level=1 --vdev=eth_ring0 -- CONFIG
 
 %file CONFIG
 DPDKInfo(2047)
diff --git a/test/userlevel/timewarp-01.clicktest b/test/userlevel/timewarp-01.clicktest
index 97d1bb8e1f91aae861d4115af849667945827eb4..a34359682b4a34d6becd9356cfd0573a53b4b1e1 100644
--- a/test/userlevel/timewarp-01.clicktest
+++ b/test/userlevel/timewarp-01.clicktest
@@ -2,6 +2,9 @@
 
 Test timewarp functionality.
 
+%require
+click-provides !dpdk-packet #Dpdk-packet will force DPDK eal initialization, which slows down the initialization and breaks the test
+
 %script
 
 now () {
diff --git a/userlevel/click.cc b/userlevel/click.cc
index 53be2a5a95ac66d7be97dbb685922a37baebd6d8..dd2bf181e36cf1771bc261aead9a4a3b0c25f997 100644
--- a/userlevel/click.cc
+++ b/userlevel/click.cc
@@ -430,7 +430,9 @@ main(int argc, char **argv)
         args.dpdk_arg.push_back((char*)(new String("--no-huge"))->c_str());
         args.dpdk_arg.push_back((char*)(new String("-l"))->c_str());
         char* s = (char*)malloc(14);
-        snprintf(s,14,"0-%d",click_nthreads - 1);
+        if (args.click_affinity_offset < 0)
+            args.click_affinity_offset = 0;
+        snprintf(s,14,"%d-%d", args.click_affinity_offset, args.click_affinity_offset + click_nthreads - 1);
         args.dpdk_arg.push_back(s);
 
         args.dpdk_arg.push_back((char*)(new String("-m"))->c_str());