merge
authorNicola Baldo <nbaldo@cttc.es>
Fri, 05 Apr 2013 16:50:37 +0200
changeset 9672 34cdaa0fad64
parent 9658 2b77600c9031 (current diff)
parent 9671 56bf50f45a64 (diff)
child 9673 da69cd4f2c93
merge
--- a/src/lte/doc/source/lte-design.rst	Fri Apr 05 16:39:16 2013 +0200
+++ b/src/lte/doc/source/lte-design.rst	Fri Apr 05 16:50:37 2013 +0200
@@ -1928,6 +1928,7 @@
 
  - three Logical Channel Groups (out of four available) are configured
    for uplink buffer status report purposes, according to the following policy:
+
    + LCG 0 is for signaling radio bearers
    + LCG 1 is for GBR data radio bearers
    + LCG 2 is for Non-GBR data radio bearers
--- a/src/lte/helper/lte-helper.cc	Fri Apr 05 16:39:16 2013 +0200
+++ b/src/lte/helper/lte-helper.cc	Fri Apr 05 16:50:37 2013 +0200
@@ -120,9 +120,6 @@
   m_phyTxStats = CreateObject<PhyTxStatsCalculator> ();
   m_phyRxStats = CreateObject<PhyRxStatsCalculator> ();
   m_macStats = CreateObject<MacStatsCalculator> ();
-  m_rlcStats = CreateObject<RadioBearerStatsCalculator> ("RLC");
-  m_pdcpStats = CreateObject<RadioBearerStatsCalculator> ("PDCP");
-
   Object::DoStart ();
 
 }
@@ -831,6 +828,8 @@
 void
 LteHelper::EnableRlcTraces (void)
 {
+  NS_ASSERT_MSG (m_rlcStats == 0, "please make sure that LteHelper::EnableRlcTraces is called at most once");
+  m_rlcStats = CreateObject<RadioBearerStatsCalculator> ("RLC");
   m_radioBearerStatsConnector.EnableRlcStats (m_rlcStats);
 }
 
@@ -1339,6 +1338,8 @@
 void
 LteHelper::EnablePdcpTraces (void)
 {
+  NS_ASSERT_MSG (m_pdcpStats == 0, "please make sure that LteHelper::EnablePdcpTraces is called at most once");
+  m_pdcpStats = CreateObject<RadioBearerStatsCalculator> ("PDCP");
   m_radioBearerStatsConnector.EnablePdcpStats (m_pdcpStats);
 }
 
--- a/src/lte/helper/radio-bearer-stats-calculator.h	Fri Apr 05 16:39:16 2013 +0200
+++ b/src/lte/helper/radio-bearer-stats-calculator.h	Fri Apr 05 16:50:37 2013 +0200
@@ -43,13 +43,22 @@
 typedef std::map<ImsiLcidPair_t, LteFlowId_t> FlowIdMap;
 
 /**
- * Calculation of statistics from the RLC layer for uplink and downlink, the data is dumped into a file periodically. Metrics considered are:
+ * This class is an ns-3 trace sink that performs the calculation of
+ * PDU statistics for uplink and downlink. Statistics are generated
+ * on a per radio bearer basis. This class can be used for 
+ * RLC PDU stats or PDCP PDU stats by connecting to the appropriate
+ * trace sources at the RLC or PDCP layer.
+ * 
+ * The statistics are calculated at consecutive time windows and
+ * periodically written to a file. The calculated statistics are:
+ *
  *   - Number of transmitted PDUs
  *   - Number of received PDUs
  *   - Number of transmitted bytes
  *   - Number of received bytes
- *   - Average, min, max and standard deviation of RLC to RLC delay
- *   - Average, min, max and standard deviation of RLC PDU size
+ *   - Average, min, max and standard deviation of PDU delay (delay is
+ *     calculated from the generation of the PDU to its reception)
+ *   - Average, min, max and standard deviation of PDU size
  */
 class RadioBearerStatsCalculator : public LteStatsCalculator
 {
--- a/src/lte/model/lte-enb-rrc.cc	Fri Apr 05 16:39:16 2013 +0200
+++ b/src/lte/model/lte-enb-rrc.cc	Fri Apr 05 16:50:37 2013 +0200
@@ -382,7 +382,7 @@
   lcinfo.gbrDl = bearer.gbrQosInfo.gbrDl;
   m_rrc->m_cmacSapProvider->AddLc (lcinfo, rlc->GetLteMacSapUser ());
   
-  if (drbInfo->m_rlc->GetTypeId () == LteRlcAm::GetTypeId ())
+  if (rlcTypeId == LteRlcAm::GetTypeId ())
     {
       drbInfo->m_rlcConfig.choice =  LteRrcSap::RlcConfig::AM;
     }
@@ -518,6 +518,10 @@
         params.bearers = GetErabList ();
   
         LteRrcSap::HandoverPreparationInfo hpi;
+        hpi.asConfig.sourceMeasConfig.haveQuantityConfig = false;
+        hpi.asConfig.sourceMeasConfig.haveMeasGapConfig = false;
+        hpi.asConfig.sourceMeasConfig.haveSmeasure = false;
+        hpi.asConfig.sourceMeasConfig.haveSpeedStatePars = false;
         hpi.asConfig.sourceUeIdentity = m_rnti;
         hpi.asConfig.sourceDlCarrierFreq = m_rrc->m_dlEarfcn;
         hpi.asConfig.sourceRadioResourceConfig = GetRadioResourceConfigForHandoverPreparationInfo ();
@@ -527,6 +531,12 @@
         hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.cellIdentity = m_rrc->m_cellId;
         hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIndication = 0;
         hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIdentity = 0;
+        LteEnbCmacSapProvider::RachConfig rc = m_rrc->m_cmacSapProvider->GetRachConfig ();
+        hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.preambleInfo.numberOfRaPreambles = rc.numberOfRaPreambles;
+        hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.preambleTransMax = rc.preambleTransMax;
+        hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.raResponseWindowSize = rc.raResponseWindowSize;
+        hpi.asConfig.sourceSystemInformationBlockType2.freqInfo.ulCarrierFreq = m_rrc->m_ulEarfcn;
+        hpi.asConfig.sourceSystemInformationBlockType2.freqInfo.ulBandwidth = m_rrc->m_ulBandwidth;
         params.rrcContext = m_rrc->m_rrcSapUser->EncodeHandoverPreparationInformation (hpi);
   
         NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
@@ -1543,6 +1553,12 @@
   handoverCommand.mobilityControlInfo.haveRachConfigDedicated = true;
   handoverCommand.mobilityControlInfo.rachConfigDedicated.raPreambleIndex = anrcrv.raPreambleId;
   handoverCommand.mobilityControlInfo.rachConfigDedicated.raPrachMaskIndex = anrcrv.raPrachMaskIndex;
+
+  LteEnbCmacSapProvider::RachConfig rc = m_cmacSapProvider->GetRachConfig ();
+  handoverCommand.mobilityControlInfo.radioResourceConfigCommon.rachConfigCommon.preambleInfo.numberOfRaPreambles = rc.numberOfRaPreambles;
+  handoverCommand.mobilityControlInfo.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.preambleTransMax = rc.preambleTransMax;
+  handoverCommand.mobilityControlInfo.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.raResponseWindowSize = rc.raResponseWindowSize;
+
   Ptr<Packet> encodedHandoverCommand = m_rrcSapUser->EncodeHandoverCommand (handoverCommand);
 
   ackParams.rrcContext = encodedHandoverCommand;
--- a/src/lte/model/lte-rrc-header.cc	Fri Apr 05 16:39:16 2013 +0200
+++ b/src/lte/model/lte-rrc-header.cc	Fri Apr 05 16:50:37 2013 +0200
@@ -856,6 +856,932 @@
   SerializeInteger (1,1,8); // maxHARQ-Msg3Tx
 }
 
+void
+RrcAsn1Header::SerializeQoffsetRange (int8_t qOffsetRange) const
+{
+  switch (qOffsetRange)
+    {
+    case -24:
+      SerializeEnum (32,0);
+      break;
+    case -22:
+      SerializeEnum (32,1);
+      break;
+    case -20:
+      SerializeEnum (32,2);
+      break;
+    case -18:
+      SerializeEnum (32,3);
+      break;
+    case -16:
+      SerializeEnum (32,4);
+      break;
+    case -14:
+      SerializeEnum (32,5);
+      break;
+    case -12:
+      SerializeEnum (32,6);
+      break;
+    case -10:
+      SerializeEnum (32,7);
+      break;
+    case -8:
+      SerializeEnum (32,8);
+      break;
+    case -6:
+      SerializeEnum (32,9);
+      break;
+    case -5:
+      SerializeEnum (32,10);
+      break;
+    case -4:
+      SerializeEnum (32,11);
+      break;
+    case -3:
+      SerializeEnum (32,12);
+      break;
+    case -2:
+      SerializeEnum (32,13);
+      break;
+    case -1:
+      SerializeEnum (32,14);
+      break;
+    case 0:
+      SerializeEnum (32,15);
+      break;
+    case 1:
+      SerializeEnum (32,16);
+      break;
+    case 2:
+      SerializeEnum (32,17);
+      break;
+    case 3:
+      SerializeEnum (32,18);
+      break;
+    case 4:
+      SerializeEnum (32,19);
+      break;
+    case 5:
+      SerializeEnum (32,20);
+      break;
+    case 6:
+      SerializeEnum (32,21);
+      break;
+    case 8:
+      SerializeEnum (32,22);
+      break;
+    case 10:
+      SerializeEnum (32,23);
+      break;
+    case 12:
+      SerializeEnum (32,24);
+      break;
+    case 14:
+      SerializeEnum (32,25);
+      break;
+    case 16:
+      SerializeEnum (32,26);
+      break;
+    case 18:
+      SerializeEnum (32,27);
+      break;
+    case 20:
+      SerializeEnum (32,28);
+      break;
+    case 22:
+      SerializeEnum (32,29);
+      break;
+    case 24:
+      SerializeEnum (32,30);
+      break;
+    default:
+      SerializeEnum (32,15);
+    }
+}
+
+void
+RrcAsn1Header::SerializeThresholdEutra (LteRrcSap::ThresholdEutra thresholdEutra) const
+{
+  switch (thresholdEutra.choice)
+    {
+    case LteRrcSap::ThresholdEutra::thresholdRsrp:
+      SerializeInteger (thresholdEutra.range, 0, 97);
+      break;
+    case LteRrcSap::ThresholdEutra::thresholdRsrq:
+    default:
+      SerializeInteger (thresholdEutra.range, 0, 34);
+    }
+}
+
+void
+RrcAsn1Header::SerializeMeasConfig (LteRrcSap::MeasConfig measConfig) const
+{
+  // Serialize MeasConfig sequence
+  // 11 optional fields, extension marker present
+  std::bitset<11> measConfigOptional;
+  measConfigOptional.set (10, !measConfig.measObjectToRemoveList.empty () );
+  measConfigOptional.set (9, !measConfig.measObjectToAddModList.empty () );
+  measConfigOptional.set (8, !measConfig.reportConfigToRemoveList.empty () );
+  measConfigOptional.set (7, !measConfig.reportConfigToAddModList.empty () );
+  measConfigOptional.set (6, !measConfig.measIdToRemoveList.empty () );
+  measConfigOptional.set (5, !measConfig.measIdToAddModList.empty () );
+  measConfigOptional.set (4, measConfig.haveQuantityConfig ); 
+  measConfigOptional.set (3, measConfig.haveMeasGapConfig ); 
+  measConfigOptional.set (2, measConfig.haveSmeasure ); 
+  measConfigOptional.set (1, false ); // preRegistrationInfoHRPD
+  measConfigOptional.set (0, measConfig.haveSpeedStatePars ); 
+  SerializeSequence (measConfigOptional,true);
+
+  if (!measConfig.measObjectToRemoveList.empty ())
+    {
+      SerializeSequenceOf (measConfig.measObjectToRemoveList.size (),MAX_OBJECT_ID,1);
+      for (std::list<uint8_t>::iterator it = measConfig.measObjectToRemoveList.begin (); it != measConfig.measObjectToRemoveList.end (); it++)
+        {
+          SerializeInteger (*it, 1, MAX_OBJECT_ID);
+        }
+    }
+
+  if (!measConfig.measObjectToAddModList.empty ())
+    {
+      SerializeSequenceOf (measConfig.measObjectToAddModList.size (),MAX_OBJECT_ID,1);
+      for (std::list<LteRrcSap::MeasObjectToAddMod>::iterator it = measConfig.measObjectToAddModList.begin (); it != measConfig.measObjectToAddModList.end (); it++)
+        {
+          SerializeSequence (std::bitset<0> (), false);
+          SerializeInteger (it->measObjectId, 1, MAX_OBJECT_ID);
+          SerializeChoice (4, 0, true); // Select MeasObjectEUTRA
+
+          // Serialize measObjectEutra
+          std::bitset<5> measObjOpts;
+          measObjOpts.set (4,!it->measObjectEutra.cellsToRemoveList.empty () );
+          measObjOpts.set (3,!it->measObjectEutra.cellsToAddModList.empty () );
+          measObjOpts.set (2,!it->measObjectEutra.blackCellsToRemoveList.empty () );
+          measObjOpts.set (1,!it->measObjectEutra.blackCellsToAddModList.empty () );
+          measObjOpts.set (0,it->measObjectEutra.haveCellForWhichToReportCGI);
+          SerializeSequence (measObjOpts, true);
+
+          // Serialize carrierFreq
+          SerializeInteger (it->measObjectEutra.carrierFreq, 0, MAX_EARFCN);
+
+          // Serialize  allowedMeasBandwidth
+          switch (it->measObjectEutra.allowedMeasBandwidth)
+            {
+            case 6:
+              SerializeEnum (6,0);
+              break;
+            case 15:
+              SerializeEnum (6,1);
+              break;
+            case 25:
+              SerializeEnum (6,2);
+              break;
+            case 50:
+              SerializeEnum (6,3);
+              break;
+            case 75:
+              SerializeEnum (6,4);
+              break;
+            case 100:
+              SerializeEnum (6,5);
+              break;
+            default:
+              SerializeEnum (6,0);
+            }
+
+          SerializeBoolean (it->measObjectEutra.presenceAntennaPort1);
+          SerializeBitstring (std::bitset<2> (it->measObjectEutra.neighCellConfig));
+          SerializeQoffsetRange (it->measObjectEutra.offsetFreq);
+
+          if (!it->measObjectEutra.cellsToRemoveList.empty ())
+            {
+              SerializeSequenceOf (it->measObjectEutra.cellsToRemoveList.size (),MAX_CELL_MEAS,1);
+              for (std::list<uint8_t>::iterator it2 = it->measObjectEutra.cellsToRemoveList.begin (); it2 != it->measObjectEutra.cellsToRemoveList.end (); it2++)
+                {
+                  SerializeInteger (*it2, 1, MAX_CELL_MEAS);
+                }
+            }
+
+          if (!it->measObjectEutra.cellsToAddModList.empty ())
+            {
+              SerializeSequenceOf (it->measObjectEutra.cellsToAddModList.size (), MAX_CELL_MEAS, 1);
+              for (std::list<LteRrcSap::CellsToAddMod>::iterator it2 = it->measObjectEutra.cellsToAddModList.begin (); it2 != it->measObjectEutra.cellsToAddModList.end (); it2++)
+                {
+                  SerializeSequence (std::bitset<0> (), false);
+
+                  // Serialize cellIndex
+                  SerializeInteger (it2->cellIndex, 1, MAX_CELL_MEAS);
+
+                  // Serialize PhysCellIdRange
+                  // range optional and not present
+                  SerializeSequence (std::bitset<1> (0),false);
+                  SerializeInteger (it2->physCellId,0,503);
+
+                  // Serialize cellIndividualOffset
+                  SerializeQoffsetRange (it2->cellIndividualOffset);
+                }
+            }
+
+          if (!it->measObjectEutra.blackCellsToRemoveList.empty () )
+            {
+              SerializeSequenceOf (it->measObjectEutra.blackCellsToRemoveList.size (),MAX_CELL_MEAS,1);
+              for (std::list<uint8_t>::iterator it2 = it->measObjectEutra.blackCellsToRemoveList.begin (); it2 != it->measObjectEutra.blackCellsToRemoveList.end (); it2++)
+                {
+                  SerializeInteger (*it2, 1, MAX_CELL_MEAS);
+                }
+            }
+
+          if (!it->measObjectEutra.blackCellsToAddModList.empty () )
+            {
+              SerializeSequenceOf (it->measObjectEutra.blackCellsToAddModList.size (), MAX_CELL_MEAS, 1);
+              for (std::list<LteRrcSap::BlackCellsToAddMod>::iterator it2 = it->measObjectEutra.blackCellsToAddModList.begin (); it2 != it->measObjectEutra.blackCellsToAddModList.end (); it2++)
+                {
+                  SerializeSequence (std::bitset<0> (),false);
+                  SerializeInteger (it2->cellIndex, 1, MAX_CELL_MEAS);
+
+                  // Serialize PhysCellIdRange
+                  // range optional
+                  std::bitset<1> rangePresent = std::bitset<1> (it2->physCellIdRange.haveRange);
+                  SerializeSequence (rangePresent,false);
+                  SerializeInteger (it2->physCellIdRange.start,0,503);
+                  if (it2->physCellIdRange.haveRange)
+                    {
+                      switch (it2->physCellIdRange.range)
+                        {
+                        case 4:
+                          SerializeEnum (16, 0);
+                          break;
+                        case 8:
+                          SerializeEnum (16, 1);
+                          break;
+                        case 12:
+                          SerializeEnum (16, 2);
+                          break;
+                        case 16:
+                          SerializeEnum (16, 3);
+                          break;
+                        case 24:
+                          SerializeEnum (16, 4);
+                          break;
+                        case 32:
+                          SerializeEnum (16, 5);
+                          break;
+                        case 48:
+                          SerializeEnum (16, 6);
+                          break;
+                        case 64:
+                          SerializeEnum (16, 7);
+                          break;
+                        case 84:
+                          SerializeEnum (16, 8);
+                          break;
+                        case 96:
+                          SerializeEnum (16, 9);
+                          break;
+                        case 128:
+                          SerializeEnum (16, 10);
+                          break;
+                        case 168:
+                          SerializeEnum (16, 11);
+                          break;
+                        case 252:
+                          SerializeEnum (16, 12);
+                          break;
+                        case 504:
+                          SerializeEnum (16, 13);
+                          break;
+                        default:
+                          SerializeEnum (16, 0);
+                        }
+                    }
+                }
+
+            }
+
+          if (it->measObjectEutra.haveCellForWhichToReportCGI)
+            {
+              SerializeInteger (it->measObjectEutra.cellForWhichToReportCGI,0,503);
+            }
+        }
+    }
+
+
+  if (!measConfig.reportConfigToRemoveList.empty () )
+    {
+      SerializeSequenceOf (measConfig.reportConfigToRemoveList.size (),MAX_REPORT_CONFIG_ID,1);
+      for (std::list<uint8_t>::iterator it = measConfig.reportConfigToRemoveList.begin (); it != measConfig.reportConfigToRemoveList.end (); it++)
+        {
+          SerializeInteger (*it, 1,MAX_REPORT_CONFIG_ID);
+        }
+    }
+
+  if (!measConfig.reportConfigToAddModList.empty () )
+    {
+      SerializeSequenceOf (measConfig.reportConfigToAddModList.size (),MAX_REPORT_CONFIG_ID,1);
+      for (std::list<LteRrcSap::ReportConfigToAddMod>::iterator it = measConfig.reportConfigToAddModList.begin (); it != measConfig.reportConfigToAddModList.end (); it++)
+        {
+          SerializeSequence (std::bitset<0> (), false);
+          SerializeInteger (it->reportConfigId,1,MAX_REPORT_CONFIG_ID);
+          SerializeChoice (2,0,false); // reportConfigEUTRA
+
+          // Serialize ReportConfigEUTRA
+          SerializeSequence (std::bitset<0> (), true);
+          switch (it->reportConfigEutra.triggerType)
+            {
+            case LteRrcSap::ReportConfigEutra::periodical:
+              SerializeChoice (2, 1, false); 
+              SerializeSequence (std::bitset<0> (),false);
+              switch (it->reportConfigEutra.purpose)
+                {
+                case LteRrcSap::ReportConfigEutra::reportCgi:
+                  SerializeEnum (2,1);
+                  break;
+                case LteRrcSap::ReportConfigEutra::reportStrongestCells:
+                default:
+                  SerializeEnum (2,0);
+                }
+              break;
+            case LteRrcSap::ReportConfigEutra::event:
+            default: 
+              SerializeChoice (2, 0, false);
+              SerializeSequence (std::bitset<0> (),true);
+              switch (it->reportConfigEutra.eventId)
+                {
+                case LteRrcSap::ReportConfigEutra::eventA1:
+                  SerializeChoice (5, 0, true);
+                  SerializeSequence (std::bitset<0> (),false);
+                  SerializeThresholdEutra (it->reportConfigEutra.threshold1);
+                  break;
+                case LteRrcSap::ReportConfigEutra::eventA2:
+                  SerializeChoice (5, 1, true);
+                  SerializeSequence (std::bitset<0> (),false);
+                  SerializeThresholdEutra (it->reportConfigEutra.threshold1);
+                  break;
+                case LteRrcSap::ReportConfigEutra::eventA3:
+                  SerializeChoice (5, 2, true);
+                  SerializeSequence (std::bitset<0> (),false);
+                  SerializeInteger (it->reportConfigEutra.a3Offset,-30,30);
+                  SerializeBoolean (it->reportConfigEutra.reportOnLeave);
+                  break;
+                case LteRrcSap::ReportConfigEutra::eventA4:
+                  SerializeChoice (5, 3, true);
+                  SerializeSequence (std::bitset<0> (),false);
+                  SerializeThresholdEutra (it->reportConfigEutra.threshold1);
+                  break;
+                case LteRrcSap::ReportConfigEutra::eventA5:
+                default:
+                  SerializeChoice (5, 4, true);
+                  SerializeSequence (std::bitset<0> (),false);
+                  SerializeThresholdEutra (it->reportConfigEutra.threshold1);
+                  SerializeThresholdEutra (it->reportConfigEutra.threshold2);
+                }
+
+              SerializeInteger (it->reportConfigEutra.hysteresis, 0, 30);
+
+              switch (it->reportConfigEutra.timeToTrigger)
+                {
+                case 0:
+                  SerializeEnum (16, 0);
+                  break;
+                case 40:
+                  SerializeEnum (16, 1);
+                  break;
+                case 64:
+                  SerializeEnum (16, 2);
+                  break;
+                case 80:
+                  SerializeEnum (16, 3);
+                  break;
+                case 100:
+                  SerializeEnum (16, 4);
+                  break;
+                case 128:
+                  SerializeEnum (16, 5);
+                  break;
+                case 160:
+                  SerializeEnum (16, 6);
+                  break;
+                case 256:
+                  SerializeEnum (16, 7);
+                  break;
+                case 320:
+                  SerializeEnum (16, 8);
+                  break;
+                case 480:
+                  SerializeEnum (16, 9);
+                  break;
+                case 512:
+                  SerializeEnum (16, 10);
+                  break;
+                case 640:
+                  SerializeEnum (16, 11);
+                  break;
+                case 1024:
+                  SerializeEnum (16, 12);
+                  break;
+                case 1280:
+                  SerializeEnum (16, 13);
+                  break;
+                case 2560:
+                  SerializeEnum (16, 14);
+                  break;
+                case 5120:
+                default:
+                  SerializeEnum (16, 15);
+                }
+            } // end trigger type
+
+          // Serialize triggerQuantity
+          if (it->reportConfigEutra.triggerQuantity == LteRrcSap::ReportConfigEutra::rsrp)
+            {
+              SerializeEnum (2, 0);
+            }
+          else
+            {
+              SerializeEnum (2, 1);
+            }
+
+          // Serialize reportQuantity
+          if (it->reportConfigEutra.reportQuantity == LteRrcSap::ReportConfigEutra::sameAsTriggerQuantity)
+            {
+              SerializeEnum (2, 0);
+            }
+          else
+            {
+              SerializeEnum (2, 1);
+            }
+
+          // Serialize maxReportCells
+          SerializeInteger (it->reportConfigEutra.maxReportCells, 1, MAX_CELL_REPORT);
+
+          // Serialize reportInterval
+          switch (it->reportConfigEutra.reportInterval)
+            {
+            case LteRrcSap::ReportConfigEutra::ms120:
+              SerializeEnum (16, 0);
+              break;
+            case LteRrcSap::ReportConfigEutra::ms240:
+              SerializeEnum (16, 1);
+              break;
+            case LteRrcSap::ReportConfigEutra::ms480:
+              SerializeEnum (16, 2);
+              break;
+            case LteRrcSap::ReportConfigEutra::ms640:
+              SerializeEnum (16, 3);
+              break;
+            case LteRrcSap::ReportConfigEutra::ms1024:
+              SerializeEnum (16, 4);
+              break;
+            case LteRrcSap::ReportConfigEutra::ms2048:
+              SerializeEnum (16, 5);
+              break;
+            case LteRrcSap::ReportConfigEutra::ms5120:
+              SerializeEnum (16, 6);
+              break;
+            case LteRrcSap::ReportConfigEutra::ms10240:
+              SerializeEnum (16, 7);
+              break;
+            case LteRrcSap::ReportConfigEutra::min1:
+              SerializeEnum (16, 8);
+              break;
+            case LteRrcSap::ReportConfigEutra::min6:
+              SerializeEnum (16, 9);
+              break;
+            case LteRrcSap::ReportConfigEutra::min12:
+              SerializeEnum (16, 10);
+              break;
+            case LteRrcSap::ReportConfigEutra::min30:
+              SerializeEnum (16, 11);
+              break;
+            case LteRrcSap::ReportConfigEutra::min60:
+              SerializeEnum (16, 12);
+              break;
+            case LteRrcSap::ReportConfigEutra::spare3:
+              SerializeEnum (16, 13);
+              break;
+            case LteRrcSap::ReportConfigEutra::spare2:
+              SerializeEnum (16, 14);
+              break;
+            case LteRrcSap::ReportConfigEutra::spare1:
+            default:
+              SerializeEnum (16, 15);
+            }
+
+          // Serialize reportAmount
+          switch (it->reportConfigEutra.reportAmount)
+            {
+            case 1:
+              SerializeEnum (8, 0);
+              break;
+            case 2:
+              SerializeEnum (8, 1);
+              break;
+            case 4:
+              SerializeEnum (8, 2);
+              break;
+            case 8:
+              SerializeEnum (8, 3);
+              break;
+            case 16:
+              SerializeEnum (8, 4);
+              break;
+            case 32:
+              SerializeEnum (8, 5);
+              break;
+            case 64:
+              SerializeEnum (8, 6);
+              break;
+            default:
+              SerializeEnum (8, 7);
+            }
+        }
+    }
+
+  if (!measConfig.measIdToRemoveList.empty () )
+    {
+      SerializeSequenceOf (measConfig.measIdToRemoveList.size (), MAX_MEAS_ID, 1);
+      for (std::list<uint8_t>::iterator it = measConfig.measIdToRemoveList.begin (); it != measConfig.measIdToRemoveList.end (); it++)
+        {
+          SerializeInteger (*it, 1, MAX_MEAS_ID);
+        }
+    }
+
+  if (!measConfig.measIdToAddModList.empty () )
+    {
+      SerializeSequenceOf ( measConfig.measIdToAddModList.size (), MAX_MEAS_ID, 1);
+      for (std::list<LteRrcSap::MeasIdToAddMod>::iterator it = measConfig.measIdToAddModList.begin (); it != measConfig.measIdToAddModList.end (); it++)
+        {
+          SerializeInteger (it->measId, 1, MAX_MEAS_ID);
+          SerializeInteger (it->measObjectId, 1, MAX_OBJECT_ID);
+          SerializeInteger (it->reportConfigId, 1, MAX_REPORT_CONFIG_ID);
+        }
+    }
+
+  if (measConfig.haveQuantityConfig )
+    {
+      // QuantityConfig sequence
+      // 4 optional fields, only first (EUTRA) present. Extension marker yes.
+      std::bitset<4> quantityConfigOpts (0);
+      quantityConfigOpts.set (3,1);
+      SerializeSequence (quantityConfigOpts, true);
+      SerializeSequence (std::bitset<0> (), false);
+
+      switch (measConfig.quantityConfig.filterCoefficientRSRP)
+        {
+        case 0:
+          SerializeEnum (16, 0);
+          break;
+        case 1:
+          SerializeEnum (16, 1);
+          break;
+        case 2:
+          SerializeEnum (16, 2);
+          break;
+        case 3:
+          SerializeEnum (16, 3);
+          break;
+        case 4:
+          SerializeEnum (16, 4);
+          break;
+        case 5:
+          SerializeEnum (16, 5);
+          break;
+        case 6:
+          SerializeEnum (16, 6);
+          break;
+        case 7:
+          SerializeEnum (16, 7);
+          break;
+        case 8:
+          SerializeEnum (16, 8);
+          break;
+        case 9:
+          SerializeEnum (16, 9);
+          break;
+        case 11:
+          SerializeEnum (16, 10);
+          break;
+        case 13:
+          SerializeEnum (16, 11);
+          break;
+        case 15:
+          SerializeEnum (16, 12);
+          break;
+        case 17:
+          SerializeEnum (16, 13);
+          break;
+        case 19:
+          SerializeEnum (16, 14);
+          break;
+        default:
+          SerializeEnum (16, 4);
+        }
+
+      switch (measConfig.quantityConfig.filterCoefficientRSRQ)
+        {
+        case 0:
+          SerializeEnum (16, 0);
+          break;
+        case 1:
+          SerializeEnum (16, 1);
+          break;
+        case 2:
+          SerializeEnum (16, 2);
+          break;
+        case 3:
+          SerializeEnum (16, 3);
+          break;
+        case 4:
+          SerializeEnum (16, 4);
+          break;
+        case 5:
+          SerializeEnum (16, 5);
+          break;
+        case 6:
+          SerializeEnum (16, 6);
+          break;
+        case 7:
+          SerializeEnum (16, 7);
+          break;
+        case 8:
+          SerializeEnum (16, 8);
+          break;
+        case 9:
+          SerializeEnum (16, 9);
+          break;
+        case 11:
+          SerializeEnum (16, 10);
+          break;
+        case 13:
+          SerializeEnum (16, 11);
+          break;
+        case 15:
+          SerializeEnum (16, 12);
+          break;
+        case 17:
+          SerializeEnum (16, 13);
+          break;
+        case 19:
+          SerializeEnum (16, 14);
+          break;
+        default:
+          SerializeEnum (16, 4);
+        }
+    }
+
+  if (measConfig.haveMeasGapConfig )
+    {
+      switch (measConfig.measGapConfig.type)
+        {
+        case LteRrcSap::MeasGapConfig::RESET:
+          SerializeChoice (2, 0, false);
+          SerializeNull ();
+          break;
+        case LteRrcSap::MeasGapConfig::SETUP:
+        default:
+          SerializeChoice (2, 1, false);
+          SerializeSequence (std::bitset<0> (),false);
+          switch (measConfig.measGapConfig.gapOffsetChoice)
+            {
+            case LteRrcSap::MeasGapConfig::gp0:
+              SerializeChoice (2, 0, true);
+              SerializeInteger (measConfig.measGapConfig.gapOffsetValue, 0, 39);
+              break;
+            case LteRrcSap::MeasGapConfig::gp1:
+            default:
+              SerializeChoice (2, 1, true);
+              SerializeInteger (measConfig.measGapConfig.gapOffsetValue, 0, 79);
+            }
+        }
+    }
+
+  if (measConfig.haveSmeasure )
+    {
+      SerializeInteger (measConfig.sMeasure, 0, 97);
+    }
+
+  // ...Here preRegistrationInfoHRPD would be serialized
+
+  if (measConfig.haveSpeedStatePars )
+    {
+      switch (measConfig.speedStatePars.type)
+        {
+        case LteRrcSap::SpeedStatePars::RESET:
+          SerializeChoice (2, 0, false);
+          SerializeNull ();
+          break;
+        case LteRrcSap::SpeedStatePars::SETUP:
+        default:
+          SerializeChoice (2, 1, false);
+          SerializeSequence (std::bitset<0> (), false);
+          switch (measConfig.speedStatePars.mobilityStateParameters.tEvaluation)
+            {
+            case 30:
+              SerializeEnum (8, 0);
+              break;
+            case 60:
+              SerializeEnum (8, 1);
+              break;
+            case 120:
+              SerializeEnum (8, 2);
+              break;
+            case 180:
+              SerializeEnum (8, 3);
+              break;
+            case 240:
+              SerializeEnum (8, 4);
+              break;
+            default:
+              SerializeEnum (8, 5);
+              break;
+            }
+
+          switch (measConfig.speedStatePars.mobilityStateParameters.tHystNormal)
+            {
+            case 30:
+              SerializeEnum (8, 0);
+              break;
+            case 60:
+              SerializeEnum (8, 1);
+              break;
+            case 120:
+              SerializeEnum (8, 2);
+              break;
+            case 180:
+              SerializeEnum (8, 3);
+              break;
+            case 240:
+              SerializeEnum (8, 4);
+              break;
+            default:
+              SerializeEnum (8, 5);
+              break;
+            }
+
+          SerializeInteger (measConfig.speedStatePars.mobilityStateParameters.nCellChangeMedium, 1, 16);
+          SerializeInteger (measConfig.speedStatePars.mobilityStateParameters.nCellChangeHigh, 1, 16);
+
+          SerializeSequence (std::bitset<0> (), false);
+          switch (measConfig.speedStatePars.timeToTriggerSf.sfMedium)
+            {
+            case 25:
+              SerializeEnum (4, 0);
+              break;
+            case 50:
+              SerializeEnum (4, 1);
+              break;
+            case 75:
+              SerializeEnum (4, 2);
+              break;
+            case 100:
+            default:
+              SerializeEnum (4, 3);
+            }
+
+          switch (measConfig.speedStatePars.timeToTriggerSf.sfHigh)
+            {
+            case 25:
+              SerializeEnum (4, 0);
+              break;
+            case 50:
+              SerializeEnum (4, 1);
+              break;
+            case 75:
+              SerializeEnum (4, 2);
+              break;
+            case 100:
+            default:
+              SerializeEnum (4, 3);
+            }
+        }
+    }
+}
+
+Buffer::Iterator
+RrcAsn1Header::DeserializeThresholdEutra (LteRrcSap::ThresholdEutra * thresholdEutra, Buffer::Iterator bIterator)
+{
+  int thresholdEutraChoice, range;
+  bIterator = DeserializeChoice (2, false, &thresholdEutraChoice, bIterator);
+
+  switch (thresholdEutraChoice)
+    {
+    case 0:
+      thresholdEutra->choice = LteRrcSap::ThresholdEutra::thresholdRsrp;
+      bIterator = DeserializeInteger (&range, 0, 97, bIterator);
+      thresholdEutra->range = range;
+      break;
+    case 1:
+    default:
+      thresholdEutra->choice = LteRrcSap::ThresholdEutra::thresholdRsrq;
+      bIterator = DeserializeInteger (&range, 0, 34, bIterator);
+      thresholdEutra->range = range;
+    }
+
+  return bIterator;
+}
+
+Buffer::Iterator
+RrcAsn1Header::DeserializeQoffsetRange (int8_t * qOffsetRange, Buffer::Iterator bIterator)
+{
+  int n;
+  bIterator = DeserializeEnum (31, &n, bIterator);
+  switch (n)
+    {
+    case 0:
+      *qOffsetRange = -24;
+      break;
+    case 1:
+      *qOffsetRange = -22;
+      break;
+    case 2:
+      *qOffsetRange = -20;
+      break;
+    case 3:
+      *qOffsetRange = -18;
+      break;
+    case 4:
+      *qOffsetRange = -16;
+      break;
+    case 5:
+      *qOffsetRange = -14;
+      break;
+    case 6:
+      *qOffsetRange = -12;
+      break;
+    case 7:
+      *qOffsetRange = -10;
+      break;
+    case 8:
+      *qOffsetRange = -8;
+      break;
+    case 9:
+      *qOffsetRange = -6;
+      break;
+    case 10:
+      *qOffsetRange = -5;
+      break;
+    case 11:
+      *qOffsetRange = -4;
+      break;
+    case 12:
+      *qOffsetRange = -3;
+      break;
+    case 13:
+      *qOffsetRange = -2;
+      break;
+    case 14:
+      *qOffsetRange = -1;
+      break;
+    case 15:
+      *qOffsetRange = 0;
+      break;
+    case 16:
+      *qOffsetRange = 1;
+      break;
+    case 17:
+      *qOffsetRange = 2;
+      break;
+    case 18:
+      *qOffsetRange = 3;
+      break;
+    case 19:
+      *qOffsetRange = 4;
+      break;
+    case 20:
+      *qOffsetRange = 5;
+      break;
+    case 21:
+      *qOffsetRange = 6;
+      break;
+    case 22:
+      *qOffsetRange = 8;
+      break;
+    case 23:
+      *qOffsetRange = 10;
+      break;
+    case 24:
+      *qOffsetRange = 12;
+      break;
+    case 25:
+      *qOffsetRange = 14;
+      break;
+    case 26:
+      *qOffsetRange = 16;
+      break;
+    case 27:
+      *qOffsetRange = 18;
+      break;
+    case 28:
+      *qOffsetRange = 20;
+      break;
+    case 29:
+      *qOffsetRange = 22;
+      break;
+    case 30:
+    default:
+      *qOffsetRange = 24;
+    }
+  return bIterator;
+}
+
 Buffer::Iterator
 RrcAsn1Header::DeserializeRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedicated *radioResourceConfigDedicated, Buffer::Iterator bIterator)
 {
@@ -1152,11 +2078,11 @@
       logicalChannelConfig->bucketSizeDurationMs = bucketSizeDurationMs;
 
       if (bitset1[0])
-      {
-        // Deserialize logicalChannelGroup
-        bIterator = DeserializeInteger (&n,0,3,bIterator);
-        logicalChannelConfig->logicalChannelGroup = n;
-      }
+        {
+          // Deserialize logicalChannelGroup
+          bIterator = DeserializeInteger (&n,0,3,bIterator);
+          logicalChannelConfig->logicalChannelGroup = n;
+        }
     }
   return bIterator;
 }
@@ -2091,6 +3017,839 @@
   return bIterator;
 }
 
+Buffer::Iterator
+RrcAsn1Header::DeserializeMeasConfig (LteRrcSap::MeasConfig * measConfig, Buffer::Iterator bIterator)
+{
+  std::bitset<0> bitset0;
+  std::bitset<2> bitset2;
+  std::bitset<11> bitset11;
+  int n;
+
+  // measConfig
+  bIterator = DeserializeSequence (&bitset11,true,bIterator);
+
+  if (bitset11[10])
+    {
+      // measObjectToRemoveList
+      int measObjectToRemoveListElems;
+      bIterator = DeserializeSequenceOf (&measObjectToRemoveListElems, MAX_OBJECT_ID, 1, bIterator);
+
+      for (int i = 0; i < measObjectToRemoveListElems; i++)
+        {
+          bIterator = DeserializeInteger (&n, 1, MAX_OBJECT_ID, bIterator);
+          measConfig->measObjectToRemoveList.push_back (n);
+        }
+    }
+
+  if (bitset11[9])
+    {
+      // measObjectToAddModList
+      int measObjectToAddModListElems;
+      bIterator = DeserializeSequenceOf (&measObjectToAddModListElems, MAX_OBJECT_ID, 1, bIterator);
+
+      for (int i = 0; i < measObjectToAddModListElems; i++)
+        {
+          LteRrcSap::MeasObjectToAddMod * elem = new LteRrcSap::MeasObjectToAddMod ();
+
+          bIterator = DeserializeSequence (&bitset0, false, bIterator);
+
+          bIterator = DeserializeInteger (&n, 1, MAX_OBJECT_ID, bIterator);
+          elem->measObjectId = n;
+
+          int measObjectChoice;
+          bIterator = DeserializeChoice (4, true, &measObjectChoice, bIterator);
+
+          switch (measObjectChoice)
+            {
+            case 1:
+              // Deserialize measObjectUTRA
+              // ...
+              break;
+
+            case 2:
+              // Deserialize measObjectGERAN
+              // ...
+              break;
+
+            case 3:
+              // Deserialize measObjectCDMA2000
+              // ...
+              break;
+
+            case 0:
+            default:
+              // Deserialize measObjectEUTRA
+              std::bitset<5> measObjectEutraOpts;
+              bIterator = DeserializeSequence (&measObjectEutraOpts, true, bIterator);
+
+              // carrierFreq
+              bIterator = DeserializeInteger (&n, 0, MAX_EARFCN, bIterator);
+              elem->measObjectEutra.carrierFreq = n;
+
+              // allowedMeasBandwidth
+              bIterator = DeserializeEnum (6, &n, bIterator);
+              switch (n)
+                {
+                case 0:
+                  elem->measObjectEutra.allowedMeasBandwidth = 6;
+                  break;
+                case 1:
+                  elem->measObjectEutra.allowedMeasBandwidth = 15;
+                  break;
+                case 2:
+                  elem->measObjectEutra.allowedMeasBandwidth = 25;
+                  break;
+                case 3:
+                  elem->measObjectEutra.allowedMeasBandwidth = 50;
+                  break;
+                case 4:
+                  elem->measObjectEutra.allowedMeasBandwidth = 75;
+                  break;
+                case 5:
+                default:
+                  elem->measObjectEutra.allowedMeasBandwidth = 100;
+                  break;
+                }
+
+              // presenceAntennaPort1
+              bIterator = DeserializeBoolean (&elem->measObjectEutra.presenceAntennaPort1, bIterator);
+
+              // neighCellConfig
+              bIterator = DeserializeBitstring (&bitset2, bIterator);
+              elem->measObjectEutra.neighCellConfig = bitset2.to_ulong ();
+
+              // offsetFreq
+              DeserializeQoffsetRange (&elem->measObjectEutra.offsetFreq, bIterator);
+
+              if (measObjectEutraOpts[4])
+                {
+                  // cellsToRemoveList
+                  int numElems;
+                  bIterator = DeserializeSequenceOf (&numElems, MAX_CELL_MEAS, 1, bIterator);
+
+                  for (int i = 0; i < numElems; i++)
+                    {
+                      bIterator = DeserializeInteger (&n, 1, MAX_CELL_MEAS, bIterator);
+                      elem->measObjectEutra.cellsToRemoveList.push_back (n);
+                    }
+                }
+
+              if (measObjectEutraOpts[3])
+                {
+                  // cellsToAddModList
+                  int numElems;
+                  bIterator = DeserializeSequenceOf (&numElems, MAX_CELL_MEAS, 1, bIterator);
+
+                  for (int i = 0; i < numElems; i++)
+                    {
+                      LteRrcSap::CellsToAddMod * cellsToAddMod = new LteRrcSap::CellsToAddMod ();
+
+                      bIterator = DeserializeSequence (&bitset0, false, bIterator);
+
+                      // cellIndex
+                      bIterator = DeserializeInteger (&n, 1, MAX_CELL_MEAS, bIterator);
+                      cellsToAddMod->cellIndex = n;
+
+                      // PhysCellId
+                      bIterator = DeserializeInteger (&n, 0, 503, bIterator);
+                      cellsToAddMod->physCellId = n;
+
+                      // cellIndividualOffset
+                      bIterator = DeserializeQoffsetRange ( &cellsToAddMod->cellIndividualOffset, bIterator);
+
+                      elem->measObjectEutra.cellsToAddModList.push_back (*cellsToAddMod);
+                    }
+                }
+
+              if (measObjectEutraOpts[2])
+                {
+                  // blackCellsToRemoveList
+                  int numElems;
+                  bIterator = DeserializeSequenceOf (&numElems, MAX_CELL_MEAS, 1, bIterator);
+
+                  for (int i = 0; i < numElems; i++)
+                    {
+                      bIterator = DeserializeInteger (&n, 1, MAX_CELL_MEAS, bIterator);
+                      elem->measObjectEutra.blackCellsToRemoveList.push_back (n);
+                    }
+                }
+
+
+              if (measObjectEutraOpts[1])
+                {
+                  // blackCellsToAddModList
+                  int numElems;
+                  bIterator = DeserializeSequenceOf (&numElems, MAX_CELL_MEAS, 1, bIterator);
+
+                  for (int i = 0; i < numElems; i++)
+                    {
+                      LteRrcSap::BlackCellsToAddMod * blackCellsToAddMod = new LteRrcSap::BlackCellsToAddMod ();
+                      bIterator = DeserializeSequence (&bitset0, false, bIterator);
+
+                      bIterator = DeserializeInteger (&n, 1, MAX_CELL_MEAS, bIterator);
+                      blackCellsToAddMod->cellIndex = n;
+
+                      // PhysCellIdRange
+                      std::bitset<1> isRangePresent;
+                      bIterator = DeserializeSequence (&isRangePresent, false, bIterator);
+
+                      // start
+                      bIterator = DeserializeInteger (&n, 0, 503, bIterator);
+                      blackCellsToAddMod->physCellIdRange.start = n;
+
+                      blackCellsToAddMod->physCellIdRange.haveRange = isRangePresent[0];
+                      if (blackCellsToAddMod->physCellIdRange.haveRange)
+                        {
+                          // range
+                          bIterator = DeserializeEnum (16, &n, bIterator);
+                          switch (n)
+                            {
+                            case 0:
+                              blackCellsToAddMod->physCellIdRange.range = 4;
+                              break;
+                            case 1:
+                              blackCellsToAddMod->physCellIdRange.range = 8;
+                              break;
+                            case 2:
+                              blackCellsToAddMod->physCellIdRange.range = 12;
+                              break;
+                            case 3:
+                              blackCellsToAddMod->physCellIdRange.range = 16;
+                              break;
+                            case 4:
+                              blackCellsToAddMod->physCellIdRange.range = 24;
+                              break;
+                            case 5:
+                              blackCellsToAddMod->physCellIdRange.range = 32;
+                              break;
+                            case 6:
+                              blackCellsToAddMod->physCellIdRange.range = 48;
+                              break;
+                            case 7:
+                              blackCellsToAddMod->physCellIdRange.range = 64;
+                              break;
+                            case 8:
+                              blackCellsToAddMod->physCellIdRange.range = 84;
+                              break;
+                            case 9:
+                              blackCellsToAddMod->physCellIdRange.range = 96;
+                              break;
+                            case 10:
+                              blackCellsToAddMod->physCellIdRange.range = 128;
+                              break;
+                            case 11:
+                              blackCellsToAddMod->physCellIdRange.range = 168;
+                              break;
+                            case 12:
+                              blackCellsToAddMod->physCellIdRange.range = 252;
+                              break;
+                            case 13:
+                              blackCellsToAddMod->physCellIdRange.range = 504;
+                              break;
+                            default:
+                              blackCellsToAddMod->physCellIdRange.range = 0;
+                            }
+                        }
+
+                      elem->measObjectEutra.blackCellsToAddModList.push_back (*blackCellsToAddMod);
+                    }
+                }
+
+              elem->measObjectEutra.haveCellForWhichToReportCGI = measObjectEutraOpts[0];
+              if (measObjectEutraOpts[0])
+                {
+                  // cellForWhichToReportCGI
+                  bIterator = DeserializeInteger (&n, 0, 503, bIterator);
+                  elem->measObjectEutra.cellForWhichToReportCGI = n;
+                }
+            }
+          measConfig->measObjectToAddModList.push_back (*elem);
+        }
+    }
+
+  if (bitset11[8])
+    {
+      // reportConfigToRemoveList
+      int reportConfigToRemoveListElems;
+      bIterator = DeserializeSequenceOf (&reportConfigToRemoveListElems, MAX_REPORT_CONFIG_ID, 1, bIterator);
+
+      for (int i = 0; i < reportConfigToRemoveListElems; i++)
+        {
+          bIterator = DeserializeInteger (&n, 1, MAX_REPORT_CONFIG_ID, bIterator);
+          measConfig->reportConfigToRemoveList.push_back (n);
+        }
+    }
+
+  if (bitset11[7])
+    {
+      // reportConfigToAddModList
+      int reportConfigToAddModListElems;
+      bIterator = DeserializeSequenceOf (&reportConfigToAddModListElems, MAX_REPORT_CONFIG_ID, 1, bIterator);
+
+      for (int i = 0; i < reportConfigToAddModListElems; i++)
+        {
+          LteRrcSap::ReportConfigToAddMod * elem = new LteRrcSap::ReportConfigToAddMod ();
+
+          bIterator = DeserializeSequence (&bitset0, false, bIterator);
+          bIterator = DeserializeInteger (&n, 1, MAX_REPORT_CONFIG_ID, bIterator);
+          elem->reportConfigId = n;
+
+          // Deserialize reportConfig
+          int reportConfigChoice;
+          bIterator = DeserializeChoice (2, false, &reportConfigChoice, bIterator);
+
+          if (reportConfigChoice == 0)
+            {
+              // reportConfigEUTRA
+              bIterator = DeserializeSequence (&bitset0, true, bIterator);
+
+              // triggerType
+              int triggerTypeChoice;
+              bIterator = DeserializeChoice (2, false, &triggerTypeChoice, bIterator);
+
+              if (triggerTypeChoice == 0)
+                {
+                  // event
+                  elem->reportConfigEutra.triggerType = LteRrcSap::ReportConfigEutra::event;
+                  bIterator = DeserializeSequence (&bitset0, false, bIterator);
+
+                  // eventId
+                  int eventIdChoice;
+                  bIterator = DeserializeChoice (5, true, &eventIdChoice, bIterator);
+
+                  switch (eventIdChoice)
+                    {
+                    case 0:
+                      elem->reportConfigEutra.eventId = LteRrcSap::ReportConfigEutra::eventA1;
+                      bIterator = DeserializeSequence (&bitset0, false, bIterator);
+                      bIterator = DeserializeThresholdEutra (&elem->reportConfigEutra.threshold1, bIterator);
+                      break;
+
+                    case 1:
+                      elem->reportConfigEutra.eventId = LteRrcSap::ReportConfigEutra::eventA2;
+                      bIterator = DeserializeSequence (&bitset0, false, bIterator);
+                      bIterator = DeserializeThresholdEutra (&elem->reportConfigEutra.threshold1, bIterator);
+                      break;
+
+                    case 2:
+                      elem->reportConfigEutra.eventId = LteRrcSap::ReportConfigEutra::eventA3;
+                      bIterator = DeserializeSequence (&bitset0, false, bIterator);
+                      bIterator = DeserializeInteger (&n, -30, 30, bIterator);
+                      elem->reportConfigEutra.a3Offset = n;
+                      bIterator = DeserializeBoolean (&elem->reportConfigEutra.reportOnLeave, bIterator);
+                      break;
+
+                    case 3:
+                      elem->reportConfigEutra.eventId = LteRrcSap::ReportConfigEutra::eventA4;
+                      bIterator = DeserializeSequence (&bitset0, false, bIterator);
+                      bIterator = DeserializeThresholdEutra (&elem->reportConfigEutra.threshold1, bIterator);
+                      break;
+
+                    default:
+                      elem->reportConfigEutra.eventId = LteRrcSap::ReportConfigEutra::eventA5;
+                      bIterator = DeserializeSequence (&bitset0, false, bIterator);
+                      bIterator = DeserializeThresholdEutra (&elem->reportConfigEutra.threshold1, bIterator);
+                      bIterator = DeserializeThresholdEutra (&elem->reportConfigEutra.threshold2, bIterator);
+                      break;
+                    }
+
+                  bIterator = DeserializeInteger (&n, 0, 30, bIterator);
+                  elem->reportConfigEutra.hysteresis = n;
+
+                  bIterator = DeserializeEnum (16, &n, bIterator);
+                  switch (n)
+                    {
+                    case 0:
+                      elem->reportConfigEutra.timeToTrigger = 0;
+                      break;
+                    case 1:
+                      elem->reportConfigEutra.timeToTrigger = 40;
+                      break;
+                    case 2:
+                      elem->reportConfigEutra.timeToTrigger = 64;
+                      break;
+                    case 3:
+                      elem->reportConfigEutra.timeToTrigger = 80;
+                      break;
+                    case 4:
+                      elem->reportConfigEutra.timeToTrigger = 100;
+                      break;
+                    case 5:
+                      elem->reportConfigEutra.timeToTrigger = 128;
+                      break;
+                    case 6:
+                      elem->reportConfigEutra.timeToTrigger = 160;
+                      break;
+                    case 7:
+                      elem->reportConfigEutra.timeToTrigger = 256;
+                      break;
+                    case 8:
+                      elem->reportConfigEutra.timeToTrigger = 320;
+                      break;
+                    case 9:
+                      elem->reportConfigEutra.timeToTrigger = 480;
+                      break;
+                    case 10:
+                      elem->reportConfigEutra.timeToTrigger = 512;
+                      break;
+                    case 11:
+                      elem->reportConfigEutra.timeToTrigger = 640;
+                      break;
+                    case 12:
+                      elem->reportConfigEutra.timeToTrigger = 1024;
+                      break;
+                    case 13:
+                      elem->reportConfigEutra.timeToTrigger = 1280;
+                      break;
+                    case 14:
+                      elem->reportConfigEutra.timeToTrigger = 2560;
+                      break;
+                    case 15:
+                    default:
+                      elem->reportConfigEutra.timeToTrigger = 5120;
+                      break;
+                    }
+                }
+
+              if (triggerTypeChoice == 1)
+                {
+                  // periodical
+                  elem->reportConfigEutra.triggerType = LteRrcSap::ReportConfigEutra::periodical;
+
+                  bIterator = DeserializeSequence (&bitset0, false, bIterator);
+                  bIterator = DeserializeEnum (2, &n, bIterator);
+                  if (n == 0)
+                    {
+                      elem->reportConfigEutra.purpose = LteRrcSap::ReportConfigEutra::reportStrongestCells;
+                    }
+                  else
+                    {
+                      elem->reportConfigEutra.purpose = LteRrcSap::ReportConfigEutra::reportCgi;
+                    }
+                }
+
+              // triggerQuantity
+              bIterator = DeserializeEnum (2, &n, bIterator);
+              if (n == 0)
+                {
+                  elem->reportConfigEutra.triggerQuantity = LteRrcSap::ReportConfigEutra::rsrp;
+                }
+              else
+                {
+                  elem->reportConfigEutra.triggerQuantity = LteRrcSap::ReportConfigEutra::rsrq;
+                }
+
+              // reportQuantity
+              bIterator = DeserializeEnum (2, &n, bIterator);
+              if (n == 0)
+                {
+                  elem->reportConfigEutra.reportQuantity = LteRrcSap::ReportConfigEutra::sameAsTriggerQuantity;
+                }
+              else
+                {
+                  elem->reportConfigEutra.reportQuantity = LteRrcSap::ReportConfigEutra::both;
+                }
+
+              // maxReportCells
+              bIterator = DeserializeInteger (&n, 1, MAX_CELL_REPORT, bIterator);
+              elem->reportConfigEutra.maxReportCells = n;
+
+              // reportInterval
+              bIterator = DeserializeEnum (16, &n, bIterator);
+              switch (n)
+                {
+                case 0:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms120;
+                  break;
+                case 1:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms240;
+                  break;
+                case 2:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms480;
+                  break;
+                case 3:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms640;
+                  break;
+                case 4:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms1024;
+                  break;
+                case 5:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms2048;
+                  break;
+                case 6:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms5120;
+                  break;
+                case 7:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms10240;
+                  break;
+                case 8:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::min1;
+                  break;
+                case 9:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::min6;
+                  break;
+                case 10:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::min12;
+                  break;
+                case 11:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::min30;
+                  break;
+                case 12:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::min60;
+                  break;
+                case 13:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::spare3;
+                  break;
+                case 14:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::spare2;
+                  break;
+                case 15:
+                default:
+                  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::spare1;
+                }
+
+              // reportAmount
+              bIterator = DeserializeEnum (8, &n, bIterator);
+              switch (n)
+                {
+                case 0:
+                  elem->reportConfigEutra.reportAmount = 1;
+                  break;
+                case 1:
+                  elem->reportConfigEutra.reportAmount = 2;
+                  break;
+                case 2:
+                  elem->reportConfigEutra.reportAmount = 4;
+                  break;
+                case 3:
+                  elem->reportConfigEutra.reportAmount = 8;
+                  break;
+                case 4:
+                  elem->reportConfigEutra.reportAmount = 16;
+                  break;
+                case 5:
+                  elem->reportConfigEutra.reportAmount = 32;
+                  break;
+                case 6:
+                  elem->reportConfigEutra.reportAmount = 64;
+                  break;
+                default:
+                  elem->reportConfigEutra.reportAmount = 0;
+                }
+            }
+
+          if (reportConfigChoice == 1)
+            {
+              // ReportConfigInterRAT
+              // ...
+            }
+
+          measConfig->reportConfigToAddModList.push_back (*elem);
+        }
+    }
+
+  if (bitset11[6])
+    {
+      // measIdToRemoveList
+      int measIdToRemoveListElems;
+      bIterator = DeserializeSequenceOf (&measIdToRemoveListElems, MAX_MEAS_ID, 1, bIterator);
+
+      for (int i = 0; i < measIdToRemoveListElems; i++)
+        {
+          bIterator = DeserializeInteger (&n, 1, MAX_MEAS_ID, bIterator);
+          measConfig->measIdToRemoveList.push_back (n);
+        }
+    }
+
+  if (bitset11[5])
+    {
+      // measIdToAddModList
+      int measIdToAddModListElems;
+      bIterator = DeserializeSequenceOf (&measIdToAddModListElems, MAX_MEAS_ID, 1, bIterator);
+
+      for (int i = 0; i < measIdToAddModListElems; i++)
+        {
+          LteRrcSap::MeasIdToAddMod * elem = new LteRrcSap::MeasIdToAddMod ();
+
+          bIterator = DeserializeSequence (&bitset0, false, bIterator);
+
+          bIterator = DeserializeInteger (&n, 1, MAX_MEAS_ID, bIterator);
+          elem->measId = n;
+
+          bIterator = DeserializeInteger (&n, 1, MAX_OBJECT_ID, bIterator);
+          elem->measObjectId = n;
+
+          bIterator = DeserializeInteger (&n, 1, MAX_REPORT_CONFIG_ID, bIterator);
+          elem->reportConfigId = n;
+
+          measConfig->measIdToAddModList.push_back (*elem);
+        }
+    }
+
+  measConfig->haveQuantityConfig = bitset11[4];
+  if (measConfig->haveQuantityConfig)
+    {
+      // quantityConfig
+      std::bitset<4> quantityConfigOpts;
+      bIterator = DeserializeSequence (&quantityConfigOpts, true, bIterator);
+
+      if (quantityConfigOpts[3])
+        {
+          // quantityConfigEUTRA
+          bIterator = DeserializeSequence (&bitset0,false,bIterator);
+          bIterator = DeserializeEnum (16, &n, bIterator);
+          switch (n)
+            {
+            case 0:
+              measConfig->quantityConfig.filterCoefficientRSRP = 0;
+              break;
+            case 1:
+              measConfig->quantityConfig.filterCoefficientRSRP = 1;
+              break;
+            case 2:
+              measConfig->quantityConfig.filterCoefficientRSRP = 2;
+              break;
+            case 3:
+              measConfig->quantityConfig.filterCoefficientRSRP = 3;
+              break;
+            case 4:
+              measConfig->quantityConfig.filterCoefficientRSRP = 4;
+              break;
+            case 5:
+              measConfig->quantityConfig.filterCoefficientRSRP = 5;
+              break;
+            case 6:
+              measConfig->quantityConfig.filterCoefficientRSRP = 6;
+              break;
+            case 7:
+              measConfig->quantityConfig.filterCoefficientRSRP = 7;
+              break;
+            case 8:
+              measConfig->quantityConfig.filterCoefficientRSRP = 8;
+              break;
+            case 9:
+              measConfig->quantityConfig.filterCoefficientRSRP = 9;
+              break;
+            case 10:
+              measConfig->quantityConfig.filterCoefficientRSRP = 11;
+              break;
+            case 11:
+              measConfig->quantityConfig.filterCoefficientRSRP = 13;
+              break;
+            case 12:
+              measConfig->quantityConfig.filterCoefficientRSRP = 15;
+              break;
+            case 13:
+              measConfig->quantityConfig.filterCoefficientRSRP = 17;
+              break;
+            case 14:
+              measConfig->quantityConfig.filterCoefficientRSRP = 19;
+              break;
+            case 15:
+              measConfig->quantityConfig.filterCoefficientRSRP = 0;
+              break;
+            default:
+              measConfig->quantityConfig.filterCoefficientRSRP = 4;
+            }
+          bIterator = DeserializeEnum (16, &n, bIterator);
+          switch (n)
+            {
+            case 0:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 0;
+              break;
+            case 1:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 1;
+              break;
+            case 2:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 2;
+              break;
+            case 3:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 3;
+              break;
+            case 4:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 4;
+              break;
+            case 5:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 5;
+              break;
+            case 6:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 6;
+              break;
+            case 7:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 7;
+              break;
+            case 8:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 8;
+              break;
+            case 9:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 9;
+              break;
+            case 10:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 11;
+              break;
+            case 11:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 13;
+              break;
+            case 12:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 15;
+              break;
+            case 13:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 17;
+              break;
+            case 14:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 19;
+              break;
+            case 15:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 0;
+              break;
+            default:
+              measConfig->quantityConfig.filterCoefficientRSRQ = 4;
+            }
+        }
+      if (quantityConfigOpts[2])
+        {
+          // quantityConfigUTRA
+          // ...
+        }
+      if (quantityConfigOpts[1])
+        {
+          // quantityConfigGERAN
+          // ...
+        }
+      if (quantityConfigOpts[0])
+        {
+          // quantityConfigCDMA2000
+          // ...
+        }
+    }
+
+  measConfig->haveMeasGapConfig = bitset11[3];
+  if (measConfig->haveMeasGapConfig)
+    {
+      // measGapConfig
+      int measGapConfigChoice;
+      bIterator = DeserializeChoice (2, false, &measGapConfigChoice, bIterator);
+      switch (measGapConfigChoice)
+        {
+        case 0:
+          measConfig->measGapConfig.type = LteRrcSap::MeasGapConfig::RESET;
+          bIterator = DeserializeNull (bIterator);
+          break;
+        case 1:
+        default:
+          measConfig->measGapConfig.type = LteRrcSap::MeasGapConfig::SETUP;
+          bIterator = DeserializeSequence (&bitset0, false, bIterator);
+
+          int gapOffsetChoice;
+          bIterator = DeserializeChoice (2, true, &gapOffsetChoice, bIterator);
+          switch (gapOffsetChoice)
+            {
+            case 0:
+              measConfig->measGapConfig.gapOffsetChoice = LteRrcSap::MeasGapConfig::gp0;
+              bIterator = DeserializeInteger (&n, 0, 39, bIterator);
+              measConfig->measGapConfig.gapOffsetValue = n;
+              break;
+            case 1:
+            default:
+              measConfig->measGapConfig.gapOffsetChoice = LteRrcSap::MeasGapConfig::gp1;
+              bIterator = DeserializeInteger (&n, 0, 79, bIterator);
+              measConfig->measGapConfig.gapOffsetValue = n;
+            }
+        }
+    }
+
+  measConfig->haveSmeasure = bitset11[2];
+  if (measConfig->haveSmeasure)
+    {
+      // s-Measure
+      bIterator = DeserializeInteger (&n, 0, 97, bIterator);
+      measConfig->sMeasure = n;
+    }
+
+  if (bitset11[1])
+    {
+      // preRegistrationInfoHRPD
+      // ...
+    }
+
+  measConfig->haveSpeedStatePars = bitset11[0];
+  if (measConfig->haveSpeedStatePars)
+    {
+      // speedStatePars
+      int speedStateParsChoice;
+      bIterator = DeserializeChoice (2, false, &speedStateParsChoice, bIterator);
+      switch (speedStateParsChoice)
+        {
+        case 0:
+          measConfig->speedStatePars.type = LteRrcSap::SpeedStatePars::RESET;
+          bIterator = DeserializeNull (bIterator);
+          break;
+        case 1:
+        default:
+          measConfig->speedStatePars.type = LteRrcSap::SpeedStatePars::SETUP;
+          bIterator = DeserializeSequence (&bitset0, false, bIterator);
+
+          // Deserialize mobilityStateParameters
+          // Deserialize t-Evaluation
+          bIterator = DeserializeEnum (8, &n, bIterator);
+          switch (n)
+            {
+            case 0:
+              measConfig->speedStatePars.mobilityStateParameters.tEvaluation = 30;
+              break;
+            case 1:
+              measConfig->speedStatePars.mobilityStateParameters.tEvaluation = 60;
+              break;
+            case 2:
+              measConfig->speedStatePars.mobilityStateParameters.tEvaluation = 120;
+              break;
+            case 3:
+              measConfig->speedStatePars.mobilityStateParameters.tEvaluation = 180;
+              break;
+            case 4:
+              measConfig->speedStatePars.mobilityStateParameters.tEvaluation = 240;
+              break;
+            default:
+              measConfig->speedStatePars.mobilityStateParameters.tEvaluation = 0;
+            }
+          // Deserialize t-HystNormal
+          bIterator = DeserializeEnum (8, &n, bIterator);
+          switch (n)
+            {
+            case 0:
+              measConfig->speedStatePars.mobilityStateParameters.tHystNormal = 30;
+              break;
+            case 1:
+              measConfig->speedStatePars.mobilityStateParameters.tHystNormal = 60;
+              break;
+            case 2:
+              measConfig->speedStatePars.mobilityStateParameters.tHystNormal = 120;
+              break;
+            case 3:
+              measConfig->speedStatePars.mobilityStateParameters.tHystNormal = 180;
+              break;
+            case 4:
+              measConfig->speedStatePars.mobilityStateParameters.tHystNormal = 240;
+              break;
+            default:
+              measConfig->speedStatePars.mobilityStateParameters.tHystNormal = 0;
+            }
+
+          bIterator = DeserializeInteger (&n, 1, 16, bIterator);
+          measConfig->speedStatePars.mobilityStateParameters.nCellChangeMedium = n;
+
+          bIterator = DeserializeInteger (&n, 1, 16, bIterator);
+          measConfig->speedStatePars.mobilityStateParameters.nCellChangeHigh = n;
+
+          // Deserialize timeToTriggerSf
+          bIterator = DeserializeEnum (4, &n, bIterator);
+          measConfig->speedStatePars.timeToTriggerSf.sfMedium = (n + 1) * 25;
+          bIterator = DeserializeEnum (4, &n, bIterator);
+          measConfig->speedStatePars.timeToTriggerSf.sfHigh = (n + 1) * 25;
+        }
+    }
+  return bIterator;
+}
 //////////////////// RrcConnectionRequest class ////////////////////////
 
 // Constructor
@@ -2655,13 +4414,9 @@
   options.set (0,0); // No nonCriticalExtension
   SerializeSequence (options,false);
 
-
   if (m_haveMeasConfig)
     {
-      // Serialize MeasConfig sequence
-      // 11 optional fields, extension marker present
-      std::bitset<11> measConfigOptional (0);
-      SerializeSequence (measConfigOptional,true);
+      SerializeMeasConfig (m_measConfig);
     }
 
   if (m_haveMobilityControlInfo)
@@ -2809,55 +4564,7 @@
           m_haveMeasConfig = rrcConnRecOpts[5];
           if (m_haveMeasConfig)
             {
-              std::bitset<11> bitset11;
-
-              // measConfig
-              bIterator = DeserializeSequence (&bitset11,true,bIterator);
-
-              if (bitset11[10])
-                {
-                  // measObjectToRemoveList
-                }
-              if (bitset11[9])
-                {
-                  // measObjectToAddModList
-                }
-              if (bitset11[8])
-                {
-                  // reportConfigToRemoveList
-                }
-              if (bitset11[7])
-                {
-                  // reportConfigToAddModList
-                }
-              if (bitset11[6])
-                {
-                  // measIdToRemoveList
-                }
-              if (bitset11[5])
-                {
-                  // measIdToAddModList
-                }
-              if (bitset11[4])
-                {
-                  // quantityConfig
-                }
-              if (bitset11[3])
-                {
-                  // measGapConfig
-                }
-              if (bitset11[2])
-                {
-                  // s-Measure
-                }
-              if (bitset11[1])
-                {
-                  // preRegistrationInfoHRPD
-                }
-              if (bitset11[0])
-                {
-                  // speedStatePars
-                }
+              bIterator = DeserializeMeasConfig (&m_measConfig, bIterator);
             }
 
           m_haveMobilityControlInfo = rrcConnRecOpts[4];
@@ -3014,6 +4721,76 @@
 {
   os << "rrcTransactionIdentifier: " << (int) m_rrcTransactionIdentifier << std::endl;
   os << "haveMeasConfig: " << m_haveMeasConfig << std::endl;
+  if (m_haveMobilityControlInfo)
+    {
+      if (!m_measConfig.measObjectToRemoveList.empty ())
+        {
+          os << "  measObjectToRemoveList: ";
+          std::list<uint8_t> auxList = m_measConfig.measObjectToRemoveList;
+          std::list<uint8_t>::iterator it = auxList.begin ();
+          for (; it != auxList.end (); it++)
+            {
+              os << (int) *it << ", ";
+            }
+          os << std::endl;
+        }
+      if (!m_measConfig.reportConfigToRemoveList.empty ())
+        {
+          os << "  reportConfigToRemoveList: ";
+          std::list<uint8_t> auxList = m_measConfig.reportConfigToRemoveList;
+          std::list<uint8_t>::iterator it = auxList.begin ();
+          for (; it != auxList.end (); it++)
+            {
+              os << (int) *it << ", ";
+            }
+          os << std::endl;
+        }
+      if (!m_measConfig.measIdToRemoveList.empty ())
+        {
+          os << "  measIdToRemoveList: ";
+          std::list<uint8_t> auxList = m_measConfig.measIdToRemoveList;
+          std::list<uint8_t>::iterator it = auxList.begin ();
+          for (; it != auxList.end (); it++)
+            {
+              os << (int) *it << ", ";
+            }
+          os << std::endl;
+        }
+
+      os << "  haveQuantityConfig: " << m_measConfig.haveQuantityConfig << std::endl;
+      if (m_measConfig.haveQuantityConfig)
+        {
+          os << "    filterCoefficientRSRP: " << (int)m_measConfig.quantityConfig.filterCoefficientRSRP << std::endl;
+          os << "    filterCoefficientRSRQ:" << (int)m_measConfig.quantityConfig.filterCoefficientRSRQ  << std::endl;
+        }
+
+      os << "  haveMeasGapConfig: " << m_measConfig.haveMeasGapConfig << std::endl;
+      if (m_measConfig.haveMeasGapConfig)
+        {
+          os << "    measGapConfig.type: " << m_measConfig.measGapConfig.type << std::endl;
+          os << "    measGapConfig.gap (gap0/1,value): (" << m_measConfig.measGapConfig.gapOffsetChoice
+             << "," << (int) m_measConfig.measGapConfig.gapOffsetValue << ")" << std::endl;
+        }
+
+      os << "  haveSmeasure: " << m_measConfig.haveSmeasure << std::endl;
+      if (m_measConfig.haveSmeasure)
+        {
+          os << "    sMeasure: " << (int) m_measConfig.sMeasure  << std::endl;
+        }
+
+      os << "  haveSpeedStatePars: " << m_measConfig.haveSpeedStatePars << std::endl;
+      if (m_measConfig.haveSpeedStatePars)
+        {
+          os << "    speedStatePars.type: " << m_measConfig.speedStatePars.type << std::endl;
+          os << "    speedStatePars.mobilityStateParameters.tEvaluation: " << (int)m_measConfig.speedStatePars.mobilityStateParameters.tEvaluation << std::endl;
+          os << "    speedStatePars.mobilityStateParameters.tHystNormal: " << (int)m_measConfig.speedStatePars.mobilityStateParameters.tHystNormal << std::endl;
+          os << "    speedStatePars.mobilityStateParameters.nCellChangeMedium: " << (int)m_measConfig.speedStatePars.mobilityStateParameters.nCellChangeMedium << std::endl;
+          os << "    speedStatePars.mobilityStateParameters.nCellChangeHigh: " << (int)m_measConfig.speedStatePars.mobilityStateParameters.nCellChangeHigh << std::endl;
+          os << "    speedStatePars.timeToTriggerSf.sfMedium: " << (int)m_measConfig.speedStatePars.timeToTriggerSf.sfMedium << std::endl;
+          os << "    speedStatePars.timeToTriggerSf.sfHigh: " << (int)m_measConfig.speedStatePars.timeToTriggerSf.sfHigh << std::endl;
+        }
+    }
+
   os << "haveMobilityControlInfo: " << m_haveMobilityControlInfo << std::endl;
   if (m_haveMobilityControlInfo)
     {
@@ -3187,9 +4964,7 @@
   SerializeSequence (std::bitset<0> (),true);
 
   // Serialize sourceMeasConfig
-  // 11 optional fields, extension marker present
-  std::bitset<11> measConfigOptional (0);
-  SerializeSequence (measConfigOptional,true);
+  SerializeMeasConfig (m_asConfig.sourceMeasConfig);
 
   // Serialize sourceRadioResourceConfig
   SerializeRadioResourceConfigDedicated (m_asConfig.sourceRadioResourceConfig);
@@ -3278,53 +5053,7 @@
               bIterator = DeserializeSequence (&bitset0,true,bIterator);
 
               // Deserialize sourceMeasConfig
-              std::bitset<11> bitset11;
-              bIterator = DeserializeSequence (&bitset11,true,bIterator);
-
-              if (bitset11[10]) //measObjectToRemoveList
-                {
-                  // ...
-                }
-              if (bitset11[9]) //measObjectToAddModList
-                {
-                  // ...
-                }
-              if (bitset11[8]) //reportConfigToRemoveList
-                {
-                  // ...
-                }
-              if (bitset11[7]) //reportConfigToAddModList
-                {
-                  // ...
-                }
-              if (bitset11[6]) //measIdToRemoveList
-                {
-                  // ...
-                }
-              if (bitset11[5]) //measIdToAddModList
-                {
-                  // ...
-                }
-              if (bitset11[4]) //quantityConfig
-                {
-                  // ...
-                }
-              if (bitset11[3]) //measGapConfig
-                {
-                  // ...
-                }
-              if (bitset11[2]) //s-Measure
-                {
-                  // ...
-                }
-              if (bitset11[1]) //preRegistrationInfoHRPD
-                {
-                  // ...
-                }
-              if (bitset11[0]) //speedStatePars
-                {
-                  // ...
-                }
+              bIterator = DeserializeMeasConfig (&m_asConfig.sourceMeasConfig, bIterator);
 
               // Deserialize sourceRadioResourceConfig
               bIterator = DeserializeRadioResourceConfigDedicated (&m_asConfig.sourceRadioResourceConfig,bIterator);
--- a/src/lte/model/lte-rrc-header.h	Fri Apr 05 16:39:16 2013 +0200
+++ b/src/lte/model/lte-rrc-header.h	Fri Apr 05 16:50:37 2013 +0200
@@ -61,7 +61,10 @@
   void SerializeMeasResults (LteRrcSap::MeasResults measResults) const;
   void SerializePlmnIdentity (uint32_t plmnId) const;
   void SerializeRachConfigCommon (LteRrcSap::RachConfigCommon rachConfigCommon) const;
-
+  void SerializeMeasConfig (LteRrcSap::MeasConfig measConfig) const;
+  void SerializeQoffsetRange (int8_t qOffsetRange) const;
+  void SerializeThresholdEutra (LteRrcSap::ThresholdEutra thresholdEutra) const;
+  
   // Deserialization functions
   Buffer::Iterator DeserializeDrbToAddModList (std::list<LteRrcSap::DrbToAddMod> *drbToAddModLis, Buffer::Iterator bIterator);
   Buffer::Iterator DeserializeSrbToAddModList (std::list<LteRrcSap::SrbToAddMod> *srbToAddModList, Buffer::Iterator bIterator);
@@ -75,6 +78,9 @@
   Buffer::Iterator DeserializeMeasResults (LteRrcSap::MeasResults *measResults, Buffer::Iterator bIterator);
   Buffer::Iterator DeserializePlmnIdentity (uint32_t *plmnId, Buffer::Iterator bIterator);
   Buffer::Iterator DeserializeRachConfigCommon (LteRrcSap::RachConfigCommon * rachConfigCommon, Buffer::Iterator bIterator);
+  Buffer::Iterator DeserializeMeasConfig (LteRrcSap::MeasConfig * measConfig, Buffer::Iterator bIterator);
+  Buffer::Iterator DeserializeQoffsetRange (int8_t * qOffsetRange, Buffer::Iterator bIterator);
+  Buffer::Iterator DeserializeThresholdEutra (LteRrcSap::ThresholdEutra * thresholdEutra, Buffer::Iterator bIterator);
 
   /**
    * This function prints RadioResourceConfigDedicated IE, for debugging purposes.
--- a/src/lte/model/lte-rrc-protocol-real.cc	Fri Apr 05 16:39:16 2013 +0200
+++ b/src/lte/model/lte-rrc-protocol-real.cc	Fri Apr 05 16:50:37 2013 +0200
@@ -306,8 +306,8 @@
       break;
     case 2:
       // RrcConnectionReject
-      p->RemoveHeader (rrcConnectionReestablishmentRejectHeader);
-      rrcConnectionReestablishmentRejectMsg = rrcConnectionReestablishmentRejectHeader.GetMessage ();
+      p->RemoveHeader (rrcConnectionRejectHeader);
+      rrcConnectionRejectMsg = rrcConnectionRejectHeader.GetMessage ();
       m_ueRrcSapProvider->RecvRrcConnectionReject (rrcConnectionRejectMsg);
       break;
     case 3:
@@ -468,17 +468,24 @@
   // Store SetupUeParameters
   m_setupUeParametersMap[rnti] = params;
 
-  // Create LteRlcSapUser, LtePdcpSapUser
-  LteRlcSapUser* srb0SapUser = new RealProtocolRlcSapUser (this,rnti);
-  LtePdcpSapUser* srb1SapUser = new LtePdcpSpecificLtePdcpSapUser<LteEnbRrcProtocolReal> (this);
   LteEnbRrcSapProvider::CompleteSetupUeParameters completeSetupUeParameters;
-  completeSetupUeParameters.srb0SapUser = srb0SapUser;
-  completeSetupUeParameters.srb1SapUser = srb1SapUser;
-
-  // Store LteRlcSapUser, LtePdcpSapUser
-  m_completeSetupUeParametersMap[rnti] = completeSetupUeParameters;
-
-  m_enbRrcSapProvider->CompleteSetupUe (rnti,completeSetupUeParameters);
+  std::map<uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters>::iterator 
+    csupIt = m_completeSetupUeParametersMap.find (rnti);
+  if (csupIt == m_completeSetupUeParametersMap.end ())
+    {
+      // Create LteRlcSapUser, LtePdcpSapUser
+      LteRlcSapUser* srb0SapUser = new RealProtocolRlcSapUser (this,rnti);
+      LtePdcpSapUser* srb1SapUser = new LtePdcpSpecificLtePdcpSapUser<LteEnbRrcProtocolReal> (this);
+      completeSetupUeParameters.srb0SapUser = srb0SapUser;
+      completeSetupUeParameters.srb1SapUser = srb1SapUser;
+      // Store LteRlcSapUser, LtePdcpSapUser
+      m_completeSetupUeParametersMap[rnti] = completeSetupUeParameters;      
+    }
+  else
+    {
+      completeSetupUeParameters = csupIt->second;
+    }
+  m_enbRrcSapProvider->CompleteSetupUe (rnti, completeSetupUeParameters);
 }
 
 void 
--- a/src/lte/model/lte-rrc-sap.h	Fri Apr 05 16:39:16 2013 +0200
+++ b/src/lte/model/lte-rrc-sap.h	Fri Apr 05 16:50:37 2013 +0200
@@ -218,12 +218,13 @@
   
   struct ThresholdEutra
   {
-    uint8_t thresholdRsrp;
-    uint8_t thresholdRsrq;
+    enum {thresholdRsrp, thresholdRsrq} choice;
+    uint8_t range;
   };
 
   struct ReportConfigEutra
   {
+    enum {event,periodical} triggerType;
     enum {eventA1,eventA2,eventA3,eventA4,eventA5} eventId;
     ThresholdEutra threshold1; // used for A1, A2, A4, A5
     ThresholdEutra threshold2; // used for A5
--- a/src/lte/test/test-asn1-encoding.cc	Fri Apr 05 16:39:16 2013 +0200
+++ b/src/lte/test/test-asn1-encoding.cc	Fri Apr 05 16:50:37 2013 +0200
@@ -46,7 +46,7 @@
     pkt->CopyData (buffer, psize);
     for (uint32_t i = 0; i < psize; i++)
       {
-        sprintf (&sbuffer[i*3],"%02x ",buffer[i]);
+        sprintf (&sbuffer[i * 3],"%02x ",buffer[i]);
       }
     return std::string (sbuffer);
   }
@@ -95,12 +95,12 @@
   virtual void DoRun (void) = 0;
   LteRrcSap::RadioResourceConfigDedicated CreateRadioResourceConfigDedicated ();
   void AssertEqualRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedicated rrcd1, LteRrcSap::RadioResourceConfigDedicated rrcd2);
-  
+
 protected:
   Ptr<Packet> packet;
 };
 
-RrcHeaderTestCase :: RrcHeaderTestCase(std::string s) : TestCase(s)
+RrcHeaderTestCase :: RrcHeaderTestCase (std::string s) : TestCase (s)
 {
 }
 
@@ -254,7 +254,7 @@
 void
 RrcConnectionRequestTestCase::DoRun (void)
 {
-  packet = Create<Packet>();
+  packet = Create<Packet> ();
   NS_LOG_DEBUG ("============= RrcConnectionRequestTestCase ===========");
 
   LteRrcSap::RrcConnectionRequest msg;
@@ -282,7 +282,7 @@
   // Check that the destination and source headers contain the same values
   NS_TEST_ASSERT_MSG_EQ (source.GetMmec (),destination.GetMmec (), "Different m_mmec!");
   NS_TEST_ASSERT_MSG_EQ (source.GetMtmsi (),destination.GetMtmsi (), "Different m_mTmsi!");
-  
+
   packet = 0;
 }
 
@@ -301,7 +301,7 @@
 void
 RrcConnectionSetupTestCase::DoRun (void)
 {
-  packet = Create<Packet>();
+  packet = Create<Packet> ();
   NS_LOG_DEBUG ("============= RrcConnectionSetupTestCase ===========");
 
   LteRrcSap::RrcConnectionSetup msg;
@@ -331,7 +331,7 @@
   NS_TEST_ASSERT_MSG_EQ (source.GetRrcTransactionIdentifier (),destination.GetRrcTransactionIdentifier (), "RrcTransactionIdentifier");
 
   AssertEqualRadioResourceConfigDedicated (source.GetRadioResourceConfigDedicated (),destination.GetRadioResourceConfigDedicated ());
-  
+
   packet = 0;
 }
 
@@ -350,7 +350,7 @@
 void
 RrcConnectionSetupCompleteTestCase::DoRun (void)
 {
-  packet = Create<Packet>();
+  packet = Create<Packet> ();
   NS_LOG_DEBUG ("============= RrcConnectionSetupCompleteTestCase ===========");
 
   LteRrcSap::RrcConnectionSetupCompleted msg;
@@ -377,7 +377,7 @@
 
   // Check that the destination and source headers contain the same values
   NS_TEST_ASSERT_MSG_EQ (source.GetRrcTransactionIdentifier (),destination.GetRrcTransactionIdentifier (), "RrcTransactionIdentifier");
-  
+
   packet = 0;
 }
 
@@ -397,7 +397,7 @@
 void
 RrcConnectionReconfigurationCompleteTestCase::DoRun (void)
 {
-  packet = Create<Packet>();
+  packet = Create<Packet> ();
   NS_LOG_DEBUG ("============= RrcConnectionReconfigurationCompleteTestCase ===========");
 
   LteRrcSap::RrcConnectionReconfigurationCompleted msg;
@@ -424,7 +424,7 @@
 
   // Check that the destination and source headers contain the same values
   NS_TEST_ASSERT_MSG_EQ (source.GetRrcTransactionIdentifier (),destination.GetRrcTransactionIdentifier (), "RrcTransactionIdentifier");
-  
+
   packet = 0;
 }
 
@@ -444,13 +444,49 @@
 void
 RrcConnectionReconfigurationTestCase::DoRun (void)
 {
-  packet = Create<Packet>();
+  packet = Create<Packet> ();
   NS_LOG_DEBUG ("============= RrcConnectionReconfigurationTestCase ===========");
 
   LteRrcSap::RrcConnectionReconfiguration msg;
   msg.rrcTransactionIdentifier = 2;
 
-  msg.haveMeasConfig = false;
+  msg.haveMeasConfig = true;
+
+  msg.measConfig.haveQuantityConfig = true;
+  msg.measConfig.quantityConfig.filterCoefficientRSRP = 8;
+  msg.measConfig.quantityConfig.filterCoefficientRSRQ = 7;
+
+  msg.measConfig.haveMeasGapConfig = true;
+  msg.measConfig.measGapConfig.type = LteRrcSap::MeasGapConfig::SETUP;
+  msg.measConfig.measGapConfig.gapOffsetChoice = LteRrcSap::MeasGapConfig::gp0;
+  msg.measConfig.measGapConfig.gapOffsetValue = 21;
+
+  msg.measConfig.haveSmeasure = true;
+  msg.measConfig.sMeasure = 57;
+
+  msg.measConfig.haveSpeedStatePars = true;
+  msg.measConfig.speedStatePars.type = LteRrcSap::SpeedStatePars::SETUP;
+  msg.measConfig.speedStatePars.mobilityStateParameters.tEvaluation = 240;
+  msg.measConfig.speedStatePars.mobilityStateParameters.tHystNormal = 60;
+  msg.measConfig.speedStatePars.mobilityStateParameters.nCellChangeMedium = 5;
+  msg.measConfig.speedStatePars.mobilityStateParameters.nCellChangeHigh = 13;
+  msg.measConfig.speedStatePars.timeToTriggerSf.sfMedium = 25;
+  msg.measConfig.speedStatePars.timeToTriggerSf.sfHigh = 75;
+
+  msg.measConfig.measObjectToRemoveList.push_back (23);
+  msg.measConfig.measObjectToRemoveList.push_back (13);
+
+  msg.measConfig.reportConfigToRemoveList.push_back (7);
+  msg.measConfig.reportConfigToRemoveList.push_back (16);
+
+  msg.measConfig.measIdToRemoveList.push_back (4);
+  msg.measConfig.measIdToRemoveList.push_back (18);
+ 
+  // TODO: Test the following:
+  // std::list<MeasObjectToAddMod> measObjectToAddModList;
+  // std::list<ReportConfigToAddMod> reportConfigToAddModList;
+  // std::list<MeasIdToAddMod> measIdToAddModList;
+
   msg.haveMobilityControlInfo = true;
   msg.mobilityControlInfo.targetPhysCellId = 4;
   msg.mobilityControlInfo.haveCarrierFreq = true;
@@ -539,7 +575,7 @@
     {
       AssertEqualRadioResourceConfigDedicated (source.GetRadioResourceConfigDedicated (), destination.GetRadioResourceConfigDedicated ());
     }
-    
+
   packet = 0;
 }
 
@@ -558,7 +594,7 @@
 void
 HandoverPreparationInfoTestCase::DoRun (void)
 {
-  packet = Create<Packet>();
+  packet = Create<Packet> ();
   NS_LOG_DEBUG ("============= HandoverPreparationInfoTestCase ===========");
 
   LteRrcSap::HandoverPreparationInfo msg;
@@ -573,12 +609,17 @@
   msg.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIdentity = 4;
   msg.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity = 123;
 
-  msg.asConfig.sourceSystemInformationBlockType2.freqInfo.ulBandwidth=100;
-  msg.asConfig.sourceSystemInformationBlockType2.freqInfo.ulCarrierFreq=10;
+  msg.asConfig.sourceSystemInformationBlockType2.freqInfo.ulBandwidth = 100;
+  msg.asConfig.sourceSystemInformationBlockType2.freqInfo.ulCarrierFreq = 10;
   msg.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.preambleInfo.numberOfRaPreambles = 4;
   msg.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.preambleTransMax = 3;
   msg.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.raResponseWindowSize = 6;
-  
+
+  msg.asConfig.sourceMeasConfig.haveQuantityConfig = false;
+  msg.asConfig.sourceMeasConfig.haveMeasGapConfig = false;
+  msg.asConfig.sourceMeasConfig.haveSmeasure = false;
+  msg.asConfig.sourceMeasConfig.haveSpeedStatePars = false;
+
   HandoverPreparationInfoHeader source;
   source.SetMessage (msg);
 
@@ -608,8 +649,8 @@
   NS_TEST_ASSERT_MSG_EQ (source.GetAsConfig ().sourceSystemInformationBlockType1.cellAccessRelatedInfo.cellIdentity, destination.GetAsConfig ().sourceSystemInformationBlockType1.cellAccessRelatedInfo.cellIdentity, "cellIdentity");
   NS_TEST_ASSERT_MSG_EQ (source.GetAsConfig ().sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIdentity, destination.GetAsConfig ().sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIdentity, "csgIdentity");
   NS_TEST_ASSERT_MSG_EQ (source.GetAsConfig ().sourceDlCarrierFreq, destination.GetAsConfig ().sourceDlCarrierFreq, "sourceDlCarrierFreq");
-  
-    packet = 0;
+
+  packet = 0;
 }
 
 // --------------------------- CLASS RrcConnectionReestablishmentRequestTestCase -----------------------------
@@ -627,7 +668,7 @@
 void
 RrcConnectionReestablishmentRequestTestCase::DoRun (void)
 {
-  packet = Create<Packet>();
+  packet = Create<Packet> ();
   NS_LOG_DEBUG ("============= RrcConnectionReestablishmentRequestTestCase ===========");
 
   LteRrcSap::RrcConnectionReestablishmentRequest msg;
@@ -658,7 +699,7 @@
   NS_TEST_ASSERT_MSG_EQ (source.GetUeIdentity ().cRnti, destination.GetUeIdentity ().cRnti, "cRnti");
   NS_TEST_ASSERT_MSG_EQ (source.GetUeIdentity ().physCellId, destination.GetUeIdentity ().physCellId, "physCellId");
   NS_TEST_ASSERT_MSG_EQ (source.GetReestablishmentCause (),destination.GetReestablishmentCause (), "ReestablishmentCause");
-  
+
   packet = 0;
 }
 
@@ -677,7 +718,7 @@
 void
 RrcConnectionReestablishmentTestCase::DoRun (void)
 {
-  packet = Create<Packet>();
+  packet = Create<Packet> ();
   NS_LOG_DEBUG ("============= RrcConnectionReestablishmentTestCase ===========");
 
   LteRrcSap::RrcConnectionReestablishment msg;
@@ -706,7 +747,7 @@
   // Check that the destination and source headers contain the same values
   NS_TEST_ASSERT_MSG_EQ (source.GetRrcTransactionIdentifier (), destination.GetRrcTransactionIdentifier (), "rrcTransactionIdentifier");
   AssertEqualRadioResourceConfigDedicated (source.GetRadioResourceConfigDedicated (),destination.GetRadioResourceConfigDedicated ());
-  
+
   packet = 0;
 }
 
@@ -725,7 +766,7 @@
 void
 RrcConnectionReestablishmentCompleteTestCase::DoRun (void)
 {
-  packet = Create<Packet>();
+  packet = Create<Packet> ();
   NS_LOG_DEBUG ("============= RrcConnectionReestablishmentCompleteTestCase ===========");
 
   LteRrcSap::RrcConnectionReestablishmentComplete msg;
@@ -752,7 +793,7 @@
 
   // Check that the destination and source headers contain the same values
   NS_TEST_ASSERT_MSG_EQ (source.GetRrcTransactionIdentifier (), destination.GetRrcTransactionIdentifier (), "rrcTransactionIdentifier");
-  
+
   packet = 0;
 }
 
@@ -771,7 +812,7 @@
 void
 RrcConnectionRejectTestCase::DoRun (void)
 {
-  packet = Create<Packet>();
+  packet = Create<Packet> ();
   NS_LOG_DEBUG ("============= RrcConnectionRejectTestCase ===========");
 
   LteRrcSap::RrcConnectionReject msg;
@@ -798,7 +839,7 @@
 
   // Check that the destination and source headers contain the same values
   NS_TEST_ASSERT_MSG_EQ (source.GetMessage ().waitTime, destination.GetMessage ().waitTime, "Different waitTime!");
-  
+
   packet = 0;
 }
 
@@ -817,7 +858,7 @@
 void
 MeasurementReportTestCase::DoRun (void)
 {
-  packet = Create<Packet>();
+  packet = Create<Packet> ();
   NS_LOG_DEBUG ("============= MeasurementReportTestCase ===========");
 
   LteRrcSap::MeasurementReport msg;
@@ -909,7 +950,7 @@
         }
     }
 
-    packet = 0;
+  packet = 0;
 }
 
 // --------------------------- CLASS Asn1EncodingSuite -----------------------------
@@ -923,17 +964,17 @@
   : TestSuite ("test-asn1-encoding", UNIT)
 {
   NS_LOG_FUNCTION (this);
-  AddTestCase (new RrcConnectionRequestTestCase());
-  AddTestCase (new RrcConnectionSetupTestCase());
-  AddTestCase (new RrcConnectionSetupCompleteTestCase());
-  AddTestCase (new RrcConnectionReconfigurationCompleteTestCase());
-  AddTestCase (new RrcConnectionReconfigurationTestCase());
-  AddTestCase (new HandoverPreparationInfoTestCase());
-  AddTestCase (new RrcConnectionReestablishmentRequestTestCase());
-  AddTestCase (new RrcConnectionReestablishmentTestCase());
-  AddTestCase (new RrcConnectionReestablishmentCompleteTestCase());
-  AddTestCase (new RrcConnectionRejectTestCase());
-  AddTestCase (new MeasurementReportTestCase());
+  AddTestCase (new RrcConnectionRequestTestCase ());
+  AddTestCase (new RrcConnectionSetupTestCase ());
+  AddTestCase (new RrcConnectionSetupCompleteTestCase ());
+  AddTestCase (new RrcConnectionReconfigurationCompleteTestCase ());
+  AddTestCase (new RrcConnectionReconfigurationTestCase ());
+  AddTestCase (new HandoverPreparationInfoTestCase ());
+  AddTestCase (new RrcConnectionReestablishmentRequestTestCase ());
+  AddTestCase (new RrcConnectionReestablishmentTestCase ());
+  AddTestCase (new RrcConnectionReestablishmentCompleteTestCase ());
+  AddTestCase (new RrcConnectionRejectTestCase ());
+  AddTestCase (new MeasurementReportTestCase ());
 }
 
 Asn1EncodingSuite asn1EncodingSuite;