diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index b82fe37fc6c91b57b9d7eb2478a4fb131b24ce17..4d37307faea8946b60b3a1f6a8272bf362f77bd2 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -384,7 +384,17 @@ void RCconfig_macrlc() {
         printf("**************** RETURNED FROM configure_nfapi_vnf() vnf_port:%d\n", RC.mac[j]->eth_params_s.my_portc);
       } else { // other midhaul
 	AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr));
-      }	
+      }
+      if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr), "default") == 0){
+      	global_scheduler_mode=SCHED_MODE_DEFAULT;
+      	printf("sched mode = default %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
+      }else if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr), "fairRR") == 0){
+      	global_scheduler_mode=SCHED_MODE_FAIR_RR;
+      	printf("sched mode = fairRR %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
+      }else{
+      	global_scheduler_mode=SCHED_MODE_DEFAULT;
+      	printf("sched mode = default %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
+      }
     }// j=0..num_inst
   } else {// MacRLC_ParamList.numelt > 0
 	  AssertFatal (0,
diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h
index 8f32a1206b7b97c97afe1c0a418cb2133f677e1d..a9441dc24508f7ba45f22a67aa440a4abd27571c 100755
--- a/openair2/ENB_APP/enb_paramdef.h
+++ b/openair2/ENB_APP/enb_paramdef.h
@@ -652,6 +652,7 @@ static int DEFENBS[] = {0};
 #define CONFIG_STRING_MACRLC_REMOTE_S_PORTC                "remote_s_portc"
 #define CONFIG_STRING_MACRLC_LOCAL_S_PORTD                 "local_s_portd"
 #define CONFIG_STRING_MACRLC_REMOTE_S_PORTD                "remote_s_portd"
+#define CONFIG_STRING_MACRLC_SCHED_MODE                    "scheduler_mode"
 
 
 /*-------------------------------------------------------------------------------------------------------------------------------------------------------*/
@@ -676,6 +677,7 @@ static int DEFENBS[] = {0};
 {CONFIG_STRING_MACRLC_REMOTE_S_PORTC,                    NULL,     0,          uptr:NULL,           defintval:50020,           TYPE_UINT,     0},        \
 {CONFIG_STRING_MACRLC_LOCAL_S_PORTD,                     NULL,     0,          uptr:NULL,           defintval:50021,           TYPE_UINT,     0},        \
 {CONFIG_STRING_MACRLC_REMOTE_S_PORTD,                    NULL,     0,          uptr:NULL,           defintval:50021,           TYPE_UINT,     0},        \
+{CONFIG_STRING_MACRLC_SCHED_MODE,                        NULL,     0,          strptr:NULL,         defintval:"default",       TYPE_STRING,   0},        \
 }
 #define MACRLC_CC_IDX                                          0
 #define MACRLC_TRANSPORT_N_PREFERENCE_IDX                      1
@@ -694,4 +696,5 @@ static int DEFENBS[] = {0};
 #define MACRLC_REMOTE_S_PORTC_IDX                              14
 #define MACRLC_LOCAL_S_PORTD_IDX                               15
 #define MACRLC_REMOTE_S_PORTD_IDX                              16
+#define MACRLC_SCHED_MODE_IDX                                  17
 /*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c
index 4dadb529ee2296eaaa154b4eb92afe94c3a18af1..95809957b3d5e5b9ff9e4574cf7c76ea3d82f1af 100644
--- a/openair2/LAYER2/MAC/config.c
+++ b/openair2/LAYER2/MAC/config.c
@@ -1021,6 +1021,7 @@ rrc_mac_config_req_eNB(module_id_t Mod_idP,
 
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT);
     }
+    RC.mac[Mod_idP]->scheduler_mode = global_scheduler_mode;
 
     return(0);			   
 }
diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h
index 54fb9254efd412c46ba2e5b82b72ed06d6a6a584..2315d59b8fe5fdec1b8d0f4e27e7203eb2c1ffbd 100644
--- a/openair2/LAYER2/MAC/defs.h
+++ b/openair2/LAYER2/MAC/defs.h
@@ -432,6 +432,12 @@ typedef enum {
     CBA_RS			/// random allocation
 } CBA_POLICY;
 
+/*!\brief  scheduler mode */
+typedef enum {
+    SCHED_MODE_DEFAULT = 0,			/// default cheduler
+    SCHED_MODE_FAIR_RR			/// fair raund robin
+} SCHEDULER_MODES;
+
 
 /*! \brief temporary struct for ULSCH sched */
 typedef struct {
@@ -1138,6 +1144,9 @@ typedef struct eNB_MAC_INST_s {
     time_stats_t schedule_pch;
 
     UE_free_list_t UE_free_list;
+	/// for scheduling selection
+    SCHEDULER_MODES scheduler_mode;
+	
 } eNB_MAC_INST;
 
 /* 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index bb79424c62a932df621902d3cd4206497c6a0ab8..e1e2e48583084c583f9664dc5b11e4bc0eacbc73 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler.c
@@ -793,9 +793,21 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP,
     }
 
 #endif
-#ifdef UE_EXPANSION
-  memset(dlsch_ue_select, 0, sizeof(dlsch_ue_select));
-#endif
+	static int debug_flag=0;
+	void (*schedule_ulsch_p)(module_id_t module_idP, frame_t frameP, sub_frame_t subframe);
+	void (*schedule_ue_spec_p)(module_id_t module_idP, frame_t frameP, sub_frame_t subframe, int *mbsfn_flag);
+	if(RC.mac[module_idP]->scheduler_mode == SCHED_MODE_DEFAULT){
+	  schedule_ulsch_p = schedule_ulsch;
+	  schedule_ue_spec_p = schedule_ue_spec;
+	}else if(RC.mac[module_idP]->scheduler_mode == SCHED_MODE_FAIR_RR){
+      memset(dlsch_ue_select, 0, sizeof(dlsch_ue_select));
+	  schedule_ulsch_p = schedule_ulsch_fairRR;
+	  schedule_ue_spec_p = schedule_ue_spec_fairRR;
+	}
+	if(debug_flag==0){
+		LOG_E(MAC,"SCHED_MODE=%d\n",RC.mac[module_idP]->scheduler_mode);
+		debug_flag=1;
+	}
     // This schedules MIB
     if ((subframeP == 0) && (frameP & 3) == 0)
 	schedule_mib(module_idP, frameP, subframeP);
@@ -809,25 +821,14 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP,
     copy_ulreq(module_idP, frameP, subframeP);
     // This schedules SRS in subframeP
     schedule_SRS(module_idP, frameP, subframeP);
-#ifdef UE_EXPANSION
-    // This schedules ULSCH in subframeP (dci0)
-    schedule_ulsch_fairRR(module_idP, frameP, subframeP);
-#else
     // This schedules ULSCH in subframeP (dci0)
-    schedule_ulsch(module_idP, frameP, subframeP);
-#endif
+    schedule_ulsch_p(module_idP, frameP, subframeP);
     // This schedules UCI_SR in subframeP
     schedule_SR(module_idP, frameP, subframeP);
     // This schedules UCI_CSI in subframeP
     schedule_CSI(module_idP, frameP, subframeP);
-
-#ifdef UE_EXPANSION
     // This schedules DLSCH in subframeP
-    schedule_ue_spec_fairRR(module_idP, frameP, subframeP, mbsfn_status);
-#else
-    // This schedules DLSCH in subframeP
-    schedule_ue_spec(module_idP, frameP, subframeP, mbsfn_status);
-#endif
+    schedule_ue_spec_p(module_idP, frameP, subframeP, mbsfn_status);
     // Allocate CCEs for good after scheduling is done
 
     for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++){
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
index 933c2ffbf2291a4590da4714d355eff9311e2c20..73b14af19b6ea9196101195f9ef124a576da57d0 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
@@ -64,22 +64,7 @@
 #include "SIMULATION/TOOLS/defs.h"	// for taus
 
 #include "T.h"
-#ifdef UE_EXPANSION
-enum SCH_UE_PRIORITY {
-  SCH_PRIORITY_NONE,
-  SCH_DL_SI,
-  SCH_DL_PAGING,
-  SCH_DL_MSG2,
-  SCH_DL_MSG4,
-  SCH_UL_PRACH,
-  SCH_UL_MSG3,
-  SCH_DL_RETRANS,
-  SCH_UL_RETRANS,
-  SCH_DL_FIRST,
-  SCH_UL_FIRST,
-  SCH_UL_INACTIVE
-};
-#endif
+
 extern uint8_t nfapi_mode;
 extern int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req);
 
@@ -596,9 +581,9 @@ generate_Msg2(module_id_t module_idP, int CC_idP, frame_t frameP,
 		TX_req->segments[0].segment_data =
 		    cc[CC_idP].RAR_pdu.payload;
 		mac->TX_req[CC_idP].tx_request_body.number_of_pdus++;
-#ifdef UE_EXPANSION
-        set_dl_ue_select(CC_idP, SCH_DL_MSG2, 4, -1, ra->rnti);
-#endif
+		if(RC.mac[module_idP]->scheduler_mode == SCHED_MODE_FAIR_RR){
+    		set_dl_ue_select_msg2(CC_idP, 4, -1, ra->rnti);
+		}
 	    }
 	}
 
@@ -730,9 +715,9 @@ generate_Msg2(module_id_t module_idP, int CC_idP, frame_t frameP,
 		TX_req->segments[0].segment_data =
 		    cc[CC_idP].RAR_pdu.payload;
 		mac->TX_req[CC_idP].tx_request_body.number_of_pdus++;
-#ifdef UE_EXPANSION
-        set_dl_ue_select(CC_idP, SCH_DL_MSG2, 4, -1, ra->rnti);
-#endif
+		if(RC.mac[module_idP]->scheduler_mode == SCHED_MODE_FAIR_RR){
+    		set_dl_ue_select_msg2(CC_idP, 4, -1, ra->rnti);
+		}
 	    }			// PDCCH CCE allocation is feasible
 	}			// Msg2 frame/subframe condition
     }				// else BL/CE
@@ -1218,9 +1203,9 @@ generate_Msg4(module_id_t module_idP, int CC_idP, frame_t frameP,
 							      UE_id),
 			  rrc_sdu_length);
 		}
-#ifdef UE_EXPANSION
-        set_dl_ue_select(CC_idP, SCH_DL_MSG4, 4, UE_id, ra->rnti);
-#endif
+		if(RC.mac[module_idP]->scheduler_mode == SCHED_MODE_FAIR_RR){
+        	set_dl_ue_select_msg4(CC_idP, 4, UE_id, ra->rnti);
+		}
 	    }			// Msg4 frame/subframe
 	}			// msg4_mpdcch_repetition_count
     }				// rach_resource_type > 0 
@@ -1422,9 +1407,9 @@ generate_Msg4(module_id_t module_idP, int CC_idP, frame_t frameP,
 							      UE_id),
 			  rrc_sdu_length);
 		}
-#ifdef UE_EXPANSION
-        set_dl_ue_select(CC_idP, SCH_DL_MSG4, 4, UE_id, ra->rnti);
-#endif
+		if(RC.mac[module_idP]->scheduler_mode == SCHED_MODE_FAIR_RR){
+        	set_dl_ue_select_msg4(CC_idP, 4, UE_id, ra->rnti);
+		}
 	    }			// CCE Allocation feasible
 	}			// msg4 frame/subframe
     }				// else rach_resource_type
@@ -1568,9 +1553,9 @@ check_Msg4_retransmission(module_id_t module_idP, int CC_idP,
 					    (cc->p_eNB == 1) ? 1 : 2,	// transmission mode
 					    1,	// num_bf_prb_per_subband
 					    1);	// num_bf_vector
-#ifdef UE_EXPANSION
-        set_dl_ue_select(CC_idP, SCH_DL_MSG4, 4, UE_id, ra->rnti);
-#endif
+			if(RC.mac[module_idP]->scheduler_mode == SCHED_MODE_FAIR_RR){
+	        	set_dl_ue_select_msg4(CC_idP, 4, UE_id, ra->rnti);
+			}
 		} else
 		    LOG_D(MAC,
 			  "msg4 retransmission for rnti %x (round %d) fsf %d/%d CCE allocation failed!\n",
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
index 1b8d212cb45df91af225b44ba023b2b4a7b887de..6b6f13dac12d103b935fd62a50d52f41bcdae45e 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
@@ -75,14 +75,20 @@ eNB_UE_STATS pre_scd_eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
 #define DEBUG_HEADER_PARSING 1
 //#define DEBUG_PACKET_TRACE 1
 
-void set_dl_ue_select(int CC_idP, enum SCH_UE_PRIORITY ue_priority,uint16_t nb_rb, int UE_id, rnti_t rnti) {
-  dlsch_ue_select[CC_idP].list[dlsch_ue_select[CC_idP].ue_num].ue_priority = ue_priority;
+void set_dl_ue_select_msg2(int CC_idP, uint16_t nb_rb, int UE_id, rnti_t rnti) {
+  dlsch_ue_select[CC_idP].list[dlsch_ue_select[CC_idP].ue_num].ue_priority = SCH_DL_MSG2;
+  dlsch_ue_select[CC_idP].list[dlsch_ue_select[CC_idP].ue_num].nb_rb = nb_rb;
+  dlsch_ue_select[CC_idP].list[dlsch_ue_select[CC_idP].ue_num].UE_id = UE_id;
+  dlsch_ue_select[CC_idP].list[dlsch_ue_select[CC_idP].ue_num].rnti = rnti;
+  dlsch_ue_select[CC_idP].ue_num++;
+}
+void set_dl_ue_select_msg4(int CC_idP, uint16_t nb_rb, int UE_id, rnti_t rnti) {
+  dlsch_ue_select[CC_idP].list[dlsch_ue_select[CC_idP].ue_num].ue_priority = SCH_DL_MSG4;
   dlsch_ue_select[CC_idP].list[dlsch_ue_select[CC_idP].ue_num].nb_rb = nb_rb;
   dlsch_ue_select[CC_idP].list[dlsch_ue_select[CC_idP].ue_num].UE_id = UE_id;
   dlsch_ue_select[CC_idP].list[dlsch_ue_select[CC_idP].ue_num].rnti = rnti;
   dlsch_ue_select[CC_idP].ue_num++;
 }
-
 #if defined(PRE_SCD_THREAD)
 inline uint16_t search_rbs_required(uint16_t mcs, uint16_t TBS,uint16_t NB_RB, uint16_t step_size){
   uint16_t nb_rb,i_TBS,tmp_TBS;
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.h b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.h
index e79bff83867387865261606ab2cf4ca689bfc311..8c901186098c24b1a861dd208c97f8212c638ef0 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.h
+++ b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.h
@@ -74,7 +74,8 @@ typedef struct {
 } ULSCH_UE_SELECT;
 
 /* proto */
-void set_dl_ue_select(int CC_idP, enum SCH_UE_PRIORITY ue_priority,uint16_t nb_rb, int UE_id, rnti_t rnti);
+void set_dl_ue_select_msg2(int CC_idP, uint16_t nb_rb, int UE_id, rnti_t rnti);
+void set_dl_ue_select_msg4(int CC_idP, uint16_t nb_rb, int UE_id, rnti_t rnti);
 
 void dlsch_scheduler_pre_ue_select_fairRR(
     module_id_t     module_idP,
diff --git a/openair2/LAYER2/MAC/extern.h b/openair2/LAYER2/MAC/extern.h
index 1005b8687ac50782ad5e397f1e897495a0e199de..8f5d55dfd375d56264adac9707a2452acd317d25 100644
--- a/openair2/LAYER2/MAC/extern.h
+++ b/openair2/LAYER2/MAC/extern.h
@@ -106,4 +106,5 @@ extern eNB_UE_STATS pre_scd_eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
 #endif
 
 extern mac_rlc_am_muilist_t rlc_am_mui;
+extern SCHEDULER_MODES global_scheduler_mode;
 #endif //DEF_H
diff --git a/openair2/LAYER2/MAC/vars.h b/openair2/LAYER2/MAC/vars.h
index 65a299ffb7af8db0164acb10847d2900ba3bc53c..51aa3c0112f79508137f3c77eab7e115740017c3 100644
--- a/openair2/LAYER2/MAC/vars.h
+++ b/openair2/LAYER2/MAC/vars.h
@@ -143,4 +143,5 @@ DCI2_5MHz_2A_TDD_t DLSCH_alloc_pdu2;
 DCI1E_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu1E;
 
 mac_rlc_am_muilist_t rlc_am_mui;
+SCHEDULER_MODES global_scheduler_mode;
 #endif