diff --git a/tests/measure_t24p.c b/tests/measure_t24p.c
index 22c88503837f30c7885f1e1a465b0cf7b9d2ea6f..3f39fd55c782ea5cf2bc12d04cc6efb89f300501 100644
--- a/tests/measure_t24p.c
+++ b/tests/measure_t24p.c
@@ -26,12 +26,8 @@
 
 #ifdef CONFIG_PPSI
 #include <ppsi/ppsi.h>
-#define UNPACK_HEADER msg_unpack_header
-#define UNPACK_FOLLOWUP msg_unpack_follow_up
 #else
 #include "ptpd.h"
-#define UNPACK_HEADER msgUnpackHeader
-#define UNPACK_FOLLOWUP msgUnpackFollowUp
 #endif
 
 #if 0 /* not used, currently */
@@ -49,8 +45,6 @@ struct meas_entry {
 };
 
 
-#ifndef CONFIG_PPSI /* FIXME */
-
 static void purge_socket(wr_socket_t *sock, char *buf)
 {
 	wr_sockaddr_t from;
@@ -60,6 +54,70 @@ static void purge_socket(wr_socket_t *sock, char *buf)
 		update_rx_queues();
 }
 
+#ifdef CONFIG_PPSI
+
+extern struct pp_instance ppi_static;
+static struct pp_instance *ppi = &ppi_static;
+
+static int meas_phase_range(wr_socket_t * sock, int phase_min, int phase_max,
+			    int phase_step, struct meas_entry *results)
+{
+	char buf[128];
+	TimeInternal ts_rx, ts_sync = {0,};
+	MsgHeader *mhdr;
+	int setpoint = phase_min, i = 0, phase;
+
+	mhdr = &ppi->msg_tmp_header;
+
+	spll_set_phase_shift(SPLL_ALL_CHANNELS, phase_min);
+
+	while (spll_shifter_busy(0)) ;
+
+	purge_socket(sock, buf);
+
+	i = 0;
+	while (setpoint <= phase_max) {
+		ptpd_netif_get_dmtd_phase(sock, &phase);
+
+		update_rx_queues();
+		int n = pp_recv_packet(ppi, buf, 128, &ts_rx);
+
+		if (n > 0) {
+			msg_unpack_header(ppi, buf);
+			if (mhdr->messageType == 0)
+				assign_TimeInternal(&ts_sync, &ts_rx);
+			else if (mhdr->messageType == 8 && ts_sync.correct) {
+				MsgFollowUp fup;
+				msg_unpack_follow_up(buf, &fup);
+
+				mprintf("Shift: %d/%dps [step %dps]        \r",
+					setpoint, phase_max, phase_step);
+				results[i].phase = phase;
+				results[i].phase_sync = ts_sync.phase;
+				results[i].ahead = ts_sync.raw_ahead;
+				results[i].delta_ns =
+				    fup.preciseOriginTimestamp.
+				    nanosecondsField - ts_sync.nanoseconds;
+				results[i].delta_ns +=
+				    (fup.preciseOriginTimestamp.secondsField.
+				     lsb - ts_sync.seconds) * 1000000000;
+
+				setpoint += phase_step;
+				spll_set_phase_shift(0, setpoint);
+				while (spll_shifter_busy(0)) ;
+				purge_socket(sock, buf);
+
+				ts_sync.correct = 0;
+				i++;
+			}
+		}
+	}
+	mprintf("\n");
+	return i;
+}
+
+#else
+
 static int meas_phase_range(wr_socket_t * sock, int phase_min, int phase_max,
 			    int phase_step, struct meas_entry *results)
 {
@@ -82,12 +140,12 @@ static int meas_phase_range(wr_socket_t * sock, int phase_min, int phase_max,
 		int n = ptpd_netif_recvfrom(sock, &from, buf, 128, &ts_rx);
 
 		if (n > 0) {
-			UNPACK_HEADER(buf, &mhdr);
+			msgUnpackHeader(buf, &mhdr);
 			if (mhdr.messageType == 0)
 				ts_sync = ts_rx;
 			else if (mhdr.messageType == 8 && ts_sync.correct) {
 				MsgFollowUp fup;
-				UNPACK_FOLLOWUP(buf, &fup);
+				msgUnpackFollowUp(buf, &fup);
 
 				mprintf("Shift: %d/%dps [step %dps]        \r",
 					setpoint, phase_max, phase_step);
@@ -115,6 +173,8 @@ static int meas_phase_range(wr_socket_t * sock, int phase_min, int phase_max,
 	return i;
 }
 
+#endif /* CONFIG_PPSI else CONFIG_PTPNOPOSIX*/
+
 static int find_transition(struct meas_entry *results, int n, int positive)
 {
 	int i;
@@ -135,6 +195,13 @@ int measure_t24p(int *value)
 	int i, nr;
 	struct meas_entry results[128];
 
+#ifdef CONFIG_PPSI
+	if (!NP(ppi)->inited) {
+		if (pp_net_init(ppi) < 0)
+			return -1;
+		NP(ppi)->inited = 1;
+	}
+#endif
 	spll_enable_ptracker(0, 1);
 
 	sock_addr.family = PTPD_SOCK_RAW_ETHERNET;	// socket type
@@ -191,6 +258,11 @@ int measure_t24p(int *value)
 	mprintf("Verification... \n");
 	nr = meas_phase_range(sock, 0, 16000, 500, results);
 
+#ifdef CONFIG_PPSI
+	pp_net_shutdown(ppi);
+	NP(ppi)->inited = 0;
+#endif
+
 	for (i = 0; i < nr; i++)
 		mprintf("phase_dmtd: %d delta_ns: %d, phase_sync: %d\n",
 			results[i].phase, results[i].delta_ns,
@@ -201,12 +273,3 @@ int measure_t24p(int *value)
 	ptpd_netif_close_socket(sock);
 	return 0;
 }
-
-#else /* FIXME: PPSI needs porting */
-
-int measure_t24p(int *value)
-{
-	return 0;
-}
-
-#endif /* PPSI */
diff --git a/wrc_ptp_ppsi.c b/wrc_ptp_ppsi.c
index 821d04dc42fa4aaa5ba6eedb596b286fad13e75d..838fa6d085da2d5962189e52ddc2ea839a9b7095 100644
--- a/wrc_ptp_ppsi.c
+++ b/wrc_ptp_ppsi.c
@@ -22,8 +22,9 @@
 #include "uart.h"
 
 static int ptp_enabled = 0, ptp_mode = WRC_MODE_UNKNOWN;
-static struct pp_instance ppi_static;
-CONST_VERBOSITY int pp_diag_verbosity = 0;
+struct pp_instance ppi_static; /* FIXME: no more static, because used in
+				   tests/measure_t24p.c */
+CONST_VERBOSITY int pp_diag_verbosity = CONFIG_PPSI_VERBOSITY;
 
 /*ppi fields*/
 static UInteger16 sent_seq_id[16];