diff --git a/userspace/ppsi b/userspace/ppsi
index fbe6df4e44af8749f1c7360499f6c2fe0c9797ed..2e5d6f4d6feaa2a9162ad1d82bad400d570e03ad 160000
--- a/userspace/ppsi
+++ b/userspace/ppsi
@@ -1 +1 @@
-Subproject commit fbe6df4e44af8749f1c7360499f6c2fe0c9797ed
+Subproject commit 2e5d6f4d6feaa2a9162ad1d82bad400d570e03ad
diff --git a/userspace/tools/wrs_dump_shmem.c b/userspace/tools/wrs_dump_shmem.c
index 41d69558f8b880c0cc326126c5ffec2a56104e45..3e6d3aae2358b03642f6ea91651e0060034da995 100644
--- a/userspace/tools/wrs_dump_shmem.c
+++ b/userspace/tools/wrs_dump_shmem.c
@@ -17,6 +17,12 @@
 #include <libwr/util.h>
 #include <ppsi/ppsi.h>
 #include <ppsi-wrs.h>
+
+/*  be safe, in case some other header had them slightly differently */
+#undef container_of
+#undef offsetof
+#undef ARRAY_SIZE
+
 #include "wrs_dump_shmem.h"
 
 #define FPGA_SPLL_STAT 0x10006800
@@ -83,7 +89,7 @@ void dump_one_field(void *addr, struct dump_info *info)
 	struct PortIdentity *pi = p;
 	struct ClockQuality *cq = p;
 	char format[16];
-	uint64_t sec, nano, pico;
+	uint64_t sec, nano, pico, femto;
 	int i;
 
 	printf("        %-30s ", info->name); /* name includes trailing ':' */
@@ -134,6 +140,9 @@ void dump_one_field(void *addr, struct dump_info *info)
 	case dump_type_Boolean:
 		printf("%i\n", *(unsigned char *)p);
 		break;
+	case dump_type_UInteger4:
+		printf("%i\n", *(unsigned char *)p & 0xF);
+		break;
 	case dump_type_UInteger16:
 	case dump_type_uint16_t:
 	case dump_type_unsigned_short:
@@ -156,11 +165,20 @@ void dump_one_field(void *addr, struct dump_info *info)
 #define TIME_FRACMASK 0xFFFF
 
 	case dump_type_time:
-		nano = t->scaled_nsecs >> TIME_FRACBITS;
-		pico = t->scaled_nsecs & TIME_FRACMASK;
+	{
+		char sign='+';
+		int64_t scaled_nsecs=t->scaled_nsecs;
+
+		if ( scaled_nsecs < 0) {
+			scaled_nsecs =-scaled_nsecs;
+			sign='-';
+		}
+		nano = scaled_nsecs >> TIME_FRACBITS;
+		pico = scaled_nsecs & TIME_FRACMASK;
 		pico = (pico * 1000) >> TIME_FRACBITS;
-		printf("correct %i: %10lli.%09"PRIu64".%03"PRIu64"\n",
-		       !is_incorrect(t), t->secs, nano,pico);
+		printf("correct %i: %10c%lli.%09"PRIu64".%03"PRIu64"\n",
+		       !is_incorrect(t),sign, t->secs, nano,pico);
+	}
 		break;
 
 	case dump_type_Timestamp:
@@ -172,21 +190,39 @@ void dump_one_field(void *addr, struct dump_info *info)
 #define TIME_INTERVAL_FRACBITS 16
 #define TIME_INTERVAL_FRACMASK 0xFFFF
 
-case dump_type_TimeInterval:
-		nano = *ti >> TIME_INTERVAL_FRACBITS;
-		pico = *ti & TIME_INTERVAL_FRACMASK;
+	case dump_type_TimeInterval:
+	{
+		char sign='+';
+		int64_t scaled_nsecs=*ti;
+
+		if ( scaled_nsecs < 0) {
+			scaled_nsecs =-scaled_nsecs;
+			sign='-';
+		}
+		nano = scaled_nsecs >> TIME_INTERVAL_FRACBITS;
+		pico = scaled_nsecs & TIME_INTERVAL_FRACMASK;
 		pico = (pico * 1000) >> TIME_INTERVAL_FRACBITS;
-		printf("%09"PRIu64".%03"PRIu64"\n", nano,pico);
+		printf("%c%09"PRIu64".%03"PRIu64"\n", sign,nano,pico);
+	}
 		break;
 
 #define REL_DIFF_FRACBITS 62
 #define REL_DIFF_FRACMASK 0x3fffffffffffffff
 
 	case dump_type_RelativeDifference:
-		nano = *rd >> REL_DIFF_FRACBITS;
-		pico = *rd & REL_DIFF_FRACMASK;
-		pico = (pico * 1000L) >> REL_DIFF_FRACBITS;
-		printf("%01"PRIu64".%03"PRIu64"\n", nano,pico);
+	{
+		char sign='+';
+		int64_t scaled_nsecs=*rd;
+
+		if (scaled_nsecs<0) {
+			scaled_nsecs =-scaled_nsecs;
+			sign='-';
+		}
+		nano = scaled_nsecs >> REL_DIFF_FRACBITS;
+		femto= (scaled_nsecs & REL_DIFF_FRACMASK)>>32;
+		femto = (femto * 1000000L) >> (REL_DIFF_FRACBITS-32);
+		printf("%c%01"PRIu64".%06"PRIu64" \n", sign, nano,femto);
+	}
 		break;
 	case dump_type_ip_address:
 		for (i = 0; i < 4; i++)
diff --git a/userspace/tools/wrs_dump_shmem.h b/userspace/tools/wrs_dump_shmem.h
index b3a283be0e1d72d4709e00e27dc585d6f7c1052f..868a0d1f18cb590aa723d8c409cf3efd815ae1d8 100644
--- a/userspace/tools/wrs_dump_shmem.h
+++ b/userspace/tools/wrs_dump_shmem.h
@@ -53,6 +53,7 @@ enum dump_type {
 	dump_type_Integer16,
 	dump_type_UInteger8,
 	dump_type_Integer8,
+	dump_type_UInteger4,
 	dump_type_Enumeration8,
 	dump_type_Boolean,
 	dump_type_ClockIdentity,