diff --git a/openair2/COMMON/e1ap_messages_types.h b/openair2/COMMON/e1ap_messages_types.h
index c1e1c9964ba6cb1a2b1691ab3cffa5d1500febfe..ae76103321548f57064418f61f15656cd973e4f5 100644
--- a/openair2/COMMON/e1ap_messages_types.h
+++ b/openair2/COMMON/e1ap_messages_types.h
@@ -125,7 +125,11 @@ typedef struct pdu_session_to_setup_s {
   long integrityProtectionIndication;
   long confidentialityProtectionIndication;
   in_addr_t tlAddress;
+  in_addr_t tlAddress_dl;
   int32_t teId;
+  int32_t teId_dl;
+  int tl_port;
+  int tl_port_dl;
   long numDRB2Setup;
   DRB_nGRAN_to_setup_t DRBnGRanList[E1AP_MAX_NUM_NGRAN_DRB];
 } pdu_session_to_setup_t;
diff --git a/openair2/F1AP/f1ap_cu_task.c b/openair2/F1AP/f1ap_cu_task.c
index df48d7ba4287cf012a253841282ba72319f6f83f..d8ce0c7868937f3eb988b28a19f5f56ba9a5df89 100644
--- a/openair2/F1AP/f1ap_cu_task.c
+++ b/openair2/F1AP/f1ap_cu_task.c
@@ -186,7 +186,7 @@ void *F1AP_CU_task(void *arg) {
       case F1AP_UE_CONTEXT_MODIFICATION_REQ:
         LOG_I(F1AP, "CU Task received F1AP_UE_CONTEXT_MODIFICATION_REQ\n");
         CU_send_UE_CONTEXT_MODIFICATION_REQUEST(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
-                                                &F1AP_UE_CONTEXT_MODIFICATION_REQ(received_msg));
+                                                &F1AP_UE_CONTEXT_SETUP_REQ(received_msg));
         break;
 
       case F1AP_UE_CONTEXT_RELEASE_CMD: // from rrc
diff --git a/openair2/F1AP/f1ap_cu_ue_context_management.c b/openair2/F1AP/f1ap_cu_ue_context_management.c
index cf8d4ce260cf262ef9c9428a080d76191405a177..0b058233b52108cab4f3bbf82d02ef2f8fb79b70 100644
--- a/openair2/F1AP/f1ap_cu_ue_context_management.c
+++ b/openair2/F1AP/f1ap_cu_ue_context_management.c
@@ -1483,22 +1483,6 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context
 
       /* 12.1.3 uLUPTNLInformation_ToBeSetup_List */
       for (int j = 0; j < f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) {
-        /*Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU*/
-        transport_layer_addr_t addr;
-        int sz=sizeof(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address);
-        memcpy(addr.buffer,&f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz);
-        addr.length = sz*8;
-
-        f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].teid = newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst,
-                                                                                                      f1ap_ue_context_modification_req->rnti,
-                                                                                                      f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id,
-                                                                                                      f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id,
-                                                                                                      0xFFFF, // We will set the right value from DU answer
-                                                                                                      -1, // no qfi
-                                                                                                      addr,
-                                                                                                      f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].port,
-                                                                                                      cu_f1u_data_req,
-                                                                                                      NULL);
         /*  12.3.1 ULTunnels_ToBeSetup_Item */
         asn1cSequenceAdd(drbs_toBeSetupMod_item->uLUPTNLInformation_ToBeSetup_List.list,
                        F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index 43c84a51f79929c89ad1118342eb31cdb308fa13..26f7835513f00e5bdfca328176bb23a648405207 100755
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -101,6 +101,7 @@
 #include <openair2/RRC/NR/nr_rrc_proto.h>
 #include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
 #include "openair2/LAYER2/nr_pdcp/nr_pdcp_e1_api.h"
+#include "openair2/F1AP/f1ap_common.h"
 
 #include "BIT_STRING.h"
 #include "assertions.h"
@@ -4057,17 +4058,49 @@ int drb_config_gtpu_create_e1(e1ap_bearer_setup_req_t *req,
   return ret;
 }
 
-int rrc_gNB_process_e1_bearer_context_setup_req(e1ap_bearer_setup_req_t *req, instance_t instance) {
+void gNB_CU_create_up_ul_tunnel(e1ap_bearer_setup_resp_t *resp,
+                                e1ap_bearer_setup_req_t *req,
+                                instance_t instance,
+                                ue_id_t ue_id) {
+
+  for (int i=0; i < req->numPDUSessions; i++) {
+    pdu_session_to_setup_t *pdu = req->pduSession + i;
+
+    transport_layer_addr_t addr;
+    int size = sizeof(pdu->tlAddress_dl);
+    memcpy(addr.buffer,
+           &pdu->tlAddress_dl,
+           size);
+    addr.length = size * 8;
+
+    resp->pduSession[i].tlAddress = pdu->tlAddress;
+    resp->pduSession[i].teId = newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst,
+                                                   ue_id,
+                                                   pdu->DRBnGRanList[0].id,
+                                                   pdu->DRBnGRanList[0].id,
+                                                   0xFFFF, // We will set the right value from DU answer
+                                                   -1, // no qfi
+                                                   addr,
+                                                   pdu->tl_port_dl,
+                                                   cu_f1u_data_req,
+                                                   NULL);
+  }
+}
+
+void rrc_gNB_process_e1_bearer_context_setup_req(e1ap_bearer_setup_req_t *req, instance_t instance) {
 
   gtpv1u_gnb_create_tunnel_req_t  create_tunnel_req={0};
   gtpv1u_gnb_create_tunnel_resp_t create_tunnel_resp={0};
 
-  int ret = drb_config_gtpu_create_e1(req, &create_tunnel_req, &create_tunnel_resp, instance);
+  // GTP tunnel for UL
+  drb_config_gtpu_create_e1(req, &create_tunnel_req, &create_tunnel_resp, instance);
 
   MessageDef *message_p;
   message_p = itti_alloc_new_message (TASK_RRC_GNB, instance, E1AP_BEARER_CONTEXT_SETUP_RESP);
   e1ap_bearer_setup_resp_t *resp = &E1AP_BEARER_CONTEXT_SETUP_RESP(message_p);
 
+  gNB_CU_create_up_ul_tunnel(resp, req, instance, req->gNB_cu_cp_ue_id);
+
   resp->gNB_cu_cp_ue_id = req->gNB_cu_cp_ue_id;
   resp->numPDUSessions = req->numPDUSessions;
   for (int i=0; i < req->numPDUSessions; i++) {
@@ -4107,11 +4140,11 @@ int rrc_gNB_process_e1_bearer_context_setup_req(e1ap_bearer_setup_req_t *req, in
   }
 
   itti_send_msg_to_task(TASK_CUUP_E1, instance, message_p);
-
-  return ret;
 }
 
-void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_context_p) {
+void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_context_p,
+                                                 e1ap_bearer_setup_resp_t *e1ap_resp,
+                                                 e1ap_bearer_setup_req_t *e1ap_req) {
 
   /*Generate a UE context modification request message towards the DU to instruct the DU
    *for SRB2 and DRB configuration and get the updates on master cell group config from the DU*/
@@ -4121,7 +4154,7 @@ void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_contex
   // TODO: So many hard codings
   MessageDef *message_p;
   message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_MODIFICATION_REQ);
-  f1ap_ue_context_setup_t *req=&F1AP_UE_CONTEXT_MODIFICATION_REQ (message_p);
+  f1ap_ue_context_setup_t *req=&F1AP_UE_CONTEXT_SETUP_REQ (message_p);
   req->rnti             = ue_context_p->ue_context.rnti;
   req->mcc              = RC.nrrrc[ctxt.module_id]->configuration.mcc[0];
   req->mnc              = RC.nrrrc[ctxt.module_id]->configuration.mnc[0];
@@ -4136,18 +4169,20 @@ void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_contex
   SRBs[0].lcid = 2;
 
   /*Instruction towards the DU for DRB configuration and tunnel creation*/
-  req->drbs_to_be_setup = malloc(1*sizeof(f1ap_drb_to_be_setup_t));
-  req->drbs_to_be_setup_length = 1;
-  f1ap_drb_to_be_setup_t *DRBs=req->drbs_to_be_setup;
-  LOG_D(RRC, "Length of DRB list:%d \n", req->drbs_to_be_setup_length);
-  DRBs[0].drb_id = 1;
-  DRBs[0].rlc_mode = RLC_MODE_AM;
-  DRBs[0].up_ul_tnl[0].tl_address = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.my_addr);
-  DRBs[0].up_ul_tnl[0].port=RC.nrrrc[ctxt.module_id]->eth_params_s.my_portd;
-  DRBs[0].up_ul_tnl_length = 1;
-  DRBs[0].up_dl_tnl[0].tl_address = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.remote_addr);
-  DRBs[0].up_dl_tnl[0].port=RC.nrrrc[ctxt.module_id]->eth_params_s.remote_portd;
-  DRBs[0].up_dl_tnl_length = 1;
+  req->drbs_to_be_setup_length = e1ap_req->numPDUSessions;
+  req->drbs_to_be_setup = malloc(1*sizeof(f1ap_drb_to_be_setup_t)*req->drbs_to_be_setup_length);
+  for (int i=0; i < e1ap_req->numPDUSessions; i++) {
+    f1ap_drb_to_be_setup_t *DRBs =  req->drbs_to_be_setup + i;
+    DRBs[i].drb_id = e1ap_req->pduSession[i].DRBnGRanList[0].id;
+    DRBs[i].rlc_mode = RLC_MODE_AM;
+    DRBs[i].up_ul_tnl[0].tl_address = e1ap_req->pduSession[i].tlAddress;
+    DRBs[i].up_ul_tnl[0].port = e1ap_req->pduSession[i].tl_port;
+    DRBs[i].up_ul_tnl[0].teid = e1ap_resp->pduSession[i].teId;
+    DRBs[i].up_ul_tnl_length = 1;
+    DRBs[i].up_dl_tnl[0].tl_address = e1ap_req->pduSession[i].tlAddress_dl;
+    DRBs[i].up_dl_tnl[0].port = e1ap_req->pduSession[i].tl_port_dl;
+    DRBs[i].up_dl_tnl_length = 1;
+  }
 
   itti_send_msg_to_task (TASK_CU_F1, ctxt.module_id, message_p);
 }
@@ -4160,6 +4195,8 @@ void bearer_context_setup_direct(e1ap_bearer_setup_req_t *req, instance_t instan
   PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, GNB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0, 0);
 
   fill_DRB_configList(&ctxt, ue_context_p);
+
+  // GTP tunnel for UL
   int ret = drb_config_gtpu_create(&ctxt,
                                    ue_context_p,
                                    req,
@@ -4171,7 +4208,19 @@ void bearer_context_setup_direct(e1ap_bearer_setup_req_t *req, instance_t instan
   if(!NODE_IS_CU(RC.nrrrc[ctxt.module_id]->node_type)){
     rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p, NULL);
   } else {
-    prepare_and_send_ue_context_modification_f1(ue_context_p);
+    for (int i=0; i < req->numPDUSessions; i++) {
+      pdu_session_to_setup_t *pdu = req->pduSession + i;
+
+      pdu->tlAddress    = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.my_addr);
+      pdu->tl_port       = RC.nrrrc[ctxt.module_id]->eth_params_s.my_portd;
+      pdu->tlAddress_dl = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.remote_addr);
+      pdu->tl_port_dl    = RC.nrrrc[ctxt.module_id]->eth_params_s.remote_portd;
+    }
+
+    e1ap_bearer_setup_resp_t resp; // Used to store teids
+    gNB_CU_create_up_ul_tunnel(&resp, req, instance, ue_context_p->ue_context.rnti);
+
+    prepare_and_send_ue_context_modification_f1(ue_context_p, &resp, req);
   }
   // call the code that sends UE context modification message to DU
 }
@@ -4217,7 +4266,21 @@ void rrc_gNB_process_e1_bearer_context_setup_resp(e1ap_bearer_setup_resp_t *resp
 
   ue_context_p->ue_context.setup_pdu_sessions += resp->numPDUSessions;
 
-  prepare_and_send_ue_context_modification_f1(ue_context_p);
+  // TODO: SV: combine e1ap_bearer_setup_req_t and e1ap_bearer_setup_resp_t and minimize assignments
+  e1ap_bearer_setup_req_t req;
+  req.numPDUSessions = resp->numPDUSessions;
+  for (int i=0; i < resp->numPDUSessions; i++) {
+    pdu_session_to_setup_t *pdu = req.pduSession + i;
+
+    pdu->DRBnGRanList[0].id = resp->pduSession[i].DRBnGRanList[0].id;
+
+    pdu->tlAddress    = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.my_addr);
+    pdu->tl_port       = RC.nrrrc[ctxt.module_id]->eth_params_s.my_portd;
+    pdu->tlAddress_dl = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.remote_addr);
+    pdu->tl_port_dl    = RC.nrrrc[ctxt.module_id]->eth_params_s.remote_portd;
+
+  }
+  prepare_and_send_ue_context_modification_f1(ue_context_p, resp, &req);
 }
 
 ///---------------------------------------------------------------------------------------------------------------///