diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index 2082de7f52771030b60a51c0ab3baa9eb0174bce..abefdca363c196671050d36029606f3c2bb46405 100644
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -1587,7 +1587,6 @@ static inline int wakeup_thread(pthread_mutex_t *mutex,pthread_cond_t *cond,int
     return(-1);
   }
   *instance_cnt = *instance_cnt + 1;
-
   // the thread can now be woken up
   if (pthread_cond_signal(cond) != 0) {
     LOG_E( PHY, "ERROR pthread_cond_signal\n");
diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h
index 1ca8dcda183d75ee77f9fe3c7069510326248470..6745b925da06b8b65a5fa1e41684b61bd6c1dfdd 100644
--- a/openair2/LAYER2/MAC/proto.h
+++ b/openair2/LAYER2/MAC/proto.h
@@ -447,6 +447,14 @@ void ue_decode_p(module_id_t module_idP, int CC_id,frame_t frame, uint8_t CH_ind
 
 void ue_send_sdu(module_id_t module_idP, uint8_t CC_id,frame_t frame, sub_frame_t subframe, uint8_t *sdu,uint16_t sdu_len,uint8_t CH_index);
 
+void ue_send_sl_sdu(module_id_t module_idP,
+		    uint8_t CC_id,
+		    frame_t frameP,
+		    sub_frame_t subframeP,
+		    uint8_t* sdu,
+		    uint16_t sdu_len,
+		    uint8_t eNB_index
+		    );
 
 #if defined(Rel10) || defined(Rel14)
 /* \brief Called by PHY to transfer MCH transport block to ue MAC.
diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c
index f0fef4cf9dc413f99eb235e0e27ca65862523abd..7f10b32366850d1d0141b3d2167727b34650b811 100644
--- a/openair2/LAYER2/MAC/ue_procedures.c
+++ b/openair2/LAYER2/MAC/ue_procedures.c
@@ -741,6 +741,31 @@ void ue_send_mch_sdu(module_id_t module_idP, uint8_t CC_id, frame_t frameP, uint
 #endif
 }
 
+
+void ue_send_sl_sdu(module_id_t module_idP,
+		    uint8_t CC_id,
+		    frame_t frameP,
+		    sub_frame_t subframeP,
+		    uint8_t* sdu,
+		    uint16_t sdu_len,
+		    uint8_t eNB_index
+		    ) {
+
+  mac_rlc_data_ind(
+		   module_idP,
+		   0x1234,
+		   eNB_index,
+		   frameP,
+		   ENB_FLAG_NO,
+		   MBMS_FLAG_NO,
+		   3,
+		   (char *)sdu,
+		   sdu_len,
+		   1,
+		   NULL);
+}
+
+
 int8_t ue_get_mbsfn_sf_alloction (module_id_t module_idP, uint8_t mbsfn_sync_area, unsigned char eNB_index)
 {
   // currently there is one-to-one mapping between sf allocation pattern and sync area
diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c
index b7e80add5de2595c884265090e62a9bd9ee11a9a..2ed153a873769dddb4cec453e2f9ca62b1ca0bd9 100644
--- a/targets/RT/USER/lte-ue.c
+++ b/targets/RT/USER/lte-ue.c
@@ -760,7 +760,8 @@ void ue_stub_rx_handler(unsigned int num_bytes, char *rx_buffer) {
   PHY_VARS_UE *UE;
   UE = PHY_vars_UE_g[0][0];
 
-  LOG_I(PHY,"Received %d bytes on UE-UE link, packet type %d\n",num_bytes,((UE_tport_header_t*)rx_buffer)->packet_type);
+  UE_tport_t *pdu = (UE_tport_t*)rx_buffer;
+  SLSCH_t *slsch = (SLSCH_t*)&pdu->slsch;
 
   switch (((UE_tport_header_t*)rx_buffer)->packet_type) {
   case TTI_SYNC:
@@ -768,6 +769,23 @@ void ue_stub_rx_handler(unsigned int num_bytes, char *rx_buffer) {
     wakeup_thread(&UE->timer_mutex,&UE->timer_cond,&UE->instance_cnt_timer,"timer_thread");
     break;
   case SLSCH:
+    
+    
+    LOG_I(PHY,"Emulator SFN.SF %d.%d, Got SLSCH packet\n",emulator_absSF/10,emulator_absSF%10);
+    LOG_I(PHY,"Received %d bytes on UE-UE link for SFN.SF %d.%d, sending SLSCH payload (%d bytes) to MAC\n",num_bytes,
+	  pdu->header.absSF/10,pdu->header.absSF%10,
+	  slsch->payload_length);
+    printf("SLSCH:");
+    for (int i=0;i<sizeof(SLSCH_t);i++) printf("%x ",((uint8_t*)slsch)[i]);
+    printf("\n");
+    
+    ue_send_sl_sdu(0,
+		   0,
+		   pdu->header.absSF/10,
+		   pdu->header.absSF%10,
+		   pdu->payload,
+		   slsch->payload_length,
+		   0);
     break;
   }
 }
@@ -1498,6 +1516,7 @@ static void* timer_thread( void* param ) {
     timer_subframe = absSFm1%10;
     pthread_mutex_lock(&UE->timer_mutex);
     UE->instance_cnt_timer = -1;
+    pthread_mutex_unlock(&UE->timer_mutex);
     LOG_I(PHY,"Running with external timer\n");
   }
   else LOG_I(PHY,"Running with internal timer\n");
@@ -1514,7 +1533,7 @@ static void* timer_thread( void* param ) {
       timer_subframe++;
     }
     //printf("[timer_thread] Frame: %d, Subframe: %d \n", timer_frame, timer_subframe);
-    LOG_D(MAC," Panos-D [timer_thread] Frame: %d, Subframe: %d \n", timer_frame, timer_subframe);
+    //LOG_I(MAC," Panos-D [timer_thread] Frame: %d, Subframe: %d \n", timer_frame, timer_subframe);
     //AssertFatal( 0 == pthread_cond_signal(&phy_stub_ticking->cond_ticking), "");
     AssertFatal(pthread_mutex_lock(&phy_stub_ticking->mutex_ticking) ==0,"");
     phy_stub_ticking->ticking_var++;
@@ -1544,7 +1563,7 @@ static void* timer_thread( void* param ) {
 				sizeof(UE_tport_header_t));
     
     }
-    else { 
+    else {
       wait_on_condition(&UE->timer_mutex,&UE->timer_cond,&UE->instance_cnt_timer,"timer_thread");
       release_thread(&UE->timer_mutex,&UE->instance_cnt_timer,"timer_thread");
     }
@@ -1587,7 +1606,11 @@ static void* timer_thread( void* param ) {
 }
 
 int init_timer_thread(void) {
+  PHY_VARS_UE *UE=PHY_vars_UE_g[0];
   phy_stub_ticking = (SF_ticking*)malloc(sizeof(SF_ticking));
+  pthread_mutex_init(&UE->timer_mutex,NULL);
+  pthread_mutex_init(&UE->timer_cond,NULL);
+  UE->instance_cnt_timer = -1;
   pthread_mutex_init(&phy_stub_ticking->mutex_ticking,NULL);
   pthread_cond_init(&phy_stub_ticking->cond_ticking,NULL);
   pthread_create(&phy_stub_ticking->pthread_timer, NULL, &timer_thread, NULL);