diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 32dca26a45b1ec10627452e81ee35a883fbd8996..95ec330055357dcbcef59ae610dc399a89438d23 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -206,6 +206,7 @@ int oaisim_flag=0;
 int emulate_rf = 0;
 
 tpool_t *Tpool;
+tpool_t *Tpool_dl;
 
 char *usrp_args=NULL;
 
@@ -672,8 +673,12 @@ int main( int argc, char **argv ) {
   set_taus_seed (0);
   tpool_t pool;
   Tpool = &pool;
-  char params[]="-1,-1"; 
+  char params[]="-1,-1,-1"; 
   initTpool(params, Tpool, false);
+  tpool_t pool_dl;
+  Tpool_dl = &pool_dl;
+  char params_dl[]="-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1"; 
+  initTpool(params_dl, Tpool_dl, false);
   cpuf=get_cpu_freq_GHz();
   itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info);
 
diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h
index 2434a1c23cdad3fcb99997ddc1a058d56cc0b805..cad8e726f404d8ef40bac9643b6c6fd11707e892 100644
--- a/executables/nr-uesoftmodem.h
+++ b/executables/nr-uesoftmodem.h
@@ -103,4 +103,5 @@ extern void print_opp_meas(void);
 void *UE_thread(void *arg);
 PHY_VARS_NR_UE *init_nr_ue_vars(NR_DL_FRAME_PARMS *frame_parms, uint8_t UE_id, uint8_t abstraction_flag);
 extern tpool_t *Tpool;
+extern tpool_t *Tpool_dl;
 #endif
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 6a277cdc425d32d4c0ac728a0eddcaee8dff25f5..c1ccaf2f1ee59f4fb1c294762e620b1730cd10e4 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -531,7 +531,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
 
       //LOG_E(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d A %d ",frame%1024,nr_tti_rx,r,harq_process->C-1, A);
 
-      //printf("harq process dr iteration %d\n", p_decParams->numMaxIter);
+      printf("harq process dr iteration %d\n", p_decParams->numMaxIter);
 
       memset(pv,0,2*harq_process->Z*sizeof(int16_t));
       //memset(pl,0,2*p_decParams->Z*sizeof(int8_t));
@@ -570,7 +570,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
         ret = no_iteration_ldpc;
       }
       else {
-        printf("\x1B[33m" "CRC NOK\n\033[0m");
+        printf("\x1B[33m" "Segment %d CRC NOK\n",r);
         ret = 1 + dlsch->max_ldpc_iterations;
       }
 
@@ -943,7 +943,7 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
   opp_enabled=1;
   if (harq_process->C>1) {
 	for (int nb_seg =1 ; nb_seg<harq_process->C; nb_seg++){
-	  if ( (res=tryPullTpool(&nf, Tpool)) != NULL ) {
+	  if ( (res=tryPullTpool(&nf, Tpool_dl)) != NULL ) {
 	          pushNotifiedFIFO_nothreadSafe(&freeBlocks,res);
 	        }
 
@@ -961,7 +961,7 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
 	  curMsg->proc.llr8_flag = llr8_flag;
 
 	  msgToPush->key=nb_seg;
-	  pushTpool(Tpool, msgToPush);
+	  pushTpool(Tpool_dl, msgToPush);
 
   /*Qm= harq_process->Qm;
     Nl=harq_process->Nl;
@@ -1112,7 +1112,7 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
 #if UE_TIMING_TRACE
       start_meas(dlsch_turbo_decoding_stats);
 #endif
-      LOG_D(PHY,"mthread AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,nr_tti_rx,r,harq_process->C-1);
+      LOG_I(PHY,"mthread AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,nr_tti_rx,r,harq_process->C-1);
 
       /*for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){
         inv_d[cnt] = (1)*harq_process->d[r][cnt];
@@ -1689,7 +1689,7 @@ void *nr_dlsch_decoding_process(void *arg)
           ret = 2;
         }
         else {
-          printf("CRC NOK\n");
+          printf("Segment %d CRC NOK\n",r);
           ret = 1+dlsch->max_ldpc_iterations;
         }
 
@@ -1757,7 +1757,7 @@ void *dlsch_thread(void *arg) {
     notifiedFIFO_elt_t *res;
 
     while (nbDlProcessing >= RX_NB_TH_DL) {
-      if ( (res=tryPullTpool(&nf, Tpool)) != NULL ) {
+      if ( (res=tryPullTpool(&nf, Tpool_dl)) != NULL ) {
         nr_rxtx_thread_data_t *tmp=(nr_rxtx_thread_data_t *)res->msgData;
         nbDlProcessing--;
         pushNotifiedFIFO_nothreadSafe(&freeBlocks,res);
diff --git a/openair1/PHY/defs_common.h b/openair1/PHY/defs_common.h
index 811ae17e7121fa5577fcc4101c5724af0c9f4e8e..d0086969295afba8cb0fc1bd8508d5d59185fe0d 100644
--- a/openair1/PHY/defs_common.h
+++ b/openair1/PHY/defs_common.h
@@ -76,9 +76,9 @@
 
 #include "defs_RU.h"
 
-#define RX_NB_TH_MAX 2
-#define RX_NB_TH 2
-#define RX_NB_TH_DL 2
+#define RX_NB_TH_MAX 3
+#define RX_NB_TH 3
+#define RX_NB_TH_DL 12
 
 #define LTE_SLOTS_PER_SUBFRAME 2
 
diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h
index 8e42149addc9dfd4b3a0e9276946f3bdcf391f00..cd61302304d36692f39f22bba0ddca8370851155 100644
--- a/openair1/SCHED_NR_UE/defs.h
+++ b/openair1/SCHED_NR_UE/defs.h
@@ -44,7 +44,7 @@
 #define OPENAIR_THREAD_STACK_SIZE     PTHREAD_STACK_MIN //4096 //RTL_PTHREAD_STACK_MIN*6
 //#define DLC_THREAD_STACK_SIZE        4096 //DLC stack size
 //#define UE_SLOT_PARALLELISATION
-//#define UE_DLSCH_PARALLELISATION
+#define UE_DLSCH_PARALLELISATION
 
 /*enum openair_SCHED_STATUS {
   openair_SCHED_STOPPED=1,