diff --git a/openair3/RAL-LTE/LTE_RAL_ENB/INCLUDE/lteRALenb_proto.h b/openair3/RAL-LTE/LTE_RAL_ENB/INCLUDE/lteRALenb_proto.h
index e5df410d6e5e295c4c972949cd21c7e773bb1409..124abde57bda3eead9ec022b9b03cb37fe36f92f 100755
--- a/openair3/RAL-LTE/LTE_RAL_ENB/INCLUDE/lteRALenb_proto.h
+++ b/openair3/RAL-LTE/LTE_RAL_ENB/INCLUDE/lteRALenb_proto.h
@@ -73,5 +73,6 @@ int eRALlte_process_map_qos(int mt_ix, int ch_ix);
 void RAL_printInitStatus(void);
 void RAL_NAS_measures_polling(void);
 void RAL_NAS_measures_analyze(void);
+void RAL_NAS_report_congestion(int ix);
 #endif
 
diff --git a/openair3/RAL-LTE/LTE_RAL_ENB/INCLUDE/lteRALenb_variables.h b/openair3/RAL-LTE/LTE_RAL_ENB/INCLUDE/lteRALenb_variables.h
index ae975288bf975b1203d359f15fc727e75819317d..646511e18f290a35c44307c62e56cbe95b646a00 100755
--- a/openair3/RAL-LTE/LTE_RAL_ENB/INCLUDE/lteRALenb_variables.h
+++ b/openair3/RAL-LTE/LTE_RAL_ENB/INCLUDE/lteRALenb_variables.h
@@ -26,6 +26,7 @@
 #define RAL_REALTIME
 
 //#define ENABLE_MEDIEVAL_DEMO3
+//#define MUSER_CONTROL // in demo3, for triggering the congestion report manually
 
 //flag to reduce the logs
 #define DEBUG_RAL_DETAILS
diff --git a/openair3/RAL-LTE/LTE_RAL_ENB/SRC/lteRALenb_main.c b/openair3/RAL-LTE/LTE_RAL_ENB/SRC/lteRALenb_main.c
index 7aff21f557a09ad1a9b31a7c8617305d3599cc2f..fdfb54326c7ce7d5f96248b9d68b1881f8896025 100755
--- a/openair3/RAL-LTE/LTE_RAL_ENB/SRC/lteRALenb_main.c
+++ b/openair3/RAL-LTE/LTE_RAL_ENB/SRC/lteRALenb_main.c
@@ -38,6 +38,7 @@
 #include "nasrg_iocontrol.h"
 #endif
 
+
 /****************************************************************************/
 /*******************  G L O C A L    D E F I N I T I O N S  *****************/
 /****************************************************************************/
@@ -79,9 +80,152 @@ struct ral_lte_priv rl_priv;
 #ifdef RAL_DUMMY
 int netl_s; /* NAS net link socket */
 #endif
+
 /****************************************************************************/
-/*********************  L O C A L    F U N C T I O N S  *********************/
+// Next part is used to receive the triggers
 /****************************************************************************/
+#ifdef MUSER_CONTROL
+
+#define USER_IP_ADDRESS             "127.0.0.1"
+#define USER_REMOTE_PORT            "0"
+#define NAS_IP_ADDRESS              "127.0.0.1"
+#define NAS_LISTENING_PORT_FOR_USER "22222"
+
+char        *g_mih_user_ip_address             = USER_IP_ADDRESS;
+char        *g_mih_user_remote_port            = USER_REMOTE_PORT;
+char        *g_nas_ip_address                  = NAS_IP_ADDRESS;
+char        *g_nas_listening_port_for_mih_user = NAS_LISTENING_PORT_FOR_USER;
+int          g_sockd_user;
+signed int   g_user_congestion    = 0;
+unsigned int g_ratio_modif        = 0;
+//---------------------------------------------------------------------------
+int lteRALenb_trigger_connect(void){
+//---------------------------------------------------------------------------
+    struct addrinfo      hints;
+    struct addrinfo     *result, *rp;
+    int                  s, on;
+    struct sockaddr_in  *addr  = NULL;
+    struct sockaddr_in6 *addr6 = NULL;
+    unsigned char        buf[sizeof(struct sockaddr_in6)];
+
+
+    memset(&hints, 0, sizeof(struct addrinfo));
+    hints.ai_family   = AF_UNSPEC;    /* Allow IPv4 or IPv6 */
+    hints.ai_socktype = SOCK_DGRAM;   /* Datagram socket */
+    hints.ai_flags    = 0;
+    hints.ai_protocol = 0;            /* Any protocol */
+
+    s = getaddrinfo(g_mih_user_ip_address, g_mih_user_remote_port, &hints, &result);
+    if (s != 0) {
+        printf("ERR getaddrinfo: %s\n", gai_strerror(s));
+        return -1;
+    }
+
+    for (rp = result; rp != NULL; rp = rp->ai_next) {
+        g_sockd_user = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
+        if (g_sockd_user == -1)
+            continue;
+
+        on = 1;
+        setsockopt( g_sockd_user, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
+
+        if(rp->ai_family == AF_INET) {
+            printf("Destination address  %s is an ipv4 address\n",g_mih_user_ip_address);
+            addr             = (struct sockaddr_in *)(&buf[0]);
+            addr->sin_port   = htons(atoi(g_nas_listening_port_for_mih_user));
+            addr->sin_family = AF_INET;
+            s = inet_pton(AF_INET, g_nas_ip_address, &addr->sin_addr);
+            if (s <= 0) {
+                if (s == 0) {
+                    printf("ERR IP address should be a IPv4 ADDR - But found not in presentation format : %s\n", g_nas_ip_address);
+                } else {
+                    printf("ERR %s - inet_pton( IPv4 ADDR %s): %s\n", __FUNCTION__, g_nas_ip_address, strerror(s));
+                }
+                return -1;
+            }
+
+            s = bind(g_sockd_user, (const struct sockaddr *)addr, sizeof(struct sockaddr_in));
+            if (s == -1) {
+                printf("ERR IPv4 Address Bind: %s\n", strerror(errno));
+                return -1;
+            }
+            // sockd_mihf is of type SOCK_DGRAM, rp->ai_addr is the address to which datagrams are sent by default
+            if (connect(g_sockd_user, rp->ai_addr, rp->ai_addrlen) != -1) {
+                printf("  lteRALeNB is now ready to receive triggers\n");
+                return 0;
+            } else {
+                close(g_sockd_user);
+            }
+        } else if (rp->ai_family == AF_INET6) {
+            printf("Destination address  %s is an ipv6 address\n",g_mih_user_ip_address);
+            addr6              = (struct sockaddr_in6 *)(&buf[0]);
+            addr6->sin6_port   = htons(atoi(g_nas_listening_port_for_mih_user));
+            addr6->sin6_family = AF_INET6;
+            s = inet_pton(AF_INET, g_nas_ip_address, &addr6->sin6_addr);
+            if (s <= 0) {
+                if (s == 0) {
+                    printf("ERR IP  address should be a IPv6 ADDR, But found not in presentation format : %s\n", g_nas_ip_address);
+                } else {
+                    printf("ERR %s - inet_pton( IPv6 ADDR %s): %s\n", __FUNCTION__, g_nas_ip_address, strerror(s));
+                }
+                return -1;
+            }
+
+            s = bind(g_sockd_user, (const struct sockaddr *)addr6, sizeof(struct sockaddr_in));
+            if (s == -1) {
+                printf("ERR  IPv6 Address Bind: %s\n", strerror(errno));
+                return -1;
+            }
+            if (connect(g_sockd_user, rp->ai_addr, rp->ai_addrlen) != -1) {
+                printf("  lteRALeNB is now ready to receive triggers\n");
+                return 0;
+            } else {
+                close(g_sockd_user);
+            }
+        } else {
+            printf("ERR %s is an unknown address format %d\n",g_mih_user_ip_address,rp->ai_family);
+        }
+        close(g_sockd_user);
+    }
+
+    if (rp == NULL) {   /* No address succeeded */
+        printf("ERR Could not establish socket to MIH-User\n");
+        return -1;
+    }
+    return -1;
+}
+
+//---------------------------------------------------------------------------
+int lteRALenb_trigger_receive(int sock){
+//---------------------------------------------------------------------------
+  unsigned char str[50];
+  int  t, done;
+    t=recv(sock, str, 50, 0);
+    if (t <= 0) {
+        if (t < 0) perror("lteRALenb_trigger_receive : recv");
+        done = 1;
+    }
+    printf("\nmessage from USER, length:  %d\n", t);
+    switch (str[0]) {
+        case 0xff:
+            printf("USER ASK FOR STOPPING CONGESTION - not supported yet\n");
+            break;
+        case 0x01:
+            printf("USER ASK FOR TRIGGERING CONGESTION\n");
+            ralpriv->rlcBufferOccupancy[0] = 95;
+            RAL_NAS_report_congestion(0);
+            break;
+        default:
+            printf("received %hx\n", str[0]);
+            return -1;
+    }
+    return 0;
+}
+#endif
+
+/****************************************************************************/
+
+
 
 /****************************************************************************
  ** Name:  arg_usage()                                                     **
@@ -301,23 +445,12 @@ void get_IPv6_addr(const char* if_name){
 }
 
 /****************************************************************************
- ** Name:  RAL_initialize()                                          **
+ ** Name:  RAL_initialize()                                                **
  **                                                                        **
  ** Description: Performs overall RAL LTE initialisations:                 **
- **                  - Default value of global variables                   **
- **                  - Command line parsing                                **
- **                  - List of supported MIH actions                       **
- **                  - List of supported MIH link-events                   **
- **                  - Communication channel with the NAS driver           **
- **                  - MIH link registration                               **
  **                                                                        **
- ** Inputs:  argc:  Number of parameters in the command line   **
- **     argv:  Command line parameters                    **
- **     Others: g_mihf_ip_address, g_mihf_remote_port      **
- **    g_sockd_mihf, g_ral_ip_address,            **
- **    g_ral_listening_port_for_mihf              **
- **    g_link_id, g_mihf_id, g_log_output         **
- **    g_sockd_nas, ralpriv                       **
+ ** Inputs:  argc:  Number of parameters in the command line               **
+ **     argv:  Command line parameters                                     **
  ***************************************************************************/
 int RAL_initialize(int argc, const char *argv[]){
 //-----------------------------------------------------------------------------
@@ -326,7 +459,7 @@ int RAL_initialize(int argc, const char *argv[]){
     #ifdef RAL_DUMMY
     unsigned int t;
     struct sockaddr_un nas_socket;
-	#endif
+    #endif
 
     ralpriv = &rl_priv;
     memset(ralpriv, 0, sizeof(struct ral_lte_priv));
@@ -374,14 +507,6 @@ int RAL_initialize(int argc, const char *argv[]){
     // excluded MIH_C_BIT_LINK_HANDOVER_IMMINENT
     // excluded MIH_C_BIT_LINK_HANDOVER_COMPLETE
     // excluded MIH_C_BIT_LINK_PDU_TRANSMIT_STATUS
-    /*
-    ralpriv->mih_supported_link_event_list = MIH_C_BIT_LINK_UP | MIH_C_BIT_LINK_DOWN | MIH_C_BIT_LINK_PARAMETERS_REPORT;
-    // excluded MIH_C_BIT_LINK_GET_PARAMETERS
-    // excluded MIH_C_BIT_LINK_CONFIGURE_THRESHOLDS
-
-    ralpriv->mih_supported_link_command_list = MIH_C_BIT_LINK_EVENT_SUBSCRIBE | MIH_C_BIT_LINK_EVENT_UNSUBSCRIBE | \
-                                              MIH_C_BIT_LINK_GET_PARAMETERS  | MIH_C_BIT_LINK_CONFIGURE_THRESHOLDS | MIH_C_BIT_LINK_ACTION;
-    */
     ralpriv->mih_supported_link_event_list = MIH_C_BIT_LINK_UP | MIH_C_BIT_LINK_DOWN | MIH_C_BIT_LINK_PARAMETERS_REPORT;
     // excluded MIH_C_BIT_LINK_GET_PARAMETERS
     // excluded MIH_C_BIT_LINK_CONFIGURE_THRESHOLDS
@@ -397,7 +522,7 @@ int RAL_initialize(int argc, const char *argv[]){
      */
     #ifdef RAL_REALTIME
     IAL_NAS_ioctl_init();
-	#endif
+    #endif
     #ifdef RAL_DUMMY
     NAS_Netlink_socket_init();
     DEBUG(" Waiting for a connection from the NAS Driver ...\n");
@@ -406,9 +531,15 @@ int RAL_initialize(int argc, const char *argv[]){
         perror("RAL_initialize : g_sockd_nas - accept() failed");
         exit(1);
     }
-	#endif
+  #endif
     DEBUG("NAS Driver Connected.\n\n");
 
+    /* Start listening to user commands for triggers*/
+    #ifdef MUSER_CONTROL
+    lteRALenb_trigger_connect();
+    #endif
+
+
     /*Get the interface IPv6 address
      */
     #ifdef RAL_DUMMY
@@ -421,14 +552,14 @@ int RAL_initialize(int argc, const char *argv[]){
 
 //  Get list of MTs
     DEBUG("Obtaining list of MTs\n\n");
-	#ifdef RAL_REALTIME
+    #ifdef RAL_REALTIME
     init_flag=1;
     RAL_process_NAS_message(IO_OBJ_CNX, IO_CMD_LIST,0,0);
     RAL_process_NAS_message(IO_OBJ_RB, IO_CMD_LIST,0,0);
     init_flag=0;
     #endif
     #ifdef RAL_DUMMY
-	eRALlte_NAS_get_MTs_list();
+    eRALlte_NAS_get_MTs_list();
     #endif
     RAL_printInitStatus();
     ralpriv->pending_req_flag = 0;
@@ -471,9 +602,12 @@ int main(int argc, const char *argv[]){
  /* Initialize fd_set and wait for input */
         FD_ZERO(&readfds);
         FD_SET(g_sockd_mihf, &readfds);
-		#ifdef RAL_DUMMY
+        #ifdef RAL_DUMMY
         FD_SET(g_sockd_nas, &readfds);
-		#endif
+        #endif
+        #ifdef MUSER_CONTROL
+        FD_SET (g_sockd_user, &readfds);
+        #endif
         tv.tv_sec  = MIH_C_RADIO_POLLING_INTERVAL_SECONDS;
         tv.tv_usec = MIH_C_RADIO_POLLING_INTERVAL_MICRO_SECONDS;
 
@@ -488,14 +622,19 @@ int main(int argc, const char *argv[]){
           if (FD_ISSET(g_sockd_mihf, &readfds)) {
               done = eRALlte_mih_link_process_message();
           }
-
- 		#ifdef RAL_DUMMY
-         /* Read data coming from the NAS driver */
-          if (FD_ISSET(g_sockd_nas, &readfds)) {
-              //printf("Received something from NAS\n");
-              done = eRALlte_NAS_process_message();
+          #ifdef RAL_DUMMY
+          /* Read data coming from the NAS driver */
+            if (FD_ISSET(g_sockd_nas, &readfds)) {
+                //printf("Received something from NAS\n");
+                done = eRALlte_NAS_process_message();
+            }
+          #endif
+          #ifdef MUSER_CONTROL
+          /* Get triggers */
+          if (FD_ISSET(g_sockd_user,&readfds)){
+              done = lteRALenb_trigger_receive(g_sockd_user);
           }
-		#endif
+          #endif
 
           /* Wait until next pending MT's timer expiration */
           if (ralpriv->pending_mt_timer > 0) {
@@ -505,9 +644,9 @@ int main(int argc, const char *argv[]){
 
           if (time_counter ++ == 11){
              // check if a new MT appeared or disappeared
-	         #ifdef RAL_REALTIME
+           #ifdef RAL_REALTIME
              RAL_process_NAS_message(IO_OBJ_CNX, IO_CMD_LIST,0,0);
-			 #endif
+           #endif
              time_counter = 1;
           }
             //get measures from NAS - timer = 21x100ms  -- impair
diff --git a/openair3/RAL-LTE/LTE_RAL_ENB/SRC/lteRALenb_process.c b/openair3/RAL-LTE/LTE_RAL_ENB/SRC/lteRALenb_process.c
index 2c010221087c5897b49d92eef95c37d8f5cebd0f..60305747803db7b24bca425d87af4d091db723fa 100755
--- a/openair3/RAL-LTE/LTE_RAL_ENB/SRC/lteRALenb_process.c
+++ b/openair3/RAL-LTE/LTE_RAL_ENB/SRC/lteRALenb_process.c
@@ -546,6 +546,42 @@ void RAL_NAS_measures_polling(void){
    #endif
 }
 
+//---------------------------------------------------------------------------
+// Common function to report congestion
+void RAL_NAS_report_congestion(int ix){
+//---------------------------------------------------------------------------
+  MIH_C_TRANSACTION_ID_T transaction_id;
+  MIH_C_LINK_TUPLE_ID_T  link_identifier;
+  LIST(MIH_C_LINK_PARAM_RPT, LinkParametersReportList);
+
+  DEBUG("Congestion detected for UE%d, sending congestion notification to MIH User \n", ix);
+  transaction_id = MIH_C_get_new_transaction_id();
+  link_identifier.link_id.link_type = MIH_C_WIRELESS_UMTS;
+  link_identifier.link_id.link_addr.choice = MIH_C_CHOICE_3GPP_3G_CELL_ID;
+  Bit_Buffer_t *plmn = new_BitBuffer_0();
+  BitBuffer_wrap(plmn, (unsigned char*) ralpriv->plmn, DEFAULT_PLMN_SIZE);
+  MIH_C_PLMN_ID_decode(plmn, &link_identifier.link_id.link_addr._union._3gpp_3g_cell_id.plmn_id);
+  free_BitBuffer(plmn);
+  link_identifier.link_id.link_addr._union._3gpp_3g_cell_id.cell_id = ralpriv->curr_cellId;
+  link_identifier.choice = MIH_C_LINK_TUPLE_ID_CHOICE_NULL;
+  //
+  LinkParametersReportList_list.val[LinkParametersReportList_list.length].link_param.link_param_type.choice = MIH_C_LINK_PARAM_TYPE_CHOICE_LTE;
+  LinkParametersReportList_list.val[LinkParametersReportList_list.length].link_param.link_param_type._union.link_param_lte = MIH_C_LINK_PARAM_LTE_L2_BUFFER_STATUS;
+  // LinkParametersReportList_list.val[LinkParametersReportList_list.length].link_param.link_param_type.choice = MIH_C_LINK_PARAM_TYPE_CHOICE_GEN;
+  // LinkParametersReportList_list.val[LinkParametersReportList_list.length].link_param.link_param_type._union.link_param_gen = MIH_C_LINK_PARAM_LTE_L2_BUFFER_STATUS;
+  LinkParametersReportList_list.val[LinkParametersReportList_list.length].link_param.choice  = MIH_C_LINK_PARAM_CHOICE_LINK_PARAM_VAL;
+  LinkParametersReportList_list.val[LinkParametersReportList_list.length].link_param._union.link_param_val = ralpriv->rlcBufferOccupancy[ix];
+
+  LinkParametersReportList_list.val[LinkParametersReportList_list.length].choice = MIH_C_LINK_PARAM_RPT_CHOICE_THRESHOLD;
+  LinkParametersReportList_list.val[LinkParametersReportList_list.length]._union.threshold.threshold_val  = ralpriv->congestion_threshold;
+  LinkParametersReportList_list.val[LinkParametersReportList_list.length]._union.threshold.threshold_xdir = MIH_C_ABOVE_THRESHOLD;
+  LinkParametersReportList_list.length = LinkParametersReportList_list.length + 1;
+
+  //
+  eRALlte_send_link_parameters_report_indication(&transaction_id,  &link_identifier, &LinkParametersReportList_list);
+  ralpriv->congestion_flag = RAL_TRUE;
+
+}
 //---------------------------------------------------------------------------
 // Temp - Enter hard-coded measures in IAL
 void RAL_NAS_measures_analyze(void){
@@ -562,36 +598,7 @@ void RAL_NAS_measures_analyze(void){
     for (ix=0; ix<ralpriv->num_UEs; ix++){
        if ((ralpriv->rlcBufferOccupancy[ix] > ralpriv->congestion_threshold)&&
            ((ralpriv->mih_subscribe_req_event_list && MIH_C_BIT_LINK_PARAMETERS_REPORT )>0)){
-           DEBUG("Congestion detected for UE%d, sending congestion notification to MIH User \n", ix);
-//            void eRALlte_send_link_parameters_report_indication(MIH_C_TRANSACTION_ID_T *tidP,
-//                                    MIH_C_LINK_TUPLE_ID_T       *lidP,
-//                                    MIH_C_LINK_PARAM_RPT_LIST_T *lparam_listP)
-           transaction_id = MIH_C_get_new_transaction_id();
-           link_identifier.link_id.link_type = MIH_C_WIRELESS_UMTS;
-           link_identifier.link_id.link_addr.choice = MIH_C_CHOICE_3GPP_3G_CELL_ID;
-           Bit_Buffer_t *plmn = new_BitBuffer_0();
-           BitBuffer_wrap(plmn, (unsigned char*) ralpriv->plmn, DEFAULT_PLMN_SIZE);
-           MIH_C_PLMN_ID_decode(plmn, &link_identifier.link_id.link_addr._union._3gpp_3g_cell_id.plmn_id);
-           free_BitBuffer(plmn);
-           link_identifier.link_id.link_addr._union._3gpp_3g_cell_id.cell_id = ralpriv->curr_cellId;
-           link_identifier.choice = MIH_C_LINK_TUPLE_ID_CHOICE_NULL;
-//
-          LinkParametersReportList_list.val[LinkParametersReportList_list.length].link_param.link_param_type.choice = MIH_C_LINK_PARAM_TYPE_CHOICE_LTE;
-          LinkParametersReportList_list.val[LinkParametersReportList_list.length].link_param.link_param_type._union.link_param_lte = MIH_C_LINK_PARAM_LTE_L2_BUFFER_STATUS;
-//          LinkParametersReportList_list.val[LinkParametersReportList_list.length].link_param.link_param_type.choice = MIH_C_LINK_PARAM_TYPE_CHOICE_GEN;
-//          LinkParametersReportList_list.val[LinkParametersReportList_list.length].link_param.link_param_type._union.link_param_gen = MIH_C_LINK_PARAM_LTE_L2_BUFFER_STATUS;
-          LinkParametersReportList_list.val[LinkParametersReportList_list.length].link_param.choice  = MIH_C_LINK_PARAM_CHOICE_LINK_PARAM_VAL;
-          LinkParametersReportList_list.val[LinkParametersReportList_list.length].link_param._union.link_param_val = ralpriv->rlcBufferOccupancy[ix];
-
-          LinkParametersReportList_list.val[LinkParametersReportList_list.length].choice = MIH_C_LINK_PARAM_RPT_CHOICE_THRESHOLD;
-          LinkParametersReportList_list.val[LinkParametersReportList_list.length]._union.threshold.threshold_val  = ralpriv->congestion_threshold;
-          LinkParametersReportList_list.val[LinkParametersReportList_list.length]._union.threshold.threshold_xdir = MIH_C_ABOVE_THRESHOLD;
-          LinkParametersReportList_list.length = LinkParametersReportList_list.length + 1;
-
-//
-           eRALlte_send_link_parameters_report_indication(&transaction_id,  &link_identifier, &LinkParametersReportList_list);
-
-           ralpriv->congestion_flag = RAL_TRUE;
+           RAL_NAS_report_congestion(ix);
            break;
        }
     }