diff --git a/arch-wrs/wrs-startup.c b/arch-wrs/wrs-startup.c
index 4a56212d6c93c25cb57207d40ed99f3c24facda2..8ff6c6523e2e24871d23342b0b33789f350e53e8 100644
--- a/arch-wrs/wrs-startup.c
+++ b/arch-wrs/wrs-startup.c
@@ -307,19 +307,19 @@ int main(int argc, char **argv)
 				break;
 			case PPSI_PROFILE_HA :
 #if CONFIG_HAS_PROFILE_HA
-					if ( !enable_l1Sync(ppi,TRUE) )
-						goto exit_out_of_memory;
-					/* Force mandatory attributes - Do not take care of the configuration */
-					L1E_DSPOR_BS(ppi)->rxCoherentIsRequired =
-							L1E_DSPOR_BS(ppi)->txCoherentIsRequired =
-									L1E_DSPOR_BS(ppi)->congruentIsRequired=
-											L1E_DSPOR_BS(ppi)->L1SyncEnabled=TRUE;
-					L1E_DSPOR_BS(ppi)->optParamsEnabled=FALSE;
-					enable_asymmetryCorrection(ppi,TRUE);
-				}
+				if ( !enable_l1Sync(ppi,TRUE) )
+					goto exit_out_of_memory;
+				/* Force mandatory attributes - Do not take care of the configuration */
+				L1E_DSPOR_BS(ppi)->rxCoherentIsRequired =
+						L1E_DSPOR_BS(ppi)->txCoherentIsRequired =
+								L1E_DSPOR_BS(ppi)->congruentIsRequired=
+										L1E_DSPOR_BS(ppi)->L1SyncEnabled=TRUE;
+				L1E_DSPOR_BS(ppi)->optParamsEnabled=FALSE;
+				enable_asymmetryCorrection(ppi,TRUE);
+
 #else
-					fprintf(stderr, "ppsi: Profile HA not supported");
-					exit(1);
+				fprintf(stderr, "ppsi: Profile HA not supported");
+				exit(1);
 #endif
 				break;
 			case PPSI_PROFILE_PTP :
@@ -331,17 +331,16 @@ int main(int argc, char **argv)
 #if CONFIG_HAS_PROFILE_CUSTOM
 				ppi->protocol_extension=PPSI_EXT_NONE; /* can be changed ...*/
 #if CONFIG_HAS_EXT_L1SYNC
-					if (ppi->cfg.l1SyncEnabled ) {
-						if ( !enable_l1Sync(ppi,TRUE) )
-							goto exit_out_of_memory;
-						/* Read L1SYNC parameters */
-						L1E_DSPOR_BS(ppi)->rxCoherentIsRequired =ppi->cfg.l1SyncRxCoherencyIsRequired;
-						L1E_DSPOR_BS(ppi)->txCoherentIsRequired =ppi->cfg.l1SyncTxCoherencyIsRequired;
-						L1E_DSPOR_BS(ppi)->congruentIsRequired =ppi->cfg.l1SyncCongruencyIsRequired;
-						L1E_DSPOR_BS(ppi)->optParamsEnabled=ppi->cfg.l1SyncOptParamsEnabled;
-						if ( L1E_DSPOR_BS(ppi)->optParamsEnabled ) {
-							L1E_DSPOR_OP(ppi)->timestampsCorrectedTx=ppi->cfg.l1SyncOptParamsTimestampsCorrectedTx;
-						}
+				if (ppi->cfg.l1SyncEnabled ) {
+					if ( !enable_l1Sync(ppi,TRUE) )
+						goto exit_out_of_memory;
+					/* Read L1SYNC parameters */
+					L1E_DSPOR_BS(ppi)->rxCoherentIsRequired =ppi->cfg.l1SyncRxCoherencyIsRequired;
+					L1E_DSPOR_BS(ppi)->txCoherentIsRequired =ppi->cfg.l1SyncTxCoherencyIsRequired;
+					L1E_DSPOR_BS(ppi)->congruentIsRequired =ppi->cfg.l1SyncCongruencyIsRequired;
+					L1E_DSPOR_BS(ppi)->optParamsEnabled=ppi->cfg.l1SyncOptParamsEnabled;
+					if ( L1E_DSPOR_BS(ppi)->optParamsEnabled ) {
+						L1E_DSPOR_OP(ppi)->timestampsCorrectedTx=ppi->cfg.l1SyncOptParamsTimestampsCorrectedTx;
 					}
 				}
 				enable_asymmetryCorrection(ppi,ppi->cfg.asymmetryCorrectionEnable);
diff --git a/proto-ext-l1sync/l1e-hooks.c b/proto-ext-l1sync/l1e-hooks.c
index 97f9d3bcacb615189f762a2f0a62383b8303ec97..0a2ba8fb3e56c6da5142d625389c8f11a97f074f 100644
--- a/proto-ext-l1sync/l1e-hooks.c
+++ b/proto-ext-l1sync/l1e-hooks.c
@@ -86,7 +86,7 @@ static int l1e_init(struct pp_instance *ppi, void *buf, int len)
 	/* Init configuration members of L1SyncOptParamsPortDS */
 	L1E_DSPOR_OP(ppi)->timestampsCorrectedTx=TRUE;
 
-	ppi->ext_enabled=TRUE;
+	ppi->pdstate = PP_PDSTATE_WAIT_MSG;
 	return 0;
 }
 
@@ -104,7 +104,10 @@ static int l1e_handle_signaling(struct pp_instance * ppi, void *buf, int len)
 		pp_timeout_set(ppi, L1E_TIMEOUT_RX_SYNC, l1e_get_rx_tmo_ms(bds));
 
 		bds->L1SyncLinkAlive = TRUE;
-		lstate_enable_extension(ppi);
+		if ( ppi->extState==PP_EXSTATE_PTP ) {
+			// Extension need to be re-enabled
+			pdstate_enable_extension(ppi);
+		}
 	}
 	return 0;
 }
@@ -123,8 +126,10 @@ static int l1e_handle_resp(struct pp_instance *ppi)
 	pp_diag(ppi, ext, 2, "hook: %s\n", __func__);
 
 	/* This correction_field we received is already part of t4 */
-	if ( ppi->ext_enabled ) {
-		l1e_servo_got_resp(ppi);
+	if ( ppi->extState==PP_EXSTATE_ACTIVE ) {
+		wr_servo_got_resp(ppi);
+		if ( ppi->pdstate==PP_PDSTATE_PDETECTED)
+			pdstate_set_state_pdetected(ppi); // Maintain state Protocol detected on MASTER side
 	}
 	else {
 		pp_servo_got_resp(ppi,OPTS(ppi)->ptpFallbackPpsGen);
@@ -132,8 +137,20 @@ static int l1e_handle_resp(struct pp_instance *ppi)
 	return 0;
 }
 
+static int l1e_handle_dreq(struct pp_instance *ppi)
+{
+	pp_diag(ppi, ext, 2, "hook: %s\n", __func__);
+	if ( ppi->extState==PP_EXSTATE_ACTIVE ) {
+		if ( ppi->pdstate==PP_PDSTATE_PDETECTED)
+			pdstate_set_state_pdetected(ppi); // Maintain state Protocol detected on MASTER side
+	}
+
+	return 0;
+}
+
+
 static int  l1e_sync_followup(struct pp_instance *ppi) {
-	if ( ppi->ext_enabled ) {
+	if ( ppi->extState==PP_EXSTATE_ACTIVE ) {
 		l1e_servo_got_sync(ppi);
 	}
 	else {
@@ -159,9 +176,11 @@ static int l1e_handle_sync(struct pp_instance *ppi)
 
 static int l1e_handle_presp(struct pp_instance *ppi)
 {
-	/* FIXME: verify that last-received cField is already accounted for */
-	if ( ppi->ext_enabled )
+	if ( ppi->extState==PP_EXSTATE_ACTIVE ) {
 		l1e_servo_got_presp(ppi);
+		if ( ppi->pdstate==PP_PDSTATE_PDETECTED)
+			pdstate_set_state_pdetected(ppi); // Maintain state Protocol detected on MASTER side
+	}
 	else
 		pp_servo_got_presp(ppi);
 	return 0;
@@ -181,34 +200,38 @@ static 	void l1e_state_change(struct pp_instance *ppi) {
 
 	pp_diag(ppi, ext, 2, "hook: %s\n", __func__);
 
-	if ( !ppi->ext_enabled)
-		return;
-	switch (ppi->next_state) {
-		case PPS_DISABLED :
-			/* In PPSI we go to DISABLE state when the link is down */
-			/* For the time being, it should be done like this because fsm is not called when the link is down */
-			L1E_DSPOR(ppi)->basic.next_state=L1SYNC_DISABLED; /* Force L1Sync DISABLE state */
-			l1e_run_state_machine(ppi,NULL,0);
-			break;
-		case PPS_INITIALIZING :
-			L1E_DSPOR(ppi)->basic.L1SyncState=L1E_DSPOR(ppi)->basic.next_state=L1SYNC_DISABLED;
-			break;
+	if ( ppi->extState==PP_EXSTATE_PTP &&  ppi->next_state==PPS_UNCALIBRATED ) {
+		// Extension need to be re-enabled
+		pdstate_enable_extension(ppi);
 	}
-	if ( ppi->state==PPS_SLAVE && ppi->next_state!=PPS_UNCALIBRATED ) {
-		/* Leave SLAVE state : We must stop the PPS generation */
-		TOPS(ppi)->enable_timing_output(GLBS(ppi),0);
-		WRH_OPER()->locking_reset(ppi);
+	if ( ppi->extState==PP_EXSTATE_ACTIVE ) {
+		switch (ppi->next_state) {
+			case PPS_DISABLED :
+				/* In PPSI we go to DISABLE state when the link is down */
+				/* For the time being, it should be done like this because fsm is not called when the link is down */
+				L1E_DSPOR(ppi)->basic.next_state=L1SYNC_DISABLED; /* Force L1Sync DISABLE state */
+				l1e_run_state_machine(ppi,NULL,0);
+				break;
+			case PPS_INITIALIZING :
+				L1E_DSPOR(ppi)->basic.L1SyncState=L1E_DSPOR(ppi)->basic.next_state=L1SYNC_DISABLED;
+				break;
+		}
+		if ( ppi->state==PPS_SLAVE && ppi->next_state!=PPS_UNCALIBRATED ) {
+			/* Leave SLAVE state : We must stop the PPS generation */
+			TOPS(ppi)->enable_timing_output(GLBS(ppi),0);
+			WRH_OPER()->locking_reset(ppi);
+		}
 	}
 }
 
 static int l1e_new_slave (struct pp_instance *ppi, void *buf, int len) {
-	if ( ppi->ext_enabled )
+	if ( ppi->extState==PP_EXSTATE_ACTIVE )
 		l1e_servo_init(ppi);
 	return 0;
 }
 
 static int l1e_require_precise_timestamp(struct pp_instance *ppi) {
-	return ppi->ext_enabled  ? L1E_DSPOR_BS(ppi)->L1SyncState==L1SYNC_UP : 0;
+	return  ppi->extState==PP_EXSTATE_ACTIVE  ? L1E_DSPOR_BS(ppi)->L1SyncState==L1SYNC_UP : 0;
 }
 
 static int l1e_get_tmo_lstate_detection(struct pp_instance *ppi) {
@@ -217,6 +240,23 @@ static int l1e_get_tmo_lstate_detection(struct pp_instance *ppi) {
 			l1e_get_rx_tmo_ms(L1E_DSPOR_BS(ppi));
 }
 
+static TimeInterval l1e_get_ingress_latency (struct pp_instance *ppi) {
+	return ppi->timestampCorrectionPortDS.ingressLatency;
+}
+
+static TimeInterval l1e_get_egress_latency (struct pp_instance *ppi) {
+	return ppi->timestampCorrectionPortDS.egressLatency;
+}
+
+/* HA extension is compliant with the standard concerning the contents of the correction fields */
+static int l1e_is_correction_field_compliant (struct pp_instance *ppi) {
+	return 1;
+}
+
+static int l1e_extension_state_changed( struct pp_instance * ppi) {
+	return 0;
+}
+
 /* The global structure used by ppsi */
 struct pp_ext_hooks l1e_ext_hooks = {
 	.open = l1e_open,
@@ -225,6 +265,7 @@ struct pp_ext_hooks l1e_ext_hooks = {
 	.run_ext_state_machine = l1e_run_state_machine,
 	.ready_for_slave = l1e_ready_for_slave,
 	.handle_resp = l1e_handle_resp,
+	.handle_dreq = l1e_handle_dreq,
 	.handle_sync = l1e_handle_sync,
 	.handle_followup = l1e_handle_followup,
 	.new_slave = l1e_new_slave,
@@ -234,6 +275,11 @@ struct pp_ext_hooks l1e_ext_hooks = {
 	.state_change = l1e_state_change,
 	.servo_reset= l1e_servo_reset,
 	.require_precise_timestamp=l1e_require_precise_timestamp,
-	.get_tmo_lstate_detection=l1e_get_tmo_lstate_detection
+	.get_tmo_lstate_detection=l1e_get_tmo_lstate_detection,
+	.get_ingress_latency=l1e_get_ingress_latency,
+	.get_egress_latency=l1e_get_egress_latency,
+	.is_correction_field_compliant=l1e_is_correction_field_compliant,
+	.extension_state_changed= l1e_extension_state_changed
+
 };
 
diff --git a/proto-ext-l1sync/l1e-state-machine.c b/proto-ext-l1sync/l1e-state-machine.c
index 0080b6e3fa714570794d93a49b71fb7df62d2432..97893c1394e573a22b2a7192283640b4854e7adb 100644
--- a/proto-ext-l1sync/l1e-state-machine.c
+++ b/proto-ext-l1sync/l1e-state-machine.c
@@ -59,7 +59,7 @@ int l1e_run_state_machine(struct pp_instance *ppi, void *buf, int len) {
 	int *execute_state_machine=&L1E_DSPOR(ppi)->execute_state_machine;
 	int delay;
 
-	if ( !ppi->ext_enabled || ppi->state==PPS_INITIALIZING)
+	if ( ppi->extState!=PP_EXSTATE_ACTIVE || ppi->state==PPS_INITIALIZING)
 		return INT_MAX; /* Return a big delay. fsm will then not use it */
 
 	if ( nextState>=MAX_STATE_ACTIONS)
@@ -281,7 +281,7 @@ static int l1e_handle_state_idle(struct pp_instance *ppi, Boolean new_state){
 	if ( !le1_evt_L1_SYNC_ENABLED(ppi) || le1_evt_L1_SYNC_RESET(ppi) ) {
 		/* Go to DISABLE state */
 		l1e_portDS->basic.next_state=L1SYNC_DISABLED;
-		lstate_set_link_failure(ppi);
+		pdstate_disable_extension(ppi);
 		return 0; /* Treatment required asap */
 	}
 	if ( le1_evt_LINK_OK(ppi) ) {
@@ -379,7 +379,7 @@ static int l1e_handle_state_up(struct pp_instance *ppi, Boolean new_state){
 	if ( !le1_evt_LINK_OK(ppi) ) {
 		/* Go to IDLE state */
 		next_state=L1SYNC_IDLE;
-		lstate_set_link_failure(ppi);
+		pdstate_disable_extension(ppi);
 	}
 	if ( !le1_evt_CONFIG_OK(ppi) ) {
 		/* Return to LINK_ALIVE state */
@@ -397,7 +397,7 @@ static int l1e_handle_state_up(struct pp_instance *ppi, Boolean new_state){
 	}
 
 	/* Iterative treatment */
-	lstate_set_link_established(ppi);
+	pdstate_enable_extension(ppi);
 	wrh_update_correction_values(ppi);
 	l1e_send_sync_msg(ppi,0);
 	return pp_next_delay_2(ppi,L1E_TIMEOUT_TX_SYNC, L1E_TIMEOUT_RX_SYNC); /* Return the shorter timeout */