diff --git a/userspace/ppsi b/userspace/ppsi
index b6a29541b0877bc81454fca91dc234e60080111d..8cf7a183725b57cd01145e5f661d7619017c5ff6 160000
--- a/userspace/ppsi
+++ b/userspace/ppsi
@@ -1 +1 @@
-Subproject commit b6a29541b0877bc81454fca91dc234e60080111d
+Subproject commit 8cf7a183725b57cd01145e5f661d7619017c5ff6
diff --git a/userspace/tools/wrs_dump_shmem.c b/userspace/tools/wrs_dump_shmem.c
index a70aee1d10ad0ddc36b51d13f6634322a84894e5..bfc39432feff3b51e492dfe908c7b3d1eacf09e7 100644
--- a/userspace/tools/wrs_dump_shmem.c
+++ b/userspace/tools/wrs_dump_shmem.c
@@ -97,7 +97,7 @@ void decode_relative_difference(RelativeDifference rd, int32_t *nsecs, uint64_t
 	}
 }
 
-void dump_one_field(void *addr, struct dump_info *info)
+void dump_one_field(void *addr, struct dump_info *info, char *info_prefix)
 {
 	void *p = addr + info->offset;
 	struct pp_time *t = p;
@@ -109,8 +109,14 @@ void dump_one_field(void *addr, struct dump_info *info)
 	char format[16];
 	uint64_t sec, nano, pico;
 	int i;
+	char pname[128];
 
-	printf("        %-30s ", info->name); /* name includes trailing ':' */
+	if (info_prefix!=NULL )
+		sprintf(pname,"%s.%s",info_prefix,info->name);
+	else
+		strcpy(pname,info->name);
+
+	printf("%-40s ", pname); /* name includes trailing ':' */
 	switch(info->type) {
 	case dump_type_char:
 		sprintf(format,"\"%%.%is\"\n", info->size);
@@ -193,7 +199,7 @@ void dump_one_field(void *addr, struct dump_info *info)
 		nano = scaled_nsecs >> TIME_FRACBITS;
 		pico = scaled_nsecs & TIME_FRACMASK;
 		pico = (pico * 1000) >> TIME_FRACBITS;
-		printf("correct %i: %10c%lli.%09"PRIu64".%03"PRIu64"\n",
+		printf("correct=%i, value=%10c%lli.%09"PRIu64".%03"PRIu64"\n",
 		       !is_incorrect(t),sign, t->secs, nano,pico);
 	}
 		break;
@@ -247,7 +253,7 @@ void dump_one_field(void *addr, struct dump_info *info)
 		break;
 
 	case dump_type_ClockQuality:
-		printf("class %i, accuracy %02x (%i), logvariance %i\n",
+		printf("class=%i, accuracy=0x%02x (%i), logvariance=%i\n",
 		       cq->clockClass, cq->clockAccuracy, cq->clockAccuracy,
 		       cq->offsetScaledLogVariance);
 		break;
@@ -379,7 +385,7 @@ void dump_one_field(void *addr, struct dump_info *info)
 	}
 }
 
-void dump_many_fields(void *addr, struct dump_info *info, int ninfo)
+void dump_many_fields(void *addr, struct dump_info *info, int ninfo, char *prefix)
 {
 	int i;
 
@@ -387,8 +393,9 @@ void dump_many_fields(void *addr, struct dump_info *info, int ninfo)
 		fprintf(stderr, "dump: pointer not valid\n");
 		return;
 	}
-	for (i = 0; i < ninfo; i++)
-		dump_one_field(addr, info + i);
+	for (i = 0; i < ninfo; i++) {
+		dump_one_field(addr, info + i,prefix);
+	}
 }
 
 /* the macro below relies on an externally-defined structure type */
@@ -484,7 +491,7 @@ int dump_hal_mem(struct wrs_shm_head *head)
 	h = (void *)head + head->data_off;
 
 	/* dump hal's shmem */
-	dump_many_fields(h, hal_shmem_info, ARRAY_SIZE(hal_shmem_info));
+	dump_many_fields(h, hal_shmem_info, ARRAY_SIZE(hal_shmem_info),"HAL");
 
 	n = h->nports;
 	p = wrs_shm_follow(head, h->ports);
@@ -495,8 +502,10 @@ int dump_hal_mem(struct wrs_shm_head *head)
 	}
 
 	for (i = 0; i < n; i++, p++) {
-		printf("dump port %i\n", i + 1);
-		dump_many_fields(p, hal_port_info, ARRAY_SIZE(hal_port_info));
+		char prefix[64];
+
+		sprintf(prefix,"HAL.port.%d",i+1);
+		dump_many_fields(p, hal_port_info, ARRAY_SIZE(hal_port_info),prefix);
 	}
 	return 0;
 }
@@ -547,6 +556,7 @@ int dump_rtu_mem(struct wrs_shm_head *head)
 	struct rtu_filtering_entry *rtu_filters_cur;
 	struct rtu_vlan_table_entry *rtu_vlans;
 	int i, j;
+	char prefix[64];
 
 	if (head->version != RTU_SHMEM_VERSION) {
 		fprintf(stderr, "dump rtu: unknown version %i (known is %i)\n",
@@ -569,9 +579,9 @@ int dump_rtu_mem(struct wrs_shm_head *head)
 			    && (!rtu_filters_cur->valid))
 				/* don't display empty entries */
 				continue;
-			printf("dump htab[%d][%d]\n", i, j);
+			sprintf(prefix,"rtu.htab.%d.%d",i,j);
 			dump_many_fields(rtu_filters_cur, htab_info,
-					 ARRAY_SIZE(htab_info));
+					 ARRAY_SIZE(htab_info),prefix);
 		}
 	}
 
@@ -580,8 +590,8 @@ int dump_rtu_mem(struct wrs_shm_head *head)
 			    && rtu_vlans->port_mask == 0x0))
 			/* don't display empty entries */
 			continue;
-		printf("dump vlan %i\n", i);
-		dump_many_fields(rtu_vlans, vlan_info, ARRAY_SIZE(vlan_info));
+		sprintf(prefix,"rtu.vlan.%d",i);
+		dump_many_fields(rtu_vlans, vlan_info, ARRAY_SIZE(vlan_info),prefix);
 	}
 	return 0;
 }
@@ -610,8 +620,6 @@ struct dump_info spll_stats_info[] = {
 
 static int dump_spll_mem(struct spll_stats *spll)
 {
-	printf("ID: Soft PLL:\n");
-
 	/* Check magic */
 	if (spll->magic != SPLL_MAGIC) {
 		/* Wrong magic */
@@ -619,7 +627,7 @@ static int dump_spll_mem(struct spll_stats *spll)
 			spll->magic, SPLL_MAGIC);
 	}
 
-	dump_many_fields(spll, spll_stats_info, ARRAY_SIZE(spll_stats_info));
+	dump_many_fields(spll, spll_stats_info, ARRAY_SIZE(spll_stats_info),"SoftPll");
 
 	return 0; /* this is complete */
 }
@@ -729,20 +737,17 @@ int main(int argc, char **argv)
 		}
 		head = m;
 		if (!head->pidsequence) {
-			printf("ID %i (\"%s\"): no data\n",
-			       i, name_id_to_name[i]);
+			printf("shm.%d.name:       %s\n",i,name_id_to_name[i]);
+			printf("shm.%d.iterations: %d  (no data)\n",i,head->pidsequence);
 			wrs_shm_put(m);
 			continue;
 		}
+		printf("shm.%d.name:       %s\n",i,head->name);
+		printf("shm.%d.pid:        %d\n",i,head->pid);
 		if (head->pid) {
-			printf("ID %i (\"%s\"): pid %i (%s, %i iterations)\n",
-			       i, head->name, head->pid,
-			       kill(head->pid, 0) < 0 ? "dead" : "alive",
-			       head->pidsequence);
-		} else {
-			printf("ID %i (\"%s\"): no pid (after %i iterations)\n",
-			       i, head->name, head->pidsequence);
+			printf("shm.%d.status:     %s\n",i,kill(head->pid, 0) < 0 ? "dead" : "alive");
 		}
+		printf("shm.%d.iterations: %d\n",i,head->pidsequence);
 		f = name_id_to_f[i];
 
 		/* if the area-specific function fails, fall back to generic */
diff --git a/userspace/tools/wrs_dump_shmem.h b/userspace/tools/wrs_dump_shmem.h
index 868a0d1f18cb590aa723d8c409cf3efd815ae1d8..4cd74a3e4d02e8921b24056c557d4630a76c2313 100644
--- a/userspace/tools/wrs_dump_shmem.h
+++ b/userspace/tools/wrs_dump_shmem.h
@@ -93,5 +93,6 @@ struct dump_info {
 	int size;  /* only for strings or binary strings */
 };
 
-void dump_many_fields(void *addr, struct dump_info *info, int ninfo);
+void dump_many_fields(void *addr, struct dump_info *info, int ninfo,
+		      char *prefix);
 int dump_ppsi_mem(struct wrs_shm_head *head);