diff --git a/userspace/ppsi b/userspace/ppsi
index cbb759933eee864326850a4b2cbd6c55ac1ebe25..7d6165475f2e05fbea12df995ca6eaa85b341a49 160000
--- a/userspace/ppsi
+++ b/userspace/ppsi
@@ -1 +1 @@
-Subproject commit cbb759933eee864326850a4b2cbd6c55ac1ebe25
+Subproject commit 7d6165475f2e05fbea12df995ca6eaa85b341a49
diff --git a/userspace/tools/wrs_dump_shmem.c b/userspace/tools/wrs_dump_shmem.c
index daab8abef8d5567431b48235e5b7a0234be95b89..9ef5c184c42b5999787c96fb129831307f9ed131 100644
--- a/userspace/tools/wrs_dump_shmem.c
+++ b/userspace/tools/wrs_dump_shmem.c
@@ -29,6 +29,9 @@
 #define FPGA_SPLL_STAT 0x10006800
 #define SPLL_MAGIC 0x5b1157a7
 
+void dump_one_field_ppsi_wrs(int type, int size, void *p, int i);
+int dump_one_field_type_ppsi_wrs(int type, int size, void *p);
+
 char *name_id_to_name[WRS_SHM_N_NAMES] = {
 	[wrs_shm_ptp] = "ptpd/ppsi",
 	[wrs_shm_rtu] = "wrsw_rtud",
@@ -113,13 +116,9 @@ void dump_one_field(void *addr, struct dump_info *info, char *info_prefix)
 	void *p = addr + info->offset;
 	char buf[128];
 	struct pp_time *t = p;
-	RelativeDifference *rd=p;
-	Timestamp *ts=p;
-	TimeInterval *ti=p;
-	struct PortIdentity *pi = p;
-	struct ClockQuality *cq = p;
 	char format[16];
 	int i;
+	int value;
 	char pname[128];
 
 	if (info_prefix!=NULL )
@@ -127,6 +126,23 @@ void dump_one_field(void *addr, struct dump_info *info, char *info_prefix)
 	else
 		strcpy(pname,info->name);
 
+	/* For some (mostly enum-like types) the size may vary.
+	 * Check the size and assign a proper value to
+	 * variable i */
+	switch(info->type) {
+	case dump_type_yes_no:
+		if (info->size == 1)
+			value = *(uint8_t *)p;
+		else if (info->size == 2)
+			value = *(uint16_t *)(p);
+		else
+			value = *(uint32_t *)(p);
+		break;
+	default:
+		/* check if this is ppsi type */
+		value = dump_one_field_type_ppsi_wrs(info->type, info->size, p);
+	}
+
 	printf("%-40s ", pname); /* name includes trailing ':' */
 	switch(info->type) {
 	case dump_type_char:
@@ -149,22 +165,18 @@ void dump_one_field(void *addr, struct dump_info *info, char *info_prefix)
 			printf("%02x%c", ((unsigned char *)p)[i],
 			       i == info->size - 1 ? '\n' : ':');
 		break;
-	case dump_type_UInteger64:
 	case dump_type_uint64_t:
 		printf("%lld\n", *(unsigned long long *)p);
 		break;
 	case dump_type_long_long:
-	case dump_type_Integer64:
 		printf("%lld\n", *(long long *)p);
 		break;
 	case dump_type_uint32_t:
 		printf("0x%08lx\n", (long)*(uint32_t *)p);
 		break;
-	case dump_type_Integer32:
 	case dump_type_int:
 		printf("%i\n", *(int *)p);
 		break;
-	case dump_type_UInteger32:
 	case dump_type_unsigned:
 		printf("%u\n", *(uint32_t *)p);
 		break;
@@ -172,16 +184,8 @@ void dump_one_field(void *addr, struct dump_info *info, char *info_prefix)
 		printf("%lu\n", *(unsigned long *)p);
 		break;
 	case dump_type_unsigned_char:
-	case dump_type_UInteger8:
-	case dump_type_Integer8:
-	case dump_type_Enumeration8:
-	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:
 		printf("%i\n", *(unsigned short *)p);
@@ -195,9 +199,6 @@ void dump_one_field(void *addr, struct dump_info *info, char *info_prefix)
 	case dump_type_pointer:
 		printf("%p\n", *(void **)p);
 		break;
-	case dump_type_Integer16:
-		printf("%i\n", *(short *)p);
-		break;
 	case dump_type_yes_no:
 		i = *(uint8_t *)p;
 		switch (i) {
@@ -223,41 +224,12 @@ void dump_one_field(void *addr, struct dump_info *info, char *info_prefix)
 		printf("%s\n",timeToString(t,buf));
 		break;
 
-	case dump_type_Timestamp:
-		printf("%s\n",timestampToString(ts,buf));
-		break;
-
-	case dump_type_TimeInterval:
-		printf("%s\n",timeIntervalToString(*ti,buf));
-		break;
-
-	case dump_type_RelativeDifference:
-		printf("%s\n",relativeDifferenceToString(*rd,buf));
-		break;
 	case dump_type_ip_address:
 		for (i = 0; i < 4; i++)
 			printf("%02x%c", ((unsigned char *)p)[i],
 			       i == 3 ? '\n' : ':');
 		break;
 
-	case dump_type_ClockIdentity: /* Same as binary */
-		for (i = 0; i < sizeof(ClockIdentity); i++)
-			printf("%02x%c", ((unsigned char *)p)[i],
-			       i == sizeof(ClockIdentity) - 1 ? '\n' : ':');
-		break;
-
-	case dump_type_PortIdentity: /* Same as above plus port */
-		for (i = 0; i < sizeof(ClockIdentity); i++)
-			printf("%02x%c", ((unsigned char *)p)[i],
-			       i == sizeof(ClockIdentity) - 1 ? '.' : ':');
-		printf("%04x (%i)\n", pi->portNumber, pi->portNumber);
-		break;
-
-	case dump_type_ClockQuality:
-		printf("class=%i, accuracy=0x%02x (%i), logvariance=%i\n",
-		       cq->clockClass, cq->clockAccuracy, cq->clockAccuracy,
-		       cq->offsetScaledLogVariance);
-		break;
 	case dump_type_sfp_flags:
 		if (*(uint32_t *)p & SFP_FLAG_CLASS_DATA)
 			printf("SFP class data, ");
@@ -394,8 +366,9 @@ void dump_one_field(void *addr, struct dump_info *info, char *info_prefix)
 		printf("\n");
 		break;
 		}
-	case dump_type_scaledPicoseconds:
-		printf("%lld\n", (*(unsigned long long *)p)>>16);
+
+	default:
+		dump_one_field_ppsi_wrs(info->type, info->size, p, value);
 		break;
 	}
 }
@@ -619,18 +592,18 @@ struct dump_info htab_info[] = {
 	DUMP_FIELD(int, end_of_bucket),
 	DUMP_FIELD(yes_no, is_bpdu),
 	DUMP_FIELD_SIZE(bina, mac, ETH_ALEN),
-	DUMP_FIELD(UInteger8, fid),
+	DUMP_FIELD(unsigned_char, fid),
 	DUMP_FIELD(uint32_t, port_mask_src),
 	DUMP_FIELD(uint32_t, port_mask_dst),
 	DUMP_FIELD(int, drop_when_source),
 	DUMP_FIELD(int, drop_when_dest),
 	DUMP_FIELD(int, drop_unmatched_src_ports),
-	DUMP_FIELD(UInteger32, last_access_t),
+	DUMP_FIELD(unsigned, last_access_t),
 	DUMP_FIELD(yes_no, force_remove),
-	DUMP_FIELD(UInteger8, prio_src),
+	DUMP_FIELD(unsigned_char, prio_src),
 	DUMP_FIELD(int, has_prio_src),
 	DUMP_FIELD(int, prio_override_src),
-	DUMP_FIELD(UInteger8, prio_dst),
+	DUMP_FIELD(unsigned_char, prio_dst),
 	DUMP_FIELD(int, has_prio_dst),
 	DUMP_FIELD(int, prio_override_dst),
 	DUMP_FIELD(rtu_filtering_entry_dynamic, dynamic),
@@ -641,8 +614,8 @@ struct dump_info htab_info[] = {
 #define DUMP_STRUCT struct rtu_vlan_table_entry
 struct dump_info vlan_info[] = {
 	DUMP_FIELD(uint32_t, port_mask),
-	DUMP_FIELD(UInteger8, fid),
-	DUMP_FIELD(UInteger8, prio),
+	DUMP_FIELD(unsigned_char, fid),
+	DUMP_FIELD(unsigned_char, prio),
 	DUMP_FIELD(yes_no, has_prio),
 	DUMP_FIELD(yes_no, prio_override),
 	DUMP_FIELD(yes_no, drop),
@@ -663,7 +636,7 @@ struct dump_info mirror_info[] = {
 struct dump_info rtu_port_info[] = {
 	DUMP_FIELD(rtu_qmode, qmode),
 	DUMP_FIELD(yes_no, fix_prio),
-	DUMP_FIELD(UInteger8, prio),
+	DUMP_FIELD(unsigned_char, prio),
 	DUMP_FIELD(uint16_t, pvid),
 	DUMP_FIELD_SIZE(bina, mac, ETH_ALEN),
 	DUMP_FIELD(yes_no, untag),
diff --git a/userspace/tools/wrs_dump_shmem.h b/userspace/tools/wrs_dump_shmem.h
index 65a1d446383e059f1d4b920f2113e80a7ce4097b..39a98e14b3f7bfec20cb65446b0fd89448b78e94 100644
--- a/userspace/tools/wrs_dump_shmem.h
+++ b/userspace/tools/wrs_dump_shmem.h
@@ -47,24 +47,7 @@ enum dump_type {
 	dump_type_pointer,
 	dump_type_yes_no,
 	dump_type_timeval,
-	/* and strange ones, from IEEE */
-	dump_type_UInteger64,
-	dump_type_Integer64,
-	dump_type_UInteger32,
-	dump_type_Integer32,
-	dump_type_UInteger16,
-	dump_type_Integer16,
-	dump_type_UInteger8,
-	dump_type_Integer8,
-	dump_type_UInteger4,
-	dump_type_Enumeration8,
-	dump_type_Boolean,
-	dump_type_ClockIdentity,
-	dump_type_PortIdentity,
-	dump_type_ClockQuality,
-	dump_type_TimeInterval,
-	dump_type_RelativeDifference,
-	dump_type_Timestamp,
+
 	/* and this is ours */
 	dump_type_time,
 	dump_type_ip_address,
@@ -84,8 +67,7 @@ enum dump_type {
 	dump_type_rtu_filtering_entry_dynamic,
 	dump_type_rtu_qmode,
 	dump_type_array_int,
-	/* scaledPicoseconds */
-	dump_type_scaledPicoseconds,
+
 };
 /*
  * A structure to dump fields. This is meant to simplify things, see use here