diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index eb9474e6709e4b1f618ccb39d6d1d11884a19cc9..2a847b30737f77922eb2a27dbc16df792de1d99e 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -710,6 +710,8 @@ if (ENB_AGENT_SB_IF)
     ${PRPT_MSG_DIR}/stats_common.proto
     ${PRPT_MSG_DIR}/stats_messages.proto
     ${PRPT_MSG_DIR}/time_common.proto
+    ${PRPT_MSG_DIR}/controller_commands.proto
+    ${PRPT_MSG_DIR}/mac_primitives.proto
     )
 
   set(PRPT_C_DIR ${protobuf_generated_dir}/${PRPTDIR})
@@ -722,6 +724,8 @@ if (ENB_AGENT_SB_IF)
     ${PRPT_C_DIR}/stats_common.pb-c.c
     ${PRPT_C_DIR}/stats_messages.pb-c.c
     ${PRPT_C_DIR}/time_common.pb-c.c
+    ${PRPT_C_DIR}/controller_commands.pb-c.c
+    ${PRPT_C_DIR}/mac_primitives.pb-c.c
     )
   
   file(GLOB prpt_h ${PRPT_C_DIR}/*.h)
diff --git a/openair2/ENB_APP/MESSAGES/V2/controller_commands.proto b/openair2/ENB_APP/MESSAGES/V2/controller_commands.proto
new file mode 100644
index 0000000000000000000000000000000000000000..4ef8c0a370b2217549e56f48780a0f2927a82859
--- /dev/null
+++ b/openair2/ENB_APP/MESSAGES/V2/controller_commands.proto
@@ -0,0 +1,58 @@
+package protocol;
+
+import "mac_primitives.proto";
+
+//
+// Body of UE DL MAC scheduling configuration info
+//
+
+message prp_dl_data {
+	optional uint32 rnti = 1;
+	optional prp_dl_dci dl_dci = 2;
+	repeated uint32 ce_bitmap = 3; // list of 2 MAC CEs, one for each TB
+	repeated prp_rlc_pdu rlc_pdu = 4; // list of parameters for the creation of RLC PDUs. One for each lcid
+	optional uint32 serv_cell_index = 5;
+	optional uint32 act_deact_ce = 6; //Hex content of MAC CE for Activation/Deactivation in CA
+}
+
+//
+// Body of the RAR scheduler configuration
+//
+message prp_dl_rar {
+	optional uint32 rnti = 1;
+	optional uint32 grant = 2;	// The 20-bit UL grant. TS 36.213, sec 6.2
+	optional prp_dl_dci rar_dci = 3;
+	optional uint32 carrier_index = 4; // The carrier index for the RAR
+}
+
+//
+// Body of the paging/broadcast configuration message
+//
+
+message prp_dl_broadcast {
+	optional uint32 type = 1;	// The PRBT_* values
+	optional uint32 index = 2;	// Index of the broadcast message:
+		       	       		// 0 - SIB1,
+                                    	// 1..31 - Six,
+                                     	// 32..63 - PCCH (PCCH index obtained from  prp_paging_info)
+	optional prp_dl_dci broad_dci = 3;
+	optional uint32 carrier_index = 4; // Index of the carrier for broadcast
+}
+
+//
+// Body of the OFDM symbol count message
+//
+
+message prp_pdcch_ofdm_sym_count {
+	optional uint32 carrier_index = 1;
+	optional uint32 num_pdcch_ofdm_symbols = 2;
+}
+
+//
+// Types of commands related enums
+//
+
+enum prp_broadcast_type {
+     PRBT_BCCH = 0;
+     PRBT_PCCH = 1;
+}
\ No newline at end of file
diff --git a/openair2/ENB_APP/MESSAGES/V2/header.proto b/openair2/ENB_APP/MESSAGES/V2/header.proto
index 8534d2f304db9ea7daf00dee90d68b0d8365fd7a..10a18ddcef7b095e07dfa5fb4ab534ce02255d99 100644
--- a/openair2/ENB_APP/MESSAGES/V2/header.proto
+++ b/openair2/ENB_APP/MESSAGES/V2/header.proto
@@ -21,5 +21,8 @@ enum prp_type {
 
      //Asynchronous messages
      PRPT_UL_SR_INFO = 6;
+
+     //Controller command messages
+     PRPT_DL_MAC_CONFIG = 7;
 }
 
diff --git a/openair2/ENB_APP/MESSAGES/V2/mac_primitives.proto b/openair2/ENB_APP/MESSAGES/V2/mac_primitives.proto
new file mode 100644
index 0000000000000000000000000000000000000000..4378e6d6682b504f59ca6a5cde0a34839d26edd2
--- /dev/null
+++ b/openair2/ENB_APP/MESSAGES/V2/mac_primitives.proto
@@ -0,0 +1,76 @@
+package protocol;
+
+//
+// Message containing the DL DCI info
+//
+
+message prp_dl_dci {
+	optional uint32 rnti = 1;
+	optional uint32 res_alloc = 2;		// Type of resource allocation
+	optional uint32 rb_bitmap = 3;		// Bitmap for RB allocation
+	optional uint32 rb_shift = 4;		// See TS 36.214, section 7.1.6.2
+	repeated uint32 tbs_size = 5;		// The size of each TBS
+	repeated uint32 mcs = 6;   		// The MCS of each TB
+	repeated uint32 ndi = 7;		// New data indicator of each TB
+	repeated uint32 rv = 8;			// Redundancy version of each TB
+	optional uint32 cce_index = 9;		// CCE index used to send the DCI
+	optional uint32 aggr_level = 10;
+	optional uint32 precoding_info = 11;	// 2 antenna ports:0..6,
+		 			 	// 4 antenna ports:0..50
+	optional uint32 format = 12;		// DCI format. A PRDCIF_* value
+	optional uint32 tpc = 13;		// TS 36.213, sec 5.1.1.1
+	optional uint32 harq_process = 14; 	// HARQ process ID
+	optional uint32 dai = 15;      		// TDD only
+	optional uint32 vrb_format = 16; 	// One of the PRVRBF_* values
+	optional uint32 tb_swap = 17;	 	// Boolean. TB to codeword swap flag
+	optional uint32 sps_release = 18;   	// Flag value
+	optional uint32 pdcch_order = 19;
+	optional uint32 preamble_index = 20;	// Only valid if pdcch_order = 1
+	optional uint32 prach_mask_index = 21;	// Only valid if pdcch_order = 1
+	optional uint32 n_gap = 22;	   	// One of the PRNGV_* values
+	optional uint32 tbs_idx = 23;		// The TBS index for Format 1A
+	optional uint32 dl_power_offset = 24;	// For format 1D
+	optional uint32 pdcch_power_offset = 25; // DL PDCCH power boosting in dB
+	optional uint32 cif_present = 26;    	// Boolean. Indication of CIF field
+	optional uint32 cif = 27;     		// CIF for cross-carrier scheduling
+}
+
+//
+// Messages related to the creation of RLC PDUs
+//
+
+message prp_rlc_pdu {
+	repeated prp_rlc_pdu_tb rlc_pdu_tb = 1; // list of parameters for the creation of RLC PDUs. One for each TB
+}
+
+message prp_rlc_pdu_tb {
+	optional uint32 logical_channel_id = 1;
+	optional uint32 size = 2;	   // Maximum RLC PDU to be created in bytes
+}
+
+//
+// MAC content types related enums
+//
+
+enum prp_dci_format {
+     PRDCIF_1 = 0;
+     PRDCIF_1A = 1;
+     PRDCIF_1B = 2;
+     PRDCIF_1C = 3;
+     PRDCIF_1D = 4;
+     PRDCIF_2 = 5;
+     PRDCIF_2A = 6;
+     PRDCIF_2B = 7;
+     PRDCIF_3 = 8;
+     PRDCIF_3A = 9;
+}
+
+enum prp_vrb_format {
+     PRVRBF_LOCALIZED = 0;
+     PRVRBF_DISTRIBUTED = 1;
+}
+
+enum prp_ngap_val {
+     PRNGV_1 = 0;
+     PRNGV_2 = 1;
+}
\ No newline at end of file
diff --git a/openair2/ENB_APP/MESSAGES/V2/progran.proto b/openair2/ENB_APP/MESSAGES/V2/progran.proto
index 730726aab4617e7b634d2e3d4d8b0e53b4e0c50a..5d0ec15518126a3245d1b1af1add69c190637dd6 100644
--- a/openair2/ENB_APP/MESSAGES/V2/progran.proto
+++ b/openair2/ENB_APP/MESSAGES/V2/progran.proto
@@ -4,6 +4,7 @@ package protocol;
 import "stats_messages.proto";
 import "header.proto";
 import "time_common.proto";
+import "controller_commands.proto";
 
 message progran_message {
        optional progran_direction msg_dir = 100;
@@ -15,6 +16,7 @@ message progran_message {
 	      prp_stats_reply stats_reply_msg = 5;
 	      prp_sf_trigger sf_trigger_msg = 6;
 	      prp_ul_sr_info ul_sr_info_msg = 7;
+	      prp_dl_mac_config dl_mac_config_msg = 8;
 	}
 }
 
@@ -106,6 +108,19 @@ message prp_ul_sr_info {
 	repeated uint32 rnti = 3;
 }
 
+//
+// Controller command messages
+//
+
+message prp_dl_mac_config {
+	optional prp_header header = 1;
+	optional uint32 sfn_sf = 2;
+	repeated prp_dl_data dl_ue_data = 3;
+	repeated prp_dl_rar dl_rar = 4;
+	repeated prp_dl_broadcast dl_broadcast = 5;
+	repeated prp_pdcch_ofdm_sym_count ofdm_sym = 6; // OFDM symbol count for each CC
+}
+
 // Extensions of the echo request and reply
 // messages for carrying a latency value in ms
 message prp_echo_request_latency {