diff --git a/arch-wrs/Makefile b/arch-wrs/Makefile
index 599223523a381f492f6decc86b72ee85187e0dd6..b8fa9532a304df7fe07b84645bdb7832c32b4838 100644
--- a/arch-wrs/Makefile
+++ b/arch-wrs/Makefile
@@ -8,6 +8,7 @@ OBJ-y += $A/wrs-startup.o \
 	$A/wrs-io.o \
 	$A/wrs-calibration.o \
 	$A/wrs-ipcserver.o \
+	arch-unix/unix-conf.o \
 	lib/cmdline.o \
 	lib/conf.o \
 	lib/libc-functions.o \
diff --git a/arch-wrs/wrs-startup.c b/arch-wrs/wrs-startup.c
index 96e9e1e7481b1038e8e95616cdf0db0aef54e922..34e775e22e920f549e4ecead96e4376336c25485 100644
--- a/arch-wrs/wrs-startup.c
+++ b/arch-wrs/wrs-startup.c
@@ -64,6 +64,7 @@ int main(int argc, char **argv)
 	struct pp_globals *ppg;
 	struct pp_instance *ppi;
 	struct wr_dsport *wrp;
+	unsigned long seed;
 	struct timex t;
 	int i, hal_retries;
 
@@ -182,6 +183,11 @@ int main(int argc, char **argv)
 
 	pp_init_globals(ppg, &__pp_default_rt_opts);
 
+	seed = time(NULL);
+	if (getenv("PPSI_DROP_SEED"))
+		seed = atoi(getenv("PPSI_DROP_SEED"));
+	ppsi_drop_init(ppg, seed);
+
 	wrs_main_loop(ppg);
 	return 0; /* never reached */
 }
diff --git a/time-wrs/wrs-socket.c b/time-wrs/wrs-socket.c
index 5da7297b18ca9535dcaa66d123d8f7a97c5b8a47..09b8c9f3c4e6de7a787bc18d19ce5ff9c7507dea 100644
--- a/time-wrs/wrs-socket.c
+++ b/time-wrs/wrs-socket.c
@@ -223,7 +223,7 @@ static int wrs_recv_msg(struct pp_instance *ppi, int fd, void *pkt, int len,
 		if (!WR_DSPOR(ppi)->wrModeOn) {
 			/* for non-wr-mode any reported stamp is correct */
 			t->correct = 1;
-			return ret;
+			goto drop;
 		}
 		if (s->dmtd_phase_valid)
 		{
@@ -233,6 +233,12 @@ static int wrs_recv_msg(struct pp_instance *ppi, int fd, void *pkt, int len,
 		}
 	}
 
+drop:
+	if (ppsi_drop_rx()) {
+		pp_diag(ppi, frames, 1, "Drop received frame\n");
+		return -2;
+	}
+
 	return ret;
 }
 
@@ -344,13 +350,22 @@ int wrs_net_send(struct pp_instance *ppi, void *pkt, int len,
 	struct sockaddr_in addr;
 	struct ethhdr *hdr = pkt;
 	struct wrs_socket *s;
-	int ret, fd;
+	int ret, fd, drop;
 
 	s = (struct wrs_socket *)NP(ppi)->ch[PP_NP_GEN].arch_data;
 
+	/*
+	 * To fake a packet loss, we must corrupt the frame; we need
+	 * to transmit it for real, if we want to get back our
+	 * hardware stamp. Thus, remember if we drop, and use this info.
+	 */
+	drop = ppsi_drop_tx();
+
 	if (ppi->ethernet_mode) {
 		fd = NP(ppi)->ch[PP_NP_GEN].fd;
 		hdr->h_proto = htons(ETH_P_1588);
+		if (drop)
+			hdr->h_proto++;
 
 		memcpy(hdr->h_dest, PP_MCAST_MACADDRESS, ETH_ALEN);
 		/* raw socket implementation always uses gen socket */
@@ -361,6 +376,10 @@ int wrs_net_send(struct pp_instance *ppi, void *pkt, int len,
 
 		ret = send(fd, hdr, len, 0);
 		poll_tx_timestamp(ppi, s, fd, t);
+
+		if (drop) /* avoid messaging about stamps that are not used */
+			goto drop_msg;
+
 		if (pp_diag_allow(ppi, frames, 2))
 			dump_1588pkt("send: ", pkt, len, t);
 		pp_diag(ppi, time, 1, "send stamp: (correct %i) %9li.%09li\n",
@@ -374,15 +393,24 @@ int wrs_net_send(struct pp_instance *ppi, void *pkt, int len,
 	addr.sin_family = AF_INET;
 	addr.sin_port = htons(chtype == PP_NP_GEN ? PP_GEN_PORT : PP_EVT_PORT);
 	addr.sin_addr.s_addr = NP(ppi)->mcast_addr;
-
+	if (drop)
+		addr.sin_port = 3200;
 	ret = sendto(fd, pkt, len, 0,
 		(struct sockaddr *)&addr, sizeof(struct sockaddr_in));
 	poll_tx_timestamp(ppi, s, fd, t);
+
+	if (drop) /* like above: skil messages about timestamps */
+		goto drop_msg;
+
 	if (pp_diag_allow(ppi, frames, 2))
 		dump_payloadpkt("send: ", pkt, len, t);
 	pp_diag(ppi, time, 1, "send stamp: (correct %i) %9li.%09li\n",
 		t->correct, (long)t->seconds,
 		(long)t->nanoseconds);
+drop_msg:
+	if (drop)
+		pp_diag(ppi, frames, 1, "Drop sent frame\n");
+
 	return ret;
 }