diff --git a/openair2/F1AP/f1ap_du_ue_context_management.c b/openair2/F1AP/f1ap_du_ue_context_management.c
index fbe838871415710e1fcd8b26950111e837292d37..4c119dd8ad3787d4703df1070a5b0cb7649ac788 100644
--- a/openair2/F1AP/f1ap_du_ue_context_management.c
+++ b/openair2/F1AP/f1ap_du_ue_context_management.c
@@ -35,6 +35,7 @@
 #include "f1ap_decoder.h"
 #include "f1ap_itti_messaging.h"
 #include "f1ap_du_ue_context_management.h"
+#include "openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h"
 
 #include "rrc_extern.h"
 #include "openair2/RRC/NR/rrc_gNB_UE_context.h"
@@ -65,13 +66,13 @@ bool lteDURecvCb(protocol_ctxt_t  *ctxt_pP,
 int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t       instance,
                                        uint32_t         assoc_id,
                                        uint32_t         stream,
-                                       F1AP_F1AP_PDU_t *pdu) {
-  MessageDef                      *msg_p; // message to RRC
+                                       F1AP_F1AP_PDU_t *pdu)
+{
   F1AP_UEContextSetupRequest_t    *container;
   int i;
   DevAssert(pdu);
-  msg_p = itti_alloc_new_message(TASK_DU_F1, 0,  F1AP_UE_CONTEXT_SETUP_REQ);
-  f1ap_ue_context_setup_t *f1ap_ue_context_setup_req = &F1AP_UE_CONTEXT_SETUP_REQ(msg_p);
+  f1ap_ue_context_setup_t ue_context_setup = {0};
+  f1ap_ue_context_setup_t *f1ap_ue_context_setup_req = &ue_context_setup;
   container = &pdu->choice.initiatingMessage->value.choice.UEContextSetupRequest;
   /* GNB_CU_UE_F1AP_ID */
   F1AP_UEContextSetupRequestIEs_t *ieCU;
@@ -224,8 +225,7 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t       instance,
     LOG_W(F1AP, "can't find RRCContainer in UEContextSetupRequestIEs by id %ld \n", F1AP_ProtocolIE_ID_id_RRCContainer);
   }
 
-  itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p);
-
+  ue_context_setup_request(f1ap_ue_context_setup_req);
   return 0;
 }
 
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
index 0a47699591de0670766db89972f695578a541e14..838c68fcb6c809d4f9981c90d78de900b0fbaa6d 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
@@ -19,6 +19,8 @@
  *      contact@openairinterface.org
  */
 
+#include <stdlib.h>
+
 #include "mac_rrc_dl_handler.h"
 
 #include "mac_proto.h"
@@ -29,6 +31,12 @@
 #include "NR_DL-CCCH-Message.h"
 #include "NR_CellGroupConfig.h"
 
+void ue_context_setup_request(const f1ap_ue_context_setup_t *req)
+{
+  (void) req;
+  abort();
+}
+
 int dl_rrc_message(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc)
 {
   LOG_I(NR_MAC, "DL RRC Message Transfer with %d bytes for RNTI %04x SRB %d\n", dl_rrc->rrc_container_length, dl_rrc->rnti, dl_rrc->srb_id);
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h
index ecbc95eef07190ea4fee1976f2a953c4e3040894..25b51c2d845924eda11e211943f71d66fd894c90 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h
@@ -25,6 +25,8 @@
 #include "platform_types.h"
 #include "f1ap_messages_types.h"
 
+void ue_context_setup_request(const f1ap_ue_context_setup_t *req);
+
 int dl_rrc_message(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc);
 
 #endif /* MAC_RRC_DL_HANDLER_H */
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h
index cb80ba4fa55c1f5c3a6ba9df5e6a41b546a3a850..53736a1695145c0a7f5c1b6f870712251e86dfb4 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h
@@ -25,6 +25,8 @@
 #include "platform_types.h"
 #include "f1ap_messages_types.h"
 
+typedef void (*ue_context_setup_response_func_t)(const f1ap_ue_context_setup_t* req, const f1ap_ue_context_setup_t *resp);
+
 typedef void (*initial_ul_rrc_message_transfer_func_t)(module_id_t module_id, const f1ap_initial_ul_rrc_message_t *ul_rrc);
 
 struct nr_mac_rrc_ul_if_s;
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
index ace8b17f4912d7e14f7dacc719fc4d5b1e4aaab0..5402b03000d44dba7a33cab41a716800a996abda 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
@@ -24,6 +24,12 @@
 
 #include "mac_rrc_ul.h"
 
+static void ue_context_setup_response_direct(const f1ap_ue_context_setup_t *req, const f1ap_ue_context_setup_t *resp)
+{
+  (void) req; /* we don't need the request -- it is to set up GTP in F1 case */
+  AssertFatal(false, "not implemented\n");
+}
+
 static void initial_ul_rrc_message_transfer_direct(module_id_t module_id, const f1ap_initial_ul_rrc_message_t *ul_rrc)
 {
   MessageDef *msg = itti_alloc_new_message(TASK_MAC_GNB, 0, F1AP_INITIAL_UL_RRC_MESSAGE);
@@ -46,5 +52,6 @@ static void initial_ul_rrc_message_transfer_direct(module_id_t module_id, const
 
 void mac_rrc_ul_direct_init(struct nr_mac_rrc_ul_if_s *mac_rrc)
 {
+  mac_rrc->ue_context_setup_response = ue_context_setup_response_direct;
   mac_rrc->initial_ul_rrc_message_transfer = initial_ul_rrc_message_transfer_direct;
 }
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
index 13547c5291ed0314e6cdaffa3de5a0409a45d660..4e175ad68e647f251d47d31eb538b1a9e8c88067 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
@@ -24,6 +24,13 @@
 
 #include "mac_rrc_ul.h"
 
+static void ue_context_setup_response_f1ap(const f1ap_ue_context_setup_t *req, const f1ap_ue_context_setup_t *resp)
+{
+  AssertFatal(false, "not implemented\n");
+
+  /* TODO: set up GTP tunnel for DL, and fill UL TEID in resp */
+}
+
 static void initial_ul_rrc_message_transfer_f1ap(module_id_t module_id, const f1ap_initial_ul_rrc_message_t *ul_rrc)
 {
   MessageDef *msg = itti_alloc_new_message(TASK_MAC_GNB, 0, F1AP_INITIAL_UL_RRC_MESSAGE);
@@ -46,6 +53,7 @@ static void initial_ul_rrc_message_transfer_f1ap(module_id_t module_id, const f1
 
 void mac_rrc_ul_f1ap_init(struct nr_mac_rrc_ul_if_s *mac_rrc)
 {
+  mac_rrc->ue_context_setup_response = ue_context_setup_response_f1ap;
   mac_rrc->initial_ul_rrc_message_transfer = initial_ul_rrc_message_transfer_f1ap;
 }
 
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index 9f28ffe546d500fb09aaf9e9893052885868673c..5f25713650a7ec1a3f8fcdf49c2c2b29d8e36b1b 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -660,6 +660,7 @@ typedef struct NR_bler_options {
 
 typedef struct nr_mac_rrc_ul_if_s {
   /* TODO add other message types as necessary */
+  ue_context_setup_response_func_t ue_context_setup_response;
   initial_ul_rrc_message_transfer_func_t initial_ul_rrc_message_transfer;
 } nr_mac_rrc_ul_if_t;
 
diff --git a/openair2/RRC/NR/mac_rrc_dl.h b/openair2/RRC/NR/mac_rrc_dl.h
index 1943490cd6accb206de4cda7a66ab2c9f2409079..49ffccd4a7e6ba1a2d16b905bf65a50493f89b84 100644
--- a/openair2/RRC/NR/mac_rrc_dl.h
+++ b/openair2/RRC/NR/mac_rrc_dl.h
@@ -25,6 +25,8 @@
 #include "platform_types.h"
 #include "f1ap_messages_types.h"
 
+typedef void (*ue_context_setup_request_func_t)(const f1ap_ue_context_setup_t *req);
+
 typedef void (*dl_rrc_message_transfer_func_t)(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc);
 
 struct nr_mac_rrc_dl_if_s;
diff --git a/openair2/RRC/NR/mac_rrc_dl_direct.c b/openair2/RRC/NR/mac_rrc_dl_direct.c
index 5c8d9d9d5bd1b759a8a0e3997986afc695539b8c..be416d69215a9c4002603a2cc5187f1a17d9f0eb 100644
--- a/openair2/RRC/NR/mac_rrc_dl_direct.c
+++ b/openair2/RRC/NR/mac_rrc_dl_direct.c
@@ -33,5 +33,6 @@ static void dl_rrc_message_transfer_direct(module_id_t module_id, const f1ap_dl_
 
 void mac_rrc_dl_direct_init(nr_mac_rrc_dl_if_t *mac_rrc)
 {
+  mac_rrc->ue_context_setup_request = ue_context_setup_request;
   mac_rrc->dl_rrc_message_transfer = dl_rrc_message_transfer_direct;
 }
diff --git a/openair2/RRC/NR/mac_rrc_dl_f1ap.c b/openair2/RRC/NR/mac_rrc_dl_f1ap.c
index 40f3b4b6eaa70bc170ce3c112c854b7bb5ba3327..7030babd1eabac2af733e0796307fafe4dd87da0 100644
--- a/openair2/RRC/NR/mac_rrc_dl_f1ap.c
+++ b/openair2/RRC/NR/mac_rrc_dl_f1ap.c
@@ -19,9 +19,17 @@
  *      conmnc_digit_lengtht@openairinterface.org
  */
 
+#include <stdlib.h>
+
 #include "mac_rrc_dl.h"
 #include "nr_rrc_defs.h"
 
+static void ue_context_setup_request_f1ap(const f1ap_ue_context_setup_t *req)
+{
+  (void) req;
+  abort();
+}
+
 static void dl_rrc_message_transfer_f1ap(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc)
 {
   /* TODO call F1AP function directly? no real-time constraint here */
@@ -40,5 +48,6 @@ static void dl_rrc_message_transfer_f1ap(module_id_t module_id, const f1ap_dl_rr
 
 void mac_rrc_dl_f1ap_init(nr_mac_rrc_dl_if_t *mac_rrc)
 {
+  mac_rrc->ue_context_setup_request = ue_context_setup_request_f1ap;
   mac_rrc->dl_rrc_message_transfer = dl_rrc_message_transfer_f1ap;
 }
diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h
index 93acdeac7bd94c681b9e959f20066849cfcf49f2..942e9ffb1f1889c9e05b3eb5301c20b63942bfb4 100644
--- a/openair2/RRC/NR/nr_rrc_defs.h
+++ b/openair2/RRC/NR/nr_rrc_defs.h
@@ -481,6 +481,7 @@ typedef struct {
 
 typedef struct nr_mac_rrc_dl_if_s {
   /* TODO add other message types as necessary */
+  ue_context_setup_request_func_t ue_context_setup_request;
   dl_rrc_message_transfer_func_t dl_rrc_message_transfer;
 } nr_mac_rrc_dl_if_t;