diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt
index 2bce891ac93c425321f5aa05580498c7e1b9b4b3..a3d75aff27b8cb61c1f56f05dbe0c2a6fa5f0e9d 100644
--- a/common/utils/T/T_messages.txt
+++ b/common/utils/T/T_messages.txt
@@ -77,6 +77,10 @@ ID = ENB_PHY_INITIATE_RA_PROCEDURE
     DESC = eNodeB initiates a random access procedure after detecting enough energy for one of the preambles
     GROUP = ALL:PHY:ENB
     FORMAT = int,eNB_ID : int,frame : int,subframe : int,preamble : int,energy : int,delay
+ID = ENB_PHY_MIB
+    DESC = MIB data
+    GROUP = ALL:PHY:ENB
+    FORMAT = int,eNB_ID : int,frame : int,subframe : buffer,data
 
 #MAC logs
 ID = ENB_MAC_UE_DL_SDU
diff --git a/common/utils/T/tracer/macpdu2wireshark.c b/common/utils/T/tracer/macpdu2wireshark.c
index 954f668aa420c0cd0070f58757df721727199e2a..4ab7606c6c9e5911f5fb1765d76324216ad1b06b 100644
--- a/common/utils/T/tracer/macpdu2wireshark.c
+++ b/common/utils/T/tracer/macpdu2wireshark.c
@@ -28,6 +28,10 @@ typedef struct {
   int dl_frame;
   int dl_subframe;
   int dl_data;
+  /* mib */
+  int mib_frame;
+  int mib_subframe;
+  int mib_data;
 } ev_data;
 
 void ul(void *_d, event e)
@@ -100,20 +104,55 @@ void dl(void *_d, event e)
   if (ret != d->buf.osize) abort();
 }
 
-void setup_data(ev_data *d, void *database, int ul_id, int dl_id)
+void mib(void *_d, event e)
+{
+  ev_data *d = _d;
+  ssize_t ret;
+  int fsf;
+  int i;
+
+  d->buf.osize = 0;
+
+  PUTS(&d->buf, MAC_LTE_START_STRING);
+  PUTC(&d->buf, FDD_RADIO);
+  PUTC(&d->buf, DIRECTION_DOWNLINK);
+  PUTC(&d->buf, NO_RNTI);
+
+  /* for newer version of wireshark? */
+  fsf = (e.e[d->mib_frame].i << 4) + e.e[d->mib_subframe].i;
+  /* for older version? */
+  //fsf = e.e[d->mib_subframe].i;
+  PUTC(&d->buf, MAC_LTE_FRAME_SUBFRAME_TAG);
+  PUTC(&d->buf, (fsf>>8) & 255);
+  PUTC(&d->buf, fsf & 255);
+
+  PUTC(&d->buf, MAC_LTE_PAYLOAD_TAG);
+  for (i = 0; i < e.e[d->mib_data].bsize; i++)
+    PUTC(&d->buf, ((char*)e.e[d->mib_data].b)[i]);
+
+  ret = sendto(d->socket, d->buf.obuf, d->buf.osize, 0,
+      (struct sockaddr *)&d->to, sizeof(struct sockaddr_in));
+  if (ret != d->buf.osize) abort();
+}
+
+void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id)
 {
   database_event_format f;
   int i;
 
-  d->ul_rnti     = -1;
-  d->ul_frame    = -1;
-  d->ul_subframe = -1;
-  d->ul_data     = -1;
+  d->ul_rnti      = -1;
+  d->ul_frame     = -1;
+  d->ul_subframe  = -1;
+  d->ul_data      = -1;
 
-  d->dl_rnti     = -1;
-  d->dl_frame    = -1;
-  d->dl_subframe = -1;
-  d->dl_data     = -1;
+  d->dl_rnti      = -1;
+  d->dl_frame     = -1;
+  d->dl_subframe  = -1;
+  d->dl_data      = -1;
+
+  d->mib_frame    = -1;
+  d->mib_subframe = -1;
+  d->mib_data     = -1;
 
 #define G(var_name, var_type, var) \
   if (!strcmp(f.name[i], var_name)) { \
@@ -144,6 +183,18 @@ void setup_data(ev_data *d, void *database, int ul_id, int dl_id)
   if (d->dl_rnti == -1 || d->dl_frame == -1 || d->dl_subframe == -1 ||
       d->dl_data == -1) goto error;
 
+  if (mib_id != -1) {
+    /* MIB: frame, subframe, data */
+    f = get_format(database, mib_id);
+    for (i = 0; i < f.count; i++) {
+      G("frame",    "int",    d->mib_frame);
+      G("subframe", "int",    d->mib_subframe);
+      G("data",     "buffer", d->mib_data);
+    }
+    if (d->mib_frame == -1 || d->mib_subframe == -1 || d->mib_data == -1)
+      goto error;
+  }
+
 #undef G
 
   return;
@@ -179,7 +230,8 @@ void usage(void)
 "    -d <database file>        this option is mandatory\n"
 "    -i <dump file>            read events from this dump file\n"
 "    -ip <IP address>          send packets to this IP address (default %s)\n"
-"    -p <port>                 send packets to this port (default %d)\n",
+"    -p <port>                 send packets to this port (default %d)\n"
+"    -no-mib                   do not report MIB\n",
   DEFAULT_IP,
   DEFAULT_PORT
   );
@@ -194,10 +246,11 @@ int main(int n, char **v)
   event_handler *h;
   int in;
   int i;
-  int ul_id, dl_id;
+  int ul_id, dl_id, mib_id = -1;
   ev_data d;
   char *ip = DEFAULT_IP;
   int port = DEFAULT_PORT;
+  int do_mib = 1;
 
   memset(&d, 0, sizeof(ev_data));
 
@@ -209,6 +262,7 @@ int main(int n, char **v)
       { if (i > n-2) usage(); input_filename = v[++i]; continue; }
     if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; }
     if (!strcmp(v[i], "-p")) {if(i>n-2)usage(); port=atoi(v[++i]); continue; }
+    if (!strcmp(v[i], "-no-mib")) { do_mib = 0; continue; }
     usage();
   }
 
@@ -232,10 +286,12 @@ int main(int n, char **v)
 
   ul_id = event_id_from_name(database, "ENB_MAC_UE_UL_PDU_WITH_DATA");
   dl_id = event_id_from_name(database, "ENB_MAC_UE_DL_PDU_WITH_DATA");
-  setup_data(&d, database, ul_id, dl_id);
+  if (do_mib) mib_id = event_id_from_name(database, "ENB_PHY_MIB");
+  setup_data(&d, database, ul_id, dl_id, mib_id);
 
   register_handler_function(h, ul_id, ul, &d);
   register_handler_function(h, dl_id, dl, &d);
+  if (do_mib) register_handler_function(h, mib_id, mib, &d);
 
   d.socket = socket(AF_INET, SOCK_DGRAM, 0);
   if (d.socket == -1) { perror("socket"); exit(1); }
@@ -253,7 +309,7 @@ int main(int n, char **v)
     event e;
     e = get_event(in, &ebuf, database);
     if (e.type == -1) break;
-    if (!(e.type == ul_id || e.type == dl_id)) continue;
+    if (!(e.type == ul_id || e.type == dl_id || e.type == mib_id)) continue;
     handle_event(h, e);
   }
 
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 276006ec3be58e40a413856efc288d7d9d2f3a43..7015df2d2aede0e189e213907f69d04bdf71f9f3 100644
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -254,6 +254,8 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,int frame, int subframe) {
       if (eNB->pbch_configured!=1) return;
       eNB->pbch_configured=0;
     }
+    T(T_ENB_PHY_MIB, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe),
+      T_BUFFER(pbch_pdu, 3));
     generate_pbch(&eNB->pbch,
 		  txdataF,
 		  AMP,