diff --git a/userspace/snmpd/WR-SWITCH-MIB.txt b/userspace/snmpd/WR-SWITCH-MIB.txt
index 8508f180a9dc107861ad8b5c7ea1fe00ad6ea17b..5950d4de5a6d9a3810458f8aa168a2ec437dd7f2 100644
--- a/userspace/snmpd/WR-SWITCH-MIB.txt
+++ b/userspace/snmpd/WR-SWITCH-MIB.txt
@@ -1753,7 +1753,8 @@ WrsPtpDataEntry ::=
         wrsPtpServoStateErrCnt  Counter32,
         wrsPtpClockOffsetErrCnt Counter32,
         wrsPtpRTTErrCnt         Counter32,
-        wrsPtpServoUpdateTime   Counter64
+        wrsPtpServoUpdateTime   Counter64,
+        wrsPtpServoExt          INTEGER
     }
 
 wrsPtpDataIndex OBJECT-TYPE
@@ -1956,6 +1957,19 @@ wrsPtpServoUpdateTime OBJECT-TYPE
             "TAI Nanosecond of the last servo's update"
     ::= { wrsPtpDataEntry 23 }
 
+wrsPtpServoExt OBJECT-TYPE
+    SYNTAX INTEGER {
+                na(0),
+                none(1),
+                wr(2),
+                l1Sync(3)
+    }
+    MAX-ACCESS  read-only
+    STATUS      current
+    DESCRIPTION
+            "Extension with which the servo runs."
+    ::= { wrsPtpDataEntry 24 }
+
 -- wrsPortStatusTable (.7.6)
 wrsPortStatusTable OBJECT-TYPE
     SYNTAX      SEQUENCE OF WrsPortStatusEntry
diff --git a/userspace/snmpd/snmp_shmem.c b/userspace/snmpd/snmp_shmem.c
index b1c2004e6f36cafbe7eaca2006ff3ecaf9abc99c..5034e1795fbda45b538cab4c01d7772fff2ddf03 100644
--- a/userspace/snmpd/snmp_shmem.c
+++ b/userspace/snmpd/snmp_shmem.c
@@ -10,8 +10,6 @@ int hal_nports_local;
 /* PPSI */
 struct wrs_shm_head *ppsi_head;
 static struct pp_globals *ppg;
-struct pp_servo *ppsi_servo;
-struct wr_servo_state *ppsi_wr_servo;
 struct pp_instance *ppsi_ppi;
 int *ppsi_ppi_nlinks;
 
@@ -122,15 +120,6 @@ static int init_shm_ppsi(void)
 	}
 	ppg = (void *)ppsi_head + ppsi_head->data_off;
 
-	/* TODO JCB Servo is part of an instance now */
-	ppsi_servo=NULL;
-//	ppsi_servo = wrs_shm_follow(ppsi_head, ppg->servo);
-//	if (!ppsi_servo) {
-//		snmp_log(LOG_ERR, "SNMP: " SL_ER
-//			"Cannot follow ppsi_servo in shmem.\n");
-//		return 4;
-//	}
-
 	ppsi_ppi = wrs_shm_follow(ppsi_head, ppg->pp_instances);
 	if (!ppsi_ppi) {
 		snmp_log(LOG_ERR, "SNMP: " SL_ER
diff --git a/userspace/snmpd/snmp_shmem.h b/userspace/snmpd/snmp_shmem.h
index b13e611777437571fa19a7cff1c4c51486232a18..80e7449a2ea535e22a67e6097a5f684f15a74a2a 100644
--- a/userspace/snmpd/snmp_shmem.h
+++ b/userspace/snmpd/snmp_shmem.h
@@ -15,7 +15,6 @@ extern int hal_nports_local;
 
 /* PPSI */
 extern struct wrs_shm_head *ppsi_head;
-extern struct pp_servo *ppsi_servo;
 extern struct pp_instance *ppsi_ppi;
 extern int *ppsi_ppi_nlinks;
 
diff --git a/userspace/snmpd/wrsPtpDataTable.c b/userspace/snmpd/wrsPtpDataTable.c
index 86b278c5831423edbd1df359fd5c330011869b1a..8faa33778af7eb4f1d519b23c79eeefd5547d5e2 100644
--- a/userspace/snmpd/wrsPtpDataTable.c
+++ b/userspace/snmpd/wrsPtpDataTable.c
@@ -29,9 +29,18 @@ static struct pickinfo wrsPtpDataTable_pickinfo[] = {
 	FIELD(wrsPtpDataTable_s, ASN_COUNTER, wrsPtpClockOffsetErrCnt),
 	FIELD(wrsPtpDataTable_s, ASN_COUNTER, wrsPtpRTTErrCnt),
 	FIELD(wrsPtpDataTable_s, ASN_COUNTER64, wrsPtpServoUpdateTime),
+	FIELD(wrsPtpDataTable_s, ASN_INTEGER, wrsPtpServoExt),
 
 };
 
+//FIXME: make a library in ppsi with all such functions, use it all around
+int64_t pp_time_to_picos(struct pp_time *ts)
+{
+	return ts->secs * PP_NSEC_PER_SEC
+		+ ((ts->scaled_nsecs * 1000 + 0x8000) >> TIME_INTERVAL_FRACBITS);
+}
+
+
 static int32_t int_saturate(int64_t value)
 {
 	if (value >= INT32_MAX)
@@ -49,6 +58,15 @@ time_t wrsPtpDataTable_data_fill(unsigned int *n_rows)
 	static time_t time_update;
 	time_t time_cur;
 	static int n_rows_local = 0;
+	int si = 0;
+	int i;
+	struct wrsPtpDataTable_s *ptp_a;
+	struct pp_instance *ppsi_i;
+	struct pp_servo *ppsi_servo;
+	struct wr_data *wr_d;
+	struct wr_servo_ext *wr_servo;
+	struct wrh_servo_t *wrh_servo;
+	char *tmp_name;
 
 	/* number of rows does not change for wrsPortStatusTable */
 	if (n_rows)
@@ -80,37 +98,154 @@ time_t wrsPtpDataTable_data_fill(unsigned int *n_rows)
 	if (n_rows)
 		*n_rows = n_rows_local;
 
+	ptp_a = wrsPtpDataTable_array;
+
+	/* servo/slave instance counter */
+	si = 0;
+
 	/* assume that there is only one servo, will change when switchover is
 	 * implemented */
 	while (1) {
 		ii = wrs_shm_seqbegin(ppsi_head);
+		for (i = 0; i < *ppsi_ppi_nlinks; i++)
+		{
+			/* report not more than max number of servo instances */
+			if( si >= WRS_MAX_N_SERVO_INSTANCES)
+				break;
+
+			ppsi_i = ppsi_ppi + i;
+			if (ppsi_i->state == PPS_SLAVE)
+			{
+
+				/*********** from ppsi instance ***************/
+
+				/* wrsPtpPortName */
+				tmp_name = (char *) wrs_shm_follow(ppsi_head,
+				ppsi_i->iface_name);
+				strncpy(ptp_a[si].wrsPtpPortName, tmp_name, 12);
+				ptp_a[si].wrsPtpPortName[11] = '\0';
+
+				/*********** from standard servo ***************/
+
+				/* get servo for ptp instance in Slave state*/
+				ppsi_servo = wrs_shm_follow(ppsi_head,
+				ppsi_i->servo);
+
+				/* wrsPtpGrandmasterID */
+				//TODO
+
+				/* wrsPtpOwnID */
+				//TODO
+
+				/* wrsPtpMode */
+				//TODO
+
+				/* wrsPtpServoState */
+				strncpy(ptp_a[si].wrsPtpServoState,
+				ppsi_servo->servo_state_name,
+				sizeof(ppsi_servo->servo_state_name));
+
+				/* wrsPtpServoStateN */
+				ptp_a[si].wrsPtpServoStateN = ppsi_servo->state;
+
+				/* wrsPtpClockOffsetPs */
+				ptp_a[si].wrsPtpClockOffsetPs =
+				pp_time_to_picos(&ppsi_servo->offsetFromMaster);
+
+				/* wrsPtpClockOffsetPsHR */
+				ptp_a[si].wrsPtpClockOffsetPsHR =
+				int_saturate(ptp_a[si].wrsPtpClockOffsetPs);
+
+				/* wrsPtpRTT */
+				ptp_a[si].wrsPtpRTT = 2*
+				pp_time_to_picos(&ppsi_servo->meanDelay);
+
+				/* wrsPtpLinkLength */
+				ptp_a[si].wrsPtpLinkLength =
+				(uint32_t)(pp_time_to_picos(&ppsi_servo->delayMS)
+				/1e12 * 300e6 / 1.55);
+
+				/* wrsPtpServoUpdates */
+				ptp_a[si].wrsPtpServoUpdates =
+				ppsi_servo->update_count;
+
+				/* wrsPtpServoUpdateTime */
+				ptp_a[si].wrsPtpServoUpdateTime = 
+ 				ppsi_servo->update_time.secs * 1000 * 1000 * 1000
+				+ (ppsi_servo->update_time.scaled_nsecs >> 16);
+
+				/* wrsPtpServoExt */
+				ptp_a[si].wrsPtpServoExt = 1+
+				ppsi_i->protocol_extension;
+
+				/******** from extensions-specific ************/
+				if (ppsi_i->protocol_extension == PPSI_EXT_WR)
+                                {
+					wr_d       = (struct wr_data *)
+							wrs_shm_follow(ppsi_head,
+							ppsi_i->ext_data);
+					wr_servo   = &wr_d->servo_ext;
+					wrh_servo  = &wr_d->servo;
+
+					/* wrsPtpPhaseTracking */
+					ptp_a[si].wrsPtpPhaseTracking =
+					1 + wrh_servo->tracking_enabled;
+
+					/* wrsPtpSyncSource */
+					// TODO
+
+					/* wrsPtpSkew */
+					ptp_a[si].wrsPtpSkew =
+					int_saturate(wrh_servo->skew_ps);
+
+					/* wrsPtpDeltaTxM */
+					ptp_a[si].wrsPtpDeltaTxM =
+					pp_time_to_picos(&wr_servo->delta_txm);
+
+					/* wrsPtpDeltaRxM */
+					ptp_a[si].wrsPtpDeltaRxM =
+					pp_time_to_picos(&wr_servo->delta_rxm);
+
+					/* wrsPtpDeltaTxS */
+					ptp_a[si].wrsPtpDeltaTxS =
+					pp_time_to_picos(&wr_servo->delta_txs);
+
+					/* wrsPtpDeltaRxS */
+					ptp_a[si].wrsPtpDeltaRxS =
+					pp_time_to_picos(&wr_servo->delta_rxs);
+
+					/* wrsPtpServoStateErrCnt */
+					ptp_a[si].wrsPtpServoStateErrCnt =
+					wrh_servo->n_err_state;
+
+					/* wrsPtpClockOffsetErrCnt */
+					ptp_a[si].wrsPtpClockOffsetErrCnt =
+                                	wrh_servo->n_err_offset;
+
+					/* wrsPtpRTTErrCnt */
+					ptp_a[si].wrsPtpRTTErrCnt =
+					wrh_servo->n_err_delta_rtt;
+				}
+				else
+                                {
+					memset(ptp_a[si].wrsPtpSyncSource,
+					0, 32 * sizeof(char));
+
+					ptp_a[si].wrsPtpPhaseTracking     = 0;
+					ptp_a[si].wrsPtpSkew              = 0;
+					ptp_a[si].wrsPtpDeltaTxM          = 0;
+					ptp_a[si].wrsPtpDeltaRxM          = 0;
+					ptp_a[si].wrsPtpDeltaTxS          = 0;
+					ptp_a[si].wrsPtpDeltaRxS          = 0;
+					ptp_a[si].wrsPtpServoStateErrCnt  = 0;
+					ptp_a[si].wrsPtpClockOffsetErrCnt = 0;
+					ptp_a[si].wrsPtpRTTErrCnt         = 0;
+				}
+				/* look for next PTP Instance in Slave state*/
+				si++;
+			}
+		}
 
-		//TODO JCB	: Search servo instance to display
-//		strncpy(wrsPtpDataTable_array[0].wrsPtpServoState,
-//			ppsi_servo->servo_state_name,
-//			sizeof(ppsi_servo->servo_state_name));
-//		wrsPtpDataTable_array[0].wrsPtpServoStateN = ppsi_servo->state;
-//		/* Keep value 0 for Not available */
-//		wrsPtpDataTable_array[0].wrsPtpPhaseTracking = 0; //JCB TODO	1 + ppsi_servo->tracking_enabled;
-//		wrsPtpDataTable_array[0].wrsPtpRTT =  0; //JCB TODO	ppsi_servo->picos_mu;
-//		wrsPtpDataTable_array[0].wrsPtpClockOffsetPs = pp_time_to_picos(&ppsi_servo->offsetFromMaster);
-//		wrsPtpDataTable_array[0].wrsPtpClockOffsetPsHR =
-//					int_saturate(wrsPtpDataTable_array[0].wrsPtpClockOffsetPs);
-//		wrsPtpDataTable_array[0].wrsPtpSkew = 0; //JCB TODO int_saturate(ppsi_servo->skew);
-//		wrsPtpDataTable_array[0].wrsPtpLinkLength =
-//				(uint32_t)(pp_time_to_picos(&ppsi_servo->delayMS)/1e12 * 300e6 / 1.55);
-//		wrsPtpDataTable_array[0].wrsPtpServoUpdates =
-//						ppsi_servo->update_count;
-//		wrsPtpDataTable_array[0].wrsPtpDeltaTxM = 0;//JCB TODO ppsi_servo->delta_txm_ps;
-//		wrsPtpDataTable_array[0].wrsPtpDeltaRxM = 0;//JCB TODO ppsi_servo->delta_rxm_ps;
-//		wrsPtpDataTable_array[0].wrsPtpDeltaTxS = 0;//JCB TODO ppsi_servo->delta_txs_ps;
-//		wrsPtpDataTable_array[0].wrsPtpDeltaRxS = 0;//JCB TODO ppsi_servo->delta_rxs_ps;
-//		wrsPtpDataTable_array[0].wrsPtpServoStateErrCnt = 0;//JCB TODO ppsi_servo->n_err_state;
-//		wrsPtpDataTable_array[0].wrsPtpClockOffsetErrCnt = 0;//JCB TODO ppsi_servo->n_err_offset;
-//		wrsPtpDataTable_array[0].wrsPtpRTTErrCnt = 0;//JCB TODO ppsi_servo->n_err_delta_rtt;
-//		wrsPtpDataTable_array[0].wrsPtpServoUpdateTime = 0;
-//		//JCB TODO ppsi_servo->update_time.secs * 1000 * 1000 * 1000
-//		//JCB TODO + (ppsi_servo->update_time.scaled_nsecs >> 16);
 		retries++;
 		if (retries > 100) {
 			snmp_log(LOG_ERR,  "SNMP: " SL_ER
diff --git a/userspace/snmpd/wrsPtpDataTable.h b/userspace/snmpd/wrsPtpDataTable.h
index 145f5b920f60bc826925dc9485b60fc6adb3d79f..0ff7ac01a43a1efe29dc58b26535b7c10c9d528e 100644
--- a/userspace/snmpd/wrsPtpDataTable.h
+++ b/userspace/snmpd/wrsPtpDataTable.h
@@ -34,6 +34,7 @@ struct wrsPtpDataTable_s {
 	uint32_t wrsPtpClockOffsetErrCnt;
 	uint32_t wrsPtpRTTErrCnt;
 	uint64_t wrsPtpServoUpdateTime;
+	int wrsPtpServoExt;
 };
 
 extern struct wrsPtpDataTable_s wrsPtpDataTable_array[WRS_MAX_N_SERVO_INSTANCES];