diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d0f7aaf76f4d40ed1b4b12f2ffcdd4c56e6d401d..2a592026864d87408227c2c378f056b5341f7d2d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -8,6 +8,8 @@ job1:
    - echo $EXTERNAL_SHARE_DIR
    - echo $SHELL
    - echo $OAI_TEST_CASE_GROUP
+   - echo $MACHINELIST
+   - echo $MACHINELISTGENERIC
    - git rev-parse --abbrev-ref HEAD
    - git_repo=`git config --get remote.origin.url`
    - git_head=`git rev-parse HEAD`
@@ -25,8 +27,8 @@ job1:
    - echo $NRUNS_LTE_SOFTMODEM
    - echo $TIMEOUT_CMD
    - mkdir -p $OPENAIR_DIR/cmake_targets/autotests/log
-   - python $OPENAIR_DIR/cmake_targets/autotests/run_exec_lte-softmodem_tests.py -c -5GRepo $git_repo -5GRepoHeadVersion $git_head -n $NFS_SHARE_DIR -u $OAI_USER -p $OAI_PASS  $OAI_EXTRA_ARGS -g "$OAI_TEST_CASE_GROUP">& $OPENAIR_DIR/cmake_targets/autotests/python_autotest_cleanup.log
-   - python $OPENAIR_DIR/cmake_targets/autotests/run_exec_lte-softmodem_tests.py -r -5GRepo $git_repo -5GRepoHeadVersion $git_head -n $NFS_SHARE_DIR -u $OAI_USER -p $OAI_PASS `echo $OAI_EXTRA_ARGS` -g "$OAI_TEST_CASE_GROUP" --nrun_lte_softmodem $NRUNS_LTE_SOFTMODEM --timeout_cmd $TIMEOUT_CMD >& $OPENAIR_DIR/cmake_targets/autotests/python_autotest.log
+   - python $OPENAIR_DIR/cmake_targets/autotests/run_exec_lte-softmodem_tests.py -c -5GRepo $git_repo -MachineList "$MACHINELIST" -MachineListGeneric "$MACHINELISTGENERIC"  -5GRepoHeadVersion $git_head -n $NFS_SHARE_DIR -u $OAI_USER -p $OAI_PASS  $OAI_EXTRA_ARGS -g "$OAI_TEST_CASE_GROUP">& $OPENAIR_DIR/cmake_targets/autotests/python_autotest_cleanup.log
+   - python $OPENAIR_DIR/cmake_targets/autotests/run_exec_lte-softmodem_tests.py -r -5GRepo $git_repo -MachineList "$MACHINELIST" -MachineListGeneric "$MACHINELISTGENERIC" -5GRepoHeadVersion $git_head -n $NFS_SHARE_DIR -u $OAI_USER -p $OAI_PASS `echo $OAI_EXTRA_ARGS` -g "$OAI_TEST_CASE_GROUP" --nrun_lte_softmodem $NRUNS_LTE_SOFTMODEM --timeout_cmd $TIMEOUT_CMD >& $OPENAIR_DIR/cmake_targets/autotests/python_autotest.log
    - mv $OPENAIR_DIR/cmake_targets/autotests/python_autotest.log $OPENAIR_DIR/cmake_targets/autotests/log/python_autotest.log
    - mv $OPENAIR_DIR/cmake_targets/autotests/python_autotest_cleanup.log $OPENAIR_DIR/cmake_targets/autotests/log/python_autotest_cleanup.log
    - sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no "  --rsync-path="mkdir -p $NFS_TEST_RESULTS_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$NFS_TEST_RESULTS_DIR
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 553309f237e93b253eb67ff5e864705e8455d8e9..a83bce5e8b4ac8bd9f942b3be484600bb8859838 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -126,6 +126,7 @@ endmacro(add_list_string_option)
 if (CMAKE_BUILD_TYPE STREQUAL "")
    set(CMAKE_BUILD_TYPE "RelWithDebInfo")
 endif()
+message("CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}")
 add_list_string_option(CMAKE_BUILD_TYPE "RelWithDebInfo" "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." Debug Release RelWithDebInfo MinSizeRel)
 
 Message("Architecture is ${CMAKE_SYSTEM_PROCESSOR}")
@@ -922,7 +923,14 @@ add_library(SECU_CN ${SECU_CN_SRC})
 
 # Scheduler
 ################################"
-file(GLOB SCHED_SRC ${OPENAIR1_DIR}/SCHED/*.c)
+set(SCHED_SRC 
+  ${OPENAIR1_DIR}/SCHED/phy_procedures_lte_eNb.c
+  ${OPENAIR1_DIR}/SCHED/phy_procedures_lte_ue.c
+  ${OPENAIR1_DIR}/SCHED/phy_procedures_lte_common.c
+  ${OPENAIR1_DIR}/SCHED/phy_mac_stub.c
+  ${OPENAIR1_DIR}/SCHED/pucch_pc.c
+  ${OPENAIR1_DIR}/SCHED/pusch_pc.c
+)
 add_library(SCHED_LIB ${SCHED_SRC})
 
 # Layer 1
@@ -1624,10 +1632,9 @@ target_link_libraries (lte-softmodem -ldl
   RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} 
   -Wl,--end-group )
 
-
 target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES})
 target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} ) 
-target_link_libraries (lte-softmodem ${LIBBOOST_LIBRARIES})
+target_link_libraries (lte-softmodem ${LIBBOOST_LIBRARIES} -lboost_system) #Added manually as it is not found for some reason for USRP
 target_link_libraries (lte-softmodem ${LIB_LMS_LIBRARIES})
 target_link_libraries (lte-softmodem ${T_LIB})
 
@@ -1662,7 +1669,7 @@ target_link_libraries (lte-softmodem-nos1
 
 target_link_libraries (lte-softmodem-nos1 ${LIBXML2_LIBRARIES})
 target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES}  ${option_HW_lib}  ${option_TP_lib} ${XFORMS_LIBRARIES} )
-target_link_libraries (lte-softmodem-nos1 ${LIBBOOST_LIBRARIES})
+target_link_libraries (lte-softmodem-nos1 ${LIBBOOST_LIBRARIES} -lboost_system) #Added manually as it is not found for some reason for USRP
 target_link_libraries (lte-softmodem-nos1  ${LIB_LMS_LIBRARIES})
 target_link_libraries (lte-softmodem-nos1 ${T_LIB})
 
@@ -1685,7 +1692,7 @@ target_link_libraries(rrh_gw
   UTIL LFDS  
   -Wl,--end-group )
 target_link_libraries (rrh_gw rt pthread m )
-target_link_libraries (rrh_gw  ${option_HW_lib} ${option_TP_lib} ${LIBBOOST_LIBRARIES} )
+target_link_libraries (rrh_gw  ${option_HW_lib} ${option_TP_lib} ${LIBBOOST_LIBRARIES} -lboost_system ) #Added manually as it is not found for some reason for USRP
 target_link_libraries (rrh_gw ${LIB_LMS_LIBRARIES})
 target_link_libraries (rrh_gw ${T_LIB})
 
diff --git a/cmake_targets/autotests/README.txt b/cmake_targets/autotests/README.txt
index cf1e28dd050498d7107abbc8461d9b07e4486477..245b235ebffeb3cdf791a9ab1225eaea915c51bb 100644
--- a/cmake_targets/autotests/README.txt
+++ b/cmake_targets/autotests/README.txt
@@ -16,17 +16,22 @@ Obj.#   Case#   Test#	Description
 01      01      20      Build lte-softmodem.USRP.Rel10
 01      01      21      Build lte-softmodem.EXMIMO.Rel10
 01      01      22      Build lte-softmodem.BLADERF.Rel10
-01      01      23      Build lte-softmodem.ETHERNET.Rel10
+01      01      23      Build lte-softmodem.ETHERNET.Rel10 (RCC)
 01      01      24      Build lte-softmodem.LMSSDR.Rel10
 
 01      01      30      Build (dlsim.Rel10 + ulsim.Rel10 + pucchsim.Rel10 + prachsim.Rel10 + pdcchsim.Rel10 + pbchsim.Rel10 + mbmssim.Rel10
                         secu_knas_encrypt_eia1.Rel10 secu_kenb.Rel10 aes128_ctr_encrypt.Rel10 aes128_ctr_decrypt.Rel10 secu_knas_encrypt_eea2.Rel10
                         secu_knas.Rel10 secu_knas_encrypt_eea1.Rel10 kdf.Rel10 aes128_cmac_encrypt.Rel10 secu_knas_encrypt_eia2.Rel10)
 
-01      01      40      Build RRH Gateway for USRP (Rel 10)
-01      01      41      Build RRH Gateway for EXMIMO  (Rel 10)
-01      01      42      Build RRH Gateway for BLADERF  (Rel 10)
-01      01      43      Build RRH Gateway for LMSSDR (Rel 10)
+01      01      40      Build RRH Gateway (time domain) for USRP (Rel 10)
+01      01      41      Build RRH Gateway (time domain) for EXMIMO  (Rel 10)
+01      01      42      Build RRH Gateway (time domain) for BLADERF  (Rel 10)
+01      01      43      Build RRH Gateway (time domain) for LMSSDR (Rel 10)
+
+01      01      50      Build RRU (NGFI) for USRP (Rel 10) w/ ETHERNET transport
+01      01      51      Build RRU (NGFI) for EXMIMO  (Rel 10) w/ ETHERNET transport
+01      01      52      Build RRU (NGFI) for BLADERF  (Rel 10) w/ ETHERNET transport
+01      01      53      Build RRU (NGFI) for LMSSDR (Rel 10) w/ ETHERNET transport
 
 
 01      02              Run OAISIM-NOS1 Rel10 (TDD + 5MHz/10MHz/20MHz + TM 1,2), and check the operation
@@ -249,4 +254,4 @@ Obj.#   Case#   Test#	Description
 #TODO: Add test cases for 10,20 MHz
 #TODO: Add test cases for TDD/FDD 
 #TODO: Test and compile seperately for Rel8/Rel10
-#TODO: Case03.py eMBMS test case
\ No newline at end of file
+#TODO: Case03.py eMBMS test case
diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py
index b25bc08427675a828ffc46edca332512bce57d9f..eed2fffb77a194fd82377a5f834fe1d4e475725e 100755
--- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py
+++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py
@@ -313,7 +313,7 @@ def SSHSessionWrapper(machine, username, key_file, password, logdir_remote, logd
 # \param CleanUpAluLteBox program to terminate AlU Bell Labs LTE Box
 # \param ExmimoRfStop String to stop EXMIMO card (specified in test_case_list.xml)
 def cleanOldPrograms(oai, programList, CleanUpAluLteBox, ExmimoRfStop, logdir, logdirOAI5GRepo):
-  cmd = 'killall -9 -q -r ' + programList
+  cmd = 'sudo -E killall -9 -q -r ' + programList
   result = oai.send(cmd, True)
   print "Killing old programs..." + result
   programArray = programList.split()
@@ -1020,6 +1020,13 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo ,
       run_result=0
       run_result_string = ' RUN_'+str(run) + ' = FAIL(Thread_Busy)'
 
+    #If there is Segmentation fault, we mark the test case as failure as most likely eNB crashed
+    cmd = "grep -ilr \"segmentation fault\" " + logdir_local_testcase + " | cat "
+    cmd_out = subprocess.check_output ([cmd], shell=True)
+    if len(cmd_out) !=0:
+      run_result=0
+      run_result_string = ' RUN_'+str(run) + ' = FAIL(SEGFAULT)'
+
     run_result_string = run_result_string + tput_run_string
 
     test_result=test_result & run_result
@@ -1261,7 +1268,8 @@ except KeyError:
    sys.exit(1)
 
 print "Killing zombie ssh sessions from earlier sessions..."
-cmd='ps aux |grep \"/usr/bin/ssh -q -l guptar\"|tr -s \" \" :|cut -f 2 -d :|xargs kill -9 '
+cmd='ps aux |grep \"/usr/bin/ssh -q -l guptar\"| awk \'{print $2}\' | sudo xargs kill -9  '
+
 os.system(cmd)
 
 if flag_start_testcase == False:
@@ -1426,13 +1434,25 @@ for oai in oai_list:
      
       setuplogfile  = logdir  + '/setup_log_' + MachineList[index] + '_.txt'
       setup_script  = locallogdir  + '/setup_script_' + MachineList[index] +  '_.txt'
+
+      #Sometimes git fails so the script below retries in that case
+      localfile = os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/tools/git-retry.sh')
+      remotefile = logdir + '/git-retry.sh'
+      paramList=[]
+      port=22
+      paramList.append ( {"operation":'put', "localfile":localfile, "remotefile":remotefile} )
+      sftp_log = os.path.expandvars(locallogdir + '/sftp_module.log')
+      sftp_module (user, pw, MachineList[index], port, paramList, sftp_log)
+
+
       cmd = ' ( \n'
       #cmd = cmd  + 'rm -fR ' +  logdir + '\n'
       #cmd = cmd + 'mkdir -p ' + logdir + '\n'
       cmd = cmd + 'cd '+ logdir   + '\n'
-      cmd = cmd + 'git config --global http.sslVerify false \n' 
-      cmd = cmd + 'git clone  '+ GitOAI5GRepo  +' \n'
-      cmd = cmd + 'git clone '+ GitOpenaircnRepo + ' \n'
+      cmd = cmd + 'sudo apt-get install -y git \n'
+      cmd = cmd + 'chmod 700 ' + logdir + '/git-retry.sh \n' 
+      cmd = cmd + logdir + '/git-retry.sh clone  '+ GitOAI5GRepo  +' \n'
+      cmd = cmd + logdir + '/git-retry.sh clone '+ GitOpenaircnRepo + ' \n'
       cmd = cmd +  'cd ' + logdirOAI5GRepo  + '\n'
       cmd = cmd + 'git checkout ' + GitOAI5GRepoBranch   + '\n'                      
       #cmd = cmd + 'git checkout ' + GitOAI5GHeadVersion   + '\n'
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index 11a0c172db05dac7613ac65aa7f5dea10bcab95c..696b732fb463e9f75c1fb3d5cbbd931ce4a1fdd8 100644
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -1,18 +1,18 @@
 <testCaseList>
 
-<MachineList>mozart tique stevens amerique</MachineList>
+<MachineList>mozart hutch starsky stevens amerique calisson nano </MachineList>
  <NFSResultsShare>/mnt/sradio/TEST_RESULTS/</NFSResultsShare>
  <GitOAI5GRepo>https://gitlab.eurecom.fr/oai/openairinterface5g.git</GitOAI5GRepo>
  <GitOpenair-cnRepo>https://gitlab.eurecom.fr/oai/openair-cn.git</GitOpenair-cnRepo>
  <GitOAI5GRepoBranch>develop</GitOAI5GRepoBranch>
  <GitOpenair-cnRepoBranch>develop</GitOpenair-cnRepoBranch>
- <CleanUpOldProgs>oaisim oaisim_nos1 lte-softmodem lte-softmodem-nos1 mme_gw run_epc auth_request run_hss oai_hss mme spgw hss hss_sim configure_cots* wvdial  iperf iperf_script iperf_script_phone ping tshark rrh_gw iperf3 iperf3_script iperf3_script_phone pppd</CleanUpOldProgs>	
+ <CleanUpOldProgs>oaisim oaisim_nos1 lte-softmodem lte-softmodem-nos1 mme_gw run_epc auth_request run_hss oai_hss mme spgw hss hss_sim configure_cots* wvdial  iperf iperf_script iperf_script_phone ping tshark rrh_gw iperf3 iperf3_script iperf3_script_phone pppd starthss start_ltebox stop_ltebox configure_cots_sony_experia_m4_ue configure_cots_huaweiE398_ue configure_cots_bandrich_ue</CleanUpOldProgs>	
  <CleanUpAluLteBox>sudo -S -E /opt/ltebox/tools/stop_ltebox</CleanUpAluLteBox>
-<ExmimoRfStop>$OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py --reset-ue;  sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue; uname -a; sudo -E dmesg</ExmimoRfStop>
+<ExmimoRfStop>exmimo_pci=`lspci -m | grep Xilinx`; if [ -n "$exmimo_pci" ] ; then $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; fi; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py --reset-ue;  sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue; uname -a; sudo -E dmesg</ExmimoRfStop>
  <Timeout_execution>36000</Timeout_execution>
- <TestCaseExclusionList>010141 0102+ 010304 010305 0104+  015506 015507 015508 015509 015510 015511   015602 015605 015702 015705 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505</TestCaseExclusionList>
+ <TestCaseExclusionList>010141 0102+ 010304 010305 0104+  015506 015507 015508 015509 015510 015511   015602 015605 015702 015705 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 </TestCaseExclusionList>
  <nruns_lte-softmodem>3</nruns_lte-softmodem>
- <MachineListGeneric>mozart tique stevens amerique </MachineListGeneric>
+ <MachineListGeneric>mozart hutch starsky stevens amerique calisson </MachineListGeneric>
      <testCase id="010101" >
      <class>compilation</class>
      <desc>Build oaisim.Rel8</desc>
@@ -381,6 +381,85 @@
      <nruns>1</nruns>
      </testCase>
 
+     <testCase id="010150" >
+     <class>compilation</class>
+     <desc>Build RRU (NGFI) for USRP (Rel 10) w/ ETHERNET transport</desc>
+     <pre_compile_prog></pre_compile_prog>
+     <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
+     <compile_prog_args>--eNB -w USRP -t ETHERNET  -c </compile_prog_args>
+     <compile_prog_out>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+                       $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_usrpdevif.so
+                       $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_eth_transpro.so</compile_prog_out>
+     <pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</pre_exec>
+     <pre_exec_args></pre_exec_args>
+     <main_exec></main_exec>
+     <main_exec_args></main_exec_args>
+     <search_expr_true></search_expr_true>
+     <search_expr_false></search_expr_false>
+     <tags>RRU.USRP.Rel10</tags>
+     <nruns>1</nruns>
+     </testCase>
+
+     <testCase id="010151" >
+     <class>compilation</class>
+     <desc>Build RRU (NGFI) for EXMIMO  (Rel 10) w/ ETHERNET transport</desc>
+     <pre_compile_prog></pre_compile_prog>
+     <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
+     <compile_prog_args>--eNB -w EXMIMO -t ETHERNET  -c </compile_prog_args>
+     <compile_prog_out>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+                       $OPENAIR_DIR/cmake_targets/lte_build_oai/build/CMakeFiles/openair_rf/openair_rf.ko
+                       $OPENAIR_DIR/cmake_targets/lte_build_oai/build/updatefw
+                       $OPENAIR_DIR/cmake_targets/lte_build_oai/build/oarf_config_exmimo.oct
+                       $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_exmimodevif.so
+                       $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_eth_transpro.so</compile_prog_out>
+     <pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</pre_exec>
+     <pre_exec_args></pre_exec_args>
+     <main_exec></main_exec>
+     <main_exec_args></main_exec_args>
+     <search_expr_true></search_expr_true>
+     <search_expr_false></search_expr_false>
+     <tags>RRU.EXMIMO.Rel10</tags>
+     <nruns>1</nruns>
+     </testCase>
+
+     <testCase id="010152" >
+     <class>compilation</class>
+     <desc>Build RRU (NGFI) for BLADERF (Rel 10) w/ ETHERNET transport</desc>
+     <pre_compile_prog></pre_compile_prog>
+     <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
+     <compile_prog_args>--eNB -w BLADERF -t ETHERNET  -c </compile_prog_args>
+     <compile_prog_out>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+                       $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_bladerfdevif.so
+                       $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_eth_transpro.so</compile_prog_out>
+     <pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</pre_exec>
+     <pre_exec_args></pre_exec_args>
+     <main_exec></main_exec>
+     <main_exec_args></main_exec_args>
+     <search_expr_true></search_expr_true>
+     <search_expr_false></search_expr_false>
+     <tags>RRU.BLADERF.Rel10</tags>
+     <nruns>1</nruns>
+     </testCase>
+
+    <testCase id="010153" >
+     <class>compilation</class>
+     <desc>Build RRU (NGFI) for LMSSDR  (Rel 10) w/ ETHERNET transport</desc>
+     <pre_compile_prog></pre_compile_prog>
+     <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
+     <compile_prog_args>--eNB -w LMSSDR -t ETHERNET  -c </compile_prog_args>
+     <compile_prog_out>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+                       $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_lmssdrdevif.so
+                       $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_eth_transpro.so</compile_prog_out>
+     <pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</pre_exec>
+     <pre_exec_args></pre_exec_args>
+     <main_exec></main_exec>
+     <main_exec_args></main_exec_args>
+     <search_expr_true></search_expr_true>
+     <search_expr_false></search_expr_false>
+     <tags>RRU.LMSSDR.Rel10</tags>
+     <nruns>1</nruns>
+     </testCase>
+
    <testCase id="010200">
       <class>execution</class>
       <desc>Run OAISIM Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2) and search for errors, segmentation fault or exit</desc>
@@ -929,7 +1008,7 @@
   <testCase id="015500" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -946,16 +1025,16 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -1004,7 +1083,7 @@
   <testCase id="015501" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -1021,16 +1100,16 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -1078,7 +1157,7 @@
   <testCase id="015502" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -1096,17 +1175,17 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
-    <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec_args> -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
     <eNB_search_expr_true></eNB_search_expr_true>
@@ -1153,7 +1232,7 @@
   <testCase id="015503" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -1170,16 +1249,16 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -1226,7 +1305,7 @@
   <testCase id="015504" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -1243,16 +1322,16 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf     </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -1299,7 +1378,7 @@
   <testCase id="015505" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -1317,17 +1396,17 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
-    <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec_args> -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
     <eNB_search_expr_true></eNB_search_expr_true>
@@ -1375,7 +1454,7 @@
   <testCase id="015506" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>calisson</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -1392,16 +1471,16 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  2
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 2
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth5\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.82/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth5\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.82/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -1450,7 +1529,7 @@
   <testCase id="015507" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>calisson</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -1467,16 +1546,16 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  2
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 2
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth5\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.82/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth5\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.82/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -1523,7 +1602,7 @@
   <testCase id="015508" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>calisson</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -1540,16 +1619,16 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  2
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 2
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth5\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.82/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth5\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.82/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -1597,7 +1676,7 @@
   <testCase id="015509" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>calisson</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -1614,16 +1693,16 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  2
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 2
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth5\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.82/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth5\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.82/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -1671,7 +1750,7 @@
   <testCase id="015510" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>calisson</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -1688,16 +1767,16 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  2
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 2
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth5\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.82/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth5\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.82/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -1745,7 +1824,7 @@
   <testCase id="015511" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>calisson</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -1762,17 +1841,17 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  2
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 2
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth5\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.82/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth5\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.82/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
-    <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec_args> -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
     <eNB_search_expr_true></eNB_search_expr_true>
@@ -1819,7 +1898,7 @@
   <testCase id="015512" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -1836,16 +1915,16 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -1894,7 +1973,7 @@
   <testCase id="015513" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -1911,16 +1990,16 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -1968,7 +2047,7 @@
   <testCase id="015514" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -1986,17 +2065,17 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
-    <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec_args> -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
     <eNB_search_expr_true></eNB_search_expr_true>
@@ -2043,7 +2122,7 @@
   <testCase id="015515" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -2060,16 +2139,16 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -2116,7 +2195,7 @@
   <testCase id="015516" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -2133,16 +2212,16 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf     </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -2189,7 +2268,7 @@
   <testCase id="015517" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -2207,17 +2286,17 @@
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
-    <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec_args> -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
     <eNB_search_expr_true></eNB_search_expr_true>
@@ -3314,7 +3393,6 @@ c
     <EPC_compile_prog_args></EPC_compile_prog_args>
     <HSS_compile_prog>sudo mkdir -p /usr/local/etc/oai/freeDiamter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ hss.openair4G.eur;  $OPENAIRCN_DIR/SCRIPTS/build_hss -c </HSS_compile_prog>
     <HSS_compile_prog_args></HSS_compile_prog_args>
-c
     <EPC_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E ifconfig eth0 add 192.172.0.1</EPC_pre_exec>
     <EPC_pre_exec_args></EPC_pre_exec_args>
     <EPC_main_exec>sleep 10;$OPENAIRCN_DIR/TEST/autotests/tools/run_epc  </EPC_main_exec>
@@ -3358,7 +3436,7 @@ c
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash  ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -3430,7 +3508,7 @@ c
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash  ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -3502,7 +3580,7 @@ c
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash  ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -3574,7 +3652,7 @@ c
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash  ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -3645,7 +3723,7 @@ c
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash  ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail</eNB_pre_exec>
     <eNB_pre_exec_args>sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail</eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -3717,7 +3795,7 @@ c
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -3788,7 +3866,7 @@ c
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash  ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -3860,7 +3938,7 @@ c
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash  ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -3932,7 +4010,7 @@ c
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash  ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -4004,7 +4082,7 @@ c
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash  ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -4075,7 +4153,7 @@ c
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash  ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail</eNB_pre_exec>
     <eNB_pre_exec_args>sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail</eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -4147,7 +4225,7 @@ c
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -4220,7 +4298,7 @@ c
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash  ;  sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf $OPENAIR_TESTDIR/enb.conf</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -7015,7 +7093,7 @@ c
   <testCase id="025500" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -7032,16 +7110,16 @@ c
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -7090,7 +7168,7 @@ c
   <testCase id="025501" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -7107,16 +7185,16 @@ c
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -7164,7 +7242,7 @@ c
   <testCase id="025502" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -7182,17 +7260,17 @@ c
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
-    <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf   -E  </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
     <eNB_search_expr_true></eNB_search_expr_true>
@@ -7239,7 +7317,7 @@ c
   <testCase id="025503" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -7256,17 +7334,17 @@ c
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
-    <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf   </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
     <eNB_search_expr_true></eNB_search_expr_true>
@@ -7313,7 +7391,7 @@ c
   <testCase id="025504" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -7330,16 +7408,16 @@ c
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -7387,7 +7465,7 @@ c
   <testCase id="025505" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -7405,17 +7483,17 @@ c
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
-    <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -E    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
     <eNB_search_expr_true></eNB_search_expr_true>
@@ -7462,7 +7540,7 @@ c
   <testCase id="025506" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -7479,16 +7557,16 @@ c
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -7537,7 +7615,7 @@ c
   <testCase id="025507" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -7554,16 +7632,16 @@ c
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -7611,7 +7689,7 @@ c
   <testCase id="025508" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -7629,17 +7707,17 @@ c
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
-    <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec_args> -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
     <eNB_search_expr_true></eNB_search_expr_true>
@@ -7686,7 +7764,7 @@ c
   <testCase id="025509" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -7703,16 +7781,16 @@ c
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
     <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
@@ -7760,7 +7838,7 @@ c
   <testCase id="025510" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -7777,17 +7855,17 @@ c
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
-    <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec_args> -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
     <eNB_search_expr_true></eNB_search_expr_true>
@@ -7834,7 +7912,7 @@ c
   <testCase id="025511" >
     <class>lte-softmodem</class>
     <desc></desc>
-    <eNB>tique</eNB>
+    <eNB>hutch</eNB>
     <UE>stevens</UE>
     <EPC>amerique</EPC>
     <TimeOut_cmd>390</TimeOut_cmd>
@@ -7852,17 +7930,17 @@ c
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  frame_type \"FDD\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_rx  1
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  nb_antennas_tx 1
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.147/24\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth1\"
-                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.147/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1_MME       \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1_MME          \"192.168.12.19/24\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_INTERFACE_NAME_FOR_S1U          \"eth0\"
+                     targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_IPV4_ADDRESS_FOR_S1U           \"192.168.12.19/24\"
                      targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf  ENB_PORT_FOR_S1U                     2152</eNB_config_file>
     <eNB_compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</eNB_compile_prog>
     <eNB_compile_prog_args>--eNB -w USRP -x -c </eNB_compile_prog_args>
     <eNB_pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</eNB_pre_exec>
     <eNB_pre_exec_args></eNB_pre_exec_args>
-    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
-    <eNB_main_exec_args> -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
+    <eNB_main_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem</eNB_main_exec>
+    <eNB_main_exec_args> -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf    </eNB_main_exec_args>
     <eNB_traffic_exec></eNB_traffic_exec>
     <eNB_traffic_exec_args></eNB_traffic_exec_args>
     <eNB_search_expr_true></eNB_search_expr_true>
@@ -7909,7 +7987,3 @@ c
 
 
   </testCaseList>
-
-
-
-
diff --git a/cmake_targets/autotests/tools/git-retry.sh b/cmake_targets/autotests/tools/git-retry.sh
new file mode 100755
index 0000000000000000000000000000000000000000..b897ba379d0a9b12b755603d72bdcb64a254f302
--- /dev/null
+++ b/cmake_targets/autotests/tools/git-retry.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+#Simple script to retry git clone in case of failure
+
+REALGIT=/usr/bin/git
+
+RETRIES=10
+DELAY=10
+COUNT=1
+while [ $COUNT -lt $RETRIES ]; do
+  $REALGIT $* >> git-clone-`hostname`-log.txt 2>&1
+  if [ $? -eq 0 ]; then
+    RETRIES=0
+    break
+  fi
+  let COUNT=$COUNT+1
+  sleep $DELAY
+done
diff --git a/cmake_targets/autotests/tools/remove_old_programs.bash b/cmake_targets/autotests/tools/remove_old_programs.bash
index 772ba11f58342d542aba7ff980fa39996b82943f..c5c26e3752c1bcdc2208cf7ab5db22bba8fe2a48 100755
--- a/cmake_targets/autotests/tools/remove_old_programs.bash
+++ b/cmake_targets/autotests/tools/remove_old_programs.bash
@@ -1,7 +1,32 @@
 #!/bin/bash
 
 #$1 programs to be killed and checked
-var=`ps -A |grep -E -i $1`
+echo "removing old programs..."
+echo "args = $1"
+echo "script name = $0"
+filename=$(basename "$0")
+echo "filename = $filename"
+echo "programs to be killed...$1"
+
+echo "bash PID = $$" 
+pid="$$"
+echo "pid = $pid"
+
+echo "Killing programs now..."
+
+ps -aux |grep -E -i -w "$1"
+
+var=`ps -aux |grep -E -i -w "$1" |awk '{print $2}'| tr '\n' ' ' | sed  "s/$pid/ /"`
+echo "Killing processes...$var"
+#var=`ps -aux |grep -E -i '$1' |awk '{print $2}'| tr '\n' ' ' | sed  "s/$pid/ /"`
+#echo $var 
+if [ -n "$var" ] ; then  sudo  kill -9 $var ; fi
+
+#| sudo xargs kill -9 
+
+echo "checking for old programs..."
+var=`ps -aux |grep -E -i -w '$1' |grep -Ev 'grep' | grep -Ev '$filename'`
+
 echo $var
 if [ -n "$var" ]; then echo 'Match found'; else echo 'Match not found' ;fi 
 
diff --git a/cmake_targets/autotests/tools/run_gdb b/cmake_targets/autotests/tools/run_gdb
new file mode 100755
index 0000000000000000000000000000000000000000..a12d6ce21dc0c7df6fc77c200ee766ebe7dab3f6
--- /dev/null
+++ b/cmake_targets/autotests/tools/run_gdb
@@ -0,0 +1,56 @@
+#!/bin/bash
+
+#arg0 -> Name of executable
+#args[1...N] -> arguments to be passed to executable
+if [ -z "$OPENAIR_DIR" ]
+then
+    echo "OPENAIR_DIR environment not set. Exiting.."
+    exit
+fi 
+
+source $OPENAIR_DIR/cmake_targets/tools/build_helper
+
+args=($*)
+exec_name=${args[0]}
+exe_args=(${args[@]:1})
+gdb_file=$OPENAIR_DIR/targets/bin/gdb_file
+gdb_log=$OPENAIR_DIR/targets/bin/gdb_log.bt
+
+echo "args = ${args[@]}"
+echo "exec_name = $exec_name"
+echo "exe_args = ${exe_args[@]}"
+echo "gdb log file = $gdb_log"
+
+$SUDO rm -fr $gdb_file $gdb_log
+$SUDO touch $gdb_file $gdb_log 
+$SUDO chmod 777  $gdb_file $gdb_log
+
+$SUDO echo "file $exec_name"                  >> $gdb_file
+$SUDO echo "set args ${exe_args[@]}"          >> $gdb_file
+$SUDO echo "run"                              >> $gdb_file
+$SUDO echo "set logging overwrite on"         >> $gdb_file
+$SUDO echo "set logging file $gdb_log"        >> $gdb_file
+$SUDO echo "set logging on"                   >> $gdb_file
+$SUDO echo "set pagination off"               >> $gdb_file
+$SUDO echo "handle SIG33 pass nostop noprint" >> $gdb_file
+$SUDO echo "echo backtrace:\n"                >> $gdb_file
+$SUDO echo "backtrace full"                   >> $gdb_file
+$SUDO echo "echo \n\nVariables:\n"            >> $gdb_file
+$SUDO echo "info variables"                   >> $gdb_file
+$SUDO echo "echo \n\nlocals:\n"               >> $gdb_file
+$SUDO echo "info locals"                      >> $gdb_file
+$SUDO echo "echo \n\nregisters:\n"            >> $gdb_file
+$SUDO echo "info registers"                   >> $gdb_file
+$SUDO echo "echo \n\ncurrent instructions:\n" >> $gdb_file 
+$SUDO echo "x/16i \$pc"                       >> $gdb_file
+$SUDO echo "echo \n\nthreads backtrace:\n"    >> $gdb_file
+$SUDO echo "thread apply all backtrace"       >> $gdb_file
+$SUDO echo "set logging off"                  >> $gdb_file
+$SUDO echo "quit"                             >> $gdb_file
+
+echo "Contents of gdb_file...start"
+$SUDO cat $gdb_file
+echo "Contents of gdb_file...finish"
+
+$SUDO gdb -n -x $gdb_file 2>&1
+
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 7ff2673b6b01bf30ca8410f0a77cd9bc58ab3225..967c92f557f1273c833e804cc0b14277128d7c95 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -61,6 +61,7 @@ TEST_CASE_GROUP=""
 BUILD_DOXYGEN=0
 T_TRACER="False"
 DISABLE_HARDWARE_DEPENDENCY="False"
+CMAKE_BUILD_TYPE=""
 trap handle_ctrl_c INT
 
 function print_help() {
@@ -82,7 +83,7 @@ Options
 --install-optional-packages
    Install useful but not mandatory packages such as valgrind
 -g | --run-with-gdb
-   Add debugging symbols to compilation directives
+   Add debugging symbols to compilation directives. It also disables any compiler optimization.
 -h | --help
    Print this help
 --eNB
@@ -170,7 +171,8 @@ function main() {
             shift;;
        -g | --run-with-gdb)
             GDB=1
-            echo_info "Will Compile with gdb symbols"
+            CMAKE_BUILD_TYPE="Debug"
+            echo_info "Will Compile with gdb symbols and disable compiler optimization"
             shift;;
        --eNB)
             eNB=1
@@ -443,6 +445,7 @@ function main() {
     if [ "$NOS1" = "1" ] ; then
 	cat  $DIR/$lte_build_dir/CMakeLists.template >>  $cmake_file
     fi
+    echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
     echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >>  $cmake_file
     echo "set ( XFORMS $XFORMS )"                  >>  $cmake_file
     echo "set ( RRC_ASN1_VERSION \"${REL}\")"      >>  $cmake_file
@@ -568,6 +571,8 @@ function main() {
     cp $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 $dbin
   fi
 
+  # oaisim compilation
+  ###############
   if [ "$oaisim" = "1" ] ; then
     dconf=$OPENAIR_DIR/targets/bin
       if [ "$NOS1" =  "1" ] ; then
@@ -581,6 +586,7 @@ function main() {
     echo_info "Compiling $oaisim_exec ($oaisim_build_dir)"
     cmake_file=$DIR/$oaisim_build_dir/CMakeLists.txt
     cp $DIR/$oaisim_build_dir/CMakeLists.template $cmake_file
+    echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
     echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >>  $cmake_file
     echo "set ( XFORMS $XFORMS )" >>  $cmake_file
     echo "set ( PRINT_STATS $PRINT_STATS )" >>  $cmake_file
@@ -649,9 +655,10 @@ function main() {
 
     cmake_file=$DIR/oaisim_mme_build_oai/CMakeLists.txt
     cp $DIR/oaisim_mme_build_oai/CMakeLists.template $cmake_file
-    echo "set(XFORMS $XFORMS )" >>  $cmake_file
-    echo "set(RRC_ASN1_VERSION \"${REL}\")" >>  $cmake_file
-    echo "set(ENABLE_VCD_FIFO $VCD_TIMING )" >>  $cmake_file
+    echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
+    echo "set ( XFORMS $XFORMS )" >>  $cmake_file
+    echo "set ( RRC_ASN1_VERSION \"${REL}\")" >>  $cmake_file
+    echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >>  $cmake_file
     echo "set ( T_TRACER $T_TRACER )"        >>  $cmake_file
     echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
     #[ "$CLEAN" = "1" ] && rm -rf $DIR/oaisim_mme_build_oai/build
@@ -676,13 +683,14 @@ function main() {
      mkdir -p $DIR/$rrh_build_dir/build
      cmake_file=$DIR/$rrh_build_dir/CMakeLists.txt
      echo "cmake_minimum_required(VERSION 2.8)"   >   $cmake_file
-     echo "set(ENABLE_VCD_FIFO $VCD_TIMING )"     >>  $cmake_file
-     echo "set(ENABLE_ITTI False )"     		 >>  $cmake_file
-     echo "set(RF_BOARD \"${HW}\")"               >>  $cmake_file
-     echo "set(TRANSP_PRO \"${TP}\")"             >>  $cmake_file
-     echo 'set(PACKAGE_NAME "\"rrh_gw\"")'        >>  $cmake_file
-     echo "set (DEADLINE_SCHEDULER \"${DEADLINE_SCHEDULER_FLAG_USER}\" )"    >>$cmake_file
-     echo "set (CPU_AFFINITY \"${CPU_AFFINITY_FLAG_USER}\" )"    >>$cmake_file
+     echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
+     echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )"     >>  $cmake_file
+     echo "set ( ENABLE_ITTI False )"     		 >>  $cmake_file
+     echo "set ( RF_BOARD \"${HW}\")"               >>  $cmake_file
+     echo "set ( TRANSP_PRO \"${TP}\")"             >>  $cmake_file
+     echo 'set ( PACKAGE_NAME "\"rrh_gw\"")'        >>  $cmake_file
+     echo "set ( DEADLINE_SCHEDULER \"${DEADLINE_SCHEDULER_FLAG_USER}\" )"    >>$cmake_file
+     echo "set ( CPU_AFFINITY \"${CPU_AFFINITY_FLAG_USER}\" )"    >>$cmake_file
      echo "set ( T_TRACER $T_TRACER )"            >>  $cmake_file
      echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file    
      cd $DIR/$rrh_build_dir/build
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index 514d7748ac7cf5fbc7afc2d1727e544906de47bc..4ebe2be1b0d2a986fbd4a7a6783d756f6acac929 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -369,7 +369,6 @@ check_install_oai_software() {
 	libxml2 \
 	libxml2-dev  \
 	libxslt1-dev \
-	linux-headers-`uname -r` \
 	mscgen  \
 	octave \
 	octave-signal \
@@ -385,6 +384,8 @@ check_install_oai_software() {
 
     $SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so
     
+    #Sometimes linux headers are not available in apt-get if kernel is custom or new
+    $SUDO apt-get install linux-headers-`uname -r` || true
     # First we remove gnutls/nettle installation and then install from sources
     $SUDO apt-get remove -y libgnutls-dev nettle-dev nettle-bin
     install_nettle_from_source
@@ -397,13 +398,9 @@ install_asn1c_from_source(){
     asn1_install_log=$OPENAIR_DIR/cmake_targets/log/asn1c_install_log.txt
     echo_info "\nInstalling ASN1. The log file for ASN1 installation is here: $asn1_install_log "
     (
-    $SUDO rm -rf /tmp/asn1c-r1516
-    svn co https://github.com/vlm/asn1c/trunk  /tmp/asn1c-r1516 -r 1516
-    cd /tmp/asn1c-r1516 
-    patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch.p0 
-    patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_2.p0 
-    patch -p0 < $OPENAIR_DIR/openair2/RRC/LITE/MESSAGES/asn1c/asn1cpatch.p0 
-    patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 
+    $SUDO rm -rf /tmp/asn1c
+    git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c
+    cd /tmp/asn1c
     ./configure
     make -j`nproc`
     $SUDO make install
diff --git a/cmake_targets/tools/run_enb_ue_virt_s1 b/cmake_targets/tools/run_enb_ue_virt_s1
index 8f7255332a19169888484e7e0cd54698230e1750..9f325c7243cfd586cc93d19e33878bf8ab0b2772 100755
--- a/cmake_targets/tools/run_enb_ue_virt_s1
+++ b/cmake_targets/tools/run_enb_ue_virt_s1
@@ -252,7 +252,7 @@ function main()
   # Check table 200 lte in /etc/iproute2/rt_tables
   fgrep lte /etc/iproute2/rt_tables  > /dev/null
   if [ $? -ne 0 ]; then
-    bash -c echo "200 lte " >> /etc/iproute2/rt_tables
+    echo "200 lte " >> /etc/iproute2/rt_tables
   fi
   ip rule add fwmark 1 table lte 
   ifconfig oip1 up
diff --git a/common/utils/T/.gitignore b/common/utils/T/.gitignore
index a52d9a36677c9d9d15f873b7f0f874248b55c86c..f5724e6ff8c25fd4bf1fc8701f7ca881de58194a 100644
--- a/common/utils/T/.gitignore
+++ b/common/utils/T/.gitignore
@@ -9,4 +9,5 @@ tracer/record
 tracer/replay
 tracer/textlog
 tracer/vcd
+tracer/macpdu2wireshark
 tracee/tracee
diff --git a/common/utils/T/tracer/Makefile b/common/utils/T/tracer/Makefile
index ee289aae59636c629934de82eddbedf0932d832d..71f1d25f9251b375dd5f57d88b59d78f979b3b11 100644
--- a/common/utils/T/tracer/Makefile
+++ b/common/utils/T/tracer/Makefile
@@ -5,7 +5,7 @@ CFLAGS=-Wall -g -pthread -DT_TRACER -I.
 
 LIBS=-lX11 -lm -lpng -lXft
 
-all: record replay extract_config textlog enb vcd
+all: record replay extract_config textlog enb vcd macpdu2wireshark
 
 record: utils.o record.o database.o config.o
 	$(CC) $(CFLAGS) -o record $^ $(LIBS)
@@ -31,6 +31,10 @@ vcd: utils.o vcd.o database.o event.o handler.o config.o \
          filter/filter.a
 	$(CC) $(CFLAGS) -o vcd $^ $(LIBS)
 
+macpdu2wireshark: macpdu2wireshark.o database.o utils.o handler.o event.o \
+                  config.o
+	$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
+
 .PHONY: all gui/gui.a view/view.a logger/logger.a filter/filter.a
 
 gui/gui.a:
@@ -50,7 +54,7 @@ filter/filter.a:
 
 clean:
 	rm -f *.o core tracer_remote textlog enb vcd record replay
-	rm -f extract_config
+	rm -f extract_config macpdu2wireshark
 	cd gui && make clean
 	cd view && make clean
 	cd logger && make clean
diff --git a/common/utils/T/tracer/macpdu2wireshark.c b/common/utils/T/tracer/macpdu2wireshark.c
new file mode 100644
index 0000000000000000000000000000000000000000..886638f5ef2c6774045395cc593e20cbd12a50a9
--- /dev/null
+++ b/common/utils/T/tracer/macpdu2wireshark.c
@@ -0,0 +1,260 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include "database.h"
+#include "event.h"
+#include "handler.h"
+#include "config.h"
+#include "utils.h"
+#include "packet-mac-lte.h"
+
+#define DEFAULT_IP   "127.0.0.1"
+#define DEFAULT_PORT 9999
+
+typedef struct {
+  int socket;
+  struct sockaddr_in to;
+  OBUF buf;
+  /* ul */
+  int ul_rnti;
+  int ul_frame;
+  int ul_subframe;
+  int ul_data;
+  /* dl */
+  int dl_rnti;
+  int dl_frame;
+  int dl_subframe;
+  int dl_data;
+} ev_data;
+
+void ul(void *_d, event e)
+{
+  ev_data *d = _d;
+  ssize_t ret;
+  int fsf;
+  int i;
+
+  d->buf.osize = 0;
+
+  PUTS(&d->buf, MAC_LTE_START_STRING);
+  PUTC(&d->buf, FDD_RADIO);
+  PUTC(&d->buf, DIRECTION_UPLINK);
+  PUTC(&d->buf, C_RNTI);
+
+  PUTC(&d->buf, MAC_LTE_RNTI_TAG);
+  PUTC(&d->buf, (e.e[d->ul_rnti].i>>8) & 255);
+  PUTC(&d->buf, e.e[d->ul_rnti].i & 255);
+
+  /* for newer version of wireshark? */
+  fsf = (e.e[d->ul_frame].i << 4) + e.e[d->ul_subframe].i;
+  /* for older version? */
+  fsf = e.e[d->ul_subframe].i;
+  PUTC(&d->buf, MAC_LTE_FRAME_SUBFRAME_TAG);
+  PUTC(&d->buf, (fsf>>8) & 255);
+  PUTC(&d->buf, fsf & 255);
+
+  PUTC(&d->buf, MAC_LTE_PAYLOAD_TAG);
+  for (i = 0; i < e.e[d->ul_data].bsize; i++)
+    PUTC(&d->buf, ((char*)e.e[d->ul_data].b)[i]);
+
+  ret = sendto(d->socket, d->buf.obuf, d->buf.osize, 0,
+      (struct sockaddr *)&d->to, sizeof(struct sockaddr_in));
+  if (ret != d->buf.osize) abort();
+}
+
+void dl(void *_d, event e)
+{
+  ev_data *d = _d;
+  ssize_t ret;
+  int fsf;
+  int i;
+
+  d->buf.osize = 0;
+
+  PUTS(&d->buf, MAC_LTE_START_STRING);
+  PUTC(&d->buf, FDD_RADIO);
+  PUTC(&d->buf, DIRECTION_DOWNLINK);
+  PUTC(&d->buf, C_RNTI);
+
+  PUTC(&d->buf, MAC_LTE_RNTI_TAG);
+  PUTC(&d->buf, (e.e[d->dl_rnti].i>>8) & 255);
+  PUTC(&d->buf, e.e[d->dl_rnti].i & 255);
+
+  /* for newer version of wireshark? */
+  fsf = (e.e[d->dl_frame].i << 4) + e.e[d->dl_subframe].i;
+  /* for older version? */
+  fsf = e.e[d->dl_subframe].i;
+  PUTC(&d->buf, MAC_LTE_FRAME_SUBFRAME_TAG);
+  PUTC(&d->buf, (fsf>>8) & 255);
+  PUTC(&d->buf, fsf & 255);
+
+  PUTC(&d->buf, MAC_LTE_PAYLOAD_TAG);
+  for (i = 0; i < e.e[d->dl_data].bsize; i++)
+    PUTC(&d->buf, ((char*)e.e[d->dl_data].b)[i]);
+
+  ret = sendto(d->socket, d->buf.obuf, d->buf.osize, 0,
+      (struct sockaddr *)&d->to, sizeof(struct sockaddr_in));
+  if (ret != d->buf.osize) abort();
+}
+
+void setup_data(ev_data *d, void *database, int ul_id, int dl_id)
+{
+  database_event_format f;
+  int i;
+
+  d->ul_rnti     = -1;
+  d->ul_frame    = -1;
+  d->ul_subframe = -1;
+  d->ul_data     = -1;
+
+  d->dl_rnti     = -1;
+  d->dl_frame    = -1;
+  d->dl_subframe = -1;
+  d->dl_data     = -1;
+
+#define G(var_name, var_type, var) \
+  if (!strcmp(f.name[i], var_name)) { \
+    if (strcmp(f.type[i], var_type)) goto error; \
+    var = i; \
+    continue; \
+  }
+
+  /* ul: rnti, frame, subframe, data */
+  f = get_format(database, ul_id);
+  for (i = 0; i < f.count; i++) {
+    G("rnti",     "int",    d->ul_rnti);
+    G("frame",    "int",    d->ul_frame);
+    G("subframe", "int",    d->ul_subframe);
+    G("data",     "buffer", d->ul_data);
+  }
+  if (d->ul_rnti == -1 || d->ul_frame == -1 || d->ul_subframe == -1 ||
+      d->ul_data == -1) goto error;
+
+  /* dl: rnti, frame, subframe, data */
+  f = get_format(database, dl_id);
+  for (i = 0; i < f.count; i++) {
+    G("rnti",     "int",    d->dl_rnti);
+    G("frame",    "int",    d->dl_frame);
+    G("subframe", "int",    d->dl_subframe);
+    G("data",     "buffer", d->dl_data);
+  }
+  if (d->dl_rnti == -1 || d->dl_frame == -1 || d->dl_subframe == -1 ||
+      d->dl_data == -1) goto error;
+
+#undef G
+
+  return;
+
+error:
+  printf("bad T_messages.txt\n");
+  abort();
+}
+
+void *receiver(void *_d)
+{
+  ev_data *d = _d;
+  int s;
+  char buf[100000];
+
+  s = socket(AF_INET, SOCK_DGRAM, 0);
+  if (s == -1) { perror("socket"); abort(); }
+
+  if (bind(s, (struct sockaddr *)&d->to, sizeof(struct sockaddr_in)) == -1)
+    { perror("bind"); abort(); }
+
+  while (1) {
+    if (recv(s, buf, 100000, 0) <= 0) abort();
+  }
+
+  return 0;
+}
+
+void usage(void)
+{
+  printf(
+"options:\n"
+"    -d <database file>        this option is mandatory\n"
+"    -in <dump file>           read events from this dump file\n"
+"    -ip <IP address>          send packets to this IP address (default %s)\n"
+"    -p <port>                 send packets to this port (default %d)\n",
+  DEFAULT_IP,
+  DEFAULT_PORT
+  );
+  exit(1);
+}
+
+int main(int n, char **v)
+{
+  char *database_filename = NULL;
+  char *input_filename = NULL;
+  void *database;
+  event_handler *h;
+  int in;
+  int i;
+  int ul_id, dl_id;
+  ev_data d;
+  char *ip = DEFAULT_IP;
+  int port = DEFAULT_PORT;
+
+  memset(&d, 0, sizeof(ev_data));
+
+  for (i = 1; i < n; i++) {
+    if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
+    if (!strcmp(v[i], "-d"))
+      { if (i > n-2) usage(); database_filename = v[++i]; continue; }
+    if (!strcmp(v[i], "-in"))
+      { if (i > n-2) usage(); input_filename = v[++i]; continue; }
+    if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; }
+    if (!strcmp(v[i], "-p")) {if(i>n-2)usage(); port=atoi(v[++i]); continue; }
+    usage();
+  }
+
+  if (database_filename == NULL) {
+    printf("ERROR: provide a database file (-d)\n");
+    exit(1);
+  }
+
+  if (input_filename == NULL) {
+    printf("ERROR: provide an input file (-i)\n");
+    exit(1);
+  }
+
+  in = open(input_filename, O_RDONLY);
+  if (in == -1) { perror(input_filename); return 1; }
+
+  database = parse_database(database_filename);
+  load_config_file(database_filename);
+
+  h = new_handler(database);
+
+  ul_id = event_id_from_name(database, "ENB_MAC_UE_UL_PDU_WITH_DATA");
+  dl_id = event_id_from_name(database, "ENB_MAC_UE_DL_PDU_WITH_DATA");
+  setup_data(&d, database, ul_id, dl_id);
+
+  register_handler_function(h, ul_id, ul, &d);
+  register_handler_function(h, dl_id, dl, &d);
+
+  d.socket = socket(AF_INET, SOCK_DGRAM, 0);
+  if (d.socket == -1) { perror("socket"); exit(1); }
+
+  d.to.sin_family = AF_INET;
+  d.to.sin_port = htons(port);
+  d.to.sin_addr.s_addr = inet_addr(ip);
+
+  new_thread(receiver, &d);
+
+  /* read messages */
+  while (1) {
+    char v[T_BUFFER_MAX];
+    event e;
+    e = get_event(in, v, database);
+    if (e.type == -1) break;
+    if (!(e.type == ul_id || e.type == dl_id)) continue;
+    handle_event(h, e);
+  }
+
+  return 0;
+}
diff --git a/common/utils/T/tracer/packet-mac-lte.h b/common/utils/T/tracer/packet-mac-lte.h
new file mode 100644
index 0000000000000000000000000000000000000000..039b9dc3c4cfe13cd5310f1e8a3c6275f081df9b
--- /dev/null
+++ b/common/utils/T/tracer/packet-mac-lte.h
@@ -0,0 +1,404 @@
+/* packet-mac-lte.h
+ *
+ * Martin Mathieson
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * This header file may also be distributed under
+ * the terms of the BSD Licence as follows:
+ *
+ * Copyright (C) 2009 Martin Mathieson. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE
+ */
+
+//#include "ws_symbol_export.h"
+
+/* radioType */
+#define FDD_RADIO 1
+#define TDD_RADIO 2
+
+/* Direction */
+#define DIRECTION_UPLINK   0
+#define DIRECTION_DOWNLINK 1
+
+/* rntiType */
+#define NO_RNTI     0
+#define P_RNTI      1
+#define RA_RNTI     2
+#define C_RNTI      3
+#define SI_RNTI     4
+#define SPS_RNTI    5
+#define M_RNTI      6
+#define SL_BCH_RNTI 7
+#define SL_RNTI     8
+#define SC_RNTI     9
+#define G_RNTI      10
+
+#if 0
+typedef enum mac_lte_oob_event {
+    ltemac_send_preamble,
+    ltemac_send_sr,
+    ltemac_sr_failure
+} mac_lte_oob_event;
+
+typedef enum mac_lte_dl_retx {
+    dl_retx_no,
+    dl_retx_yes,
+    dl_retx_unknown
+} mac_lte_dl_retx;
+
+typedef enum mac_lte_crc_status {
+    crc_fail = 0,
+    crc_success = 1,
+    crc_high_code_rate = 2,
+    crc_pdsch_lost = 3,
+    crc_duplicate_nonzero_rv = 4,
+    crc_false_dci = 5
+} mac_lte_crc_status;
+
+typedef enum mac_lte_carrier_id {
+    carrier_id_primary,
+    carrier_id_secondary_1,
+    carrier_id_secondary_2,
+    carrier_id_secondary_3,
+    carrier_id_secondary_4
+} mac_lte_carrier_id;
+
+typedef enum mac_lte_ce_mode {
+    no_ce_mode = 0,
+    ce_mode_a = 1,
+    ce_mode_b = 2
+} mac_lte_ce_mode;
+
+typedef enum mac_lte_nb_mode {
+    no_nb_mode = 0,
+    nb_mode = 1
+} mac_lte_nb_mode;
+
+/* Context info attached to each LTE MAC frame */
+typedef struct mac_lte_info
+{
+    /* Needed for decode */
+    guint8          radioType;
+    guint8          direction;
+    guint8          rntiType;
+
+    /* Extra info to display */
+    guint16         rnti;
+    guint16         ueid;
+
+    /* Timing info */
+    guint16         sysframeNumber;
+    guint16         subframeNumber;
+
+    /* Optional field. More interesting for TDD (FDD is always -4 subframeNumber) */
+    gboolean        subframeNumberOfGrantPresent;
+    guint16         subframeNumberOfGrant;
+
+    /* Flag set only if doing PHY-level data test - i.e. there may not be a
+       well-formed MAC PDU so just show as raw data */
+    gboolean        isPredefinedData;
+
+    /* Length of DL PDU or UL grant size in bytes */
+    guint16         length;
+
+    /* 0=newTx, 1=first-retx, etc */
+    guint8          reTxCount;
+    guint8          isPHICHNACK; /* FALSE=PDCCH retx grant, TRUE=PHICH NACK */
+
+    /* UL only.  Indicates if the R10 extendedBSR-Sizes parameter is set */
+    gboolean        isExtendedBSRSizes;
+
+    /* UL only.  Indicates if the R10 simultaneousPUCCH-PUSCH parameter is set for PCell */
+    gboolean        isSimultPUCCHPUSCHPCell;
+
+    /* UL only.  Indicates if the R10 extendedBSR-Sizes parameter is set for PSCell */
+    gboolean        isSimultPUCCHPUSCHPSCell;
+
+    /* Status of CRC check. For UE it is DL only. For eNodeB it is UL
+       only. For an analyzer, it is present for both DL and UL. */
+    gboolean        crcStatusValid;
+    mac_lte_crc_status crcStatus;
+
+    /* Carrier ID */
+    mac_lte_carrier_id   carrierId;
+
+    /* DL only.  Is this known to be a retransmission? */
+    mac_lte_dl_retx dl_retx;
+
+    /* DL only. CE mode to be used for RAR decoding */
+    mac_lte_ce_mode ceMode;
+
+    /* DL and UL. NB-IoT mode of the UE */
+    mac_lte_nb_mode nbMode;
+
+    /* More Physical layer info (see direction above for which side of union to use) */
+    union {
+        struct mac_lte_ul_phy_info
+        {
+            guint8 present;  /* Remaining UL fields are present and should be displayed */
+            guint8 modulation_type;
+            guint8 tbs_index;
+            guint8 resource_block_length;
+            guint8 resource_block_start;
+            guint8 harq_id;
+            gboolean ndi;
+        } ul_info;
+        struct mac_lte_dl_phy_info
+        {
+            guint8 present; /* Remaining DL fields are present and should be displayed */
+            guint8 dci_format;
+            guint8 resource_allocation_type;
+            guint8 aggregation_level;
+            guint8 mcs_index;
+            guint8 redundancy_version_index;
+            guint8 resource_block_length;
+            guint8 harq_id;
+            gboolean ndi;
+            guint8   transport_block;  /* 0..1 */
+        } dl_info;
+    } detailed_phy_info;
+
+    /* Relating to out-of-band events */
+    /* N.B. dissector will only look to these fields if length is 0... */
+    mac_lte_oob_event  oob_event;
+    guint8             rapid;
+    guint8             rach_attempt_number;
+    #define MAX_SRs 20
+    guint16            number_of_srs;
+    guint16            oob_ueid[MAX_SRs];
+    guint16            oob_rnti[MAX_SRs];
+} mac_lte_info;
+
+
+typedef struct mac_lte_tap_info {
+    /* Info from context */
+    guint16  rnti;
+    guint16  ueid;
+    guint8   rntiType;
+    guint8   isPredefinedData;
+    gboolean crcStatusValid;
+    mac_lte_crc_status   crcStatus;
+    guint8   direction;
+
+    guint8   isPHYRetx;
+    guint16  ueInTTI;
+
+    nstime_t mac_lte_time;
+
+    /* Number of bytes (which part is used depends upon context settings) */
+    guint32  single_number_of_bytes;
+    guint32  bytes_for_lcid[11];
+    guint32  sdus_for_lcid[11];
+    guint8   number_of_rars;
+    guint8   number_of_paging_ids;
+
+    /* Number of padding bytes includes padding subheaders and trailing padding */
+    guint16  padding_bytes;
+    guint16  raw_length;
+} mac_lte_tap_info;
+
+
+/* Accessor function to check if a frame was considered to be ReTx */
+int is_mac_lte_frame_retx(packet_info *pinfo, guint8 direction);
+
+#endif
+
+/*****************************************************************/
+/* UDP framing format                                            */
+/* -----------------------                                       */
+/* Several people have asked about dissecting MAC by framing     */
+/* PDUs over IP.  A suggested format over UDP has been created   */
+/* and implemented by this dissector, using the definitions      */
+/* below. A link to an example program showing you how to encode */
+/* these headers and send LTE MAC PDUs on a UDP socket is        */
+/* provided at https://wiki.wireshark.org/MAC-LTE                 */
+/*                                                               */
+/* A heuristic dissecter (enabled by a preference) will          */
+/* recognise a signature at the beginning of these frames.       */
+/*****************************************************************/
+
+
+/* Signature.  Rather than try to define a port for this, or make the
+   port number a preference, frames will start with this string (with no
+   terminating NULL */
+#define MAC_LTE_START_STRING "mac-lte"
+
+/* Fixed fields.  This is followed by the following 3 mandatory fields:
+   - radioType (1 byte)
+   - direction (1 byte)
+   - rntiType (1 byte)
+   (where the allowed values are defined above */
+
+/* Optional fields. Attaching this info to frames will allow you
+   to show you display/filter/plot/add-custom-columns on these fields, so should
+   be added if available.
+   The format is to have the tag, followed by the value (there is no length field,
+   it's implicit from the tag) */
+
+#define MAC_LTE_RNTI_TAG            0x02
+/* 2 bytes, network order */
+
+#define MAC_LTE_UEID_TAG            0x03
+/* 2 bytes, network order */
+
+#define MAC_LTE_FRAME_SUBFRAME_TAG  0x04
+/* 2 bytes, network order, SFN is stored in 12 MSB and SF in 4 LSB */
+
+#define MAC_LTE_PREDEFINED_DATA_TAG 0x05
+/* 1 byte */
+
+#define MAC_LTE_RETX_TAG            0x06
+/* 1 byte */
+
+#define MAC_LTE_CRC_STATUS_TAG      0x07
+/* 1 byte */
+
+#define MAC_LTE_EXT_BSR_SIZES_TAG   0x08
+/* 0 byte */
+
+#define MAC_LTE_SEND_PREAMBLE_TAG   0x09
+/* 2 bytes, RAPID value (1 byte) followed by RACH attempt number (1 byte) */
+
+#define MAC_LTE_CARRIER_ID_TAG      0x0A
+/* 1 byte */
+
+#define MAC_LTE_PHY_TAG             0x0B
+/* variable length, length (1 byte) then depending on direction
+   in UL: modulation type (1 byte), TBS index (1 byte), RB length (1 byte),
+          RB start (1 byte), HARQ id (1 byte), NDI (1 byte)
+   in DL: DCI format (1 byte), resource allocation type (1 byte), aggregation level (1 byte),
+          MCS index (1 byte), redundancy version (1 byte), resource block length (1 byte),
+          HARQ id (1 byte), NDI (1 byte), TB (1 byte), DL reTx (1 byte) */
+
+#define MAC_LTE_SIMULT_PUCCH_PUSCH_PCELL  0x0C
+/* 0 byte */
+
+#define MAC_LTE_SIMULT_PUCCH_PUSCH_PSCELL 0x0D
+/* 0 byte */
+
+#define MAC_LTE_CE_MODE             0x0E
+/* 1 byte containing mac_lte_ce_mode enum value */
+
+#define MAC_LTE_NB_MODE             0x0F
+/* 1 byte containing mac_lte_nb_mode enum value */
+
+/* MAC PDU. Following this tag comes the actual MAC PDU (there is no length, the PDU
+   continues until the end of the frame) */
+#define MAC_LTE_PAYLOAD_TAG 0x01
+
+
+#if 0
+
+/* Type to store parameters for configuring LCID->RLC channel settings for DRB */
+/* Some are optional, and may not be seen (e.g. on reestablishment) */
+typedef struct drb_mapping_t
+{
+    guint16    ueid;                /* Mandatory */
+    guint8     drbid;               /* Mandatory */
+    gboolean   lcid_present;
+    guint8     lcid;                /* Part of LogicalChannelConfig - optional */
+    gboolean   rlcMode_present;
+    guint8     rlcMode;             /* Part of RLC config - optional */
+    gboolean   rlc_ul_ext_li_field; /* Part of RLC config - optional */
+    gboolean   rlc_dl_ext_li_field; /* Part of RLC config - optional */
+    gboolean   rlc_ul_ext_am_sn;    /* Part of RLC config - optional */
+    gboolean   rlc_dl_ext_am_sn;    /* Part of RLC config - optional */
+    gboolean   um_sn_length_present;
+    guint8     um_sn_length;        /* Part of RLC config - optional */
+    gboolean   ul_priority_present;
+    guint8     ul_priority;         /* Part of LogicalChannelConfig - optional */
+    gboolean   pdcp_sn_size_present;
+    guint8     pdcp_sn_size;        /* Part of pdcp-Config - optional */
+} drb_mapping_t;
+
+
+/* Set details of an LCID -> drb channel mapping.  To be called from
+   configuration protocol (e.g. RRC) */
+void set_mac_lte_channel_mapping(drb_mapping_t *drb_mapping);
+
+
+/* Dedicated DRX config. Used to verify that a sensible config is given.
+   Also, beginning to configure MAC with this config and (optionally) show
+   DRX config and state (cycles/timers) attached to each UL/DL PDU! */
+typedef struct drx_config_t {
+    gboolean    configured;
+    guint32     frameNum;
+    guint32     previousFrameNum;
+
+    guint32     onDurationTimer;
+    guint32     inactivityTimer;
+    guint32     retransmissionTimer;
+    guint32     longCycle;
+    guint32     cycleOffset;
+    /* Optional Short cycle */
+    gboolean    shortCycleConfigured;
+    guint32     shortCycle;
+    guint32     shortCycleTimer;
+} drx_config_t;
+
+/* Functions to set/release up dedicated DRX config */
+void set_mac_lte_drx_config(guint16 ueid, drx_config_t *drx_config, packet_info *pinfo);
+void set_mac_lte_drx_config_release(guint16 ueid,  packet_info *pinfo);
+
+/* RRC can tell this dissector which RAPIDs are Group A, Group A&B */
+void set_mac_lte_rapid_ranges(guint groupA, guint all_RA);
+
+/* RRC can indicate whether extended BSR sizes are used */
+void set_mac_lte_extended_bsr_sizes(guint16 ueid, gboolean use_ext_bsr_sizes, packet_info *pinfo);
+
+/* RRC can indicate whether simultaneous PUCCH/PUSCH is used */
+typedef enum {
+    SIMULT_PUCCH_PUSCH_PCELL = 0,
+    SIMULT_PUCCH_PUSCH_PSCELL
+} simult_pucch_pusch_cell_type;
+void set_mac_lte_simult_pucch_pusch(guint16 ueid, simult_pucch_pusch_cell_type cell_type, gboolean use_simult_pucch_pusch, packet_info *pinfo);
+
+/* Functions to be called from outside this module (e.g. in a plugin, where mac_lte_info
+   isn't available) to get/set per-packet data */
+WS_DLL_PUBLIC
+mac_lte_info *get_mac_lte_proto_data(packet_info *pinfo);
+WS_DLL_PUBLIC
+void set_mac_lte_proto_data(packet_info *pinfo, mac_lte_info *p_mac_lte_info);
+
+/* Function to attempt to populate p_mac_lte_info using framing definition above */
+gboolean dissect_mac_lte_context_fields(struct mac_lte_info  *p_mac_lte_info, tvbuff_t *tvb,
+                                        gint *p_offset);
+
+#endif
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
index e673a333718069e8f8a7a60e4686b565a000f289..64c5bc12b5e882ba4a8629a6b5dfd57aa999d05f 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
@@ -68,6 +68,7 @@
 
 #include "SIMULATION/TOOLS/defs.h" // for taus
 
+#include "T.h"
 
 void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,unsigned char Msg3_subframe)
 {
@@ -644,6 +645,9 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un
 		     &eNB->common_channels[CC_id].CCCH_pdu.payload[0],
 		     rrc_sdu_length);
 	      
+              T(T_ENB_MAC_UE_DL_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), T_INT(RA_template->rnti), T_INT(frameP), T_INT(subframeP),
+                T_INT(0 /*harq_pid always 0?*/), T_BUFFER(&eNB->UE_list.DLSCH_pdu[CC_id][0][UE_id].payload[0], TBsize));
+
 	      if (opt_enabled==1) {
 		trace_pdu(1, (uint8_t *)eNB->UE_list.DLSCH_pdu[CC_id][0][(unsigned char)UE_id].payload[0],
 			  rrc_sdu_length, UE_id, 3, UE_RNTI(module_idP, UE_id),
diff --git a/openair2/RRC/LITE/MESSAGES/asn1c/asn1cpatch.p0 b/openair2/RRC/LITE/MESSAGES/asn1c/asn1cpatch.p0
deleted file mode 100644
index 18dc516285b45214f9dd88598ce8ed08753a7588..0000000000000000000000000000000000000000
--- a/openair2/RRC/LITE/MESSAGES/asn1c/asn1cpatch.p0
+++ /dev/null
@@ -1,13 +0,0 @@
-Index: skeletons/per_opentype.c
-===================================================================
---- skeletons/per_opentype.c	(revision 1516)
-+++ skeletons/per_opentype.c	(working copy)
-@@ -277,7 +306,7 @@
- 	(void)constraints;
- 	(void)sptr;
- 
--	while(per_get_few_bits(pd, 24) >= 0);
-+	while(per_get_few_bits(pd, 1 /*24*/) >= 0);
- 
- 	rv.code = RC_OK;
- 	rv.consumed = pd->moved;
diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c
index 1414c4e1b305f116b2fe1121722010c4cb74e0f1..cdb2ddc0ca2bf42cfac591217cbcf32bb9438258 100644
--- a/openair2/RRC/LITE/rrc_eNB_S1AP.c
+++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c
@@ -60,6 +60,8 @@
 #endif
 #include "msc.h"
 
+#include "UERadioAccessCapabilityInformation.h"
+
 #include "gtpv1u_eNB_task.h"
 #include "RRC/LITE/rrc_eNB_GTPV1U.h"
 
@@ -584,29 +586,42 @@ void rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(
 //------------------------------------------------------------------------------
 {
   UECapabilityInformation_t *ueCapabilityInformation = &ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation;
-
-  if ((ueCapabilityInformation->criticalExtensions.present == UECapabilityInformation__criticalExtensions_PR_c1)
-      && (ueCapabilityInformation->criticalExtensions.choice.c1.present
-          == UECapabilityInformation__criticalExtensions__c1_PR_ueCapabilityInformation_r8)
-      && (ueCapabilityInformation->criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.count > 0)) {
-    UE_CapabilityRAT_ContainerList_t* ue_CapabilityRAT_ContainerList =
-      &ueCapabilityInformation->criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList;
-    MessageDef *msg_p;
-
-    msg_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_UE_CAPABILITIES_IND);
-    S1AP_UE_CAPABILITIES_IND (msg_p).eNB_ue_s1ap_id = ue_context_pP->ue_context.eNB_ue_s1ap_id;
-    S1AP_UE_CAPABILITIES_IND (msg_p).ue_radio_cap.length = ue_CapabilityRAT_ContainerList->list.array[0]->ueCapabilityRAT_Container.size;
-    S1AP_UE_CAPABILITIES_IND (msg_p).ue_radio_cap.buffer = ue_CapabilityRAT_ContainerList->list.array[0]->ueCapabilityRAT_Container.buf;
-
-    itti_send_msg_to_task (TASK_S1AP, ctxt_pP->instance, msg_p);
-
-    if (ue_CapabilityRAT_ContainerList->list.count > 1) {
-      LOG_W (RRC,"[eNB %d][UE %x] can only handle 1 UE capability RAT item for now (%d)\n",
-             ctxt_pP->module_id,
-             ue_context_pP->ue_context.rnti,
-             ue_CapabilityRAT_ContainerList->list.count);
-    }
+  /* 4096 is arbitrary, should be big enough */
+  unsigned char buf[4096];
+  unsigned char *buf2;
+  UERadioAccessCapabilityInformation_t rac;
+
+  if (ueCapabilityInformation->criticalExtensions.present != UECapabilityInformation__criticalExtensions_PR_c1
+      || ueCapabilityInformation->criticalExtensions.choice.c1.present != UECapabilityInformation__criticalExtensions__c1_PR_ueCapabilityInformation_r8) {
+    LOG_E(RRC, "[eNB %d][UE %x] bad UE capabilities\n", ctxt_pP->module_id, ue_context_pP->ue_context.rnti);
+    return;
   }
+
+  asn_enc_rval_t ret = uper_encode_to_buffer(&asn_DEF_UECapabilityInformation, ueCapabilityInformation, buf, 4096);
+  if (ret.encoded == -1) abort();
+
+  memset(&rac, 0, sizeof(UERadioAccessCapabilityInformation_t));
+
+  rac.criticalExtensions.present = UERadioAccessCapabilityInformation__criticalExtensions_PR_c1;
+  rac.criticalExtensions.choice.c1.present = UERadioAccessCapabilityInformation__criticalExtensions__c1_PR_ueRadioAccessCapabilityInformation_r8;
+  rac.criticalExtensions.choice.c1.choice.ueRadioAccessCapabilityInformation_r8.ue_RadioAccessCapabilityInfo.buf = buf;
+  rac.criticalExtensions.choice.c1.choice.ueRadioAccessCapabilityInformation_r8.ue_RadioAccessCapabilityInfo.size = (ret.encoded+7)/8;
+  rac.criticalExtensions.choice.c1.choice.ueRadioAccessCapabilityInformation_r8.nonCriticalExtension = NULL;
+
+  /* 8192 is arbitrary, should be big enough */
+  buf2 = malloc16(8192);
+  if (buf2 == NULL) abort();
+  ret = uper_encode_to_buffer(&asn_DEF_UERadioAccessCapabilityInformation, &rac, buf2, 8192);
+  if (ret.encoded == -1) abort();
+
+  MessageDef *msg_p;
+
+  msg_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_UE_CAPABILITIES_IND);
+  S1AP_UE_CAPABILITIES_IND (msg_p).eNB_ue_s1ap_id = ue_context_pP->ue_context.eNB_ue_s1ap_id;
+  S1AP_UE_CAPABILITIES_IND (msg_p).ue_radio_cap.length = (ret.encoded+7)/8;
+  S1AP_UE_CAPABILITIES_IND (msg_p).ue_radio_cap.buffer = buf2;
+
+  itti_send_msg_to_task (TASK_S1AP, ctxt_pP->instance, msg_p);
 }
 
 //------------------------------------------------------------------------------
diff --git a/openair3/NAS/UE/API/USIM/usim_api.c b/openair3/NAS/UE/API/USIM/usim_api.c
index fe8dc8b35074b8b38c745e7bab232bcfb29f356f..807ee467242e030694a2c3c12e5bb49ff5721d53 100644
--- a/openair3/NAS/UE/API/USIM/usim_api.c
+++ b/openair3/NAS/UE/API/USIM/usim_api.c
@@ -77,7 +77,8 @@ Description Implements the API used by the NAS layer to read/write
  * Subscriber authentication security key
  */
 #define USIM_API_K_SIZE         16
-#define USIM_API_K_VALUE        "fec86ba6eb707ed08905757b1bb44b8f"
+//#define USIM_API_K_VALUE        "fec86ba6eb707ed08905757b1bb44b8f"
+#define USIM_API_K_VALUE        "8BAF473F2F8FD09487CCCBD7097C6862"
 
 static uint8_t _usim_api_k[USIM_API_K_SIZE];
 
diff --git a/openair3/S1AP/MESSAGES/ASN1/asn1cpatch.p0 b/openair3/S1AP/MESSAGES/ASN1/asn1cpatch.p0
deleted file mode 100644
index b3a5b8d39f5059fabb85b65f03f23ea8f6760784..0000000000000000000000000000000000000000
--- a/openair3/S1AP/MESSAGES/ASN1/asn1cpatch.p0
+++ /dev/null
@@ -1,5082 +0,0 @@
-Index: asn1c/unber.c
-===================================================================
---- asn1c/unber.c	(revision 1516)
-+++ asn1c/unber.c	(working copy)
-@@ -775,4 +775,8 @@
- 
- asn_enc_rval_t OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *cts, void *sptr, asn_per_outp_t *po) { asn_enc_rval_t er = { 0, 0, 0 }; (void)td; (void)cts; (void)sptr; (void)po; return er; }
- 
-+asn_dec_rval_t OCTET_STRING_decode_aper(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *cts, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rv = { 0, 0 }; (void)ctx; (void)td; (void)cts; (void)sptr; (void)pd; return rv; }
-+
-+asn_enc_rval_t OCTET_STRING_encode_aper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *cts, void *sptr, asn_per_outp_t *po) { asn_enc_rval_t er = { 0, 0, 0 }; (void)td; (void)cts; (void)sptr; (void)po; return er; }
-+
- size_t xer_whitespace_span(const void *chunk_buf, size_t chunk_size) {  (void)chunk_buf; (void)chunk_size; return 0; }
-Index: asn1c/asn1c.c
-===================================================================
---- asn1c/asn1c.c	(revision 1516)
-+++ asn1c/asn1c.c	(working copy)
-@@ -111,6 +111,8 @@
- 			asn1_compiler_flags &= ~A1C_LINK_SKELETONS;
- 		} else if(strcmp(optarg, "link-skeletons") == 0) {
- 			asn1_compiler_flags |= A1C_LINK_SKELETONS;
-+		} else if(strcmp(optarg, "have_native64") == 0) {
-+			asn1_compiler_flags |= A1C_HAVE_NATIVE_64;
- 		} else {
- 			fprintf(stderr, "-f%s: Invalid argument\n", optarg);
- 			exit(EX_USAGE);
-@@ -471,6 +473,7 @@
- "  -fno-include-deps     Do not generate courtesy #includes for dependencies\n"
- "  -funnamed-unions      Enable unnamed unions in structures\n"
- "  -fwide-types          Use INTEGER_t instead of \"long\" by default, etc.\n"
-+"  -fhave_native64       Use int64_t/uint64_t for target platform\n"
- "\n"
- 
- "  -gen-PER              Generate PER support code\n"
-Index: examples/README
-===================================================================
---- examples/README	(revision 1516)
-+++ examples/README	(working copy)
-@@ -25,6 +25,8 @@
-    UserPlane Location Protocol decoder. Before trying to compile, read the
-    README file in that directory.
- 
-+The clyx2asn1.pl script can be used to extract ASN.1 data from LyX editor files.
-+
- The crfc2asn1.pl script can be used to extract ASN.1 data from RFC texts.
- For instance, it is used to extract X.509, MEGACO, and LDAPv3 ASN.1 modules
- from the corresponding RFC texts (rfc3280.txt, rfc3525.txt, rfc4211.txt).
-Index: skeletons/UTF8String.c
-===================================================================
---- skeletons/UTF8String.c	(revision 1516)
-+++ skeletons/UTF8String.c	(working copy)
-@@ -25,6 +25,8 @@
- 	OCTET_STRING_encode_xer_utf8,
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_UTF8String_tags,
- 	sizeof(asn_DEF_UTF8String_tags)
-Index: skeletons/constr_TYPE.h
-===================================================================
---- skeletons/constr_TYPE.h	(revision 1516)
-+++ skeletons/constr_TYPE.h	(working copy)
-@@ -99,6 +99,8 @@
- 	xer_type_encoder_f *xer_encoder;	/* [Canonical] XER encoder */
- 	per_type_decoder_f *uper_decoder;	/* Unaligned PER decoder */
- 	per_type_encoder_f *uper_encoder;	/* Unaligned PER encoder */
-+	per_type_decoder_f *aper_decoder;	/* Aligned PER decoder */
-+	per_type_encoder_f *aper_encoder;	/* Aligned PER encoder */
- 
- 	/***********************************************************************
- 	 * Internally useful members. Not to be used by applications directly. *
-Index: skeletons/RELATIVE-OID.c
-===================================================================
---- skeletons/RELATIVE-OID.c	(revision 1516)
-+++ skeletons/RELATIVE-OID.c	(working copy)
-@@ -28,6 +28,8 @@
- 	RELATIVE_OID_encode_xer,
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_RELATIVE_OID_tags,
- 	sizeof(asn_DEF_RELATIVE_OID_tags)
-Index: skeletons/per_encoder.c
-===================================================================
---- skeletons/per_encoder.c	(revision 1516)
-+++ skeletons/per_encoder.c	(working copy)
-@@ -4,6 +4,7 @@
- 
- static asn_enc_rval_t uper_encode_internal(asn_TYPE_descriptor_t *td, asn_per_constraints_t *, void *sptr, asn_app_consume_bytes_f *cb, void *app_key);
- 
-+static asn_enc_rval_t aper_encode_internal(asn_TYPE_descriptor_t *td, asn_per_constraints_t *, void *sptr, asn_app_consume_bytes_f *cb, void *app_key);
- asn_enc_rval_t
- uper_encode(asn_TYPE_descriptor_t *td, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) {
- 	return uper_encode_internal(td, 0, sptr, cb, app_key);
-@@ -41,6 +42,18 @@
- 	return uper_encode_internal(td, 0, sptr, encode_to_buffer_cb, &key);
- }
- 
-+asn_enc_rval_t
-+aper_encode_to_buffer(asn_TYPE_descriptor_t *td, void *sptr, void *buffer, size_t buffer_size) {
-+	enc_to_buf_arg key;
-+	
-+	key.buffer = buffer;
-+	key.left = buffer_size;
-+
-+	if(td) ASN_DEBUG("Encoding \"%s\" using ALIGNED PER", td->name);
-+
-+	return aper_encode_internal(td, 0, sptr, encode_to_buffer_cb, &key);
-+}
-+
- typedef struct enc_dyn_arg {
- 	void *buffer;
- 	size_t length;
-@@ -93,6 +106,35 @@
- 	}
- }
- 
-+ssize_t
-+aper_encode_to_new_buffer(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, void **buffer_r) {
-+	asn_enc_rval_t er;
-+	enc_dyn_arg key;
-+	
-+	memset(&key, 0, sizeof(key));
-+	
-+	er = aper_encode_internal(td, constraints, sptr, encode_dyn_cb, &key);
-+	switch(er.encoded) {
-+		case -1:
-+			FREEMEM(key.buffer);
-+			return -1;
-+		case 0:
-+			FREEMEM(key.buffer);
-+			key.buffer = MALLOC(1);
-+			if(key.buffer) {
-+				*(char *)key.buffer = '\0';
-+				*buffer_r = key.buffer;
-+				return 1;
-+			} else {
-+				return -1;
-+			}
-+		default:
-+			*buffer_r = key.buffer;
-+			ASN_DEBUG("Complete encoded in %ld bits", (long)er.encoded);
-+			return ((er.encoded + 7) >> 3);
-+	}
-+}
-+
- /*
-  * Internally useful functions.
-  */
-@@ -115,6 +157,23 @@
- 	return po->outper(po->tmpspace, buf - po->tmpspace, po->op_key);
- }
- 
-+static int
-+_aper_encode_flush_outp(asn_per_outp_t *po) {
-+	uint8_t *buf;
-+
-+	if(po->nboff == 0 && po->buffer == po->tmpspace)
-+		return 0;
-+
-+	buf = po->buffer + (po->nboff >> 3);
-+	/* Make sure we account for the last, partially filled */
-+	if(po->nboff & 0x07) {
-+		buf[0] &= 0xff << (8 - (po->nboff & 0x07));
-+		buf++;
-+	}
-+
-+	return po->outper(po->tmpspace, buf - po->tmpspace, po->op_key);
-+}
-+
- static asn_enc_rval_t
- uper_encode_internal(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) {
- 	asn_per_outp_t po;
-@@ -149,3 +208,37 @@
- 	return er;
- }
- 
-+static asn_enc_rval_t
-+aper_encode_internal(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) {
-+	asn_per_outp_t po;
-+	asn_enc_rval_t er;
-+
-+	/*
-+	 * Invoke type-specific encoder.
-+	 */
-+	if(!td || !td->aper_encoder)
-+		_ASN_ENCODE_FAILED;	 /* PER is not compiled in */
-+
-+	po.buffer = po.tmpspace;
-+	po.nboff = 0;
-+	po.nbits = 8 * sizeof(po.tmpspace);
-+	po.outper = cb;
-+	po.op_key = app_key;
-+	po.flushed_bytes = 0;
-+
-+	er = td->aper_encoder(td, constraints, sptr, &po);
-+	if(er.encoded != -1) {
-+		size_t bits_to_flush;
-+
-+		bits_to_flush = ((po.buffer - po.tmpspace) << 3) + po.nboff;
-+
-+		/* Set number of bits encoded to a firm value */
-+		er.encoded = (po.flushed_bytes << 3) + bits_to_flush;
-+
-+		if(_aper_encode_flush_outp(&po))
-+			_ASN_ENCODE_FAILED;
-+	}
-+
-+	return er;
-+}
-+
-Index: skeletons/NumericString.c
-===================================================================
---- skeletons/NumericString.c	(revision 1516)
-+++ skeletons/NumericString.c	(working copy)
-@@ -49,6 +49,8 @@
- 	OCTET_STRING_encode_xer_utf8,
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_NumericString_tags,
- 	sizeof(asn_DEF_NumericString_tags)
-Index: skeletons/per_encoder.h
-===================================================================
---- skeletons/per_encoder.h	(revision 1516)
-+++ skeletons/per_encoder.h	(working copy)
-@@ -38,6 +38,12 @@
- 	size_t buffer_size	/* Initial buffer size (max) */
- );
- 
-+asn_enc_rval_t aper_encode_to_buffer(
-+	struct asn_TYPE_descriptor_s *type_descriptor,
-+	void *struct_ptr,	   /* Structure to be encoded */
-+	void *buffer,		   /* Pre-allocated buffer */
-+	size_t buffer_size	   /* Initial buffer size (max) */
-+);
- /*
-  * A variant of uper_encode_to_buffer() which allocates buffer itself.
-  * Returns the number of bytes in the buffer or -1 in case of failure.
-@@ -52,6 +58,11 @@
- 	void **buffer_r		/* Buffer allocated and returned */
- );
- 
-+ssize_t
-+aper_encode_to_new_buffer(struct asn_TYPE_descriptor_s *td,
-+						  asn_per_constraints_t *constraints,
-+						  void *sptr,
-+						  void **buffer_r);
- /*
-  * Type of the generic PER encoder function.
-  */
-Index: skeletons/T61String.c
-===================================================================
---- skeletons/T61String.c	(revision 1516)
-+++ skeletons/T61String.c	(working copy)
-@@ -24,6 +24,8 @@
- 	OCTET_STRING_encode_xer,
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_T61String_tags,
- 	sizeof(asn_DEF_T61String_tags)
-Index: skeletons/TeletexString.c
-===================================================================
---- skeletons/TeletexString.c	(revision 1516)
-+++ skeletons/TeletexString.c	(working copy)
-@@ -24,6 +24,8 @@
- 	OCTET_STRING_encode_xer,
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_TeletexString_tags,
- 	sizeof(asn_DEF_TeletexString_tags)
-Index: skeletons/BMPString.c
-===================================================================
---- skeletons/BMPString.c	(revision 1516)
-+++ skeletons/BMPString.c	(working copy)
-@@ -35,6 +35,8 @@
- 	BMPString_encode_xer,		/* Convert to UTF-8 */
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,	/* Aligned PER decoder */
-+	OCTET_STRING_encode_aper,	/* Aligned PER encoder */
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_BMPString_tags,
- 	sizeof(asn_DEF_BMPString_tags)
-Index: skeletons/ObjectDescriptor.c
-===================================================================
---- skeletons/ObjectDescriptor.c	(revision 1516)
-+++ skeletons/ObjectDescriptor.c	(working copy)
-@@ -24,6 +24,8 @@
- 	OCTET_STRING_encode_xer_utf8,
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_ObjectDescriptor_tags,
- 	sizeof(asn_DEF_ObjectDescriptor_tags)
-Index: skeletons/PrintableString.c
-===================================================================
---- skeletons/PrintableString.c	(revision 1516)
-+++ skeletons/PrintableString.c	(working copy)
-@@ -59,6 +59,8 @@
- 	OCTET_STRING_encode_xer_utf8,
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_PrintableString_tags,
- 	sizeof(asn_DEF_PrintableString_tags)
-Index: skeletons/constr_SET_OF.c
-===================================================================
---- skeletons/constr_SET_OF.c	(revision 1516)
-+++ skeletons/constr_SET_OF.c	(working copy)
-@@ -34,7 +34,7 @@
- #undef	ADVANCE
- #define	ADVANCE(num_bytes)	do {		\
- 		size_t num = num_bytes;		\
--		ptr = ((const void *)ptr) + num;\
-+		ptr = ((const char *)ptr) + num;\
- 		size -= num;			\
- 		if(ctx->left >= 0)		\
- 			ctx->left -= num;	\
-@@ -100,7 +100,7 @@
- 	/*
- 	 * Restore parsing context.
- 	 */
--	ctx = (asn_struct_ctx_t *)((void *)st + specs->ctx_offset);
-+	ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
- 	
- 	/*
- 	 * Start to parse where left previously
-@@ -457,7 +457,7 @@
- #undef	XER_ADVANCE
- #define	XER_ADVANCE(num_bytes)	do {			\
- 		size_t num = num_bytes;			\
--		buf_ptr = ((const void *)buf_ptr) + num;\
-+		buf_ptr = ((const char *)buf_ptr) + num;\
- 		size -= num;				\
- 		consumed_myself += num;			\
- 	} while(0)
-@@ -505,7 +505,7 @@
- 	/*
- 	 * Restore parsing context.
- 	 */
--	ctx = (asn_struct_ctx_t *)((void *)st + specs->ctx_offset);
-+	ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
- 
- 	/*
- 	 * Phases of XER/XML processing:
-@@ -627,7 +627,7 @@
- 		t->buffer = p;
- 		t->size = newsize;
- 	}
--	memcpy((void *)t->buffer + t->offset, buffer, size);
-+	memcpy((char *)t->buffer + t->offset, buffer, size);
- 	t->offset += size;
- 	return 0;
- }
-@@ -809,7 +809,7 @@
- 		asn_set_empty(list);	/* Remove (list->array) */
- 
- 		specs = (asn_SET_OF_specifics_t *)td->specifics;
--		ctx = (asn_struct_ctx_t *)((void *)ptr + specs->ctx_offset);
-+		ctx = (asn_struct_ctx_t *)((char *)ptr + specs->ctx_offset);
- 		if(ctx->ptr) {
- 			ASN_STRUCT_FREE(*elm->type, ctx->ptr);
- 			ctx->ptr = 0;
-@@ -884,7 +884,7 @@
- 	if(!st) {
- 		st = *sptr = CALLOC(1, specs->struct_size);
- 		if(!st) _ASN_DECODE_FAILED;
--	}                                                                       
-+	}
- 	list = _A_SET_FROM_VOID(st);
- 
- 	/* Figure out which constraints to use */
-@@ -901,7 +901,7 @@
- 	if(ct && ct->effective_bits >= 0) {
- 		/* X.691, #19.5: No length determinant */
- 		nelems = per_get_few_bits(pd, ct->effective_bits);
--		ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s",
-+		ASN_DEBUG("Preparing to fetch %ld+%"PRIdMAX" elements from %s",
- 			(long)nelems, ct->lower_bound, td->name);
- 		if(nelems < 0)  _ASN_DECODE_STARVED;
- 		nelems += ct->lower_bound;
-@@ -951,3 +951,91 @@
- 	return rv;
- }
- 
-+asn_dec_rval_t
-+SET_OF_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
-+				   asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) {
-+	asn_dec_rval_t rv;
-+	asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics;
-+	asn_TYPE_member_t *elm = td->elements;	/* Single one */
-+	void *st = *sptr;
-+	asn_anonymous_set_ *list;
-+	asn_per_constraint_t *ct;
-+	int repeat = 0;
-+	ssize_t nelems;
-+
-+	if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx))
-+		_ASN_DECODE_FAILED;
-+
-+	/*
-+	 * Create the target structure if it is not present already.
-+	 */
-+	if(!st) {
-+		st = *sptr = CALLOC(1, specs->struct_size);
-+		if(!st) _ASN_DECODE_FAILED;
-+	}
-+	list = _A_SET_FROM_VOID(st);
-+
-+	/* Figure out which constraints to use */
-+	if(constraints) ct = &constraints->size;
-+	else if(td->per_constraints) ct = &td->per_constraints->size;
-+	else ct = 0;
-+
-+	if(ct && ct->flags & APC_EXTENSIBLE) {
-+		int value = per_get_few_bits(pd, 1);
-+		if(value < 0) _ASN_DECODE_STARVED;
-+		if(value) ct = 0;	/* Not restricted! */
-+	}
-+
-+	if(ct && ct->effective_bits >= 0) {
-+		/* X.691, #19.5: No length determinant */
-+// 		nelems = per_get_few_bits(pd, ct->effective_bits);
-+		nelems = aper_get_nsnnwn(pd, ct->upper_bound - ct->lower_bound);
-+		ASN_DEBUG("Preparing to fetch %ld+%"PRIdMAX" elements from %s",
-+			(long)nelems, ct->lower_bound, td->name);
-+		if(nelems < 0)  _ASN_DECODE_STARVED;
-+		nelems += ct->lower_bound;
-+	} else {
-+		nelems = -1;
-+	}
-+
-+	do {
-+		int i;
-+		if(nelems < 0) {
-+			nelems = aper_get_length(pd, ct ? ct->upper_bound - ct->lower_bound + 1 : -1,
-+				ct ? ct->effective_bits : -1, &repeat);
-+			ASN_DEBUG("Got to decode %d elements (eff %d)",
-+				(int)nelems, (int)ct ? ct->effective_bits : -1);
-+			if(nelems < 0) _ASN_DECODE_STARVED;
-+		}
-+
-+		for(i = 0; i < nelems; i++) {
-+			void *ptr = 0;
-+			ASN_DEBUG("SET OF %s decoding", elm->type->name);
-+			rv = elm->type->aper_decoder(opt_codec_ctx, elm->type,
-+				elm->per_constraints, &ptr, pd);
-+			ASN_DEBUG("%s SET OF %s decoded %d, %p",
-+				td->name, elm->type->name, rv.code, ptr);
-+			if(rv.code == RC_OK) {
-+				if(ASN_SET_ADD(list, ptr) == 0)
-+					continue;
-+				ASN_DEBUG("Failed to add element into %s",
-+					td->name);
-+				/* Fall through */
-+				rv.code = RC_FAIL;
-+			} else {
-+				ASN_DEBUG("Failed decoding %s of %s (SET OF)",
-+					elm->type->name, td->name);
-+			}
-+			if(ptr) ASN_STRUCT_FREE(*elm->type, ptr);
-+			return rv;
-+		}
-+
-+		nelems = -1;	/* Allow uper_get_length() */
-+	} while(repeat);
-+
-+	ASN_DEBUG("Decoded %s as SET OF", td->name);
-+
-+	rv.code = RC_OK;
-+	rv.consumed = 0;
-+	return rv;
-+}
-Index: skeletons/NULL.c
-===================================================================
---- skeletons/NULL.c	(revision 1516)
-+++ skeletons/NULL.c	(working copy)
-@@ -25,6 +25,8 @@
- 	NULL_encode_xer,
- 	NULL_decode_uper,	/* Unaligned PER decoder */
- 	NULL_encode_uper,	/* Unaligned PER encoder */
-+	NULL_decode_aper,	/* Aligned PER decoder */
-+	NULL_encode_aper,	/* Aligned PER encoder */
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_NULL_tags,
- 	sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]),
-@@ -135,6 +137,34 @@
- 	return rv;
- }
- 
-+asn_dec_rval_t
-+NULL_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) {
-+	asn_dec_rval_t rv;
-+
-+	(void)opt_codec_ctx;
-+	(void)td;
-+	(void)constraints;
-+	(void)pd;
-+
-+	if(!*sptr) {
-+		*sptr = MALLOC(sizeof(NULL_t));
-+		if(*sptr) {
-+			*(NULL_t *)*sptr = 0;
-+		} else {
-+			_ASN_DECODE_FAILED;
-+		}
-+	}
-+
-+	/*
-+	 * NULL type does not have content octets.
-+	 */
-+
-+	rv.code = RC_OK;
-+	rv.consumed = 0;
-+	return rv;
-+}
-+
- asn_enc_rval_t
- NULL_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints,
- 		void *sptr, asn_per_outp_t *po) {
-@@ -148,3 +178,17 @@
- 	er.encoded = 0;
- 	_ASN_ENCODED_OK(er);
- }
-+
-+asn_enc_rval_t
-+NULL_encode_aper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints,
-+	void *sptr, asn_per_outp_t *po) {
-+	asn_enc_rval_t er;
-+
-+	(void)td;
-+	(void)constraints;
-+	(void)sptr;
-+	(void)po;
-+	
-+	er.encoded = 0;
-+	_ASN_ENCODED_OK(er);
-+}
-Index: skeletons/per_decoder.c
-===================================================================
---- skeletons/per_decoder.c	(revision 1516)
-+++ skeletons/per_decoder.c	(working copy)
-@@ -37,6 +37,35 @@
- }
- 
- asn_dec_rval_t
-+aper_decode_complete(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size) {
-+	asn_dec_rval_t rval;
-+	
-+	rval = aper_decode(opt_codec_ctx, td, sptr, buffer, size, 0, 0);
-+	if(rval.consumed) {
-+		/*
-+		 * We've always given 8-aligned data,
-+		 * so convert bits to integral bytes.
-+		 */
-+		rval.consumed += 7;
-+		rval.consumed >>= 3;
-+	} else if(rval.code == RC_OK) {
-+		if(size) {
-+			if(((const uint8_t *)buffer)[0] == 0) {
-+				rval.consumed = 1;	/* 1 byte */
-+			} else {
-+				ASN_DEBUG("Expecting single zeroed byte");
-+				rval.code = RC_FAIL;
-+			}
-+		} else {
-+			/* Must contain at least 8 bits. */
-+			rval.code = RC_WMORE;
-+		}
-+	}
-+	
-+	return rval;
-+}
-+
-+asn_dec_rval_t
- uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size, int skip_bits, int unused_bits) {
- 	asn_codec_ctx_t s_codec_ctx;
- 	asn_dec_rval_t rval;
-@@ -91,3 +120,57 @@
- 	return rval;
- }
- 
-+asn_dec_rval_t
-+aper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size, int skip_bits, int unused_bits) {
-+	asn_codec_ctx_t s_codec_ctx;
-+	asn_dec_rval_t rval;
-+	asn_per_data_t pd;
-+	
-+	if(skip_bits < 0 || skip_bits > 7
-+		|| unused_bits < 0 || unused_bits > 7
-+		|| (unused_bits > 0 && !size))
-+		_ASN_DECODE_FAILED;
-+	
-+	/*
-+	 * Stack checker requires that the codec context
-+	 * must be allocated on the stack.
-+	 */
-+	if(opt_codec_ctx) {
-+		if(opt_codec_ctx->max_stack_size) {
-+			s_codec_ctx = *opt_codec_ctx;
-+			opt_codec_ctx = &s_codec_ctx;
-+		}
-+	} else {
-+		/* If context is not given, be security-conscious anyway */
-+		memset(&s_codec_ctx, 0, sizeof(s_codec_ctx));
-+		s_codec_ctx.max_stack_size = _ASN_DEFAULT_STACK_MAX;
-+		opt_codec_ctx = &s_codec_ctx;
-+	}
-+	
-+	/* Fill in the position indicator */
-+	memset(&pd, 0, sizeof(pd));
-+	pd.buffer = (const uint8_t *)buffer;
-+	pd.nboff = skip_bits;
-+	pd.nbits = 8 * size - unused_bits; /* 8 is CHAR_BIT from <limits.h> */
-+	if(pd.nboff > pd.nbits)
-+		_ASN_DECODE_FAILED;
-+	
-+	/*
-+	 * Invoke type-specific decoder.
-+	 */
-+	if(!td->aper_decoder)
-+		_ASN_DECODE_FAILED;	/* PER is not compiled in */
-+		rval = td->aper_decoder(opt_codec_ctx, td, 0, sptr, &pd);
-+	if(rval.code == RC_OK) {
-+		/* Return the number of consumed bits */
-+		rval.consumed = ((pd.buffer - (const uint8_t *)buffer) << 3)
-+		+ pd.nboff - skip_bits;
-+		ASN_DEBUG("PER decoding consumed %d, counted %d",
-+				  rval.consumed, pd.moved);
-+		assert(rval.consumed == pd.moved);
-+	} else {
-+		/* PER codec is not a restartable */
-+		rval.consumed = 0;
-+	}
-+	return rval;
-+}
-Index: skeletons/constr_SET_OF.h
-===================================================================
---- skeletons/constr_SET_OF.h	(revision 1516)
-+++ skeletons/constr_SET_OF.h	(working copy)
-@@ -34,6 +34,8 @@
- xer_type_encoder_f SET_OF_encode_xer;
- per_type_decoder_f SET_OF_decode_uper;
- per_type_encoder_f SET_OF_encode_uper;
-+per_type_decoder_f SET_OF_decode_aper;
-+per_type_encoder_f SET_OF_encode_aper;
- 
- #ifdef __cplusplus
- }
-Index: skeletons/NULL.h
-===================================================================
---- skeletons/NULL.h	(revision 1516)
-+++ skeletons/NULL.h	(working copy)
-@@ -25,6 +25,8 @@
- xer_type_encoder_f NULL_encode_xer;
- per_type_decoder_f NULL_decode_uper;
- per_type_encoder_f NULL_encode_uper;
-+per_type_decoder_f NULL_decode_aper;
-+per_type_encoder_f NULL_encode_aper;
- 
- #ifdef __cplusplus
- }
-Index: skeletons/per_decoder.h
-===================================================================
---- skeletons/per_decoder.h	(revision 1516)
-+++ skeletons/per_decoder.h	(working copy)
-@@ -38,8 +38,30 @@
- 	int unused_bits		/* Number of unused tailing bits, 0..7 */
- 	);
- 
-+/*
-+ * Aligned PER decoder of a "complete encoding" as per X.691#10.1.
-+ * On success, this call always returns (.consumed >= 1), as per X.691#10.1.3.
-+ */
-+asn_dec_rval_t aper_decode_complete(struct asn_codec_ctx_s *opt_codec_ctx,
-+									struct asn_TYPE_descriptor_s *type_descriptor,	/* Type to decode */
-+									void **struct_ptr,	/* Pointer to a target structure's pointer */
-+									const void *buffer,	/* Data to be decoded */
-+									size_t size		/* Size of data buffer */
-+									);
- 
- /*
-+ * Aligned PER decoder of any ASN.1 type. May be invoked by the application.
-+ * WARNING: This call returns the number of BITS read from the stream. Beware.
-+ */
-+asn_dec_rval_t aper_decode(struct asn_codec_ctx_s *opt_codec_ctx,
-+						   struct asn_TYPE_descriptor_s *type_descriptor,	/* Type to decode */
-+						   void **struct_ptr,	/* Pointer to a target structure's pointer */
-+						   const void *buffer,	/* Data to be decoded */
-+						   size_t size,		/* Size of data buffer */
-+						   int skip_bits,		/* Number of unused leading bits, 0..7 */
-+						   int unused_bits		/* Number of unused tailing bits, 0..7 */
-+					       );
-+/*
-  * Type of the type-specific PER decoder function.
-  */
- typedef asn_dec_rval_t (per_type_decoder_f)(asn_codec_ctx_t *opt_codec_ctx,
-Index: skeletons/per_support.c
-===================================================================
---- skeletons/per_support.c	(revision 1516)
-+++ skeletons/per_support.c	(working copy)
-@@ -31,6 +31,16 @@
- 	}
- }
- 
-+int32_t
-+aper_get_align(asn_per_data_t *pd) {
-+
-+	if(pd->nboff & 0x7) {
-+		ASN_DEBUG("Aligning %d bits", 8 - (pd->nboff & 0x7));
-+		return per_get_few_bits(pd, 8 - (pd->nboff & 0x7));
-+	}
-+	return 0;
-+}
-+
- /*
-  * Extract a small number of bits (<= 31) from the specified PER data pointer.
-  */
-@@ -187,6 +197,36 @@
- 	return (16384 * value);
- }
- 
-+ssize_t
-+aper_get_length(asn_per_data_t *pd, int range, int ebits, int *repeat) {
-+	ssize_t value;
-+
-+	*repeat = 0;
-+
-+	if (range <= 65536 && range >= 0)
-+		return aper_get_nsnnwn(pd, range);
-+
-+	if (aper_get_align(pd) < 0)
-+		return -1;
-+
-+	if(ebits >= 0) return per_get_few_bits(pd, ebits);
-+
-+	value = per_get_few_bits(pd, 8);
-+	if(value < 0) return -1;
-+	if((value & 128) == 0)  /* #10.9.3.6 */
-+		return (value & 0x7F);
-+	if((value & 64) == 0) { /* #10.9.3.7 */
-+		value = ((value & 63) << 8) | per_get_few_bits(pd, 8);
-+		if(value < 0) return -1;
-+		return value;
-+	}
-+	value &= 63;	/* this is "m" from X.691, #10.9.3.8 */
-+	if(value < 1 || value > 4)
-+		return -1;
-+	*repeat = 1;
-+	return (16384 * value);
-+}
-+
- /*
-  * Get the normally small length "n".
-  * This procedure used to decode length of extensions bit-maps
-@@ -211,6 +251,25 @@
- 	}
- }
- 
-+ssize_t
-+aper_get_nslength(asn_per_data_t *pd) {
-+	ssize_t length;
-+
-+	ASN_DEBUG("Getting normally small length");
-+
-+	if(per_get_few_bits(pd, 1) == 0) {
-+		length = per_get_few_bits(pd, 6) + 1;
-+		if(length <= 0) return -1;
-+		ASN_DEBUG("l=%d", length);
-+		return length;
-+	} else {
-+		int repeat;
-+		length = aper_get_length(pd, -1, -1, &repeat);
-+		if(length >= 0 && !repeat) return length;
-+		return -1; /* Error, or do not support >16K extensions */
-+	}
-+}
-+
- /*
-  * Get the normally small non-negative whole number.
-  * X.691, #10.6
-@@ -237,6 +296,40 @@
- 	return value;
- }
- 
-+ssize_t
-+aper_get_nsnnwn(asn_per_data_t *pd, int range) {
-+	ssize_t value;
-+	int bytes = 0;
-+
-+	ASN_DEBUG("getting nsnnwn with range %d", range);
-+
-+	if(range <= 255) {
-+		if (range < 0) return -1;
-+		/* 1 -> 8 bits */
-+		int i;
-+		for (i = 1; i <= 8; i++) {
-+			int upper = 1 << i;
-+			if (upper >= range)
-+				break;
-+		}
-+		value = per_get_few_bits(pd, i);
-+		return value;
-+	} else if (range == 256){
-+		/* 1 byte */
-+		bytes = 1;
-+		return -1;
-+	} else if (range <= 65536) {
-+		/* 2 bytes */
-+		bytes = 2;
-+	} else {
-+		return -1;
-+	}
-+	if (aper_get_align(pd) < 0)
-+		return -1;
-+	value = per_get_few_bits(pd, 8 * bytes);
-+	return value;
-+}
-+
- /*
-  * Put the normally small non-negative whole number.
-  * X.691, #10.6
-@@ -263,7 +356,59 @@
- 	return per_put_few_bits(po, n, 8 * bytes);
- }
- 
-+int
-+aper_put_nsnnwn(asn_per_outp_t *po, int range, int number) {
-+	int bytes;
- 
-+	/* 10.5.7.1 X.691 */
-+	if(range < 0) {
-+		int i;
-+		for (i = 1; ; i++) {
-+			int bits = 1 << (8 * i);
-+			if (number <= bits)
-+				break;
-+		}
-+		bytes = i;
-+		assert(i <= 4);
-+	}
-+	if(range <= 255) {
-+		int i;
-+		for (i = 1; i <= 8; i++) {
-+			int bits = 1 << i;
-+			if (range <= bits)
-+				break;
-+		}
-+		return per_put_few_bits(po, number, i);
-+	} else if(range == 256) {
-+		bytes = 1;
-+	} else if(range <= 65536) {
-+		bytes = 2;
-+	} else { /* Ranges > 64K */
-+		int i;
-+		for (i = 1; ; i++) {
-+			int bits = 1 << (8 * i);
-+			if (range <= bits)
-+				break;
-+		}
-+		assert(i <= 4);
-+		bytes = i;
-+	}
-+	if(aper_put_align(po) < 0) /* Aligning on octet */
-+		return -1;
-+
-+	return per_put_few_bits(po, number, 8 * bytes);
-+}
-+
-+int aper_put_align(asn_per_outp_t *po) {
-+
-+	if(po->nboff & 0x7) {
-+		ASN_DEBUG("Aligning %d bits", 8 - (po->nboff & 0x7));
-+		if(per_put_few_bits(po, 0x00, (8 - (po->nboff & 0x7))))
-+			return -1;
-+	}
-+	return 0;
-+}
-+
- /*
-  * Put a small number of bits (<= 31).
-  */
-@@ -392,6 +537,8 @@
- ssize_t
- uper_put_length(asn_per_outp_t *po, size_t length) {
- 
-+	ASN_DEBUG("UPER put length %d", length);
-+
- 	if(length <= 127)	/* #10.9.3.6 */
- 		return per_put_few_bits(po, length, 8)
- 			? -1 : (ssize_t)length;
-@@ -406,7 +553,34 @@
- 			? -1 : (ssize_t)(length << 14);
- }
- 
-+ssize_t
-+aper_put_length(asn_per_outp_t *po, int range, size_t length) {
- 
-+	ASN_DEBUG("APER put length %d with range %d", length, range);
-+
-+	/* 10.9 X.691 Note 2 */
-+	if (range <= 65536 && range >= 0)
-+		return aper_put_nsnnwn(po, range, length);
-+
-+	if (aper_put_align(po) < 0)
-+		return -1;
-+
-+	if(length <= 127)	   /* #10.9.3.6 */{
-+		return per_put_few_bits(po, length, 8)
-+		? -1 : (ssize_t)length;
-+	}
-+	else if(length < 16384) /* #10.9.3.7 */
-+		return per_put_few_bits(po, length|0x8000, 16)
-+		? -1 : (ssize_t)length;
-+	
-+	length >>= 14;
-+	if(length > 4) length = 4;
-+	
-+	return per_put_few_bits(po, 0xC0 | length, 8)
-+	? -1 : (ssize_t)(length << 14);
-+}
-+
-+
- /*
-  * Put the normally small length "n" into the stream.
-  * This procedure used to encode length of extensions bit-maps
-@@ -429,3 +603,19 @@
- 	return 0;
- }
- 
-+int
-+aper_put_nslength(asn_per_outp_t *po, size_t length) {
-+
-+	if(length <= 64) {
-+		/* #10.9.3.4 */
-+		if(length == 0) return -1;
-+		return per_put_few_bits(po, length-1, 7) ? -1 : 0;
-+	} else {
-+		if(aper_put_length(po, -1, length) != (ssize_t)length) {
-+			/* This might happen in case of >16K extensions */
-+			return -1;
-+		}
-+	}
-+
-+	return 0;
-+}
-Index: skeletons/constr_SET.c
-===================================================================
---- skeletons/constr_SET.c	(revision 1516)
-+++ skeletons/constr_SET.c	(working copy)
-@@ -36,7 +36,7 @@
- #undef	ADVANCE
- #define	ADVANCE(num_bytes)	do {		\
- 		size_t num = num_bytes;		\
--		ptr = ((const void *)ptr) + num;\
-+		ptr = ((const char *)ptr) + num;\
- 		size -= num;			\
- 		if(ctx->left >= 0)		\
- 			ctx->left -= num;	\
-@@ -132,7 +132,7 @@
- 	/*
- 	 * Restore parsing context.
- 	 */
--	ctx = (asn_struct_ctx_t *)((void *)st + specs->ctx_offset);
-+	ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
- 	
- 	/*
- 	 * Start to parse where left previously
-@@ -250,7 +250,7 @@
- 
- 			skip = ber_skip_length(opt_codec_ctx,
- 				BER_TLV_CONSTRUCTED(ptr),
--				(const void *)ptr + tag_len, LEFT - tag_len);
-+				(const char *)ptr + tag_len, LEFT - tag_len);
- 
- 			switch(skip) {
- 			case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE);
-@@ -271,7 +271,7 @@
- 		 * Check for duplications: must not overwrite
- 		 * already decoded elements.
- 		 */
--		if(ASN_SET_ISPRESENT2((void *)st + specs->pres_offset, edx)) {
-+		if(ASN_SET_ISPRESENT2((char *)st + specs->pres_offset, edx)) {
- 			ASN_DEBUG("SET %s: Duplicate element %s (%d)",
- 				td->name, elements[edx].name, edx);
- 			RETURN(RC_FAIL);
-@@ -284,13 +284,13 @@
- 		 */
- 		if(elements[edx].flags & ATF_POINTER) {
- 			/* Member is a pointer to another structure */
--			memb_ptr2 = (void **)((void *)st + elements[edx].memb_offset);
-+			memb_ptr2 = (void **)((char *)st + elements[edx].memb_offset);
- 		} else {
- 			/*
- 			 * A pointer to a pointer
- 			 * holding the start of the structure
- 			 */
--			memb_ptr = (void *)st + elements[edx].memb_offset;
-+			memb_ptr = (char *)st + elements[edx].memb_offset;
- 			memb_ptr2 = &memb_ptr;
- 		}
- 		/*
-@@ -302,7 +302,7 @@
- 				elements[edx].tag_mode);
- 		switch(rval.code) {
- 		case RC_OK:
--			ASN_SET_MKPRESENT((void *)st + specs->pres_offset, edx);
-+			ASN_SET_MKPRESENT((char *)st + specs->pres_offset, edx);
- 			break;
- 		case RC_WMORE: /* More data expected */
- 			if(!SIZE_VIOLATION) {
-@@ -369,7 +369,7 @@
- 
- 			ll = ber_skip_length(opt_codec_ctx,
- 				BER_TLV_CONSTRUCTED(ptr),
--				(const void *)ptr + tl, LEFT - tl);
-+				(const char *)ptr + tl, LEFT - tl);
- 			switch(ll) {
- 			case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE);
- 				/* Fall through */
-@@ -404,7 +404,7 @@
- 		unsigned int midx, pres, must;
- 
- 		midx = edx/(8 * sizeof(specs->_mandatory_elements[0]));
--		pres = ((unsigned int *)((void *)st+specs->pres_offset))[midx];
-+		pres = ((unsigned int *)((char *)st+specs->pres_offset))[midx];
- 		must = sys_ntohl(specs->_mandatory_elements[midx]);
- 
- 		if((pres & must) == must) {
-@@ -473,7 +473,7 @@
- 		 * Compute the length of the encoding of this member.
- 		 */
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(void **)((void *)sptr + elm->memb_offset);
-+			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
- 			if(!memb_ptr) {
- 				if(!elm->optional)
- 					/* Mandatory elements missing */
-@@ -486,7 +486,7 @@
- 				continue;
- 			}
- 		} else {
--			memb_ptr = (void *)((void *)sptr + elm->memb_offset);
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
- 		}
- 		tmper = elm->type->der_encoder(elm->type, memb_ptr,
- 			elm->tag_mode, elm->tag,
-@@ -547,10 +547,10 @@
- 		elm = &td->elements[t2m[edx].el_no];
- 
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(void **)((void *)sptr + elm->memb_offset);
-+			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
- 			if(!memb_ptr) continue;
- 		} else {
--			memb_ptr = (void *)((void *)sptr + elm->memb_offset);
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
- 		}
- 		tmper = elm->type->der_encoder(elm->type, memb_ptr,
- 			elm->tag_mode, elm->tag,
-@@ -570,10 +570,185 @@
- 	_ASN_ENCODED_OK(er);
- }
- 
-+asn_enc_rval_t
-+SET_encode_uper(asn_TYPE_descriptor_t *td,
-+				asn_per_constraints_t *constraints,
-+				void *sptr,
-+				asn_per_outp_t *po) {
-+}
-+
-+asn_dec_rval_t
-+SET_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
-+					 asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) {
-+}
-+
-+asn_enc_rval_t
-+SET_encode_aper(asn_TYPE_descriptor_t *td,
-+				asn_per_constraints_t *constraints,
-+				void *sptr,
-+				asn_per_outp_t *po) {
-+	asn_SET_specifics_t *specs = (asn_SET_specifics_t *)td->specifics;
-+	asn_enc_rval_t er;
-+	int edx, i;
-+	int t2m_build_own = (specs->tag2el_count != td->elements_count);
-+	asn_TYPE_tag2member_t *t2m;
-+	int t2m_count;
-+
-+	(void)constraints;
-+
-+	if(!sptr)
-+		_ASN_ENCODE_FAILED;
-+
-+	er.encoded = 0;
-+
-+	ASN_DEBUG("Encoding %s as SET (APER) map %d", td->name, specs->_mandatory_elements[0]);
-+
-+	/*
-+	 * Use existing, or build our own tags map.
-+	 */
-+	if(t2m_build_own) {
-+		t2m = (asn_TYPE_tag2member_t *)alloca(
-+			td->elements_count * sizeof(t2m[0]));
-+	if(!t2m) _ASN_ENCODE_FAILED; /* There are such platforms */
-+		t2m_count = 0;
-+	} else {
-+		/*
-+		 * There is no untagged CHOICE in this SET.
-+		 * Employ existing table.
-+		 */
-+		t2m = specs->tag2el;
-+		t2m_count = specs->tag2el_count;
-+	}
-+
-+	/*
-+	 * Gather the length of the underlying members sequence.
-+	 */
-+	for(edx = 0; edx < td->elements_count; edx++) {
-+		asn_TYPE_member_t *elm = &td->elements[edx];
-+		asn_enc_rval_t tmper;
-+		void *memb_ptr;
-+		
-+		/*
-+		 * Compute the length of the encoding of this member.
-+		 */
-+		if(elm->flags & ATF_POINTER) {
-+			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
-+			if(!memb_ptr) {
-+				if(!elm->optional)
-+				/* Mandatory elements missing */
-+					_ASN_ENCODE_FAILED;
-+				if(t2m_build_own) {
-+					t2m[t2m_count].el_no = edx;
-+					t2m[t2m_count].el_tag = 0;
-+					t2m_count++;
-+				}
-+				continue;
-+			}
-+		} else {
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
-+		}
-+
-+		/*
-+		 * Remember the outmost tag of this member.
-+		 */
-+		if(t2m_build_own) {
-+			t2m[t2m_count].el_no = edx;
-+			t2m[t2m_count].el_tag = asn_TYPE_outmost_tag(
-+				elm->type, memb_ptr, elm->tag_mode, elm->tag);
-+			t2m_count++;
-+		} else {
-+			/*
-+			 * No dynamic sorting is necessary.
-+			 */
-+		}
-+	}
-+
-+	/*
-+	 * Finalize order of the components.
-+	 */
-+	assert(t2m_count == td->elements_count);
-+	if(t2m_build_own) {
-+		/*
-+		 * Sort the underlying members according to their
-+		 * canonical tags order. DER encoding mandates it.
-+		 */
-+		qsort(t2m, t2m_count, sizeof(specs->tag2el[0]), _t2e_cmp);
-+	} else {
-+		/*
-+		 * Tags are already sorted by the compiler.
-+		 */
-+	}
-+
-+	for(edx = 0; edx < td->elements_count; edx++) {
-+		asn_TYPE_member_t *elm = &td->elements[t2m[edx].el_no];
-+		asn_enc_rval_t tmper;
-+		void *memb_ptr;		 /* Pointer to the member */
-+		void **memb_ptr2;	   /* Pointer to that pointer */
-+		int present;
-+
-+		/* Fetch the pointer to this member */
-+		if(elm->flags & ATF_POINTER) {
-+			memb_ptr2 = (void **)((char *)sptr + elm->memb_offset);
-+			present = (*memb_ptr2 != 0);
-+		} else {
-+//			 memb_ptr = (void *)((char *)sptr + elm->memb_offset);
-+//			 memb_ptr2 = &memb_ptr;
-+			present = 1;
-+			continue;
-+		}
-+
-+//		 /* Eliminate default values */
-+//		 if(present && elm->default_value
-+//			 && elm->default_value(0, memb_ptr2) == 1)
-+//			 present = 0;
-+
-+		ASN_DEBUG("Element %s %s %s->%s is %s",
-+				  elm->flags & ATF_POINTER ? "ptr" : "inline",
-+				  elm->default_value ? "def" : "wtv",
-+				  td->name, elm->name, present ? "present" : "absent");
-+		if(per_put_few_bits(po, present << 7, 8))
-+			_ASN_ENCODE_FAILED;
-+	}
-+
-+	/*
-+	 * Encode all members.
-+	 */
-+	for(edx = 0; edx < td->elements_count; edx++) {
-+		asn_TYPE_member_t *elm = &td->elements[edx];
-+		asn_enc_rval_t tmper;
-+		void *memb_ptr;		 /* Pointer to the member */
-+		void **memb_ptr2;	   /* Pointer to that pointer */
-+
-+		/* Encode according to the tag order */
-+//		 elm = &td->elements[t2m[edx].el_no];
-+
-+		if(elm->flags & ATF_POINTER) {
-+			memb_ptr2 = (void **)((char *)sptr + elm->memb_offset);
-+			if(!*memb_ptr2) {
-+				ASN_DEBUG("Element %s %d not present",
-+						  elm->name, edx);
-+				if(elm->optional)
-+					continue;
-+				/* Mandatory element is missing */
-+				_ASN_ENCODE_FAILED;
-+			}
-+		} else {
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
-+			memb_ptr2 = &memb_ptr;
-+		}
-+		tmper = elm->type->aper_encoder(elm->type, elm->per_constraints,
-+										*memb_ptr2, po);
-+		if(tmper.encoded == -1)
-+			return tmper;
-+	}
-+
-+	_ASN_ENCODED_OK(er);
-+}
-+
- #undef	XER_ADVANCE
- #define	XER_ADVANCE(num_bytes)	do {			\
- 		size_t num = num_bytes;			\
--		buf_ptr = ((const void *)buf_ptr) + num;\
-+		buf_ptr = ((const char *)buf_ptr) + num;\
- 		size -= num;				\
- 		consumed_myself += num;			\
- 	} while(0)
-@@ -613,7 +788,7 @@
- 	/*
- 	 * Restore parsing context.
- 	 */
--	ctx = (asn_struct_ctx_t *)((void *)st + specs->ctx_offset);
-+	ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
- 
- 	/*
- 	 * Phases of XER/XML processing:
-@@ -637,7 +812,7 @@
- 			void *memb_ptr;		/* Pointer to the member */
- 			void **memb_ptr2;	/* Pointer to that pointer */
- 
--			if(ASN_SET_ISPRESENT2((void *)st + specs->pres_offset,
-+			if(ASN_SET_ISPRESENT2((char *)st + specs->pres_offset,
- 					edx)) {
- 				ASN_DEBUG("SET %s: Duplicate element %s (%d)",
- 				td->name, elements[edx].name, edx);
-@@ -648,10 +823,10 @@
- 
- 			if(elm->flags & ATF_POINTER) {
- 				/* Member is a pointer to another structure */
--				memb_ptr2 = (void **)((void *)st
-+				memb_ptr2 = (void **)((char *)st
- 					+ elm->memb_offset);
- 			} else {
--				memb_ptr = (void *)st + elm->memb_offset;
-+				memb_ptr = (char *)st + elm->memb_offset;
- 				memb_ptr2 = &memb_ptr;
- 			}
- 
-@@ -663,7 +838,7 @@
- 			if(tmprval.code != RC_OK)
- 				RETURN(tmprval.code);
- 			ctx->phase = 1;	/* Back to body processing */
--			ASN_SET_MKPRESENT((void *)st + specs->pres_offset, edx);
-+			ASN_SET_MKPRESENT((char *)st + specs->pres_offset, edx);
- 			ASN_DEBUG("XER/SET phase => %d", ctx->phase);
- 			/* Fall through */
- 		}
-@@ -827,7 +1002,7 @@
- 		mlen = strlen(elm->name);
- 
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(void **)((void *)sptr + elm->memb_offset);
-+			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
- 			if(!memb_ptr) {
- 				if(elm->optional)
- 					continue;
-@@ -835,7 +1010,7 @@
- 				_ASN_ENCODE_FAILED;
- 			}
- 		} else {
--			memb_ptr = (void *)((void *)sptr + elm->memb_offset);
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
- 		}
- 
- 		if(!xcan)
-@@ -877,14 +1052,14 @@
- 		const void *memb_ptr;
- 
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(const void * const *)((const void *)sptr + elm->memb_offset);
-+			memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
- 			if(!memb_ptr) {
- 				if(elm->optional) continue;
- 				/* Print <absent> line */
- 				/* Fall through */
- 			}
- 		} else {
--			memb_ptr = (const void *)((const void *)sptr + elm->memb_offset);
-+			memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
- 		}
- 
- 		_i_INDENT(1);
-@@ -919,11 +1094,11 @@
- 		asn_TYPE_member_t *elm = &td->elements[edx];
- 		void *memb_ptr;
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(void **)((void *)ptr + elm->memb_offset);
-+			memb_ptr = *(void **)((char *)ptr + elm->memb_offset);
- 			if(memb_ptr)
- 				ASN_STRUCT_FREE(*elm->type, memb_ptr);
- 		} else {
--			memb_ptr = (void *)((void *)ptr + elm->memb_offset);
-+			memb_ptr = (void *)((char *)ptr + elm->memb_offset);
- 			ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr);
- 		}
- 	}
-@@ -953,7 +1128,7 @@
- 		const void *memb_ptr;
- 
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(const void * const *)((const void *)sptr + elm->memb_offset);
-+			memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
- 			if(!memb_ptr) {
- 				if(elm->optional)
- 					continue;
-@@ -963,7 +1138,7 @@
- 				return -1;
- 			}
- 		} else {
--			memb_ptr = (const void *)((const void *)sptr + elm->memb_offset);
-+			memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
- 		}
- 
- 		if(elm->memb_constraints) {
-Index: skeletons/constr_SEQUENCE_OF.c
-===================================================================
---- skeletons/constr_SEQUENCE_OF.c	(revision 1516)
-+++ skeletons/constr_SEQUENCE_OF.c	(working copy)
-@@ -164,7 +164,7 @@
- 	if(ct) {
- 		int not_in_root = (list->count < ct->lower_bound
- 				|| list->count > ct->upper_bound);
--		ASN_DEBUG("lb %ld ub %ld %s",
-+		ASN_DEBUG("lb %"PRIdMAX" ub %"PRIdMAX" %s",
- 			ct->lower_bound, ct->upper_bound,
- 			ct->flags & APC_EXTENSIBLE ? "ext" : "fix");
- 		if(ct->flags & APC_EXTENSIBLE) {
-@@ -206,3 +206,70 @@
- 	_ASN_ENCODED_OK(er);
- }
- 
-+asn_enc_rval_t
-+SEQUENCE_OF_encode_aper(asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-+	asn_anonymous_sequence_ *list;
-+	asn_per_constraint_t *ct;
-+	asn_enc_rval_t er;
-+	asn_TYPE_member_t *elm = td->elements;
-+	int seq;
-+
-+	if(!sptr) _ASN_ENCODE_FAILED;
-+	list = _A_SEQUENCE_FROM_VOID(sptr);
-+
-+	er.encoded = 0;
-+
-+	ASN_DEBUG("Encoding %s as SEQUENCE OF size (%d) using ALIGNED PER", td->name, list->count);
-+
-+	if(constraints) ct = &constraints->size;
-+	else if(td->per_constraints) ct = &td->per_constraints->size;
-+	else ct = 0;
-+
-+	/* If extensible constraint, check if size is in root */
-+	if(ct) {
-+		int not_in_root = (list->count < ct->lower_bound
-+				|| list->count > ct->upper_bound);
-+		ASN_DEBUG("lb %"PRIdMAX" ub %"PRIdMAX" %s",
-+			ct->lower_bound, ct->upper_bound,
-+			ct->flags & APC_EXTENSIBLE ? "ext" : "fix");
-+		if(ct->flags & APC_EXTENSIBLE) {
-+			/* Declare whether size is in extension root */
-+			if(per_put_few_bits(po, not_in_root, 1))
-+				_ASN_ENCODE_FAILED;
-+			if(not_in_root) ct = 0;
-+		} else if(not_in_root && ct->effective_bits >= 0)
-+			_ASN_ENCODE_FAILED;
-+	}
-+
-+	if(ct && ct->effective_bits >= 0) {
-+		/* X.691, #19.5: No length determinant */
-+//		 if(per_put_few_bits(po, list->count - ct->lower_bound,
-+//				 ct->effective_bits))
-+//			 _ASN_ENCODE_FAILED;
-+		if (aper_put_length(po, ct->upper_bound - ct->lower_bound + 1, list->count - ct->lower_bound) < 0)
-+			_ASN_ENCODE_FAILED;
-+	}
-+
-+	for(seq = -1; seq < list->count;) {
-+		ssize_t mayEncode;
-+		if(seq < 0) seq = 0;
-+		if(ct && ct->effective_bits >= 0) {
-+			mayEncode = list->count;
-+		} else {
-+			mayEncode = aper_put_length(po, -1, list->count - seq);
-+			if(mayEncode < 0) _ASN_ENCODE_FAILED;
-+		}
-+
-+		while(mayEncode--) {
-+			void *memb_ptr = list->array[seq++];
-+			if(!memb_ptr) _ASN_ENCODE_FAILED;
-+			er = elm->type->aper_encoder(elm->type,
-+				elm->per_constraints, memb_ptr, po);
-+			if(er.encoded == -1)
-+				_ASN_ENCODE_FAILED;
-+		}
-+	}
-+
-+	_ASN_ENCODED_OK(er);
-+}
-Index: skeletons/per_support.h
-===================================================================
---- skeletons/per_support.h	(revision 1516)
-+++ skeletons/per_support.h	(working copy)
-@@ -24,8 +24,8 @@
- 	} flags;
- 	int  range_bits;		/* Full number of bits in the range */
- 	int  effective_bits;		/* Effective bits */
--	long lower_bound;		/* "lb" value */
--	long upper_bound;		/* "ub" value */
-+	int64_t lower_bound;		/* "lb" value */
-+	int64_t upper_bound;		/* "ub" value */
- } asn_per_constraint_t;
- typedef struct asn_per_constraints_s {
- 	asn_per_constraint_t value;
-@@ -39,9 +39,9 @@
-  */
- typedef struct asn_per_data_s {
-   const uint8_t *buffer;  /* Pointer to the octet stream */
--         size_t  nboff;   /* Bit offset to the meaningful bit */
--         size_t  nbits;   /* Number of bits in the stream */
--         size_t  moved;   /* Number of bits moved through this bit stream */
-+		 size_t  nboff;   /* Bit offset to the meaningful bit */
-+		 size_t  nbits;   /* Number of bits in the stream */
-+		 size_t  moved;   /* Number of bits moved through this bit stream */
-   int (*refill)(struct asn_per_data_s *);
-   void *refill_key;
- } asn_per_data_t;
-@@ -71,15 +71,22 @@
- 			int effective_bound_bits,
- 			int *repeat);
- 
-+ssize_t aper_get_length(asn_per_data_t *pd,
-+						int range,
-+						int effective_bound_bits,
-+						int *repeat);
-+
- /*
-  * Get the normally small length "n".
-  */
- ssize_t uper_get_nslength(asn_per_data_t *pd);
-+ssize_t aper_get_nslength(asn_per_data_t *pd);
- 
- /*
-  * Get the normally small non-negative whole number.
-  */
- ssize_t uper_get_nsnnwn(asn_per_data_t *pd);
-+ssize_t aper_get_nsnnwn(asn_per_data_t *pd, int range);
- 
- /* Non-thread-safe debugging function, don't use it */
- char *per_data_string(asn_per_data_t *pd);
-@@ -103,6 +110,10 @@
- /* Output a large number of bits */
- int per_put_many_bits(asn_per_outp_t *po, const uint8_t *src, int put_nbits);
- 
-+/* Align the current bit position to octet bundary */
-+int aper_put_align(asn_per_outp_t *po);
-+int32_t aper_get_align(asn_per_data_t *pd);
-+
- /*
-  * Put the length "n" to the Unaligned PER stream.
-  * This function returns the number of units which may be flushed
-@@ -110,17 +121,23 @@
-  */
- ssize_t uper_put_length(asn_per_outp_t *po, size_t whole_length);
- 
-+ssize_t aper_put_length(asn_per_outp_t *po, int range, size_t length);
-+
- /*
-  * Put the normally small length "n" to the Unaligned PER stream.
-  * Returns 0 or -1.
-  */
- int uper_put_nslength(asn_per_outp_t *po, size_t length);
- 
-+int aper_put_nslength(asn_per_outp_t *po, size_t length);
-+
- /*
-  * Put the normally small non-negative whole number.
-  */
- int uper_put_nsnnwn(asn_per_outp_t *po, int n);
- 
-+int aper_put_nsnnwn(asn_per_outp_t *po, int range, int number);
-+
- #ifdef __cplusplus
- }
- #endif
-Index: skeletons/constr_SET.h
-===================================================================
---- skeletons/constr_SET.h	(revision 1516)
-+++ skeletons/constr_SET.h	(working copy)
-@@ -53,7 +53,9 @@
- xer_type_decoder_f SET_decode_xer;
- xer_type_encoder_f SET_encode_xer;
- per_type_decoder_f SET_decode_uper;
-+per_type_decoder_f SET_decode_aper;
- per_type_encoder_f SET_encode_uper;
-+per_type_encoder_f SET_encode_aper;
- 
- /***********************
-  * Some handy helpers. *
-Index: skeletons/constr_SEQUENCE_OF.h
-===================================================================
---- skeletons/constr_SEQUENCE_OF.h	(revision 1516)
-+++ skeletons/constr_SEQUENCE_OF.h	(working copy)
-@@ -22,9 +22,11 @@
- #define	SEQUENCE_OF_decode_ber	SET_OF_decode_ber
- #define	SEQUENCE_OF_decode_xer	SET_OF_decode_xer
- #define	SEQUENCE_OF_decode_uper	SET_OF_decode_uper
-+#define	SEQUENCE_OF_decode_aper	SET_OF_decode_aper
- der_type_encoder_f SEQUENCE_OF_encode_der;
- xer_type_encoder_f SEQUENCE_OF_encode_xer;
- per_type_encoder_f SEQUENCE_OF_encode_uper;
-+per_type_encoder_f SEQUENCE_OF_encode_aper;
- 
- #ifdef __cplusplus
- }
-Index: skeletons/ENUMERATED.c
-===================================================================
---- skeletons/ENUMERATED.c	(revision 1516)
-+++ skeletons/ENUMERATED.c	(working copy)
-@@ -26,6 +26,8 @@
- 	INTEGER_encode_xer,
- 	ENUMERATED_decode_uper,	/* Unaligned PER decoder */
- 	ENUMERATED_encode_uper,	/* Unaligned PER encoder */
-+	ENUMERATED_decode_aper,	/* Aligned PER decoder */
-+	ENUMERATED_encode_aper,	/* Aligned PER encoder */
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_ENUMERATED_tags,
- 	sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]),
-@@ -57,6 +59,27 @@
- 	return rval;
- }
- 
-+asn_dec_rval_t
-+ENUMERATED_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) {
-+	asn_dec_rval_t rval;
-+	ENUMERATED_t *st = (ENUMERATED_t *)*sptr;
-+	long value;
-+	void *vptr = &value;
-+
-+	if(!st) {
-+		st = (ENUMERATED_t *)(*sptr = CALLOC(1, sizeof(*st)));
-+		if(!st) _ASN_DECODE_FAILED;
-+	}
-+
-+	rval = NativeEnumerated_decode_aper(opt_codec_ctx, td, constraints,
-+			(void **)&vptr, pd);
-+	if(rval.code == RC_OK)
-+		if(asn_long2INTEGER(st, value))
-+			rval.code = RC_FAIL;
-+	return rval;
-+}
-+
- asn_enc_rval_t
- ENUMERATED_encode_uper(asn_TYPE_descriptor_t *td,
- 	asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-@@ -69,3 +92,14 @@
- 	return NativeEnumerated_encode_uper(td, constraints, &value, po);
- }
- 
-+asn_enc_rval_t
-+ENUMERATED_encode_aper(asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-+	ENUMERATED_t *st = (ENUMERATED_t *)sptr;
-+	long value;
-+	
-+	if(asn_INTEGER2long(st, &value))
-+		_ASN_ENCODE_FAILED;
-+	
-+	return NativeEnumerated_encode_aper(td, constraints, &value, po);
-+}
-Index: skeletons/ENUMERATED.h
-===================================================================
---- skeletons/ENUMERATED.h	(revision 1516)
-+++ skeletons/ENUMERATED.h	(working copy)
-@@ -17,6 +17,8 @@
- 
- per_type_decoder_f ENUMERATED_decode_uper;
- per_type_encoder_f ENUMERATED_encode_uper;
-+per_type_decoder_f ENUMERATED_decode_aper;
-+per_type_encoder_f ENUMERATED_encode_aper;
- 
- #ifdef __cplusplus
- }
-Index: skeletons/NativeEnumerated.c
-===================================================================
---- skeletons/NativeEnumerated.c	(revision 1516)
-+++ skeletons/NativeEnumerated.c	(working copy)
-@@ -30,6 +30,8 @@
- 	NativeEnumerated_encode_xer,
- 	NativeEnumerated_decode_uper,
- 	NativeEnumerated_encode_uper,
-+	NativeEnumerated_decode_aper,
-+	NativeEnumerated_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_NativeEnumerated_tags,
- 	sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]),
-@@ -42,17 +44,17 @@
- 
- asn_enc_rval_t
- NativeEnumerated_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,
--        int ilevel, enum xer_encoder_flags_e flags,
--                asn_app_consume_bytes_f *cb, void *app_key) {
-+	int ilevel, enum xer_encoder_flags_e flags,
-+	asn_app_consume_bytes_f *cb, void *app_key) {
- 	asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
--        asn_enc_rval_t er;
--        const long *native = (const long *)sptr;
-+	asn_enc_rval_t er;
-+	const long *native = (const long *)sptr;
- 	const asn_INTEGER_enum_map_t *el;
- 
--        (void)ilevel;
--        (void)flags;
-+	(void)ilevel;
-+	(void)flags;
- 
--        if(!native) _ASN_ENCODE_FAILED;
-+	if(!native) _ASN_ENCODE_FAILED;
- 
- 	el = INTEGER_map_value2enum(specs, *native);
- 	if(el) {
-@@ -125,6 +127,66 @@
- 	return rval;
- }
- 
-+asn_dec_rval_t
-+NativeEnumerated_decode_aper(asn_codec_ctx_t *opt_codec_ctx,
-+	asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints,
-+	void **sptr, asn_per_data_t *pd) {
-+	asn_INTEGER_specifics_t *specs = (asn_INTEGER_specifics_t *)td->specifics;
-+	asn_dec_rval_t rval = { RC_OK, 0 };
-+	long *native = (long *)*sptr;
-+	asn_per_constraint_t *ct;
-+	long value;
-+	int freeme = 0;
-+
-+	(void)opt_codec_ctx;
-+
-+	if(constraints) ct = &constraints->value;
-+	else if(td->per_constraints) ct = &td->per_constraints->value;
-+	else _ASN_DECODE_FAILED;	/* Mandatory! */
-+	if(!specs) _ASN_DECODE_FAILED;
-+
-+	if(!native) {
-+		native = (long *)(*sptr = CALLOC(1, sizeof(*native)));
-+		freeme = 1;
-+		if(!native) _ASN_DECODE_FAILED;
-+	}
-+
-+	ASN_DEBUG("Decoding %s as NativeEnumerated", td->name);
-+
-+	if(ct->flags & APC_EXTENSIBLE) {
-+		int inext = per_get_few_bits(pd, 1);
-+		if(inext < 0) _ASN_DECODE_STARVED;
-+		if(inext) ct = 0;
-+	}
-+
-+	if(ct && ct->range_bits >= 0) {
-+		value = per_get_few_bits(pd, ct->range_bits);
-+		if(value < 0) _ASN_DECODE_STARVED;
-+		if(value >= (specs->extension
-+			? specs->extension - 1 : specs->map_count))
-+			_ASN_DECODE_FAILED;
-+	} else {
-+		if(!specs->extension)
-+			_ASN_DECODE_FAILED;
-+		/*
-+		 * X.691, #10.6: normally small non-negative whole number;
-+		 */
-+		value = uper_get_nsnnwn(pd);
-+		if(value < 0) _ASN_DECODE_STARVED;
-+		value += specs->extension - 1;
-+		if(value >= specs->map_count)
-+			_ASN_DECODE_FAILED;
-+	}
-+
-+	*native = specs->value2enum[value].nat_value;
-+	ASN_DEBUG("Decoded %s = %ld", td->name, *native);
-+
-+	if (freeme)
-+		free(native);
-+
-+	return rval;
-+}
-+
- static int
- NativeEnumerated__compar_value2enum(const void *ap, const void *bp) {
- 	const asn_INTEGER_enum_map_t *a = ap;
-@@ -205,3 +267,71 @@
- 	_ASN_ENCODED_OK(er);
- }
- 
-+asn_enc_rval_t
-+NativeEnumerated_encode_aper(asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-+	asn_INTEGER_specifics_t *specs = (asn_INTEGER_specifics_t *)td->specifics;
-+	asn_enc_rval_t er;
-+	long native, value;
-+	asn_per_constraint_t *ct;
-+	int inext = 0;
-+	asn_INTEGER_enum_map_t key;
-+	asn_INTEGER_enum_map_t *kf;
-+
-+	if(!sptr) _ASN_ENCODE_FAILED;
-+	if(!specs) _ASN_ENCODE_FAILED;
-+
-+	if(constraints) ct = &constraints->value;
-+	else if(td->per_constraints) ct = &td->per_constraints->value;
-+	else _ASN_ENCODE_FAILED;	/* Mandatory! */
-+
-+	ASN_DEBUG("Encoding %s as NativeEnumerated", td->name);
-+
-+	er.encoded = 0;
-+
-+	native = *(long *)sptr;
-+	if(native < 0) _ASN_ENCODE_FAILED;
-+
-+	key.nat_value = native;
-+	kf = bsearch(&key, specs->value2enum, specs->map_count,
-+		sizeof(key), NativeEnumerated__compar_value2enum);
-+	if(!kf) {
-+		ASN_DEBUG("No element corresponds to %ld", native);
-+		_ASN_ENCODE_FAILED;
-+	}
-+	value = kf - specs->value2enum;
-+
-+	if(ct->range_bits >= 0) {
-+		int cmpWith = specs->extension
-+				? specs->extension - 1 : specs->map_count;
-+		if(value >= cmpWith)
-+			inext = 1;
-+	}
-+	if(ct->flags & APC_EXTENSIBLE) {
-+		if(per_put_few_bits(po, inext, 1))
-+			_ASN_ENCODE_FAILED;
-+		if(inext) ct = 0;
-+	} else if(inext) {
-+		_ASN_ENCODE_FAILED;
-+	}
-+
-+	if(ct && ct->range_bits >= 0) {
-+		if(per_put_few_bits(po, value, ct->range_bits))
-+			_ASN_ENCODE_FAILED;
-+		_ASN_ENCODED_OK(er);
-+	}
-+
-+	if(!specs->extension)
-+		_ASN_ENCODE_FAILED;
-+
-+	/*
-+	 * X.691, #10.6: normally small non-negative whole number;
-+	 */
-+	ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld",
-+		value, specs->extension, inext,
-+		value - (inext ? (specs->extension - 1) : 0));
-+	if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0)))
-+		_ASN_ENCODE_FAILED;
-+
-+	_ASN_ENCODED_OK(er);
-+}
-Index: skeletons/GeneralString.c
-===================================================================
---- skeletons/GeneralString.c	(revision 1516)
-+++ skeletons/GeneralString.c	(working copy)
-@@ -24,6 +24,8 @@
- 	OCTET_STRING_encode_xer,
- 	OCTET_STRING_decode_uper,    /* Implemented in terms of OCTET STRING */
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_GeneralString_tags,
- 	sizeof(asn_DEF_GeneralString_tags)
-Index: skeletons/IA5String.c
-===================================================================
---- skeletons/IA5String.c	(revision 1516)
-+++ skeletons/IA5String.c	(working copy)
-@@ -29,6 +29,8 @@
- 	OCTET_STRING_encode_xer_utf8,
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_IA5String_tags,
- 	sizeof(asn_DEF_IA5String_tags)
-Index: skeletons/NativeEnumerated.h
-===================================================================
---- skeletons/NativeEnumerated.h	(revision 1516)
-+++ skeletons/NativeEnumerated.h	(working copy)
-@@ -24,6 +24,8 @@
- xer_type_encoder_f NativeEnumerated_encode_xer;
- per_type_decoder_f NativeEnumerated_decode_uper;
- per_type_encoder_f NativeEnumerated_encode_uper;
-+per_type_decoder_f NativeEnumerated_decode_aper;
-+per_type_encoder_f NativeEnumerated_encode_aper;
- 
- #ifdef __cplusplus
- }
-Index: skeletons/OBJECT_IDENTIFIER.c
-===================================================================
---- skeletons/OBJECT_IDENTIFIER.c	(revision 1516)
-+++ skeletons/OBJECT_IDENTIFIER.c	(working copy)
-@@ -27,6 +27,8 @@
- 	OBJECT_IDENTIFIER_encode_xer,
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_OBJECT_IDENTIFIER_tags,
- 	sizeof(asn_DEF_OBJECT_IDENTIFIER_tags)
-Index: skeletons/per_opentype.c
-===================================================================
---- skeletons/per_opentype.c	(revision 1516)
-+++ skeletons/per_opentype.c	(working copy)
-@@ -53,6 +53,35 @@
- 	return 0;
- }
- 
-+int
-+aper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-+	void *buf;
-+	void *bptr;
-+	ssize_t size;
-+	size_t toGo;
-+	
-+	ASN_DEBUG("Open type put %s ...", td->name);
-+	
-+	size = aper_encode_to_new_buffer(td, constraints, sptr, &buf);
-+	if(size <= 0) return -1;
-+
-+	for(bptr = buf, toGo = size; toGo;) {
-+		ssize_t maySave = aper_put_length(po, -1, toGo);
-+		if(maySave < 0) break;
-+		if(per_put_many_bits(po, bptr, maySave * 8)) break;
-+		bptr = (char *)bptr + maySave;
-+		toGo -= maySave;
-+	}
-+	
-+	FREEMEM(buf);
-+	if(toGo) return -1;
-+	
-+	ASN_DEBUG("Open type put %s of length %ld + overhead (1byte?)",
-+		td->name, (long)size);
-+	
-+	return 0;
-+}
-+
- static asn_dec_rval_t
- uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td,
- 	asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) {
-Index: skeletons/VideotexString.c
-===================================================================
---- skeletons/VideotexString.c	(revision 1516)
-+++ skeletons/VideotexString.c	(working copy)
-@@ -24,6 +24,8 @@
- 	OCTET_STRING_encode_xer,
- 	OCTET_STRING_decode_uper,    /* Implemented in terms of OCTET STRING */
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_VideotexString_tags,
- 	sizeof(asn_DEF_VideotexString_tags)
-Index: skeletons/per_opentype.h
-===================================================================
---- skeletons/per_opentype.h	(revision 1516)
-+++ skeletons/per_opentype.h	(working copy)
-@@ -15,6 +15,8 @@
- 
- int uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po);
- 
-+int aper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po);
-+
- #ifdef __cplusplus
- }
- #endif
-Index: skeletons/BOOLEAN.c
-===================================================================
---- skeletons/BOOLEAN.c	(revision 1516)
-+++ skeletons/BOOLEAN.c	(working copy)
-@@ -24,6 +24,8 @@
- 	BOOLEAN_encode_xer,
- 	BOOLEAN_decode_uper,	/* Unaligned PER decoder */
- 	BOOLEAN_encode_uper,	/* Unaligned PER encoder */
-+	BOOLEAN_decode_aper,	/* Aligned PER decoder */
-+	BOOLEAN_encode_aper,	/* Aligned PER encoder */
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_BOOLEAN_tags,
- 	sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]),
-@@ -264,7 +266,36 @@
- 	return rv;
- }
- 
-+asn_dec_rval_t
-+BOOLEAN_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) {
-+	asn_dec_rval_t rv;
-+	BOOLEAN_t *st = (BOOLEAN_t *)*sptr;
- 
-+	(void)opt_codec_ctx;
-+	(void)constraints;
-+
-+	if(!st) {
-+		st = (BOOLEAN_t *)(*sptr = MALLOC(sizeof(*st)));
-+		if(!st) _ASN_DECODE_FAILED;
-+	}
-+
-+	/*
-+	 * Extract a single bit
-+	 */
-+	switch(per_get_few_bits(pd, 1)) {
-+	case 1: *st = 1; break;
-+	case 0: *st = 0; break;
-+	case -1: default: _ASN_DECODE_STARVED;
-+	}
-+
-+	ASN_DEBUG("%s decoded as %s", td->name, *st ? "TRUE" : "FALSE");
-+
-+	rv.code = RC_OK;
-+	rv.consumed = 1;
-+	return rv;
-+}
-+
- asn_enc_rval_t
- BOOLEAN_encode_uper(asn_TYPE_descriptor_t *td,
- 	asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-@@ -280,3 +311,18 @@
- 
- 	_ASN_ENCODED_OK(er);
- }
-+
-+asn_enc_rval_t
-+BOOLEAN_encode_aper(asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-+	const BOOLEAN_t *st = (const BOOLEAN_t *)sptr;
-+	asn_enc_rval_t er;
-+
-+	(void)constraints;
-+
-+	if(!st) _ASN_ENCODE_FAILED;
-+
-+	per_put_few_bits(po, *st ? 1 : 0, 1);
-+
-+	_ASN_ENCODED_OK(er);
-+}
-Index: skeletons/ISO646String.c
-===================================================================
---- skeletons/ISO646String.c	(revision 1516)
-+++ skeletons/ISO646String.c	(working copy)
-@@ -29,6 +29,8 @@
- 	OCTET_STRING_encode_xer_utf8,
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_ISO646String_tags,
- 	sizeof(asn_DEF_ISO646String_tags)
-Index: skeletons/constr_CHOICE.c
-===================================================================
---- skeletons/constr_CHOICE.c	(revision 1516)
-+++ skeletons/constr_CHOICE.c	(working copy)
-@@ -34,7 +34,7 @@
- #undef	ADVANCE
- #define	ADVANCE(num_bytes)	do {		\
- 		size_t num = num_bytes;		\
--		ptr = ((const void *)ptr) + num;\
-+		ptr = ((const char *)ptr) + num;\
- 		size -= num;			\
- 		if(ctx->left >= 0)		\
- 			ctx->left -= num;	\
-@@ -133,7 +133,7 @@
- 	/*
- 	 * Restore parsing context.
- 	 */
--	ctx = (asn_struct_ctx_t *)((void *)st + specs->ctx_offset);
-+	ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
- 	
- 	/*
- 	 * Start to parse where left previously
-@@ -211,7 +211,7 @@
- 
- 				skip = ber_skip_length(opt_codec_ctx,
- 					BER_TLV_CONSTRUCTED(ptr),
--					(const void *)ptr + tag_len,
-+					(const char *)ptr + tag_len,
- 					LEFT - tag_len);
- 
- 				switch(skip) {
-@@ -244,7 +244,7 @@
- 		 */
- 		if(elm->flags & ATF_POINTER) {
- 			/* Member is a pointer to another structure */
--			memb_ptr2 = (void **)((void *)st + elm->memb_offset);
-+			memb_ptr2 = (void **)((char *)st + elm->memb_offset);
- 		} else {
- 			/*
- 			 * A pointer to a pointer
-@@ -390,7 +390,7 @@
- 	 */
- 	elm = &td->elements[present-1];
- 	if(elm->flags & ATF_POINTER) {
--		memb_ptr = *(void **)((void *)sptr + elm->memb_offset);
-+		memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
- 		if(memb_ptr == 0) {
- 			if(elm->optional) {
- 				erval.encoded = 0;
-@@ -400,7 +400,7 @@
- 			_ASN_ENCODE_FAILED;
- 		}
- 	} else {
--		memb_ptr = (void *)((void *)sptr + elm->memb_offset);
-+		memb_ptr = (void *)((char *)sptr + elm->memb_offset);
- 	}
- 
- 	/*
-@@ -463,10 +463,10 @@
- 
- 		if(elm->flags & ATF_POINTER) {
- 			memb_ptr = *(const void * const *)
--					((const void *)ptr + elm->memb_offset);
-+					((const char *)ptr + elm->memb_offset);
- 		} else {
- 			memb_ptr = (const void *)
--					((const void *)ptr + elm->memb_offset);
-+					((const char *)ptr + elm->memb_offset);
- 		}
- 
- 		return asn_TYPE_outmost_tag(elm->type, memb_ptr,
-@@ -498,7 +498,7 @@
- 		const void *memb_ptr;
- 
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(const void * const *)((const void *)sptr + elm->memb_offset);
-+			memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
- 			if(!memb_ptr) {
- 				if(elm->optional)
- 					return 0;
-@@ -508,7 +508,7 @@
- 				return -1;
- 			}
- 		} else {
--			memb_ptr = (const void *)((const void *)sptr + elm->memb_offset);
-+			memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
- 		}
- 
- 		if(elm->memb_constraints) {
-@@ -535,7 +535,7 @@
- #undef	XER_ADVANCE
- #define	XER_ADVANCE(num_bytes)	do {			\
- 		size_t num = num_bytes;			\
--		buf_ptr = ((const void *)buf_ptr) + num;\
-+		buf_ptr = ((const char *)buf_ptr) + num;\
- 		size -= num;				\
- 		consumed_myself += num;			\
- 	} while(0)
-@@ -574,7 +574,7 @@
- 	/*
- 	 * Restore parsing context.
- 	 */
--	ctx = (asn_struct_ctx_t *)((void *)st + specs->ctx_offset);
-+	ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
- 	if(ctx->phase == 0 && !*xml_tag)
- 		ctx->phase = 1;	/* Skip the outer tag checking phase */
- 
-@@ -605,7 +605,7 @@
- 
- 			if(elm->flags & ATF_POINTER) {
- 				/* Member is a pointer to another structure */
--				memb_ptr2 = (void **)((void *)st
-+				memb_ptr2 = (void **)((char *)st
- 					+ elm->memb_offset);
- 			} else {
- 				memb_ptr = (char *)st + elm->memb_offset;
-@@ -797,10 +797,10 @@
- 		unsigned int mlen = strlen(mname);
- 
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(void **)((void *)sptr + elm->memb_offset);
-+			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
- 			if(!memb_ptr) _ASN_ENCODE_FAILED;
- 		} else {
--			memb_ptr = (void *)((void *)sptr + elm->memb_offset);
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
- 		}
- 
- 		er.encoded = 0;
-@@ -884,7 +884,7 @@
- 	elm = &td->elements[value];
- 	if(elm->flags & ATF_POINTER) {
- 		/* Member is a pointer to another structure */
--		memb_ptr2 = (void **)((void *)st + elm->memb_offset);
-+		memb_ptr2 = (void **)((char *)st + elm->memb_offset);
- 	} else {
- 		memb_ptr = (char *)st + elm->memb_offset;
- 		memb_ptr2 = &memb_ptr;
-@@ -904,7 +904,88 @@
- 			elm->name, td->name, rv.code);
- 	return rv;
- }
--   
-+
-+asn_dec_rval_t
-+CHOICE_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) {
-+	asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics;
-+	asn_dec_rval_t rv;
-+	asn_per_constraint_t *ct;
-+	asn_TYPE_member_t *elm;	/* CHOICE's element */
-+	void *memb_ptr;
-+	void **memb_ptr2;
-+	void *st = *sptr;
-+	int value;
-+
-+	if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx))
-+		_ASN_DECODE_FAILED;
-+
-+	/*
-+	 * Create the target structure if it is not present already.
-+	 */
-+	if(!st) {
-+		st = *sptr = CALLOC(1, specs->struct_size);
-+		if(!st) _ASN_DECODE_FAILED;
-+	}
-+
-+	if(constraints) ct = &constraints->value;
-+	else if(td->per_constraints) ct = &td->per_constraints->value;
-+	else ct = 0;
-+
-+	if(ct && ct->flags & APC_EXTENSIBLE) {
-+		value = per_get_few_bits(pd, 1);
-+		if(value < 0) _ASN_DECODE_STARVED;
-+		if(value) ct = 0;	/* Not restricted */
-+	}
-+
-+	if(ct && ct->range_bits >= 0) {
-+		value = per_get_few_bits(pd, ct->range_bits);
-+		if(value < 0) _ASN_DECODE_STARVED;
-+		ASN_DEBUG("CHOICE %s got index %d in range %d",
-+			td->name, value, ct->range_bits);
-+		if(value > ct->upper_bound)
-+			_ASN_DECODE_FAILED;
-+	} else {
-+		if(specs->ext_start == -1)
-+			_ASN_DECODE_FAILED;
-+		value = uper_get_nsnnwn(pd);
-+		if(value < 0) _ASN_DECODE_STARVED;
-+		value += specs->ext_start;
-+		if(value >= td->elements_count)
-+			_ASN_DECODE_FAILED;
-+	}
-+
-+	/* Adjust if canonical order is different from natural order */
-+	if(specs->canonical_order)
-+		value = specs->canonical_order[value];
-+
-+	/* Set presence to be able to free it later */
-+	_set_present_idx(st, specs->pres_offset, specs->pres_size, value + 1);
-+
-+	elm = &td->elements[value];
-+	if(elm->flags & ATF_POINTER) {
-+		/* Member is a pointer to another structure */
-+		memb_ptr2 = (void **)((char *)st + elm->memb_offset);
-+	} else {
-+		memb_ptr = (char *)st + elm->memb_offset;
-+		memb_ptr2 = &memb_ptr;
-+	}
-+	ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name);
-+
-+	if(ct && ct->range_bits >= 0) {
-+		rv = elm->type->aper_decoder(opt_codec_ctx, elm->type,
-+			elm->per_constraints, memb_ptr2, pd);
-+	} else {
-+		rv = uper_open_type_get(opt_codec_ctx, elm->type,
-+			elm->per_constraints, memb_ptr2, pd);
-+	}
-+
-+	if(rv.code != RC_OK)
-+		ASN_DEBUG("Failed to decode %s in %s (CHOICE) %d",
-+			elm->name, td->name, rv.code);
-+	return rv;
-+}
-+
- asn_enc_rval_t
- CHOICE_encode_uper(asn_TYPE_descriptor_t *td,
- 	asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-@@ -917,7 +998,7 @@
- 
- 	if(!sptr) _ASN_ENCODE_FAILED;
- 
--	ASN_DEBUG("Encoding %s as CHOICE", td->name);
-+	ASN_DEBUG("Encoding %s as CHOICE using UPER", td->name);
- 
- 	if(constraints) ct = &constraints->value;
- 	else if(td->per_constraints) ct = &td->per_constraints->value;
-@@ -962,7 +1043,7 @@
- 	elm = &td->elements[present];
- 	if(elm->flags & ATF_POINTER) {
- 		/* Member is a pointer to another structure */
--		memb_ptr = *(void **)((void *)sptr + elm->memb_offset);
-+		memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
- 		if(!memb_ptr) _ASN_ENCODE_FAILED;
- 	} else {
- 		memb_ptr = (char *)sptr + elm->memb_offset;
-@@ -987,8 +1068,88 @@
- 		_ASN_ENCODED_OK(rval);
- 	}
- }
--   
- 
-+asn_enc_rval_t
-+CHOICE_encode_aper(asn_TYPE_descriptor_t *td,
-+				   asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-+	asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics;
-+	asn_TYPE_member_t *elm; /* CHOICE's element */
-+	asn_per_constraint_t *ct;
-+	void *memb_ptr;
-+	int present;
-+
-+	if(!sptr) _ASN_ENCODE_FAILED;
-+
-+	ASN_DEBUG("Encoding %s as CHOICE using ALIGNED PER", td->name);
-+
-+	if(constraints) ct = &constraints->value;
-+	else if(td->per_constraints) ct = &td->per_constraints->value;
-+	else ct = 0;
-+	
-+	present = _fetch_present_idx(sptr,
-+								 specs->pres_offset, specs->pres_size);
-+
-+	/*
-+	 * If the structure was not initialized properly, it cannot be encoded:
-+	 * can't deduce what to encode in the choice type.
-+	 */
-+	if(present <= 0 || present > td->elements_count)
-+		_ASN_ENCODE_FAILED;
-+	else
-+		present--;
-+
-+	/* Adjust if canonical order is different from natural order */
-+	if(specs->canonical_order)
-+		present = specs->canonical_order[present];
-+
-+	ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present);
-+
-+	if(ct && ct->range_bits >= 0) {
-+		if(present < ct->lower_bound
-+			|| present > ct->upper_bound) {
-+			if(ct->flags & APC_EXTENSIBLE) {
-+				if(per_put_few_bits(po, 1, 1))
-+					_ASN_ENCODE_FAILED;
-+			} else {
-+				_ASN_ENCODE_FAILED;
-+			}
-+			ct = 0;
-+			}
-+	}
-+	if(ct && ct->flags & APC_EXTENSIBLE) {
-+		if(per_put_few_bits(po, 0, 1))
-+			_ASN_ENCODE_FAILED;
-+	}
-+
-+	elm = &td->elements[present];
-+	if(elm->flags & ATF_POINTER) {
-+		/* Member is a pointer to another structure */
-+		memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
-+		if(!memb_ptr) _ASN_ENCODE_FAILED;
-+	} else {
-+		memb_ptr = (char *)sptr + elm->memb_offset;
-+	}
-+
-+	if(ct && ct->range_bits >= 0) {
-+		if(per_put_few_bits(po, present, ct->range_bits))
-+			_ASN_ENCODE_FAILED;
-+
-+			return elm->type->aper_encoder(elm->type, elm->per_constraints,
-+										   memb_ptr, po);
-+	} else {
-+		asn_enc_rval_t rval;
-+		if(specs->ext_start == -1)
-+			_ASN_ENCODE_FAILED;
-+        if(aper_put_nsnnwn(po, ct->range_bits, present - specs->ext_start))
-+			_ASN_ENCODE_FAILED;
-+		if(aper_open_type_put(elm->type, elm->per_constraints,
-+			memb_ptr, po))
-+			_ASN_ENCODE_FAILED;
-+		rval.encoded = 0;
-+		_ASN_ENCODED_OK(rval);
-+	}
-+}
-+
- int
- CHOICE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
- 		asn_app_consume_bytes_f *cb, void *app_key) {
-@@ -1010,10 +1171,10 @@
- 		const void *memb_ptr;
- 
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(const void * const *)((const void *)sptr + elm->memb_offset);
-+			memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
- 			if(!memb_ptr) return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
- 		} else {
--			memb_ptr = (const void *)((const void *)sptr + elm->memb_offset);
-+			memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
- 		}
- 
- 		/* Print member's name and stuff */
-@@ -1053,11 +1214,11 @@
- 		void *memb_ptr;
- 
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(void **)((void *)ptr + elm->memb_offset);
-+			memb_ptr = *(void **)((char *)ptr + elm->memb_offset);
- 			if(memb_ptr)
- 				ASN_STRUCT_FREE(*elm->type, memb_ptr);
- 		} else {
--			memb_ptr = (void *)((void *)ptr + elm->memb_offset);
-+			memb_ptr = (void *)((char *)ptr + elm->memb_offset);
- 			ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr);
- 		}
- 	}
-@@ -1082,7 +1243,7 @@
- 	const void *present_ptr;
- 	int present;
- 
--	present_ptr = ((const void *)struct_ptr) + pres_offset;
-+	present_ptr = ((const char *)struct_ptr) + pres_offset;
- 
- 	switch(pres_size) {
- 	case sizeof(int):	present =   *(const int *)present_ptr; break;
-@@ -1100,7 +1261,7 @@
- static void
- _set_present_idx(void *struct_ptr, int pres_offset, int pres_size, int present) {
- 	void *present_ptr;
--	present_ptr = ((void *)struct_ptr) + pres_offset;
-+	present_ptr = ((char *)struct_ptr) + pres_offset;
- 
- 	switch(pres_size) {
- 	case sizeof(int):	*(int *)present_ptr   = present; break;
-Index: skeletons/asn_internal.h
-===================================================================
---- skeletons/asn_internal.h	(revision 1516)
-+++ skeletons/asn_internal.h	(working copy)
-@@ -20,7 +20,7 @@
- #endif
- 
- /* Environment version might be used to avoid running with the old library */
--#define	ASN1C_ENVIRONMENT_VERSION	923	/* Compile-time version */
-+#define	ASN1C_ENVIRONMENT_VERSION	924	/* Compile-time version */
- int get_asn1c_environment_version(void);	/* Run-time version */
- 
- #define	CALLOC(nmemb, size)	calloc(nmemb, size)
-@@ -48,18 +48,22 @@
- #define ASN_DEBUG_INDENT_ADD(i) do { asn_debug_indent += i; } while(0)
- #endif	/* ASN_THREAD_SAFE */
- #define	ASN_DEBUG(fmt, args...)	do {			\
--		int adi = asn_debug_indent;		\
--		while(adi--) fprintf(stderr, " ");	\
--		fprintf(stderr, fmt, ##args);		\
--		fprintf(stderr, " (%s:%d)\n",		\
--			__FILE__, __LINE__);		\
--	} while(0)
-+	int adi = asn_debug_indent;			\
-+	while(adi--) fprintf(stderr, " ");	\
-+	fprintf(stderr, fmt, ##args);		\
-+	fprintf(stderr, " (%s:%d)\n",		\
-+		__FILE__, __LINE__);				\
-+} while(0)
- #else	/* !__GNUC__ */
- void ASN_DEBUG_f(const char *fmt, ...);
- #define	ASN_DEBUG	ASN_DEBUG_f
- #endif	/* __GNUC__ */
- #else	/* EMIT_ASN_DEBUG != 1 */
-+# ifdef EMIT_ASN_DEBUG_EXTERN
-+extern inline void ASN_DEBUG(const char *fmt, ...);
-+# else
- static inline void ASN_DEBUG(const char *fmt, ...) { (void)fmt; }
-+# endif
- #endif	/* EMIT_ASN_DEBUG */
- #endif	/* ASN_DEBUG */
- 
-Index: skeletons/BOOLEAN.h
-===================================================================
---- skeletons/BOOLEAN.h	(revision 1516)
-+++ skeletons/BOOLEAN.h	(working copy)
-@@ -28,6 +28,8 @@
- xer_type_encoder_f BOOLEAN_encode_xer;
- per_type_decoder_f BOOLEAN_decode_uper;
- per_type_encoder_f BOOLEAN_encode_uper;
-+per_type_decoder_f BOOLEAN_decode_aper;
-+per_type_encoder_f BOOLEAN_encode_aper;
- 
- #ifdef __cplusplus
- }
-Index: skeletons/constr_CHOICE.h
-===================================================================
---- skeletons/constr_CHOICE.h	(revision 1516)
-+++ skeletons/constr_CHOICE.h	(working copy)
-@@ -48,6 +48,8 @@
- xer_type_encoder_f CHOICE_encode_xer;
- per_type_decoder_f CHOICE_decode_uper;
- per_type_encoder_f CHOICE_encode_uper;
-+per_type_decoder_f CHOICE_decode_aper;
-+per_type_encoder_f CHOICE_encode_aper;
- asn_outmost_tag_f CHOICE_outmost_tag;
- 
- #ifdef __cplusplus
-Index: skeletons/INTEGER.c
-===================================================================
---- skeletons/INTEGER.c	(revision 1516)
-+++ skeletons/INTEGER.c	(working copy)
-@@ -27,9 +27,13 @@
- #ifdef	ASN_DISABLE_PER_SUPPORT
- 	0,
- 	0,
-+	0,
-+	0,
- #else
- 	INTEGER_decode_uper,	/* Unaligned PER decoder */
- 	INTEGER_encode_uper,	/* Unaligned PER encoder */
-+	INTEGER_decode_aper,
-+	INTEGER_encode_aper,
- #endif	/* ASN_DISABLE_PER_SUPPORT */
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_INTEGER_tags,
-@@ -612,7 +616,7 @@
- 				value = per_get_few_bits(pd, ct->range_bits);
- 				if(value < 0) _ASN_DECODE_STARVED;
- 			}
--			ASN_DEBUG("Got value %ld + low %ld",
-+			ASN_DEBUG("Got value %ld + low %"PRIdMAX,
- 				value, ct->lower_bound);
- 			value += ct->lower_bound;
- 			if((specs && specs->field_unsigned)
-@@ -660,6 +664,158 @@
- 	return rval;
- }
- 
-+asn_dec_rval_t
-+INTEGER_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) {
-+	asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
-+	asn_dec_rval_t rval = { RC_OK, 0 };
-+	INTEGER_t *st = (INTEGER_t *)*sptr;
-+	asn_per_constraint_t *ct;
-+	int repeat;
-+
-+	(void)opt_codec_ctx;
-+
-+	if(!st) {
-+		st = (INTEGER_t *)(*sptr = CALLOC(1, sizeof(*st)));
-+		if(!st) _ASN_DECODE_FAILED;
-+	}
-+
-+	if(!constraints) constraints = td->per_constraints;
-+	ct = constraints ? &constraints->value : 0;
-+
-+	if(ct && ct->flags & APC_EXTENSIBLE) {
-+		int inext = per_get_few_bits(pd, 1);
-+		if(inext < 0) _ASN_DECODE_STARVED;
-+		if(inext) ct = 0;
-+	}
-+
-+	FREEMEM(st->buf);
-+	st->buf = 0;
-+	st->size = 0;
-+	if(ct) {
-+		if(ct->flags & APC_SEMI_CONSTRAINED) {
-+			st->buf = (uint8_t *)CALLOC(1, 2);
-+			if(!st->buf) _ASN_DECODE_FAILED;
-+			st->size = 1;
-+		} else if(ct->flags & APC_CONSTRAINED && ct->range_bits >= 0) {
-+			size_t size = (ct->range_bits + 7) >> 3;
-+			st->buf = (uint8_t *)MALLOC(1 + size + 1);
-+			if(!st->buf) _ASN_DECODE_FAILED;
-+			st->size = size;
-+		}
-+	}
-+
-+	/* X.691, #12.2.2 */
-+	if(ct && ct->flags != APC_UNCONSTRAINED) {
-+		/* #10.5.6 */
-+		ASN_DEBUG("Integer with range %d bits", ct->range_bits);
-+		if(ct->range_bits >= 0) {
-+			if (ct->range_bits > 16) {
-+				int max_range_bytes = (ct->range_bits >> 3) +
-+					(((ct->range_bits % 8) > 0) ? 1 : 0);
-+				int length = 0, i;
-+				int64_t value = 0;
-+
-+				for (i = 1; ; i++) {
-+					int upper = 1 << i;
-+					if (upper >= max_range_bytes)
-+						break;
-+				}
-+				ASN_DEBUG("Can encode %d (%d bytes) in %d bits", ct->range_bits,
-+						  max_range_bytes, i);
-+
-+				if ((length = per_get_few_bits(pd, i)) < 0)
-+					_ASN_DECODE_FAILED;
-+
-+				/* X.691 #12.2.6 length determinant + lb (1) */
-+				length += 1;
-+				ASN_DEBUG("Got length %d", length);
-+
-+				if (aper_get_align(pd) != 0)
-+					_ASN_DECODE_STARVED;
-+
-+				while (length--) {
-+					int buf = per_get_few_bits(pd, 8);
-+					if (buf < 0)
-+						_ASN_DECODE_STARVED;
-+					value += (((int64_t)buf) << (8 * length));
-+				}
-+
-+				value += ct->lower_bound;
-+				if((specs && specs->field_unsigned)
-+					? asn_uint642INTEGER(st, value)
-+					: asn_int642INTEGER(st, value))
-+					_ASN_DECODE_FAILED;
-+				ASN_DEBUG("Got value %lld + low %lld",
-+						  value, ct->lower_bound);
-+			} else {
-+				long value = 0;
-+				if (ct->range_bits < 8) {
-+					value = per_get_few_bits(pd, ct->range_bits);
-+					if(value < 0) _ASN_DECODE_STARVED;
-+				} else if (ct->range_bits == 8) {
-+					if (aper_get_align(pd) < 0)
-+						_ASN_DECODE_FAILED;
-+					value = per_get_few_bits(pd, ct->range_bits);
-+					if(value < 0) _ASN_DECODE_STARVED;
-+				} else {
-+					/* Align */
-+					if (aper_get_align(pd) < 0)
-+						_ASN_DECODE_FAILED;
-+					value = per_get_few_bits(pd, 16);
-+					if(value < 0) _ASN_DECODE_STARVED;
-+				}
-+				value += ct->lower_bound;
-+				if((specs && specs->field_unsigned)
-+					? asn_ulong2INTEGER(st, value)
-+					: asn_long2INTEGER(st, value))
-+					_ASN_DECODE_FAILED;
-+					ASN_DEBUG("Got value %ld + low %lld",
-+							  value, ct->lower_bound);
-+			}
-+			return rval;
-+		} else {
-+			_ASN_DECODE_FAILED;
-+		}
-+	} else {
-+		ASN_DEBUG("Decoding unconstrained integer %s", td->name);
-+	}
-+
-+	/* X.691, #12.2.3, #12.2.4 */
-+	do {
-+		ssize_t len;
-+		void *p;
-+		int ret;
-+
-+		/* Get the PER length */
-+		len = aper_get_length(pd, -1, -1, &repeat);
-+		if(len < 0) _ASN_DECODE_STARVED;
-+
-+		p = REALLOC(st->buf, st->size + len + 1);
-+		if(!p) _ASN_DECODE_FAILED;
-+		st->buf = (uint8_t *)p;
-+
-+		ret = per_get_many_bits(pd, &st->buf[st->size], 0, 8 * len);
-+		if(ret < 0) _ASN_DECODE_STARVED;
-+		st->size += len;
-+	} while(repeat);
-+	st->buf[st->size] = 0;	/* JIC */
-+
-+	/* #12.2.3 */
-+	if(ct && ct->lower_bound) {
-+		/*
-+		 * TODO: replace by in-place arithmetics.
-+		 */
-+		long value;
-+		if(asn_INTEGER2long(st, &value))
-+			_ASN_DECODE_FAILED;
-+		if(asn_long2INTEGER(st, value + ct->lower_bound))
-+			_ASN_DECODE_FAILED;
-+	}
-+
-+	return rval;
-+}
-+
- asn_enc_rval_t
- INTEGER_encode_uper(asn_TYPE_descriptor_t *td,
- 	asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-@@ -693,7 +849,7 @@
- 				|| uval > (unsigned long)ct->upper_bound)
- 					inext = 1;
- 			}
--			ASN_DEBUG("Value %lu (%02x/%d) lb %lu ub %lu %s",
-+			ASN_DEBUG("Value %lu (%02x/%d) lb %"PRIuMAX" ub %"PRIuMAX" %s",
- 				uval, st->buf[0], st->size,
- 				ct->lower_bound, ct->upper_bound,
- 				inext ? "ext" : "fix");
-@@ -710,7 +866,7 @@
- 				|| value > ct->upper_bound)
- 					inext = 1;
- 			}
--			ASN_DEBUG("Value %ld (%02x/%d) lb %ld ub %ld %s",
-+			ASN_DEBUG("Value %ld (%02x/%d) lb %"PRIdMAX" ub %"PRIdMAX" %s",
- 				value, st->buf[0], st->size,
- 				ct->lower_bound, ct->upper_bound,
- 				inext ? "ext" : "fix");
-@@ -745,7 +901,7 @@
- 	}
- 
- 	if(ct && ct->lower_bound) {
--		ASN_DEBUG("Adjust lower bound to %ld", ct->lower_bound);
-+		ASN_DEBUG("Adjust lower bound to %"PRIdMAX"\n", ct->lower_bound);
- 		/* TODO: adjust lower bound */
- 		_ASN_ENCODE_FAILED;
- 	}
-@@ -762,6 +918,153 @@
- 	_ASN_ENCODED_OK(er);
- }
- 
-+asn_enc_rval_t
-+INTEGER_encode_aper(asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-+	asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
-+	asn_enc_rval_t er;
-+	INTEGER_t *st = (INTEGER_t *)sptr;
-+	const uint8_t *buf;
-+	const uint8_t *end;
-+	asn_per_constraint_t *ct;
-+	int64_t value = 0;
-+
-+	if(!st || st->size == 0) _ASN_ENCODE_FAILED;
-+
-+	if(!constraints) constraints = td->per_constraints;
-+	ct = constraints ? &constraints->value : 0;
-+
-+	er.encoded = 0;
-+
-+	if(ct) {
-+		int inext = 0;
-+		if(specs && specs->field_unsigned) {
-+			uint64_t uval;
-+			if(asn_INTEGER2uint64(st, &uval))
-+				_ASN_ENCODE_FAILED;
-+			/* Check proper range */
-+			if(ct->flags & APC_SEMI_CONSTRAINED) {
-+				if(uval < ct->lower_bound)
-+					inext = 1;
-+			} else if(ct->range_bits >= 0) {
-+				if(uval < ct->lower_bound
-+					|| uval > ct->upper_bound)
-+					inext = 1;
-+			}
-+			ASN_DEBUG("Value %llu (%02x/%d) lb %llu ub %llu %s",
-+								uval, st->buf[0], st->size,
-+								ct->lower_bound, ct->upper_bound,
-+								inext ? "ext" : "fix");
-+						value = uval;
-+		} else {
-+			if(asn_INTEGER2int64(st, &value)) _ASN_ENCODE_FAILED;
-+			/* Check proper range */
-+			if(ct->flags & APC_SEMI_CONSTRAINED) {
-+				if(value < ct->lower_bound)
-+					inext = 1;
-+			} else if(ct->range_bits >= 0) {
-+				if(value < ct->lower_bound
-+					|| value > ct->upper_bound)
-+					inext = 1;
-+			}
-+			ASN_DEBUG("Value %lld (%02x/%d) lb %lld ub %lld %s",
-+					  value, st->buf[0], st->size,
-+					  ct->lower_bound, ct->upper_bound,
-+					  inext ? "ext" : "fix");
-+		}
-+		if(ct->flags & APC_EXTENSIBLE) {
-+			if(per_put_few_bits(po, inext, 1))
-+				_ASN_ENCODE_FAILED;
-+			if(inext) ct = 0;
-+		} else if(inext) {
-+			_ASN_ENCODE_FAILED;
-+		}
-+	}
-+
-+	/* X.691, #12.2.2 */
-+	if(ct && ct->range_bits >= 0) {
-+		/* #10.5.6 */
-+		ASN_DEBUG("Encoding integer with range %d bits",
-+				  ct->range_bits);
-+		
-+		value -= ct->lower_bound;
-+		
-+		/* #12 <= 8 -> alignment ? */
-+		if (ct->range_bits < 8) {
-+			/* Bit field case -> no alignment*/
-+			if(per_put_few_bits(po, 0x00 | value, ct->range_bits))
-+				_ASN_ENCODE_FAILED;
-+		} else if (ct->range_bits == 8) {
-+			if(aper_put_align(po) < 0)
-+				_ASN_ENCODE_FAILED;
-+			if(per_put_few_bits(po, 0x00 | value, ct->range_bits))
-+				_ASN_ENCODE_FAILED;
-+		} else if (ct->range_bits <= 16) {
-+			// Consume the bytes to align on octet
-+			if(aper_put_align(po) < 0)
-+				_ASN_ENCODE_FAILED;
-+			if(per_put_few_bits(po, 0x0000 | value,
-+				16))
-+				_ASN_ENCODE_FAILED;
-+		} else {
-+			/* TODO: extend to >64 bits */
-+			int64_t v = value;
-+			int i, j;
-+			int max_range_bytes = (ct->range_bits >> 3) +
-+			(((ct->range_bits % 8) > 0) ? 1 : 0);
-+
-+			for (i = 1; ; i++) {
-+				int upper = 1 << i;
-+				if (upper >= max_range_bytes)
-+					break;
-+			}
-+
-+			for(j = sizeof(int64_t) - 1; j != 0; j--) {
-+				uint8_t val;
-+				val = v >> (j * 8);
-+				if (val != 0) {
-+					break;
-+				}
-+			}
-+
-+			ASN_DEBUG("Putting n - lb (%"PRIdMAX") with range %d bytes (real size - lb (1)) %d in %d bits",
-+					  v, max_range_bytes, j, i);
-+
-+			/* Putting length in the minimum number of bits ex: 5 = 3bits */
-+			if (per_put_few_bits(po, j, i))
-+				_ASN_ENCODE_FAILED;
-+
-+			// Consume the bits to align on octet
-+			if (aper_put_align(po) < 0)
-+				_ASN_ENCODE_FAILED;
-+
-+			/* Put the value */
-+			for (i = 0; i <= j; i++) {
-+				if(per_put_few_bits(po, (v >> (8 * (j - i))) & 0xff, 8))
-+					_ASN_ENCODE_FAILED;
-+			}
-+		}
-+		_ASN_ENCODED_OK(er);
-+	}
-+
-+	if(ct && ct->lower_bound) {
-+		ASN_DEBUG("Adjust lower bound to %"PRIdMAX, ct->lower_bound);
-+		/* TODO: adjust lower bound */
-+		_ASN_ENCODE_FAILED;
-+	}
-+
-+	for(buf = st->buf, end = st->buf + st->size; buf < end;) {
-+		ssize_t mayEncode = aper_put_length(po, -1, end - buf);
-+		if(mayEncode < 0)
-+			_ASN_ENCODE_FAILED;
-+		if(per_put_many_bits(po, buf, 8 * mayEncode))
-+			_ASN_ENCODE_FAILED;
-+		buf += mayEncode;
-+	}
-+	
-+	_ASN_ENCODED_OK(er);
-+}
-+
- #endif	/* ASN_DISABLE_PER_SUPPORT */
- 
- int
-@@ -825,6 +1128,66 @@
- }
- 
- int
-+asn_INTEGER2int64(const INTEGER_t *iptr, int64_t *lptr) {
-+	uint8_t *b, *end;
-+	size_t size;
-+	int64_t l;
-+	
-+	/* Sanity checking */
-+	if(!iptr || !iptr->buf || !lptr) {
-+		errno = EINVAL;
-+		return -1;
-+	}
-+	
-+	/* Cache the begin/end of the buffer */
-+	b = iptr->buf;	/* Start of the INTEGER buffer */
-+	size = iptr->size;
-+	end = b + size;	/* Where to stop */
-+	
-+	if(size > sizeof(int64_t)) {
-+		uint8_t *end1 = end - 1;
-+		/*
-+		 * Slightly more advanced processing,
-+		 * able to >sizeof(int64_t) bytes,
-+		 * when the actual value is small
-+		 * (0x0000000000abcdef would yield a fine 0x00abcdef)
-+		 */
-+		/* Skip out the insignificant leading bytes */
-+		for(; b < end1; b++) {
-+			switch(*b) {
-+				case 0x00: if((b[1] & 0x80) == 0) continue; break;
-+				case 0xff: if((b[1] & 0x80) != 0) continue; break;
-+			}
-+			break;
-+		}
-+		
-+		size = end - b;
-+		if(size > sizeof(int64_t)) {
-+			/* Still cannot fit the int64_t */
-+			errno = ERANGE;
-+			return -1;
-+		}
-+	}
-+
-+	/* Shortcut processing of a corner case */
-+	if(end == b) {
-+		*lptr = 0;
-+		return 0;
-+	}
-+
-+	/* Perform the sign initialization */
-+	/* Actually l = -(*b >> 7); gains nothing, yet unreadable! */
-+	if((*b >> 7)) l = -1; else l = 0;
-+
-+	/* Conversion engine */
-+	for(; b < end; b++)
-+		l = (l << 8) | *b;
-+
-+	*lptr = l;
-+	return 0;
-+}
-+
-+int
- asn_INTEGER2ulong(const INTEGER_t *iptr, unsigned long *lptr) {
- 	uint8_t *b, *end;
- 	unsigned long l;
-@@ -857,6 +1220,38 @@
- }
- 
- int
-+asn_INTEGER2uint64(const INTEGER_t *iptr, uint64_t *lptr) {
-+	uint8_t *b, *end;
-+	uint64_t l;
-+	size_t size;
-+	
-+	if(!iptr || !iptr->buf || !lptr) {
-+		errno = EINVAL;
-+		return -1;
-+	}
-+	
-+	b = iptr->buf;
-+	size = iptr->size;
-+	end = b + size;
-+	
-+	/* If all extra leading bytes are zeroes, ignore them */
-+	for(; size > sizeof(uint64_t); b++, size--) {
-+		if(*b) {
-+			/* Value won't fit unsigned long */
-+			errno = ERANGE;
-+			return -1;
-+		}
-+	}
-+	
-+	/* Conversion engine */
-+	for(l = 0; b < end; b++)
-+		l = (l << 8) | *b;
-+	
-+	*lptr = l;
-+	return 0;
-+}
-+
-+int
- asn_ulong2INTEGER(INTEGER_t *st, unsigned long value) {
- 	uint8_t *buf;
- 	uint8_t *end;
-@@ -871,7 +1266,7 @@
- 
- 	end = buf + (sizeof(value) + 1);
- 	buf[0] = 0;
--	for(b = buf + 1, shr = (sizeof(long)-1)*8; b < end; shr -= 8, b++)
-+	for(b = buf + 1, shr = (sizeof(unsigned long)-1)*8; b < end; shr -= 8, b++)
- 		*b = (uint8_t)(value >> shr);
- 
- 	if(st->buf) FREEMEM(st->buf);
-@@ -882,6 +1277,31 @@
- }
- 
- int
-+asn_uint642INTEGER(INTEGER_t *st, uint64_t value) {
-+	uint8_t *buf;
-+	uint8_t *end;
-+	uint8_t *b;
-+	int shr;
-+	
-+	if(value <= INT64_MAX)
-+		return asn_int642INTEGER(st, value);
-+	
-+	buf = (uint8_t *)MALLOC(1 + sizeof(value));
-+	if(!buf) return -1;
-+	
-+	end = buf + (sizeof(value) + 1);
-+	buf[0] = 0;
-+	for(b = buf + 1, shr = (sizeof(value)-1)*8; b < end; shr -= 8, b++)
-+		*b = (uint8_t)(value >> shr);
-+	
-+	if(st->buf) FREEMEM(st->buf);
-+	st->buf = buf;
-+	st->size = 1 + sizeof(value);
-+	
-+	return 0;
-+}
-+
-+int
- asn_long2INTEGER(INTEGER_t *st, long value) {
- 	uint8_t *buf, *bp;
- 	uint8_t *p;
-@@ -1024,3 +1444,60 @@
- 	return ASN_STRTOL_OK;
- }
- 
-+
-+int
-+asn_int642INTEGER(INTEGER_t *st, int64_t value) {
-+	uint8_t *buf, *bp;
-+	uint8_t *p;
-+	uint8_t *pstart;
-+	uint8_t *pend1;
-+	int littleEndian = 1;	/* Run-time detection */
-+	int add;
-+
-+	if(!st) {
-+		errno = EINVAL;
-+		return -1;
-+	}
-+
-+	buf = (uint8_t *)MALLOC(sizeof(value));
-+	if(!buf) return -1;
-+
-+	if(*(char *)&littleEndian) {
-+		pstart = (uint8_t *)&value + sizeof(value) - 1;
-+		pend1 = (uint8_t *)&value;
-+		add = -1;
-+	} else {
-+		pstart = (uint8_t *)&value;
-+		pend1 = pstart + sizeof(value) - 1;
-+		add = 1;
-+	}
-+
-+	/*
-+	 * If the contents octet consists of more than one octet,
-+	 * then bits of the first octet and bit 8 of the second octet:
-+	 * a) shall not all be ones; and
-+	 * b) shall not all be zero.
-+	 */
-+	for(p = pstart; p != pend1; p += add) {
-+		switch(*p) {
-+		case 0x00: if((*(p+add) & 0x80) == 0)
-+				continue;
-+			break;
-+		case 0xff: if((*(p+add) & 0x80))
-+				continue;
-+			break;
-+		}
-+		break;
-+	}
-+	/* Copy the integer body */
-+	for(pstart = p, bp = buf, pend1 += add; p != pend1; p += add)
-+		*bp++ = *p;
-+
-+	if(st->buf) FREEMEM(st->buf);
-+	st->buf = buf;
-+	st->size = bp - buf;
-+
-+	return 0;
-+}
-+
-+
-Index: skeletons/constr_SEQUENCE.c
-===================================================================
---- skeletons/constr_SEQUENCE.c	(revision 1516)
-+++ skeletons/constr_SEQUENCE.c	(working copy)
-@@ -34,7 +34,7 @@
- #undef	ADVANCE
- #define	ADVANCE(num_bytes)	do {		\
- 		size_t num = num_bytes;		\
--		ptr = ((const void *)ptr) + num;\
-+		ptr = ((const char *)ptr) + num;\
- 		size -= num;			\
- 		if(ctx->left >= 0)		\
- 			ctx->left -= num;	\
-@@ -144,7 +144,7 @@
- 	/*
- 	 * Restore parsing context.
- 	 */
--	ctx = (asn_struct_ctx_t *)((void *)st + specs->ctx_offset);
-+	ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
- 	
- 	/*
- 	 * Start to parse where left previously
-@@ -366,7 +366,7 @@
- 					ber_tlv_tag_string(tlv_tag), edx);
- 				skip = ber_skip_length(opt_codec_ctx,
- 					BER_TLV_CONSTRUCTED(ptr),
--					(const void *)ptr + tag_len,
-+					(const char *)ptr + tag_len,
- 					LEFT - tag_len);
- 				ASN_DEBUG("Skip length %d in %s",
- 					(int)skip, td->name);
-@@ -397,13 +397,13 @@
- 		 */
- 		if(elements[edx].flags & ATF_POINTER) {
- 			/* Member is a pointer to another structure */
--			memb_ptr2 = (void **)((void *)st + elements[edx].memb_offset);
-+			memb_ptr2 = (void **)((char *)st + elements[edx].memb_offset);
- 		} else {
- 			/*
- 			 * A pointer to a pointer
- 			 * holding the start of the structure
- 			 */
--			memb_ptr = (void *)st + elements[edx].memb_offset;
-+			memb_ptr = (char *)st + elements[edx].memb_offset;
- 			memb_ptr2 = &memb_ptr;
- 		}
- 		/*
-@@ -489,7 +489,7 @@
- 
- 			ll = ber_skip_length(opt_codec_ctx,
- 				BER_TLV_CONSTRUCTED(ptr),
--				(const void *)ptr + tl, LEFT - tl);
-+				(const char *)ptr + tl, LEFT - tl);
- 			switch(ll) {
- 			case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE);
- 				/* Fall through */
-@@ -528,14 +528,14 @@
- 		asn_TYPE_member_t *elm = &td->elements[edx];
- 		void *memb_ptr;
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(void **)((void *)sptr + elm->memb_offset);
-+			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
- 			if(!memb_ptr) {
- 				if(elm->optional) continue;
- 				/* Mandatory element is missing */
- 				_ASN_ENCODE_FAILED;
- 			}
- 		} else {
--			memb_ptr = (void *)((void *)sptr + elm->memb_offset);
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
- 		}
- 		erval = elm->type->der_encoder(elm->type, memb_ptr,
- 			elm->tag_mode, elm->tag,
-@@ -567,10 +567,10 @@
- 		void *memb_ptr;
- 
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(void **)((void *)sptr + elm->memb_offset);
-+			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
- 			if(!memb_ptr) continue;
- 		} else {
--			memb_ptr = (void *)((void *)sptr + elm->memb_offset);
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
- 		}
- 		tmperval = elm->type->der_encoder(elm->type, memb_ptr,
- 			elm->tag_mode, elm->tag,
-@@ -595,7 +595,7 @@
- #undef	XER_ADVANCE
- #define	XER_ADVANCE(num_bytes)	do {			\
- 		size_t num = num_bytes;			\
--		buf_ptr = ((const void *)buf_ptr) + num;\
-+		buf_ptr = ((const char *)buf_ptr) + num;\
- 		size -= num;				\
- 		consumed_myself += num;			\
- 	} while(0)
-@@ -637,7 +637,7 @@
- 	/*
- 	 * Restore parsing context.
- 	 */
--	ctx = (asn_struct_ctx_t *)((void *)st + specs->ctx_offset);
-+	ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
- 
- 
- 	/*
-@@ -667,9 +667,10 @@
- 
- 			if(elm->flags & ATF_POINTER) {
- 				/* Member is a pointer to another structure */
--				memb_ptr2 = (void **)((void *)st + elm->memb_offset);
-+				memb_ptr2 = (void **)((char *)st
-+					+ elm->memb_offset);
- 			} else {
--				memb_ptr = (void *)st + elm->memb_offset;
-+				memb_ptr = (char *)st + elm->memb_offset;
- 				memb_ptr2 = &memb_ptr;
- 			}
- 
-@@ -739,7 +740,7 @@
- 				if(edx >= td->elements_count
- 				   ||
- 				   /* Explicit OPTIONAL specs reaches the end */
--				    (edx + elements[edx].optional
-+					(edx + elements[edx].optional
- 					== td->elements_count)
- 				   ||
- 				   /* All extensions are optional */
-@@ -869,7 +870,7 @@
- 		unsigned int mlen = strlen(mname);
- 
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(void **)((void *)sptr + elm->memb_offset);
-+			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
- 			if(!memb_ptr) {
- 				if(elm->optional)
- 					continue;
-@@ -877,7 +878,7 @@
- 				_ASN_ENCODE_FAILED;
- 			}
- 		} else {
--			memb_ptr = (void *)((void *)sptr + elm->memb_offset);
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
- 		}
- 
- 		if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel);
-@@ -917,14 +918,14 @@
- 		const void *memb_ptr;
- 
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(const void * const *)((const void *)sptr + elm->memb_offset);
-+			memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
- 			if(!memb_ptr) {
- 				if(elm->optional) continue;
- 				/* Print <absent> line */
- 				/* Fall through */
- 			}
- 		} else {
--			memb_ptr = (const void *)((const void *)sptr + elm->memb_offset);
-+			memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
- 		}
- 
- 		/* Indentation */
-@@ -960,11 +961,11 @@
- 		asn_TYPE_member_t *elm = &td->elements[edx];
- 		void *memb_ptr;
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(void **)((void *)sptr + elm->memb_offset);
-+			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
- 			if(memb_ptr)
- 				ASN_STRUCT_FREE(*elm->type, memb_ptr);
- 		} else {
--			memb_ptr = (void *)((void *)sptr + elm->memb_offset);
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
- 			ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr);
- 		}
- 	}
-@@ -994,7 +995,7 @@
- 		const void *memb_ptr;
- 
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr = *(const void * const *)((const void *)sptr + elm->memb_offset);
-+			memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
- 			if(!memb_ptr) {
- 				if(elm->optional)
- 					continue;
-@@ -1004,7 +1005,7 @@
- 				return -1;
- 			}
- 		} else {
--			memb_ptr = (const void *)((const void *)sptr + elm->memb_offset);
-+			memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
- 		}
- 
- 		if(elm->memb_constraints) {
-@@ -1088,9 +1089,9 @@
- 
- 		/* Fetch the pointer to this member */
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr2 = (void **)((void *)st + elm->memb_offset);
-+			memb_ptr2 = (void **)((char *)st + elm->memb_offset);
- 		} else {
--			memb_ptr = (void *)st + elm->memb_offset;
-+			memb_ptr = (char *)st + elm->memb_offset;
- 			memb_ptr2 = &memb_ptr;
- 		}
- 
-@@ -1154,11 +1155,224 @@
- 		memset(&epmd, 0, sizeof(epmd));
- 		epmd.buffer = epres;
- 		epmd.nbits = bmlength;
-+		ASN_DEBUG("Read in extensions bitmap for %s of %d bits (%x..)",
-+			td->name, bmlength, *epres);
-+
-+		/* Go over extensions and read them in */
-+		for(edx = specs->ext_after + 1; edx < td->elements_count; edx++) {
-+		asn_TYPE_member_t *elm = &td->elements[edx];
-+		void *memb_ptr;		/* Pointer to the member */
-+		void **memb_ptr2;	/* Pointer to that pointer */
-+		int present;
-+
-+		if(!IN_EXTENSION_GROUP(specs, edx)) {
-+			ASN_DEBUG("%d is not extension", edx);
-+			continue;
-+		}
-+
-+		/* Fetch the pointer to this member */
-+		if(elm->flags & ATF_POINTER) {
-+			memb_ptr2 = (void **)((char *)st + elm->memb_offset);
-+		} else {
-+			memb_ptr = (void *)((char *)st + elm->memb_offset);
-+			memb_ptr2 = &memb_ptr;
-+		}
-+
-+		present = per_get_few_bits(&epmd, 1);
-+		if(present <= 0) {
-+			if(present < 0) break;	/* No more extensions */
-+			continue;
-+		}
-+
-+		ASN_DEBUG("Decoding member %s in %s %p", elm->name, td->name, *memb_ptr2);
-+		rv = uper_open_type_get(opt_codec_ctx, elm->type,
-+			elm->per_constraints, memb_ptr2, pd);
-+		if(rv.code != RC_OK) {
-+			FREEMEM(epres);
-+			return rv;
-+		}
-+		}
-+
-+		/* Skip over overflow extensions which aren't present
-+		 * in this system's version of the protocol */
-+		for(;;) {
-+			ASN_DEBUG("Getting overflow extensions");
-+			switch(per_get_few_bits(&epmd, 1)) {
-+			case -1: break;
-+			case 0: continue;
-+			default:
-+				if(uper_open_type_skip(opt_codec_ctx, pd)) {
-+					FREEMEM(epres);
-+					_ASN_DECODE_STARVED;
-+				}
-+			}
-+			break;
-+		}
-+
-+		FREEMEM(epres);
-+	}
-+
-+	/* Fill DEFAULT members in extensions */
-+	for(edx = specs->roms_count; edx < specs->roms_count
-+			+ specs->aoms_count; edx++) {
-+		asn_TYPE_member_t *elm = &td->elements[edx];
-+		void **memb_ptr2;	/* Pointer to member pointer */
-+
-+		if(!elm->default_value) continue;
-+
-+		/* Fetch the pointer to this member */
-+		if(elm->flags & ATF_POINTER) {
-+			memb_ptr2 = (void **)((char *)st
-+					+ elm->memb_offset);
-+			if(*memb_ptr2) continue;
-+		} else {
-+			continue;	/* Extensions are all optionals */
-+		}
-+
-+		/* Set default value */
-+		if(elm->default_value(1, memb_ptr2)) {
-+			_ASN_DECODE_FAILED;
-+		}
-+	}
-+
-+	rv.consumed = 0;
-+	rv.code = RC_OK;
-+	return rv;
-+}
-+
-+asn_dec_rval_t
-+SEQUENCE_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) {
-+	asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics;
-+	void *st = *sptr;	/* Target structure. */
-+	int extpresent;		/* Extension additions are present */
-+	uint8_t *opres;		/* Presence of optional root members */
-+	asn_per_data_t opmd;
-+	asn_dec_rval_t rv;
-+	int edx;
-+
-+	(void)constraints;
-+
-+	if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx))
-+		_ASN_DECODE_FAILED;
-+
-+	if(!st) {
-+		st = *sptr = CALLOC(1, specs->struct_size);
-+		if(!st) _ASN_DECODE_FAILED;
-+	}
-+
-+	ASN_DEBUG("Decoding %s as SEQUENCE (APER)", td->name);
-+
-+	/* Handle extensions */
-+	if(specs->ext_before >= 0) {
-+		extpresent = per_get_few_bits(pd, 1);
-+		if(extpresent < 0) _ASN_DECODE_STARVED;
-+	} else {
-+		extpresent = 0;
-+	}
-+
-+	/* Prepare a place and read-in the presence bitmap */
-+	memset(&opmd, 0, sizeof(opmd));
-+	if(specs->roms_count) {
-+		opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1);
-+		if(!opres) _ASN_DECODE_FAILED;
-+		/* Get the presence map */
-+		if(per_get_many_bits(pd, opres, 0, specs->roms_count)) {
-+			FREEMEM(opres);
-+			_ASN_DECODE_STARVED;
-+		}
-+		opmd.buffer = opres;
-+		opmd.nbits = specs->roms_count;
-+		ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)",
-+			td->name, specs->roms_count, *opres);
-+	} else {
-+		opres = 0;
-+	}
-+
-+	/*
-+	 * Get the sequence ROOT elements.
-+	 */
-+	for(edx = 0; edx < td->elements_count; edx++) {
-+		asn_TYPE_member_t *elm = &td->elements[edx];
-+		void *memb_ptr;		/* Pointer to the member */
-+		void **memb_ptr2;	/* Pointer to that pointer */
-+
-+		if(IN_EXTENSION_GROUP(specs, edx))
-+			continue;
-+
-+		/* Fetch the pointer to this member */
-+		if(elm->flags & ATF_POINTER) {
-+			memb_ptr2 = (void **)((char *)st + elm->memb_offset);
-+		} else {
-+			memb_ptr = (char *)st + elm->memb_offset;
-+			memb_ptr2 = &memb_ptr;
-+		}
-+
-+		/* Deal with optionality */
-+		if(elm->optional) {
-+			int present = per_get_few_bits(&opmd, 1);
-+			ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)",
-+				td->name, elm->name, present,
-+				(int)opmd.nboff, (int)opmd.nbits);
-+			if(present == 0) {
-+				/* This element is not present */
-+				if(elm->default_value) {
-+					/* Fill-in DEFAULT */
-+					if(elm->default_value(1, memb_ptr2)) {
-+						FREEMEM(opres);
-+						_ASN_DECODE_FAILED;
-+					}
-+					ASN_DEBUG("Filled-in default");
-+				}
-+				/* The member is just not present */
-+				continue;
-+			}
-+			/* Fall through */
-+		}
-+
-+		/* Fetch the member from the stream */
-+		ASN_DEBUG("Decoding member %s in %s", elm->name, td->name);
-+		rv = elm->type->aper_decoder(opt_codec_ctx, elm->type,
-+			elm->per_constraints, memb_ptr2, pd);
-+		if(rv.code != RC_OK) {
-+			ASN_DEBUG("Failed decode %s in %s",
-+				elm->name, td->name);
-+			FREEMEM(opres);
-+			return rv;
-+		}
-+	}
-+
-+	/* Optionality map is not needed anymore */
-+	FREEMEM(opres);
-+
-+	/*
-+	 * Deal with extensions.
-+	 */
-+	if(extpresent) {
-+		ssize_t bmlength;
-+		uint8_t *epres;		/* Presence of extension members */
-+		asn_per_data_t epmd;
-+
-+		bmlength = uper_get_nslength(pd);
-+		if(bmlength < 0) _ASN_DECODE_STARVED;
-+
-+		ASN_DEBUG("Extensions %d present in %s", bmlength, td->name);
-+
-+		epres = (uint8_t *)MALLOC((bmlength + 15) >> 3);
-+		if(!epres) _ASN_DECODE_STARVED;
-+
-+		/* Get the extensions map */
-+		if(per_get_many_bits(pd, epres, 0, bmlength))
-+			_ASN_DECODE_STARVED;
-+
-+		memset(&epmd, 0, sizeof(epmd));
-+		epmd.buffer = epres;
-+		epmd.nbits = bmlength;
- 		ASN_DEBUG("Read in extensions bitmap for %s of %ld bits (%x..)",
- 			td->name, (long)bmlength, *epres);
- 
--	    /* Go over extensions and read them in */
--	    for(edx = specs->ext_after + 1; edx < td->elements_count; edx++) {
-+		/* Go over extensions and read them in */
-+		for(edx = specs->ext_after + 1; edx < td->elements_count; edx++) {
- 		asn_TYPE_member_t *elm = &td->elements[edx];
- 		void *memb_ptr;		/* Pointer to the member */
- 		void **memb_ptr2;	/* Pointer to that pointer */
-@@ -1171,9 +1385,9 @@
- 
- 		/* Fetch the pointer to this member */
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr2 = (void **)((void *)st + elm->memb_offset);
-+			memb_ptr2 = (void **)((char *)st + elm->memb_offset);
- 		} else {
--			memb_ptr = (void *)((void *)st + elm->memb_offset);
-+			memb_ptr = (void *)((char *)st + elm->memb_offset);
- 			memb_ptr2 = &memb_ptr;
- 		}
- 
-@@ -1190,7 +1404,7 @@
- 			FREEMEM(epres);
- 			return rv;
- 		}
--	    }
-+		}
- 
- 		/* Skip over overflow extensions which aren't present
- 		 * in this system's version of the protocol */
-@@ -1221,7 +1435,7 @@
- 
- 		/* Fetch the pointer to this member */
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr2 = (void **)((void *)st
-+			memb_ptr2 = (void **)((char *)st
- 					+ elm->memb_offset);
- 			if(*memb_ptr2) continue;
- 		} else {
-@@ -1265,10 +1479,10 @@
- 
- 		/* Fetch the pointer to this member */
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr2 = (void **)((void *)sptr + elm->memb_offset);
-+			memb_ptr2 = (void **)((char *)sptr + elm->memb_offset);
- 			present = (*memb_ptr2 != 0);
- 		} else {
--			memb_ptr = (void *)((void *)sptr + elm->memb_offset);
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
- 			memb_ptr2 = &memb_ptr;
- 			present = 1;
- 		}
-@@ -1334,10 +1548,10 @@
- 
- 		/* Fetch the pointer to this member */
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr2 = (void **)((void *)sptr + elm->memb_offset);
-+			memb_ptr2 = (void **)((char *)sptr + elm->memb_offset);
- 			present = (*memb_ptr2 != 0);
- 		} else {
--			memb_ptr = (void *)((void *)sptr + elm->memb_offset);
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
- 			memb_ptr2 = &memb_ptr;
- 			present = 1;
- 		}
-@@ -1373,7 +1587,7 @@
- 
- 		/* Fetch the pointer to this member */
- 		if(elm->flags & ATF_POINTER) {
--			memb_ptr2 = (void **)((void *)sptr + elm->memb_offset);
-+			memb_ptr2 = (void **)((char *)sptr + elm->memb_offset);
- 			if(!*memb_ptr2) {
- 				ASN_DEBUG("Element %s %d not present",
- 					elm->name, edx);
-@@ -1383,7 +1597,7 @@
- 				_ASN_ENCODE_FAILED;
- 			}
- 		} else {
--			memb_ptr = (void *)((void *)sptr + elm->memb_offset);
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
- 			memb_ptr2 = &memb_ptr;
- 		}
- 
-@@ -1420,3 +1634,130 @@
- 	_ASN_ENCODED_OK(er);
- }
- 
-+asn_enc_rval_t
-+SEQUENCE_encode_aper(asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-+	asn_SEQUENCE_specifics_t *specs
-+		= (asn_SEQUENCE_specifics_t *)td->specifics;
-+	asn_enc_rval_t er;
-+	int n_extensions;
-+	int edx;
-+	int i;
-+
-+	(void)constraints;
-+
-+	if(!sptr)
-+		_ASN_ENCODE_FAILED;
-+
-+	er.encoded = 0;
-+
-+	ASN_DEBUG("Encoding %s as SEQUENCE (APER)", td->name);
-+
-+	/*
-+	 * X.691#18.1 Whether structure is extensible
-+	 * and whether to encode extensions
-+	 */
-+	if(specs->ext_before >= 0) {
-+		n_extensions = SEQUENCE_handle_extensions(td, sptr, 0, 0);
-+		per_put_few_bits(po, n_extensions ? 1 : 0, 1);
-+	} else {
-+		n_extensions = 0;	   /* There are no extensions to encode */
-+	}
-+
-+	/* Encode a presence bitmap */
-+	for(i = 0; i < specs->roms_count; i++) {
-+		asn_TYPE_member_t *elm;
-+		void *memb_ptr;	 /* Pointer to the member */
-+		void **memb_ptr2;	   /* Pointer to that pointer */
-+		int present;
-+
-+		edx = specs->oms[i];
-+		elm = &td->elements[edx];
-+
-+		/* Fetch the pointer to this member */
-+		if(elm->flags & ATF_POINTER) {
-+			memb_ptr2 = (void **)((char *)sptr + elm->memb_offset);
-+			present = (*memb_ptr2 != 0);
-+		} else {
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
-+			memb_ptr2 = &memb_ptr;
-+			present = 1;
-+		}
-+
-+		/* Eliminate default values */
-+		if(present && elm->default_value
-+		&& elm->default_value(0, memb_ptr2) == 1)
-+			present = 0;
-+
-+		ASN_DEBUG("Element %s %s %s->%s is %s",
-+			elm->flags & ATF_POINTER ? "ptr" : "inline",
-+			elm->default_value ? "def" : "wtv",
-+			td->name, elm->name, present ? "present" : "absent");
-+		if(per_put_few_bits(po, present, 1))
-+			_ASN_ENCODE_FAILED;
-+	}
-+
-+	/*
-+	 * Encode the sequence ROOT elements.
-+	 */
-+	ASN_DEBUG("ext_after = %d, ec = %d, eb = %d", specs->ext_after, td->elements_count, specs->ext_before);
-+	for(edx = 0; edx < ((specs->ext_after < 0)
-+		? td->elements_count : specs->ext_before - 1); edx++) {
-+
-+		asn_TYPE_member_t *elm = &td->elements[edx];
-+		void *memb_ptr;	 /* Pointer to the member */
-+		void **memb_ptr2;	   /* Pointer to that pointer */
-+
-+		if(IN_EXTENSION_GROUP(specs, edx))
-+			continue;
-+
-+		ASN_DEBUG("About to encode %s", elm->type->name);
-+
-+		/* Fetch the pointer to this member */
-+		if(elm->flags & ATF_POINTER) {
-+			memb_ptr2 = (void **)((char *)sptr + elm->memb_offset);
-+			if(!*memb_ptr2) {
-+				ASN_DEBUG("Element %s %d not present",
-+					elm->name, edx);
-+				if(elm->optional)
-+					continue;
-+				/* Mandatory element is missing */
-+				_ASN_ENCODE_FAILED;
-+			}
-+		} else {
-+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
-+			memb_ptr2 = &memb_ptr;
-+		}
-+
-+		/* Eliminate default values */
-+		if(elm->default_value && elm->default_value(0, memb_ptr2) == 1)
-+			continue;
-+
-+		ASN_DEBUG("Encoding %s->%s", td->name, elm->name);
-+		er = elm->type->aper_encoder(elm->type, elm->per_constraints,
-+			*memb_ptr2, po);
-+		if(er.encoded == -1)
-+			return er;
-+	}
-+
-+	/* No extensions to encode */
-+	if(!n_extensions) _ASN_ENCODED_OK(er);
-+
-+	ASN_DEBUG("Length of %d bit-map", n_extensions);
-+	/* #18.8. Write down the presence bit-map length. */
-+	if(aper_put_nslength(po, n_extensions))
-+		_ASN_ENCODE_FAILED;
-+
-+	ASN_DEBUG("Bit-map of %d elements", n_extensions);
-+	/* #18.7. Encoding the extensions presence bit-map. */
-+	/* TODO: act upon NOTE in #18.7 for canonical PER */
-+	if(SEQUENCE_handle_extensions(td, sptr, po, 0) != n_extensions)
-+		_ASN_ENCODE_FAILED;
-+
-+	ASN_DEBUG("Writing %d extensions", n_extensions);
-+	/* #18.9. Encode extensions as open type fields. */
-+	if(SEQUENCE_handle_extensions(td, sptr, 0, po) != n_extensions)
-+		_ASN_ENCODE_FAILED;
-+
-+	_ASN_ENCODED_OK(er);
-+}
-Index: skeletons/INTEGER.h
-===================================================================
---- skeletons/INTEGER.h	(revision 1516)
-+++ skeletons/INTEGER.h	(working copy)
-@@ -41,6 +41,8 @@
- xer_type_encoder_f INTEGER_encode_xer;
- per_type_decoder_f INTEGER_decode_uper;
- per_type_encoder_f INTEGER_encode_uper;
-+per_type_decoder_f INTEGER_decode_aper;
-+per_type_encoder_f INTEGER_encode_aper;
- 
- /***********************************
-  * Some handy conversion routines. *
-@@ -52,8 +54,12 @@
-  * -1/ERANGE: Value encoded is out of range for long representation
-  * -1/ENOMEM: Memory allocation failed (in asn_long2INTEGER()).
-  */
-+int asn_INTEGER2int64(const INTEGER_t *i, int64_t *l);
-+int asn_INTEGER2uint64(const INTEGER_t *i, uint64_t *l);
- int asn_INTEGER2long(const INTEGER_t *i, long *l);
- int asn_INTEGER2ulong(const INTEGER_t *i, unsigned long *l);
-+int asn_int642INTEGER(INTEGER_t *i, int64_t l);
-+int asn_uint642INTEGER(INTEGER_t *i, uint64_t l);
- int asn_long2INTEGER(INTEGER_t *i, long l);
- int asn_ulong2INTEGER(INTEGER_t *i, unsigned long l);
- 
-Index: skeletons/OCTET_STRING.c
-===================================================================
---- skeletons/OCTET_STRING.c	(revision 1516)
-+++ skeletons/OCTET_STRING.c	(working copy)
-@@ -36,6 +36,8 @@
- 	OCTET_STRING_encode_xer,
- 	OCTET_STRING_decode_uper,	/* Unaligned PER decoder */
- 	OCTET_STRING_encode_uper,	/* Unaligned PER encoder */
-+	OCTET_STRING_decode_aper,	/* Aligned PER decoder */
-+	OCTET_STRING_encode_aper,	/* Aligned PER encoder */
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_OCTET_STRING_tags,
- 	sizeof(asn_DEF_OCTET_STRING_tags)
-@@ -86,7 +88,7 @@
- 			void *ptr;					\
- 			/* Be nice and round to the memory allocator */	\
- 			do { _ns = _ns ? _ns << 1 : 16; }		\
--			    while(_ns <= _es);				\
-+				while(_ns <= _es);				\
- 			/* int is really a typeof(st->size): */		\
- 			if((int)_ns < 0) RETURN(RC_FAIL);		\
- 			ptr = REALLOC(st->buf, _ns);			\
-@@ -195,7 +197,7 @@
- 	}
- 
- 	/* Restore parsing context */
--	ctx = (asn_struct_ctx_t *)((void *)st + specs->ctx_offset);
-+	ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
- 
- 	switch(ctx->phase) {
- 	case 0:
-@@ -416,7 +418,7 @@
- 		ASN_DEBUG("Phase 2: Need %ld bytes, size=%ld, alrg=%ld, wn=%d",
- 			(long)sel->left, (long)size, (long)sel->got,
- 				sel->want_nulls);
--	    {
-+		{
- 		ber_tlv_len_t len;
- 
- 		assert(sel->left >= 0);
-@@ -446,7 +448,7 @@
- 
- 		PREV_PHASE(ctx);
- 		goto phase1;
--	    }
-+		}
- 		break;
- 	case 3:
- 	phase3:
-@@ -1143,7 +1145,7 @@
- 	}
- 
- 	/* Restore parsing context */
--	ctx = (asn_struct_ctx_t *)(((void *)*sptr) + specs->ctx_offset);
-+	ctx = (asn_struct_ctx_t *)(((char *)*sptr) + specs->ctx_offset);
- 
- 	return xer_decode_general(opt_codec_ctx, ctx, *sptr, xml_tag,
- 		buf_ptr, size, opt_unexpected_tag_decoder, body_receiver);
-@@ -1392,7 +1394,7 @@
- 		if(!st) RETURN(RC_FAIL);
- 	}
- 
--	ASN_DEBUG("PER Decoding %s size %ld .. %ld bits %d",
-+	ASN_DEBUG("PER Decoding %s size %"PRIdMAX" .. %"PRIdMAX" bits %d",
- 		csiz->flags & APC_EXTENSIBLE ? "extensible" : "non-extensible",
- 		csiz->lower_bound, csiz->upper_bound, csiz->effective_bits);
- 
-@@ -1423,17 +1425,17 @@
- 	if(csiz->effective_bits == 0) {
- 		int ret;
- 		if(bpc) {
--			ASN_DEBUG("Encoding OCTET STRING size %ld",
-+			ASN_DEBUG("Encoding OCTET STRING size %"PRIdMAX,
- 				csiz->upper_bound);
- 			ret = OCTET_STRING_per_get_characters(pd, st->buf,
- 				csiz->upper_bound, bpc, unit_bits,
- 				cval->lower_bound, cval->upper_bound, pc);
- 			if(ret > 0) RETURN(RC_FAIL);
- 		} else {
--			ASN_DEBUG("Encoding BIT STRING size %ld",
-+			ASN_DEBUG("Encoding BIT STRING size %"PRIdMAX,
- 				csiz->upper_bound);
- 			ret = per_get_many_bits(pd, st->buf, 0,
--					    unit_bits * csiz->upper_bound);
-+						unit_bits * csiz->upper_bound);
- 		}
- 		if(ret < 0) RETURN(RC_WMORE);
- 		consumed_myself += unit_bits * csiz->upper_bound;
-@@ -1492,9 +1494,197 @@
- 	return rval;
- }
- 
-+asn_dec_rval_t
-+OCTET_STRING_decode_aper(asn_codec_ctx_t *opt_codec_ctx,
-+	asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints,
-+	void **sptr, asn_per_data_t *pd) {
-+
-+	asn_OCTET_STRING_specifics_t *specs = td->specifics
-+		? (asn_OCTET_STRING_specifics_t *)td->specifics
-+		: &asn_DEF_OCTET_STRING_specs;
-+	asn_per_constraints_t *pc = constraints ? constraints
-+				: td->per_constraints;
-+	asn_per_constraint_t *cval;
-+	asn_per_constraint_t *csiz;
-+	asn_dec_rval_t rval = { RC_OK, 0 };
-+	BIT_STRING_t *st = (BIT_STRING_t *)*sptr;
-+	ssize_t consumed_myself = 0;
-+	int repeat;
-+	enum {
-+		OS__BPC_BIT	= 0,
-+		OS__BPC_CHAR	= 1,
-+		OS__BPC_U16	= 2,
-+		OS__BPC_U32	= 4
-+	} bpc;	/* Bytes per character */
-+	unsigned int unit_bits;
-+	unsigned int canonical_unit_bits;
-+
-+	(void)opt_codec_ctx;
-+
-+	if(pc) {
-+		cval = &pc->value;
-+		csiz = &pc->size;
-+	} else {
-+		cval = &asn_DEF_OCTET_STRING_constraints.value;
-+		csiz = &asn_DEF_OCTET_STRING_constraints.size;
-+	}
-+
-+	switch(specs->subvariant) {
-+	default:
-+// 	case ASN_OSUBV_ANY:
-+// 		ASN_DEBUG("Unrecognized subvariant %d", specs->subvariant);
-+// 		RETURN(RC_FAIL);
-+	case ASN_OSUBV_BIT:
-+		canonical_unit_bits = unit_bits = 1;
-+		bpc = OS__BPC_BIT;
-+		break;
-+	case ASN_OSUBV_ANY:
-+	case ASN_OSUBV_STR:
-+		canonical_unit_bits = unit_bits = 8;
-+// 		if(cval->flags & APC_CONSTRAINED)
-+// 			unit_bits = cval->range_bits;
-+		bpc = OS__BPC_CHAR;
-+		break;
-+	case ASN_OSUBV_U16:
-+		canonical_unit_bits = unit_bits = 16;
-+		if(cval->flags & APC_CONSTRAINED)
-+			unit_bits = cval->range_bits;
-+		bpc = OS__BPC_U16;
-+		break;
-+	case ASN_OSUBV_U32:
-+		canonical_unit_bits = unit_bits = 32;
-+		if(cval->flags & APC_CONSTRAINED)
-+			unit_bits = cval->range_bits;
-+		bpc = OS__BPC_U32;
-+		break;
-+	}
-+
-+	/*
-+	 * Allocate the string.
-+	 */
-+	if(!st) {
-+		st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size));
-+		if(!st) RETURN(RC_FAIL);
-+	}
-+
-+	ASN_DEBUG("PER Decoding %s size %"PRIdMAX" .. %"PRIdMAX" bits %d",
-+		csiz->flags & APC_EXTENSIBLE ? "extensible" : "non-extensible",
-+		csiz->lower_bound, csiz->upper_bound, csiz->effective_bits);
-+
-+	if(csiz->flags & APC_EXTENSIBLE) {
-+		int inext = per_get_few_bits(pd, 1);
-+		if(inext < 0) RETURN(RC_WMORE);
-+		if(inext) {
-+			csiz = &asn_DEF_OCTET_STRING_constraints.size;
-+			cval = &asn_DEF_OCTET_STRING_constraints.value;
-+			unit_bits = canonical_unit_bits;
-+		}
-+	}
-+
-+	if(csiz->effective_bits >= 0) {
-+		FREEMEM(st->buf);
-+		if(bpc) {
-+			st->size = csiz->upper_bound * bpc;
-+		} else {
-+			st->size = (csiz->upper_bound + 7) >> 3;
-+		}
-+		st->buf = (uint8_t *)MALLOC(st->size + 1);
-+		if(!st->buf) { st->size = 0; RETURN(RC_FAIL); }
-+	}
-+
-+	/* X.691, #16.5: zero-length encoding */
-+	/* X.691, #16.6: short fixed length encoding (up to 2 octets) */
-+	/* X.691, #16.7: long fixed length encoding (up to 64K octets) */
-+	if(csiz->effective_bits == 0) {
-+		int ret;
-+		if (st->size > 2) { /* X.691 #16 NOTE 1 */
-+			if (aper_get_align(pd) < 0)
-+				RETURN(RC_FAIL);
-+		}
-+		if(bpc) {
-+			ASN_DEBUG("Decoding OCTET STRING size %"PRIdMAX,
-+				csiz->upper_bound);
-+			ret = OCTET_STRING_per_get_characters(pd, st->buf,
-+				csiz->upper_bound, bpc, unit_bits,
-+				cval->lower_bound, cval->upper_bound, pc);
-+			if(ret > 0) RETURN(RC_FAIL);
-+		} else {
-+			ASN_DEBUG("Decoding BIT STRING size %"PRIdMAX,
-+				csiz->upper_bound);
-+			ret = per_get_many_bits(pd, st->buf, 0,
-+						unit_bits * csiz->upper_bound);
-+		}
-+		if(ret < 0) RETURN(RC_WMORE);
-+		consumed_myself += unit_bits * csiz->upper_bound;
-+		st->buf[st->size] = 0;
-+		if(bpc == 0) {
-+			int ubs = (csiz->upper_bound & 0x7);
-+			st->bits_unused = ubs ? 8 - ubs : 0;
-+		}
-+		RETURN(RC_OK);
-+	}
-+
-+	st->size = 0;
-+	do {
-+		ssize_t raw_len;
-+		ssize_t len_bytes;
-+		ssize_t len_bits;
-+		void *p;
-+		int ret;
-+
-+		/* Get the PER length */
-+		if (csiz->upper_bound - csiz->lower_bound == 0)
-+			// Indefinite length case
-+			raw_len = aper_get_length(pd, -1, csiz->effective_bits, &repeat);
-+		else
-+			raw_len = aper_get_length(pd, csiz->upper_bound - csiz->lower_bound + 1, csiz->effective_bits, &repeat);
-+		repeat = 0;
-+		if(raw_len < 0) RETURN(RC_WMORE);
-+		raw_len += csiz->lower_bound;
-+
-+		ASN_DEBUG("Got PER length eb %ld, len %ld, %s (%s)",
-+			(long)csiz->effective_bits, (long)raw_len,
-+			repeat ? "repeat" : "once", td->name);
-+
-+		if (raw_len > 2) { /* X.691 #16 NOTE 1 */
-+			if (aper_get_align(pd) < 0)
-+				RETURN(RC_FAIL);
-+		}
-+
-+		if(bpc) {
-+			len_bytes = raw_len * bpc;
-+			len_bits = len_bytes * unit_bits;
-+		} else {
-+			len_bits = raw_len;
-+			len_bytes = (len_bits + 7) >> 3;
-+			if(len_bits & 0x7)
-+				st->bits_unused = 8 - (len_bits & 0x7);
-+			/* len_bits be multiple of 16K if repeat is set */
-+		}
-+		p = REALLOC(st->buf, st->size + len_bytes + 1);
-+		if(!p) RETURN(RC_FAIL);
-+		st->buf = (uint8_t *)p;
-+
-+		if(bpc) {
-+			ret = OCTET_STRING_per_get_characters(pd,
-+				&st->buf[st->size], raw_len, bpc, unit_bits,
-+				cval->lower_bound, cval->upper_bound, pc);
-+			if(ret > 0) RETURN(RC_FAIL);
-+		} else {
-+			ret = per_get_many_bits(pd, &st->buf[st->size],
-+				0, len_bits);
-+		}
-+		if(ret < 0) RETURN(RC_WMORE);
-+		st->size += len_bytes;
-+	} while(repeat);
-+	st->buf[st->size] = 0;	/* nul-terminate */
-+
-+	return rval;
-+}
-+
- asn_enc_rval_t
- OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td,
--        asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-+		asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
- 
- 	asn_OCTET_STRING_specifics_t *specs = td->specifics
- 		? (asn_OCTET_STRING_specifics_t *)td->specifics
-@@ -1566,7 +1756,7 @@
- 	}
- 
- 	ASN_DEBUG("Encoding %s into %d units of %d bits"
--		" (%ld..%ld, effective %d)%s",
-+		" (%"PRIdMAX"..%"PRIdMAX", effective %d)%s",
- 		td->name, sizeinunits, unit_bits,
- 		csiz->lower_bound, csiz->upper_bound,
- 		csiz->effective_bits, ct_extensible ? " EXT" : "");
-@@ -1598,7 +1788,7 @@
- 	/* X.691, #16.6: short fixed length encoding (up to 2 octets) */
- 	/* X.691, #16.7: long fixed length encoding (up to 64K octets) */
- 	if(csiz->effective_bits >= 0) {
--		ASN_DEBUG("Encoding %d bytes (%ld), length in %d bits",
-+		ASN_DEBUG("Encoding %d bytes (%"PRIdMAX"), length in %d bits",
- 				st->size, sizeinunits - csiz->lower_bound,
- 				csiz->effective_bits);
- 		ret = per_put_few_bits(po, sizeinunits - csiz->lower_bound,
-@@ -1652,6 +1842,173 @@
- 	_ASN_ENCODED_OK(er);
- }
- 
-+asn_enc_rval_t
-+OCTET_STRING_encode_aper(asn_TYPE_descriptor_t *td,
-+		asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-+
-+		asn_OCTET_STRING_specifics_t *specs = td->specifics
-+				? (asn_OCTET_STRING_specifics_t *)td->specifics
-+				: &asn_DEF_OCTET_STRING_specs;
-+		asn_per_constraints_t *pc = constraints ? constraints
-+								: td->per_constraints;
-+		asn_per_constraint_t *cval;
-+		asn_per_constraint_t *csiz;
-+		const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-+		asn_enc_rval_t er = { 0, 0, 0 };
-+		int inext = 0;		  /* Lies not within extension root */
-+		unsigned int unit_bits;
-+		unsigned int canonical_unit_bits;
-+		unsigned int sizeinunits;
-+		const uint8_t *buf;
-+		int ret;
-+		enum {
-+				OS__BPC_BIT	 = 0,
-+				OS__BPC_CHAR	= 1,
-+				OS__BPC_U16	 = 2,
-+				OS__BPC_U32	 = 4
-+		} bpc;  /* Bytes per character */
-+		int ct_extensible;
-+
-+		if(!st || (!st->buf && st->size))
-+				_ASN_ENCODE_FAILED;
-+
-+		if(pc) {
-+				cval = &pc->value;
-+				csiz = &pc->size;
-+		} else {
-+				cval = &asn_DEF_OCTET_STRING_constraints.value;
-+				csiz = &asn_DEF_OCTET_STRING_constraints.size;
-+		}
-+		ct_extensible = csiz->flags & APC_EXTENSIBLE;
-+
-+		switch(specs->subvariant) {
-+		default:
-+//		 case ASN_OSUBV_ANY:
-+//				 _ASN_ENCODE_FAILED;
-+		case ASN_OSUBV_BIT:
-+				canonical_unit_bits = unit_bits = 1;
-+				bpc = OS__BPC_BIT;
-+				sizeinunits = st->size * 8 - (st->bits_unused & 0x07);
-+				ASN_DEBUG("BIT STRING of %d bits",
-+								sizeinunits);
-+		break;
-+		case ASN_OSUBV_ANY:
-+	case ASN_OSUBV_STR:
-+		canonical_unit_bits = unit_bits = 8;
-+// 		if(cval->flags & APC_CONSTRAINED)
-+// 			unit_bits = 8;
-+		bpc = OS__BPC_CHAR;
-+		sizeinunits = st->size;
-+		break;
-+	case ASN_OSUBV_U16:
-+		canonical_unit_bits = unit_bits = 16;
-+		if(cval->flags & APC_CONSTRAINED)
-+			unit_bits = cval->range_bits;
-+		bpc = OS__BPC_U16;
-+		sizeinunits = st->size / 2;
-+		break;
-+	case ASN_OSUBV_U32:
-+		canonical_unit_bits = unit_bits = 32;
-+		if(cval->flags & APC_CONSTRAINED)
-+			unit_bits = cval->range_bits;
-+		bpc = OS__BPC_U32;
-+		sizeinunits = st->size / 4;
-+		break;
-+	}
-+
-+	ASN_DEBUG("Encoding %s into %d units of %d bits"
-+		" (%"PRIdMAX"..%"PRIdMAX", effective %d)%s",
-+		td->name, sizeinunits, unit_bits,
-+		csiz->lower_bound, csiz->upper_bound,
-+		csiz->effective_bits, ct_extensible ? " EXT" : "");
-+
-+	/* Figure out wheter size lies within PER visible constraint */
-+
-+	if(csiz->effective_bits >= 0) {
-+		if((int)sizeinunits < csiz->lower_bound
-+		|| (int)sizeinunits > csiz->upper_bound) {
-+			if(ct_extensible) {
-+				cval = &asn_DEF_OCTET_STRING_constraints.value;
-+				csiz = &asn_DEF_OCTET_STRING_constraints.size;
-+				unit_bits = canonical_unit_bits;
-+				inext = 1;
-+			} else
-+				_ASN_ENCODE_FAILED;
-+		}
-+	} else {
-+		inext = 0;
-+	}
-+
-+
-+	if(ct_extensible) {
-+		/* Declare whether length is [not] within extension root */
-+		if(per_put_few_bits(po, inext, 1))
-+			_ASN_ENCODE_FAILED;
-+	}
-+
-+	/* X.691, #16.5: zero-length encoding */
-+	/* X.691, #16.6: short fixed length encoding (up to 2 octets) */
-+	/* X.691, #16.7: long fixed length encoding (up to 64K octets) */
-+	if(csiz->effective_bits >= 0) {
-+		ASN_DEBUG("Encoding %d bytes (%"PRIdMAX"), length in %d bits",
-+				st->size, sizeinunits - csiz->lower_bound,
-+				csiz->effective_bits);
-+		ret = per_put_few_bits(po, sizeinunits - csiz->lower_bound,
-+				csiz->effective_bits);
-+		if(ret) _ASN_ENCODE_FAILED;
-+		if (st->size > 2) { /* X.691 #16 NOTE 1 */
-+			if (aper_put_align(po) < 0)
-+				_ASN_ENCODE_FAILED;
-+		}
-+		if(bpc) {
-+			ret = OCTET_STRING_per_put_characters(po, st->buf,
-+				sizeinunits, bpc, unit_bits,
-+				cval->lower_bound, cval->upper_bound, pc);
-+		} else {
-+			ret = per_put_many_bits(po, st->buf,
-+				sizeinunits * unit_bits);
-+		}
-+		if(ret) _ASN_ENCODE_FAILED;
-+		_ASN_ENCODED_OK(er);
-+	}
-+
-+	ASN_DEBUG("Encoding %d bytes", st->size);
-+
-+	if(sizeinunits == 0) {
-+		if(aper_put_length(po, -1, 0))
-+			_ASN_ENCODE_FAILED;
-+		_ASN_ENCODED_OK(er);
-+	}
-+
-+	buf = st->buf;
-+	while(sizeinunits) {
-+		ssize_t maySave = aper_put_length(po, -1, sizeinunits);
-+
-+		if(maySave < 0) _ASN_ENCODE_FAILED;
-+
-+		ASN_DEBUG("Encoding %ld of %ld",
-+			(long)maySave, (long)sizeinunits);
-+
-+		if(bpc) {
-+			ret = OCTET_STRING_per_put_characters(po, buf,
-+				maySave, bpc, unit_bits,
-+				cval->lower_bound, cval->upper_bound, pc);
-+		} else {
-+			ret = per_put_many_bits(po, buf, maySave * unit_bits);
-+		}
-+		if(ret) _ASN_ENCODE_FAILED;
-+
-+		if(bpc)
-+			buf += maySave * bpc;
-+		else
-+			buf += maySave >> 3;
-+		sizeinunits -= maySave;
-+		assert(!(maySave & 0x07) || !sizeinunits);
-+	}
-+
-+	_ASN_ENCODED_OK(er);
-+}
-+
- int
- OCTET_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
- 	asn_app_consume_bytes_f *cb, void *app_key) {
-@@ -1716,7 +2073,7 @@
- 				? (asn_OCTET_STRING_specifics_t *)td->specifics
- 				: &asn_DEF_OCTET_STRING_specs;
- 	asn_struct_ctx_t *ctx = (asn_struct_ctx_t *)
--					((void *)st + specs->ctx_offset);
-+					((char *)st + specs->ctx_offset);
- 	struct _stack *stck;
- 
- 	if(!td || !st)
-Index: skeletons/BIT_STRING.c
-===================================================================
---- skeletons/BIT_STRING.c	(revision 1516)
-+++ skeletons/BIT_STRING.c	(working copy)
-@@ -29,6 +29,8 @@
- 	BIT_STRING_encode_xer,
- 	OCTET_STRING_decode_uper,	/* Unaligned PER decoder */
- 	OCTET_STRING_encode_uper,	/* Unaligned PER encoder */
-+	OCTET_STRING_decode_aper,	/* Aligned PER decoder */
-+	OCTET_STRING_encode_aper,	/* Aligned PER encoder */
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_BIT_STRING_tags,
- 	sizeof(asn_DEF_BIT_STRING_tags)
-Index: skeletons/NativeInteger.c
-===================================================================
---- skeletons/NativeInteger.c	(revision 1516)
-+++ skeletons/NativeInteger.c	(working copy)
-@@ -31,6 +31,8 @@
- 	NativeInteger_encode_xer,
- 	NativeInteger_decode_uper,	/* Unaligned PER decoder */
- 	NativeInteger_encode_uper,	/* Unaligned PER encoder */
-+	NativeInteger_decode_aper,	/* Aligned PER decoder */
-+	NativeInteger_encode_aper,	/* Aligned PER encoder */
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_NativeInteger_tags,
- 	sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]),
-@@ -267,6 +269,46 @@
- 	return rval;
- }
- 
-+asn_dec_rval_t
-+NativeInteger_decode_aper(asn_codec_ctx_t *opt_codec_ctx,
-+	asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) {
-+
-+	asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
-+	asn_dec_rval_t rval;
-+	long *native = (long *)*sptr;
-+	INTEGER_t tmpint;
-+	void *tmpintptr = &tmpint;
-+	int dynamic = 0;
-+
-+	(void)opt_codec_ctx;
-+	ASN_DEBUG("Decoding NativeInteger %s (APER)", td->name);
-+
-+	if(!native) {
-+		native = (long *)(*sptr = CALLOC(1, sizeof(*native)));
-+		dynamic = 1;
-+		if(!native) _ASN_DECODE_FAILED;
-+	}
-+
-+	memset(&tmpint, 0, sizeof tmpint);
-+	rval = INTEGER_decode_aper(opt_codec_ctx, td, constraints,
-+				   &tmpintptr, pd);
-+	if(rval.code == RC_OK) {
-+		if((specs&&specs->field_unsigned)
-+			? asn_INTEGER2ulong(&tmpint, (unsigned long *)native)
-+			: asn_INTEGER2long(&tmpint, native))
-+			rval.code = RC_FAIL;
-+		else
-+			ASN_DEBUG("NativeInteger %s got value %ld",
-+				td->name, *native);
-+	}
-+	ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint);
-+	//if (dynamic)
-+	//	free(native);
-+
-+	return rval;
-+}
-+
- asn_enc_rval_t
- NativeInteger_encode_uper(asn_TYPE_descriptor_t *td,
- 	asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-@@ -291,6 +333,44 @@
- 	return er;
- }
- 
-+asn_enc_rval_t
-+NativeInteger_encode_aper(
-+	asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-+
-+	asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
-+	asn_enc_rval_t er;
-+	INTEGER_t tmpint;
-+
-+	if(!sptr) _ASN_ENCODE_FAILED;
-+	memset(&tmpint, 0, sizeof(tmpint));
-+
-+	if(specs&&specs->field_unsigned) {
-+		unsigned long native;
-+		native = *(unsigned long *)sptr;
-+
-+		ASN_DEBUG("Encoding NativeInteger %s %lu (APER) (unsigned)", td->name, native);
-+
-+		if(asn_ulong2INTEGER(&tmpint, native))
-+			_ASN_ENCODE_FAILED;
-+	} else {
-+		long native;
-+		native = *(long *)sptr;
-+
-+		ASN_DEBUG("Encoding NativeInteger %s %ld (APER) (unsigned)", td->name, native);
-+		if(asn_long2INTEGER(&tmpint, native))
-+			_ASN_ENCODE_FAILED;
-+	}
-+
-+// 	if((specs&&specs->field_unsigned)
-+// 		? asn_ulong2INTEGER(&tmpint, native)
-+// 		: asn_long2INTEGER(&tmpint, native))
-+// 		_ASN_ENCODE_FAILED;
-+	er = INTEGER_encode_aper(td, constraints, &tmpint, po);
-+	ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint);
-+	return er;
-+}
-+
- /*
-  * INTEGER specific human-readable output.
-  */
-Index: skeletons/constr_SEQUENCE.h
-===================================================================
---- skeletons/constr_SEQUENCE.h	(revision 1516)
-+++ skeletons/constr_SEQUENCE.h	(working copy)
-@@ -52,6 +52,8 @@
- xer_type_encoder_f SEQUENCE_encode_xer;
- per_type_decoder_f SEQUENCE_decode_uper;
- per_type_encoder_f SEQUENCE_encode_uper;
-+per_type_decoder_f SEQUENCE_decode_aper;
-+per_type_encoder_f SEQUENCE_encode_aper;
- 
- #ifdef __cplusplus
- }
-Index: skeletons/NativeInteger.h
-===================================================================
---- skeletons/NativeInteger.h	(revision 1516)
-+++ skeletons/NativeInteger.h	(working copy)
-@@ -29,6 +29,8 @@
- xer_type_encoder_f NativeInteger_encode_xer;
- per_type_decoder_f NativeInteger_decode_uper;
- per_type_encoder_f NativeInteger_encode_uper;
-+per_type_decoder_f NativeInteger_decode_aper;
-+per_type_encoder_f NativeInteger_encode_aper;
- 
- #ifdef __cplusplus
- }
-Index: skeletons/OCTET_STRING.h
-===================================================================
---- skeletons/OCTET_STRING.h	(revision 1516)
-+++ skeletons/OCTET_STRING.h	(working copy)
-@@ -32,6 +32,8 @@
- xer_type_encoder_f OCTET_STRING_encode_xer_utf8;
- per_type_decoder_f OCTET_STRING_decode_uper;
- per_type_encoder_f OCTET_STRING_encode_uper;
-+per_type_decoder_f OCTET_STRING_decode_aper;
-+per_type_encoder_f OCTET_STRING_encode_aper;
- 
- /******************************
-  * Handy conversion routines. *
-Index: skeletons/UTCTime.c
-===================================================================
---- skeletons/UTCTime.c	(revision 1516)
-+++ skeletons/UTCTime.c	(working copy)
-@@ -40,6 +40,8 @@
- 	UTCTime_encode_xer,
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_UTCTime_tags,
- 	sizeof(asn_DEF_UTCTime_tags)
-Index: skeletons/REAL.c
-===================================================================
---- skeletons/REAL.c	(revision 1516)
-+++ skeletons/REAL.c	(working copy)
-@@ -45,6 +45,8 @@
- 	REAL_encode_xer,
- 	REAL_decode_uper,
- 	REAL_encode_uper,
-+	REAL_decode_aper,
-+	REAL_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_REAL_tags,
- 	sizeof(asn_DEF_REAL_tags) / sizeof(asn_DEF_REAL_tags[0]),
-@@ -361,6 +363,21 @@
- 	return OCTET_STRING_encode_uper(td, 0, sptr, po);
- }
- 
-+asn_dec_rval_t
-+REAL_decode_aper(asn_codec_ctx_t *opt_codec_ctx,
-+	asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints,
-+	void **sptr, asn_per_data_t *pd) {
-+	(void)constraints;	/* No PER visible constraints */
-+	return OCTET_STRING_decode_aper(opt_codec_ctx, td, 0, sptr, pd);
-+}
-+
-+asn_enc_rval_t
-+REAL_encode_aper(asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-+	(void)constraints;	/* No PER visible constraints */
-+	return OCTET_STRING_encode_aper(td, 0, sptr, po);
-+}
-+
- int
- asn_REAL2double(const REAL_t *st, double *dbl_value) {
- 	unsigned int octv;
-Index: skeletons/VisibleString.c
-===================================================================
---- skeletons/VisibleString.c	(revision 1516)
-+++ skeletons/VisibleString.c	(working copy)
-@@ -29,6 +29,8 @@
- 	OCTET_STRING_encode_xer_utf8,
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_VisibleString_tags,
- 	sizeof(asn_DEF_VisibleString_tags)
-Index: skeletons/ANY.c
-===================================================================
---- skeletons/ANY.c	(revision 1516)
-+++ skeletons/ANY.c	(working copy)
-@@ -21,7 +21,10 @@
- 	OCTET_STRING_encode_der,
- 	OCTET_STRING_decode_xer_hex,
- 	ANY_encode_xer,
--	0, 0,
-+	OCTET_STRING_decode_uper,
-+	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	0, 0, 0, 0,
- 	0,	/* No PER visible constraints */
-@@ -87,6 +90,37 @@
- 	return 0;
- }
- 
-+int
-+ANY_fromType_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr) {
-+	uint8_t *buffer = NULL;
-+	ssize_t erval;
-+	
-+	if(!st || !td) {
-+		errno = EINVAL;
-+		return -1;
-+	}
-+	
-+	if(!sptr) {
-+		if(st->buf) FREEMEM(st->buf);
-+		st->size = 0;
-+		return 0;
-+	}
-+	
-+	erval = aper_encode_to_new_buffer(td, td->per_constraints, sptr, (void**)&buffer);
-+
-+	if(erval == -1) {
-+		if(buffer) FREEMEM(buffer);
-+		return -1;
-+	}
-+	assert((size_t)erval > 0);
-+	
-+	if(st->buf) FREEMEM(st->buf);
-+	st->buf = buffer;
-+	st->size = erval;
-+	
-+	return 0;
-+}
-+
- ANY_t *
- ANY_new_fromType(asn_TYPE_descriptor_t *td, void *sptr) {
- 	ANY_t tmp;
-@@ -111,6 +145,30 @@
- 	}
- }
- 
-+ANY_t *
-+ANY_new_fromType_aper(asn_TYPE_descriptor_t *td, void *sptr) {
-+	ANY_t tmp;
-+	ANY_t *st;
-+	
-+	if(!td || !sptr) {
-+		errno = EINVAL;
-+		return 0;
-+	}
-+	
-+	memset(&tmp, 0, sizeof(tmp));
-+	
-+	if(ANY_fromType_aper(&tmp, td, sptr)) return 0;
-+	
-+	st = (ANY_t *)CALLOC(1, sizeof(ANY_t));
-+	if(st) {
-+		*st = tmp;
-+		return st;
-+	} else {
-+		FREEMEM(tmp.buf);
-+		return 0;
-+	}
-+}
-+
- int
- ANY_to_type(ANY_t *st, asn_TYPE_descriptor_t *td, void **struct_ptr) {
- 	asn_dec_rval_t rval;
-@@ -138,6 +196,33 @@
- 	}
- }
- 
-+int
-+ANY_to_type_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void **struct_ptr) {
-+	asn_dec_rval_t rval;
-+	void *newst = 0;
-+	
-+	if(!st || !td || !struct_ptr) {
-+		errno = EINVAL;
-+		return -1;
-+	}
-+	
-+	if(st->buf == 0) {
-+		/* Nothing to convert, make it empty. */
-+		*struct_ptr = (void *)0;
-+		return 0;
-+	}
-+	
-+	rval = aper_decode(0, td, (void **)&newst, st->buf, st->size, 0, 0);
-+	if(rval.code == RC_OK) {
-+		*struct_ptr = newst;
-+		return 0;
-+	} else {
-+		/* Remove possibly partially decoded data. */
-+		ASN_STRUCT_FREE(*td, newst);
-+		return -1;
-+	}
-+}
-+
- static int ANY__consume_bytes(const void *buffer, size_t size, void *key) {
- 	struct _callback_arg *arg = (struct _callback_arg *)key;
- 
-Index: skeletons/REAL.h
-===================================================================
---- skeletons/REAL.h	(revision 1516)
-+++ skeletons/REAL.h	(working copy)
-@@ -21,6 +21,8 @@
- xer_type_encoder_f REAL_encode_xer;
- per_type_decoder_f REAL_decode_uper;
- per_type_encoder_f REAL_encode_uper;
-+per_type_decoder_f REAL_decode_aper;
-+per_type_encoder_f REAL_encode_aper;
- 
- /***********************************
-  * Some handy conversion routines. *
-Index: skeletons/NativeReal.c
-===================================================================
---- skeletons/NativeReal.c	(revision 1516)
-+++ skeletons/NativeReal.c	(working copy)
-@@ -32,6 +32,8 @@
- 	NativeReal_encode_xer,
- 	NativeReal_decode_uper,
- 	NativeReal_encode_uper,
-+	NativeReal_decode_aper,
-+	NativeReal_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_NativeReal_tags,
- 	sizeof(asn_DEF_NativeReal_tags) / sizeof(asn_DEF_NativeReal_tags[0]),
-@@ -123,11 +125,11 @@
- 			tmp.size = length;
- 			memcpy(tmp.buf, buf_ptr, length);
- 			tmp.buf[tmp.size] = '\0';
--			if(asn_REAL2double(&tmp, &d)) {
--				rval.code = RC_FAIL;
--				rval.consumed = 0;
--				return rval;
--			}
-+		if(asn_REAL2double(&tmp, &d)) {
-+			rval.code = RC_FAIL;
-+			rval.consumed = 0;
-+			return rval;
-+		}
- 		} else {
- 			/* This should probably never happen: impractically long value */
- 			tmp.buf = CALLOC(1, length + 1);
-@@ -228,6 +230,43 @@
- 	return rval;
- }
- 
-+asn_dec_rval_t
-+NativeReal_decode_aper(asn_codec_ctx_t *opt_codec_ctx,
-+	asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints,
-+		void **dbl_ptr, asn_per_data_t *pd) {
-+	double *Dbl = (double *)*dbl_ptr;
-+	asn_dec_rval_t rval;
-+	REAL_t tmp;
-+	void *ptmp = &tmp;
-+	int ret;
-+
-+	(void)constraints;
-+
-+	/*
-+	 * If the structure is not there, allocate it.
-+	 */
-+	if(Dbl == NULL) {
-+		*dbl_ptr = CALLOC(1, sizeof(*Dbl));
-+		Dbl = (double *)*dbl_ptr;
-+		if(Dbl == NULL)
-+			_ASN_DECODE_FAILED;
-+	}
-+
-+	memset(&tmp, 0, sizeof(tmp));
-+	rval = OCTET_STRING_decode_aper(opt_codec_ctx, td, NULL,
-+			&ptmp, pd);
-+	if(rval.code != RC_OK) {
-+		ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp);
-+		return rval;
-+	}
-+
-+	ret = asn_REAL2double(&tmp, Dbl);
-+	ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp);
-+	if(ret) _ASN_DECODE_FAILED;
-+
-+	return rval;
-+}
-+
- /*
-  * Encode the NativeReal using the OCTET STRING PER encoder.
-  */
-@@ -257,6 +296,32 @@
- 	return erval;
- }
- 
-+asn_enc_rval_t
-+NativeReal_encode_aper(asn_TYPE_descriptor_t *td,
-+	asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
-+	double Dbl = *(const double *)sptr;
-+	asn_enc_rval_t erval;
-+	REAL_t tmp;
-+
-+	(void)constraints;
-+
-+	/* Prepare a temporary clean structure */
-+	memset(&tmp, 0, sizeof(tmp));
-+
-+	if(asn_double2REAL(&tmp, Dbl))
-+		_ASN_ENCODE_FAILED;
-+
-+	/* Encode a DER REAL */
-+	erval = OCTET_STRING_encode_aper(td, NULL, &tmp, po);
-+	if(erval.encoded == -1)
-+		erval.structure_ptr = sptr;
-+
-+	/* Free possibly allocated members of the temporary structure */
-+	ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp);
-+
-+	return erval;
-+}
-+
- /*
-  * Decode the chunk of XML text encoding REAL.
-  */
-Index: skeletons/asn_system.h
-===================================================================
---- skeletons/asn_system.h	(revision 1516)
-+++ skeletons/asn_system.h	(working copy)
-@@ -21,6 +21,11 @@
- #include <stdarg.h>	/* For va_start */
- #include <stddef.h>	/* for offsetof and ptrdiff_t */
- 
-+#if HAVE_STDINT_H
-+# include <stdint.h>
-+# include <inttypes.h>
-+#endif
-+
- #ifdef	_WIN32
- 
- #include <malloc.h>
-Index: skeletons/ANY.h
-===================================================================
---- skeletons/ANY.h	(revision 1516)
-+++ skeletons/ANY.h	(working copy)
-@@ -32,10 +32,13 @@
- 
- /* Convert another ASN.1 type into the ANY. This implies DER encoding. */
- int ANY_fromType(ANY_t *, asn_TYPE_descriptor_t *td, void *struct_ptr);
-+int ANY_fromType_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr);
- ANY_t *ANY_new_fromType(asn_TYPE_descriptor_t *td, void *struct_ptr);
-+ANY_t *ANY_new_fromType_aper(asn_TYPE_descriptor_t *td, void *sptr);
- 
- /* Convert the contents of the ANY type into the specified type. */
- int ANY_to_type(ANY_t *, asn_TYPE_descriptor_t *td, void **struct_ptr);
-+int ANY_to_type_aper(ANY_t *, asn_TYPE_descriptor_t *td, void **struct_ptr);
- 
- #define	ANY_fromBuf(s, buf, size)	OCTET_STRING_fromBuf((s), (buf), (size))
- #define	ANY_new_fromBuf(buf, size)	OCTET_STRING_new_fromBuf(	\
-Index: skeletons/NativeReal.h
-===================================================================
---- skeletons/NativeReal.h	(revision 1516)
-+++ skeletons/NativeReal.h	(working copy)
-@@ -27,6 +27,8 @@
- xer_type_encoder_f NativeReal_encode_xer;
- per_type_decoder_f NativeReal_decode_uper;
- per_type_encoder_f NativeReal_encode_uper;
-+per_type_decoder_f NativeReal_decode_aper;
-+per_type_encoder_f NativeReal_encode_aper;
- 
- #ifdef __cplusplus
- }
-Index: skeletons/UniversalString.c
-===================================================================
---- skeletons/UniversalString.c	(revision 1516)
-+++ skeletons/UniversalString.c	(working copy)
-@@ -35,6 +35,8 @@
- 	UniversalString_encode_xer,	/* Convert into UTF-8 */
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_UniversalString_tags,
- 	sizeof(asn_DEF_UniversalString_tags)
-Index: skeletons/GraphicString.c
-===================================================================
---- skeletons/GraphicString.c	(revision 1516)
-+++ skeletons/GraphicString.c	(working copy)
-@@ -24,6 +24,8 @@
- 	OCTET_STRING_encode_xer,	/* Can't expect it to be ASCII/UTF8 */
- 	OCTET_STRING_decode_uper,    /* Implemented in terms of OCTET STRING */
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_GraphicString_tags,
- 	sizeof(asn_DEF_GraphicString_tags)
-Index: skeletons/GeneralizedTime.c
-===================================================================
---- skeletons/GeneralizedTime.c	(revision 1516)
-+++ skeletons/GeneralizedTime.c	(working copy)
-@@ -167,6 +167,8 @@
- 	GeneralizedTime_encode_xer,
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
-+	OCTET_STRING_decode_aper,
-+	OCTET_STRING_encode_aper,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_GeneralizedTime_tags,
- 	sizeof(asn_DEF_GeneralizedTime_tags)
-Index: libasn1compiler/asn1c_out.h
-===================================================================
---- libasn1compiler/asn1c_out.h	(revision 1516)
-+++ libasn1compiler/asn1c_out.h	(working copy)
-@@ -117,16 +117,24 @@
-  * Format LONG_MIN according to C90 rules.
-  */
- #define OINT(iv)	do {					\
--	if(iv == (-2147483647L - 1))				\
-+	if(iv > 4294967295U)						\
-+		OUT("%" PRIdASN"ULL", iv);			\
-+	else if(iv > 2147483647L)				\
-+		OUT("%" PRIdASN"U", iv);				\
-+	else if(iv == (-2147483647L - 1))		\
- 		OUT("(-2147483647L - 1)");			\
--	else							\
-+	else									\
- 		OUT("%" PRIdASN, iv);				\
- } while(0)
- 
- #define OINTS(iv)	do {					\
--	if(iv == (-2147483647L - 1))				\
-+	if(iv > 4294967295U)						\
-+		OUT("%" PRIdASN"ULL", iv);			\
-+	else if(iv > 2147483647L)				\
-+		OUT("%" PRIdASN"U", iv);				\
-+	else if(iv == (-2147483647L - 1))		\
- 		OUT("(-2147483647L - 1)");			\
--	else							\
-+	else									\
- 		OUT("% " PRIdASN, iv);				\
- } while(0)
- 
-Index: libasn1compiler/asn1compiler.h
-===================================================================
---- libasn1compiler/asn1compiler.h	(revision 1516)
-+++ libasn1compiler/asn1compiler.h	(working copy)
-@@ -77,7 +77,14 @@
- 	 * -fline-refs
- 	 * Include ASN.1 module's line numbers in comments.
- 	 */
--	A1C_LINE_REFS       = 0x20000
-+	A1C_LINE_REFS       = 0x20000,
-+ 	/*
-+	 * -fhave_native64
-+	 * Assume target platform has native 64bits support and generate types using
-+	 * int64_t or uint64_t whereas possible
-+	 */
-+	A1C_HAVE_NATIVE_64	= 0x40000
-+
- };
- 
- /*
-Index: libasn1compiler/asn1c_C.c
-===================================================================
---- libasn1compiler/asn1c_C.c	(revision 1516)
-+++ libasn1compiler/asn1c_C.c	(working copy)
-@@ -1242,6 +1242,8 @@
- 	OUT("td->xer_encoder    = asn_DEF_%s.xer_encoder;\n",    type_name);
- 	OUT("td->uper_decoder   = asn_DEF_%s.uper_decoder;\n",   type_name);
- 	OUT("td->uper_encoder   = asn_DEF_%s.uper_encoder;\n",   type_name);
-+	OUT("td->aper_decoder   = asn_DEF_%s.aper_decoder;\n",   type_name);
-+	OUT("td->aper_encoder   = asn_DEF_%s.aper_encoder;\n",   type_name);
- 	if(!terminal && !tags_count) {
- 	  OUT("/* The next four lines are here because of -fknown-extern-type */\n");
- 	  OUT("td->tags           = asn_DEF_%s.tags;\n",         type_name);
-@@ -1394,6 +1396,38 @@
- 	);
- 	OUT("}\n");
- 	OUT("\n");
-+
-+	p = MKID(expr);
-+	if(HIDE_INNER_DEFS) OUT("static ");
-+							OUT("asn_enc_rval_t\n");
-+	OUT("%s", p);
-+	if(HIDE_INNER_DEFS) OUT("_%d", expr->_type_unique_index);
-+		OUT("_encode_aper(asn_TYPE_descriptor_t *td,\n");
-+	INDENTED(
-+	OUT("\tasn_per_constraints_t *constraints,\n");
-+	OUT("\tvoid *structure, asn_per_outp_t *per_out) {\n");
-+	OUT("%s_%d_inherit_TYPE_descriptor(td);\n",
-+		p, expr->_type_unique_index);
-+	OUT("return td->aper_encoder(td, constraints, structure, per_out);\n");
-+	);
-+	OUT("}\n");
-+	OUT("\n");
-+
-+	p = MKID(expr);
-+	
-+	if(HIDE_INNER_DEFS) OUT("static ");
-+	OUT("asn_dec_rval_t\n");
-+	OUT("%s", p);
-+	if(HIDE_INNER_DEFS) OUT("_%d", expr->_type_unique_index);
-+	OUT("_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,\n");
-+	INDENTED(
-+		OUT("\tasn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {\n");
-+	OUT("%s_%d_inherit_TYPE_descriptor(td);\n",
-+		p, expr->_type_unique_index);
-+	OUT("return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);\n");
-+	);
-+	OUT("}\n");
-+	OUT("\n");
-   }
- 
- 	REDIR(OT_FUNC_DECLS);
-@@ -1415,6 +1449,8 @@
- 		if(arg->flags & A1C_GEN_PER) {
- 		OUT("per_type_decoder_f %s_decode_uper;\n", p);
- 		OUT("per_type_encoder_f %s_encode_uper;\n", p);
-+		OUT("per_type_decoder_f %s_decode_aper;\n", p);
-+		OUT("per_type_encoder_f %s_encode_aper;\n", p);
- 		}
- 	}
- 
-@@ -1670,12 +1706,11 @@
- 		OUT("%d, ", tag2el[i].el_no);
- 		OUT("%d, ", tag2el[i].toff_first);
- 		OUT("%d ", tag2el[i].toff_last);
--		OUT("}%s /* %s",
-+		OUT("}%s /* %s at %d */\n",
- 			(i + 1 < tag2el_count) ? "," : "",
--			tag2el[i].from_expr->Identifier);
--        if(arg->flags & A1C_LINE_REFS)
--            OUT("at %d", tag2el[i].from_expr->_lineno);
--        OUT(" */\n");
-+			tag2el[i].from_expr->Identifier,
-+			tag2el[i].from_expr->_lineno
-+		);
- 	}
- 	OUT("};\n");
- 
-@@ -2111,19 +2146,22 @@
- try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) {
- 	int save_target = arg->target->target;
- 	asn1p_expr_type_e etype = expr_get_type(arg, expr);
--	int fits_long = 0;
-+// 	int fits_long = 0;
-+	enum asn1c_fitslong_e fits = FL_NOTFIT;
- 
- 	switch(etype) {
- 	case ASN_BASIC_BOOLEAN:
--		fits_long = 1;
-+// 		fits_long = 1;
-+		fits = FL_FITS_SIGNED;
- 	case ASN_BASIC_INTEGER:
- 	case ASN_BASIC_ENUMERATED:
- 		if(expr->marker.default_value == NULL
- 		|| expr->marker.default_value->type != ATV_INTEGER)
- 			break;
--		if(!fits_long)
--			fits_long = asn1c_type_fits_long(arg, expr)!=FL_NOTFIT;
--		if(fits_long && !expr->marker.default_value->value.v_integer)
-+		if(fits == FL_NOTFIT)
-+// 			fits_long = asn1c_type_fits_long(arg, expr)!=FL_NOTFIT;
-+			fits = asn1c_type_fits_long(arg, expr);
-+		if(fits != FL_NOTFIT && !expr->marker.default_value->value.v_integer)
- 			expr->marker.flags &= ~EM_INDIRECT;
- 		if(!out) {
- 			OUT("asn_DFL_%d_set_%" PRIdASN
-@@ -2150,7 +2188,7 @@
- 		INDENT(+1);
- 		OUT("/* Install default value %" PRIdASN " */\n",
- 			expr->marker.default_value->value.v_integer);
--		if(fits_long) {
-+		if(fits != FL_NOTFIT) {
- 			OUT("*st = ");
- 			OINT(expr->marker.default_value->value.v_integer);
- 			OUT(";\n");
-@@ -2165,7 +2203,7 @@
- 		INDENT(+1);
- 		OUT("/* Test default value %" PRIdASN " */\n",
- 			expr->marker.default_value->value.v_integer);
--		if(fits_long) {
-+		if(fits != FL_NOTFIT) {
- 			OUT("return (*st == %" PRIdASN ");\n",
- 				expr->marker.default_value->value.v_integer);
- 		} else {
-@@ -2455,9 +2493,13 @@
- 		if(arg->flags & A1C_GEN_PER) {
- 			FUNCREF(decode_uper);
- 			FUNCREF(encode_uper);
-+			FUNCREF(decode_aper);
-+			FUNCREF(encode_aper);
- 		} else {
--			OUT("0, 0,\t/* No PER support, "
-+			OUT("0, 0,\t/* No UPER support, "
- 				"use \"-gen-PER\" to enable */\n");
-+			OUT("0, 0,\t/* No APER support, "
-+				"use \"-gen-PER\" to enable */\n");
- 		}
- 
- 		if(!terminal || terminal->expr_type == ASN_CONSTR_CHOICE) {
-Index: libasn1compiler/asn1c_constraint.c
-===================================================================
---- libasn1compiler/asn1c_constraint.c	(revision 1516)
-+++ libasn1compiler/asn1c_constraint.c	(working copy)
-@@ -35,6 +35,7 @@
- 	int alphabet_table_compiled;
- 	int produce_st = 0;
- 	int ulong_optimize = 0;
-+	enum asn1c_fitslong_e fits = FL_NOTFIT;
- 
- 	ct = expr->combined_constraints;
- 	if(ct == NULL)
-@@ -74,7 +75,8 @@
- 	switch(etype) {
- 	case ASN_BASIC_INTEGER:
- 	case ASN_BASIC_ENUMERATED:
--		if(asn1c_type_fits_long(arg, arg->expr) == FL_NOTFIT)
-+		fits = asn1c_type_fits_long(arg, arg->expr);
-+		if(fits == FL_NOTFIT)
- 			produce_st = 1;
- 		break;
- 	case ASN_BASIC_REAL:
-@@ -103,13 +105,19 @@
- 			switch(etype) {
- 			case ASN_BASIC_INTEGER:
- 			case ASN_BASIC_ENUMERATED:
--				if(native_long_sign(r_value) >= 0) {
--					ulong_optimize = ulong_optimization(etype, r_size, r_value);
--					if(!ulong_optimize) {
--						OUT("unsigned long value;\n");
-+				if(fits == FL_FITS_INT64) {
-+					OUT("int64_t value;\n");
-+				} else if(fits == FL_FITS_UINT64) {
-+					OUT("uint64_t value;\n");
-+				} else {
-+					if(native_long_sign(r_value) >= 0) {
-+						ulong_optimize = ulong_optimization(etype, r_size, r_value);
-+						if(!ulong_optimize) {
-+							OUT("unsigned long value;\n");
-+						}
-+					} else {
-+						OUT("long value;\n");
- 					}
--				} else {
--					OUT("long value;\n");
- 				}
- 				break;
- 			case ASN_BASIC_REAL:
-@@ -603,13 +611,19 @@
- 
- static int
- emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype, asn1cnst_range_t *r_value) {
-+	enum asn1c_fitslong_e fits = FL_NOTFIT;
- 
- 	switch(etype) {
- 	case ASN_BASIC_INTEGER:
- 	case ASN_BASIC_ENUMERATED:
--		if(asn1c_type_fits_long(arg, arg->expr) == FL_FITS_UNSIGN) {
-+		fits = asn1c_type_fits_long(arg, arg->expr);
-+		if(fits == FL_FITS_INT64) {
-+			OUT("value = *(const int64_t *)sptr;\n");
-+		} else if(fits == FL_FITS_UINT64) {
-+			OUT("value = *(const uint64_t *)sptr;\n");
-+		} else if(fits == FL_FITS_UNSIGN) {
- 			OUT("value = *(const unsigned long *)sptr;\n");
--		} else if(asn1c_type_fits_long(arg, arg->expr) != FL_NOTFIT) {
-+		} else if(fits != FL_NOTFIT) {
- 			OUT("value = *(const long *)sptr;\n");
- 		} else {
- 			/*
-Index: libasn1compiler/asn1c_misc.c
-===================================================================
---- libasn1compiler/asn1c_misc.c	(revision 1516)
-+++ libasn1compiler/asn1c_misc.c	(working copy)
-@@ -158,6 +158,7 @@
- 	asn1p_expr_t *terminal;
- 	int stdname = 0;
- 	char *typename;
-+	enum asn1c_fitslong_e fits;
- 
- 	/* Rewind to the topmost parent expression */
- 	if((top_parent = expr->parent_expr))
-@@ -213,15 +214,20 @@
- 	case ASN_BASIC_INTEGER:
- 	case ASN_BASIC_ENUMERATED:
- 	case ASN_BASIC_REAL:
-+		fits = asn1c_type_fits_long(arg, expr);
- 		if((expr->expr_type == ASN_BASIC_REAL
- 			&& !(arg->flags & A1C_USE_WIDE_TYPES))
--		|| asn1c_type_fits_long(arg, expr)) {
-+			|| (fits != FL_NOTFIT)) {
- 			switch(_format) {
- 			case TNF_CTYPE:
- 			case TNF_RSAFE:
- 				if(expr->expr_type == ASN_BASIC_REAL)
- 					return "double";
--				else if(asn1c_type_fits_long(arg, expr) == FL_FITS_UNSIGN)
-+				else if (fits == FL_FITS_INT64)
-+					return "int64_t";
-+				else if (fits == FL_FITS_UINT64)
-+					return "uint64_t";
-+				else if(fits == FL_FITS_UNSIGN)
- 					return "unsigned long";
- 				else
- 					return "long";
-@@ -377,11 +383,33 @@
- 	/* Special case for unsigned */
- 	if(left.type == ARE_VALUE
- 		&& left.value >= 0
--	&& right.type == ARE_VALUE
-+		&& right.type == ARE_VALUE
- 		&& right.value > 2147483647
- 		&& right.value <= 4294967295UL)
- 		return FL_FITS_UNSIGN;
--		
-+	/* Special for native 64 bits integer option */
-+	if (arg->flags & A1C_HAVE_NATIVE_64) {
-+// 		printf("left.value %lld right.value %lld\n", left.value, right.value);
-+		if(left.type == ARE_VALUE
-+			&& left.value >= 0
-+			&& right.type == ARE_VALUE
-+			&& right.value > 9223372036854775807LL
-+			&& right.value <= 18446744073709551615ULL)
-+			return FL_FITS_UINT64;
-+		if(left.type == ARE_VALUE
-+			&& left.value < -2147483648
-+			&& left.value >= -9223372036854775808LL
-+			&& right.type == ARE_VALUE
-+			&& right.value > 2147483647
-+			&& right.value <= 9223372036854775807LL)
-+			return FL_FITS_INT64;
-+		if(left.type == ARE_VALUE
-+			&& left.value >= 0
-+			&& right.type == ARE_VALUE
-+			&& right.value > 4294967295UL
-+			&& right.value <= 9223372036854775807LL)
-+			return FL_FITS_INT64;
-+	}
- 
- 	/* If some fixed value is outside of target range, not fit */
- 	if(left.type == ARE_VALUE
-Index: libasn1compiler/asn1c_misc.h
-===================================================================
---- libasn1compiler/asn1c_misc.h	(revision 1516)
-+++ libasn1compiler/asn1c_misc.h	(working copy)
-@@ -36,6 +36,8 @@
-  */
- enum asn1c_fitslong_e {
- 	FL_NOTFIT,
-+	FL_FITS_INT64,
-+	FL_FITS_UINT64,
- 	FL_FITS_SIGNED,
- 	FL_FITS_UNSIGN,
- 	FL_PRESUMED,
diff --git a/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_2.p0 b/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_2.p0
deleted file mode 100644
index 80835b1b86621a62fde0dda589135082c142ed93..0000000000000000000000000000000000000000
--- a/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_2.p0
+++ /dev/null
@@ -1,22 +0,0 @@
---- skeletons/OCTET_STRING.c.orig	2015-04-28 10:40:04.036970492 +0200
-+++ skeletons/OCTET_STRING.c	2015-04-28 10:40:09.619970869 +0200
-@@ -159,7 +159,7 @@
- }
- 
- static struct _stack *
--_new_stack() {
-+_new_stack(void) {
- 	return (struct _stack *)CALLOC(1, sizeof(struct _stack));
- }
- 
---- skeletons/converter-sample.c.orig	2015-04-28 10:40:32.164972391 +0200
-+++ skeletons/converter-sample.c	2015-04-28 10:40:37.140972727 +0200
-@@ -353,7 +353,7 @@
- } DynamicBuffer;
- 
- static void
--buffer_dump() {
-+buffer_dump(void) {
- 	uint8_t *p = DynamicBuffer.data + DynamicBuffer.offset;
- 	uint8_t *e = p + DynamicBuffer.length - (DynamicBuffer.unbits ? 1 : 0);
- 	if(!opt_debug) return;
diff --git a/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 b/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0
deleted file mode 100644
index d5a936c1018b9d3bcc96d06d532c3cddbec911d4..0000000000000000000000000000000000000000
--- a/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0
+++ /dev/null
@@ -1,1264 +0,0 @@
---- asn1c/unber.c	2015-12-08 14:39:33.282543533 +0100
-+++ asn1c/unber.c	2015-12-07 10:46:18.382647000 +0100
-@@ -779,4 +779,6 @@
- 
- asn_enc_rval_t OCTET_STRING_encode_aper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *cts, void *sptr, asn_per_outp_t *po) { asn_enc_rval_t er = { 0, 0, 0 }; (void)td; (void)cts; (void)sptr; (void)po; return er; }
- 
-+asn_comp_rval_t *  OCTET_STRING_compare(asn_TYPE_descriptor_t *td1, const void *sptr1, asn_TYPE_descriptor_t *td2, const void *sptr2) { (void)td1; (void)sptr1; (void)td2; (void)sptr2; return 0; }
-+
- size_t xer_whitespace_span(const void *chunk_buf, size_t chunk_size) {  (void)chunk_buf; (void)chunk_size; return 0; }
---- libasn1compiler/asn1c_C.c	2015-12-08 14:39:33.366543533 +0100
-+++ libasn1compiler/asn1c_C.c	2015-12-08 08:38:29.002565000 +0100
-@@ -1082,6 +1082,8 @@
- 	enum tvm_compat tv_mode;
- 	enum etd_spec etd_spec;
- 	char *p;
-+  //char tmp_buf[512];
-+  //int i = 0;
- 
- 	if(arg->embed) {
- 		enum tnfmt tnfmt = TNF_CTYPE;
-@@ -1243,7 +1245,8 @@
- 	OUT("td->uper_decoder   = asn_DEF_%s.uper_decoder;\n",   type_name);
- 	OUT("td->uper_encoder   = asn_DEF_%s.uper_encoder;\n",   type_name);
- 	OUT("td->aper_decoder   = asn_DEF_%s.aper_decoder;\n",   type_name);
--	OUT("td->aper_encoder   = asn_DEF_%s.aper_encoder;\n",   type_name);
-+  OUT("td->aper_encoder   = asn_DEF_%s.aper_encoder;\n",   type_name);
-+  OUT("td->compare        = asn_DEF_%s.compare;\n",        type_name);
- 	if(!terminal && !tags_count) {
- 	  OUT("/* The next four lines are here because of -fknown-extern-type */\n");
- 	  OUT("td->tags           = asn_DEF_%s.tags;\n",         type_name);
-@@ -1413,6 +1416,39 @@
- 	OUT("}\n");
- 	OUT("\n");
- 
-+
-+  //i = 0;
-+  //while ((p[i] != '_') && (i < sizeof(tmp_buf))) {
-+  //  tmp_buf[i] = p[i];
-+  //  i++;
-+  //}
-+  //tmp_buf[i] = '\0';
-+  // hack, only for s1ap
-+  //if ((strcmp("S1ap", tmp_buf) == 0) || (strcmp("X2ap", tmp_buf) == 0))
-+  //  OUT("#include \"%s-ProtocolIE-ID.h\"\n", tmp_buf);
-+
-+
-+  p = MKID(expr);
-+  if(HIDE_INNER_DEFS) OUT("static ");
-+              OUT("asn_comp_rval_t * \n");
-+  OUT("%s", p);
-+  if(HIDE_INNER_DEFS) OUT("_%d", expr->_type_unique_index);
-+    OUT("_compare(asn_TYPE_descriptor_t *td1,\n");
-+  INDENTED(
-+  OUT("\tconst void *structure1,\n");
-+  OUT("\tasn_TYPE_descriptor_t *td2,\n");
-+  OUT("\tconst void *structure2) {\n");
-+  OUT("asn_comp_rval_t * res  = NULL;\n");
-+  OUT("%s_%d_inherit_TYPE_descriptor(td1);\n",
-+    p, expr->_type_unique_index);
-+  OUT("%s_%d_inherit_TYPE_descriptor(td2);\n",
-+    p, expr->_type_unique_index);
-+  OUT("res = td1->compare(td1, structure1, td2, structure2);\n");
-+  OUT("return res;\n");
-+  );
-+  OUT("}\n");
-+  OUT("\n");
-+
- 	p = MKID(expr);
- 	
- 	if(HIDE_INNER_DEFS) OUT("static ");
-@@ -1450,7 +1486,8 @@
- 		OUT("per_type_decoder_f %s_decode_uper;\n", p);
- 		OUT("per_type_encoder_f %s_encode_uper;\n", p);
- 		OUT("per_type_decoder_f %s_decode_aper;\n", p);
--		OUT("per_type_encoder_f %s_encode_aper;\n", p);
-+    OUT("per_type_encoder_f %s_encode_aper;\n", p);
-+    OUT("type_compare_f     %s_compare;\n", p);
- 		}
- 	}
- 
-@@ -2501,6 +2538,7 @@
- 			OUT("0, 0,\t/* No APER support, "
- 				"use \"-gen-PER\" to enable */\n");
- 		}
-+    FUNCREF(compare);
- 
- 		if(!terminal || terminal->expr_type == ASN_CONSTR_CHOICE) {
- 		//if(expr->expr_type == ASN_CONSTR_CHOICE) {
---- skeletons/ANY.c	2015-12-08 14:39:33.350543533 +0100
-+++ skeletons/ANY.c	2015-11-26 14:40:56.547616000 +0100
-@@ -24,7 +24,8 @@
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	0, 0, 0, 0,
- 	0,	/* No PER visible constraints */
---- skeletons/asn_application.h	2015-12-08 14:39:12.674543554 +0100
-+++ skeletons/asn_application.h	2015-12-07 14:36:32.950633000 +0100
-@@ -9,7 +9,8 @@
- #define	_ASN_APPLICATION_H_
- 
- #include "asn_system.h"		/* for platform-dependent types */
--#include "asn_codecs.h"		/* for ASN.1 codecs specifics */
-+#include "asn_codecs.h"   /* for ASN.1 codecs specifics */
-+#include "asn_compare.h"
- 
- #ifdef __cplusplus
- extern "C" {
---- skeletons/asn_compare.h	1970-01-01 01:00:00.000000000 +0100
-+++ skeletons/asn_compare.h	2015-12-08 10:34:58.090558000 +0100
-@@ -0,0 +1,78 @@
-+#ifndef	_ASN_COMPARE_H_
-+#define	_ASN_COMPARE_H_
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+struct asn_TYPE_descriptor_s;	/* Forward declaration */
-+
-+
-+typedef enum COMPARE_ERR_CODE_e {
-+  COMPARE_ERR_CODE_START = 0,
-+  COMPARE_ERR_CODE_NONE = COMPARE_ERR_CODE_START,
-+  COMPARE_ERR_CODE_NO_MATCH,
-+  COMPARE_ERR_CODE_TYPE_MISMATCH,
-+  COMPARE_ERR_CODE_TYPE_ARG_NULL,
-+  COMPARE_ERR_CODE_VALUE_NULL,
-+  COMPARE_ERR_CODE_VALUE_ARG_NULL,
-+  COMPARE_ERR_CODE_CHOICE_NUM,
-+  COMPARE_ERR_CODE_CHOICE_PRESENT,
-+  COMPARE_ERR_CODE_CHOICE_MALFORMED,
-+  COMPARE_ERR_CODE_SET_MALFORMED,
-+  COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS,
-+  COMPARE_ERR_CODE_END
-+} COMPARE_ERR_CODE_t;
-+
-+typedef struct asn_comp_rval_s {
-+  enum COMPARE_ERR_CODE_e err_code;
-+  char                   *name; // e_S1ap_ProtocolIE_ID not available for all ASN1 use (RRC vs S1AP, X2AP)
-+  const void             *structure1;
-+  const void             *structure2;
-+  struct asn_comp_rval_s *next;
-+} asn_comp_rval_t;
-+
-+#define COMPARE_CHECK_ARGS(aRg_tYpE_dEf1, aRg_tYpE_dEf2, aRg_vAl1, aRg_vAl2, rEsUlT) \
-+    do {\
-+      if ((aRg_tYpE_dEf1) && (aRg_tYpE_dEf2)) {\
-+        if ((aRg_tYpE_dEf1->name) && (aRg_tYpE_dEf2->name)) {\
-+          if (strcmp(aRg_tYpE_dEf1->name, aRg_tYpE_dEf2->name)) {\
-+            rEsUlT           = (asn_comp_rval_t *)calloc(1, sizeof(asn_comp_rval_t));\
-+            rEsUlT->err_code = COMPARE_ERR_CODE_TYPE_MISMATCH;\
-+            rEsUlT->name     = aRg_tYpE_dEf1->name;\
-+            return rEsUlT;\
-+          }\
-+        } else {\
-+          if ((aRg_tYpE_dEf1->xml_tag) && (aRg_tYpE_dEf2->xml_tag)) {\
-+            if (strcmp(aRg_tYpE_dEf1->xml_tag, aRg_tYpE_dEf2->xml_tag)) {\
-+              rEsUlT           = (asn_comp_rval_t *)calloc(1, sizeof(asn_comp_rval_t));\
-+              rEsUlT->err_code = COMPARE_ERR_CODE_TYPE_MISMATCH;\
-+              rEsUlT->name     = aRg_tYpE_dEf1->xml_tag;\
-+              return rEsUlT;\
-+            }\
-+          }\
-+        }\
-+      } else {\
-+        rEsUlT             = (asn_comp_rval_t *)calloc(1, sizeof(asn_comp_rval_t));\
-+        rEsUlT->name       = aRg_tYpE_dEf1->name;\
-+        rEsUlT->structure1 = aRg_vAl1;\
-+        rEsUlT->structure2 = aRg_vAl2;\
-+        rEsUlT->err_code   = COMPARE_ERR_CODE_TYPE_ARG_NULL;\
-+        return rEsUlT;\
-+      }\
-+      if ((NULL == aRg_vAl1) || (NULL == aRg_vAl2)){\
-+        rEsUlT             = (asn_comp_rval_t *)calloc(1, sizeof(asn_comp_rval_t));\
-+        rEsUlT->name       = aRg_tYpE_dEf1->name;\
-+        rEsUlT->structure1 = aRg_vAl1;\
-+        rEsUlT->structure2 = aRg_vAl2;\
-+        rEsUlT->err_code   = COMPARE_ERR_CODE_VALUE_ARG_NULL;\
-+        return rEsUlT;\
-+      }\
-+    } while (0);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif	/* _ASN_COMPARE_H_ */
---- skeletons/BIT_STRING.c	2015-12-08 14:39:33.346543533 +0100
-+++ skeletons/BIT_STRING.c	2015-11-26 14:41:50.159616000 +0100
-@@ -30,7 +30,8 @@
- 	OCTET_STRING_decode_uper,	/* Unaligned PER decoder */
- 	OCTET_STRING_encode_uper,	/* Unaligned PER encoder */
- 	OCTET_STRING_decode_aper,	/* Aligned PER decoder */
--	OCTET_STRING_encode_aper,	/* Aligned PER encoder */
-+  OCTET_STRING_encode_aper, /* Aligned PER encoder */
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_BIT_STRING_tags,
- 	sizeof(asn_DEF_BIT_STRING_tags)
---- skeletons/BMPString.c	2015-12-08 14:39:33.338543533 +0100
-+++ skeletons/BMPString.c	2015-11-26 14:42:08.487616000 +0100
-@@ -36,7 +36,8 @@
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,	/* Aligned PER decoder */
--	OCTET_STRING_encode_aper,	/* Aligned PER encoder */
-+  OCTET_STRING_encode_aper, /* Aligned PER encoder */
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_BMPString_tags,
- 	sizeof(asn_DEF_BMPString_tags)
---- skeletons/BOOLEAN.c	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/BOOLEAN.c	2015-12-08 10:37:11.866558000 +0100
-@@ -25,7 +25,8 @@
- 	BOOLEAN_decode_uper,	/* Unaligned PER decoder */
- 	BOOLEAN_encode_uper,	/* Unaligned PER encoder */
- 	BOOLEAN_decode_aper,	/* Aligned PER decoder */
--	BOOLEAN_encode_aper,	/* Aligned PER encoder */
-+  BOOLEAN_encode_aper,  /* Aligned PER encoder */
-+  BOOLEAN_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_BOOLEAN_tags,
- 	sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]),
-@@ -326,3 +327,22 @@
- 
- 	_ASN_ENCODED_OK(er);
- }
-+
-+asn_comp_rval_t *
-+BOOLEAN_compare(asn_TYPE_descriptor_t *td1,
-+  const void *sptr1, asn_TYPE_descriptor_t *td2, const void *sptr2) {
-+  const BOOLEAN_t *st1 = (const BOOLEAN_t *)sptr1;
-+  const BOOLEAN_t *st2 = (const BOOLEAN_t *)sptr2;
-+  asn_comp_rval_t *res = NULL;
-+
-+  COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
-+
-+  if (*st1 == *st2) return NULL;
-+  res = calloc(1, sizeof(asn_comp_rval_t));
-+  res->name = td1->name;
-+  res->structure1 = sptr1;
-+  res->structure2 = sptr2;
-+  res->err_code = COMPARE_ERR_CODE_NO_MATCH;
-+  return res;
-+}
-+
---- skeletons/BOOLEAN.h	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/BOOLEAN.h	2015-11-26 12:46:58.491623000 +0100
-@@ -30,6 +30,7 @@
- per_type_encoder_f BOOLEAN_encode_uper;
- per_type_decoder_f BOOLEAN_decode_aper;
- per_type_encoder_f BOOLEAN_encode_aper;
-+type_compare_f     BOOLEAN_compare;
- 
- #ifdef __cplusplus
- }
---- skeletons/compare.h	1970-01-01 01:00:00.000000000 +0100
-+++ skeletons/compare.h	2015-12-08 08:23:03.694566000 +0100
-@@ -0,0 +1,28 @@
-+/*-
-+ * Eurecom 2015.
-+ */
-+#ifndef	_COMPARE_H_
-+#define	_COMPARE_H_
-+
-+#include <asn_application.h>
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+struct asn_TYPE_descriptor_s;	/* Forward declaration */
-+
-+typedef asn_comp_rval_t * (type_compare_f)(
-+  struct asn_TYPE_descriptor_s *type_descriptor1,
-+  const void *struct_ptr1,
-+  struct asn_TYPE_descriptor_s *type_descriptor2,
-+  const void *struct_ptr2
-+);
-+
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif	/* _COMPARE_H_ */
---- skeletons/constr_CHOICE.c	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/constr_CHOICE.c	2015-12-08 10:39:16.670558000 +0100
-@@ -1272,3 +1272,75 @@
- 		assert(pres_size != sizeof(int));
- 	}
- }
-+
-+asn_comp_rval_t *
-+CHOICE_compare(asn_TYPE_descriptor_t *td1, const void *sptr1, asn_TYPE_descriptor_t *td2, const void *sptr2)
-+{
-+  asn_CHOICE_specifics_t *specs1 = (asn_CHOICE_specifics_t *)td1->specifics;
-+  asn_CHOICE_specifics_t *specs2 = (asn_CHOICE_specifics_t *)td2->specifics;
-+  int present1;
-+  int present2;
-+  asn_comp_rval_t *res = NULL;
-+
-+  COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
-+
-+  /*
-+   * Figure out which CHOICE element is encoded.
-+   */
-+  present1 = _fetch_present_idx(sptr1, specs1->pres_offset,specs1->pres_size);
-+  // same specs
-+  present2 = _fetch_present_idx(sptr2, specs2->pres_offset,specs2->pres_size);
-+
-+  if (td1->elements_count != td2->elements_count) {
-+    res = calloc(1, sizeof(asn_comp_rval_t));
-+    res->name = td1->name;
-+    res->structure1 = sptr1;
-+    res->structure2 = sptr2;
-+    res->err_code = COMPARE_ERR_CODE_CHOICE_NUM;
-+    return res;
-+  }
-+  if (present1 != present2) {
-+    res = calloc(1, sizeof(asn_comp_rval_t));
-+    res->name = td1->name;
-+    res->structure1 = sptr1;
-+    res->structure2 = sptr2;
-+    res->err_code = COMPARE_ERR_CODE_CHOICE_PRESENT;
-+    return res;
-+  }
-+  if(present1 > 0 && present1 <= td1->elements_count) {
-+    asn_TYPE_member_t *elm1 = &td1->elements[present1-1];
-+    asn_TYPE_member_t *elm2 = &td2->elements[present2-1];
-+    const void *memb_ptr1;
-+    const void *memb_ptr2;
-+
-+    if((elm1->flags & ATF_POINTER) && (elm1->flags & ATF_POINTER)){
-+      memb_ptr1 = *(const void * const *)((const char *)sptr1 + elm1->memb_offset);
-+      memb_ptr2 = *(const void * const *)((const char *)sptr2 + elm2->memb_offset);
-+      if((!memb_ptr1) || (!memb_ptr2)) {
-+        res = calloc(1, sizeof(asn_comp_rval_t));
-+        res->name = td1->name;
-+        res->structure1 = sptr1;
-+        res->structure2 = sptr2;
-+        res->err_code = COMPARE_ERR_CODE_VALUE_NULL;
-+        return res;
-+      }
-+    } else if (!(elm1->flags & ATF_POINTER) && !(elm1->flags & ATF_POINTER)){
-+      memb_ptr1 = (const void *)((const char *)sptr1 + elm1->memb_offset);
-+      memb_ptr2 = (const void *)((const char *)sptr2 + elm2->memb_offset);
-+    } else {
-+      res = calloc(1, sizeof(asn_comp_rval_t));
-+      res->name = td1->name;
-+      res->structure1 = sptr1;
-+      res->structure2 = sptr2;
-+      res->err_code = COMPARE_ERR_CODE_CHOICE_MALFORMED;
-+      return res;
-+    }
-+    return elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2);
-+  }
-+  res = calloc(1, sizeof(asn_comp_rval_t));
-+  res->name = td1->name;
-+  res->structure1 = sptr1;
-+  res->structure2 = sptr2;
-+  res->err_code = COMPARE_ERR_CODE_CHOICE_MALFORMED;
-+  return res;
-+}
---- skeletons/constr_CHOICE.h	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/constr_CHOICE.h	2015-11-26 14:43:57.647616000 +0100
-@@ -39,7 +39,7 @@
- /*
-  * A set specialized functions dealing with the CHOICE type.
-  */
--asn_struct_free_f CHOICE_free;
-+asn_struct_free_f  CHOICE_free;
- asn_struct_print_f CHOICE_print;
- asn_constr_check_f CHOICE_constraint;
- ber_type_decoder_f CHOICE_decode_ber;
-@@ -50,7 +50,8 @@
- per_type_encoder_f CHOICE_encode_uper;
- per_type_decoder_f CHOICE_decode_aper;
- per_type_encoder_f CHOICE_encode_aper;
--asn_outmost_tag_f CHOICE_outmost_tag;
-+type_compare_f     CHOICE_compare;
-+asn_outmost_tag_f  CHOICE_outmost_tag;
- 
- #ifdef __cplusplus
- }
---- skeletons/constr_SEQUENCE.c	2015-12-08 14:39:33.346543533 +0100
-+++ skeletons/constr_SEQUENCE.c	2015-12-08 10:39:52.442558000 +0100
-@@ -1761,3 +1761,65 @@
- 
- 	_ASN_ENCODED_OK(er);
- }
-+
-+asn_comp_rval_t * SEQUENCE_compare(asn_TYPE_descriptor_t *td1, const void *sptr1, asn_TYPE_descriptor_t *td2, const void *sptr2) {
-+  int edx;
-+  asn_comp_rval_t *res = NULL;
-+  asn_comp_rval_t *res2 = NULL;
-+
-+  COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
-+
-+  if (td1->elements_count != td2->elements_count) {
-+    res = calloc(1, sizeof(asn_comp_rval_t));
-+    res->name = td1->name;
-+    res->structure1 = sptr1;
-+    res->structure2 = sptr2;
-+    res->err_code = COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS;
-+    return res;
-+  }
-+
-+  for(edx = 0; edx < td1->elements_count; edx++) {
-+    asn_TYPE_member_t *elm1 = &td1->elements[edx];
-+    asn_TYPE_member_t *elm2 = &td1->elements[edx];
-+    const void *memb_ptr1;
-+    const void *memb_ptr2;
-+
-+    if(elm1->flags & ATF_POINTER) {
-+      memb_ptr1 = *(const void * const *)((const char *)sptr1 + elm1->memb_offset);
-+      memb_ptr2 = *(const void * const *)((const char *)sptr2 + elm2->memb_offset);
-+      if((!memb_ptr1) && (!memb_ptr2)) {
-+        if(elm1->optional) continue;
-+      }
-+      if ((!memb_ptr1) || (!memb_ptr2)) {
-+        res2 = calloc(1, sizeof(asn_comp_rval_t));
-+        res2->name = elm1->name;
-+        res2->structure1 = memb_ptr1;
-+        res2->structure2 = memb_ptr2;
-+        res->err_code = COMPARE_ERR_CODE_VALUE_NULL;
-+        if (NULL == res) {
-+          res = res2;
-+        } else {
-+          res2->next = res;
-+          res = res2;
-+        }
-+        res2 = NULL;
-+      }
-+    } else {
-+      memb_ptr1 = (const void *)((const char *)sptr1 + elm1->memb_offset);
-+      memb_ptr2 = (const void *)((const char *)sptr2 + elm2->memb_offset);
-+    }
-+
-+    /* Compare the member itself */
-+    res2 = elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2);
-+    if(res2) {
-+      if (NULL == res) {
-+        res = res2;
-+      } else {
-+        res2->next = res;
-+        res = res2;
-+      }
-+      res2 = NULL;
-+    }
-+  }
-+  return res;
-+}
---- skeletons/constr_SEQUENCE.h	2015-12-08 14:39:33.346543533 +0100
-+++ skeletons/constr_SEQUENCE.h	2015-11-26 14:48:14.123616000 +0100
-@@ -54,6 +54,7 @@
- per_type_encoder_f SEQUENCE_encode_uper;
- per_type_decoder_f SEQUENCE_decode_aper;
- per_type_encoder_f SEQUENCE_encode_aper;
-+type_compare_f     SEQUENCE_compare;
- 
- #ifdef __cplusplus
- }
---- skeletons/constr_SEQUENCE_OF.h	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/constr_SEQUENCE_OF.h	2015-11-26 15:05:25.399615000 +0100
-@@ -22,7 +22,8 @@
- #define	SEQUENCE_OF_decode_ber	SET_OF_decode_ber
- #define	SEQUENCE_OF_decode_xer	SET_OF_decode_xer
- #define	SEQUENCE_OF_decode_uper	SET_OF_decode_uper
--#define	SEQUENCE_OF_decode_aper	SET_OF_decode_aper
-+#define SEQUENCE_OF_decode_aper SET_OF_decode_aper
-+#define SEQUENCE_OF_compare     SET_OF_compare
- der_type_encoder_f SEQUENCE_OF_encode_der;
- xer_type_encoder_f SEQUENCE_OF_encode_xer;
- per_type_encoder_f SEQUENCE_OF_encode_uper;
---- skeletons/constr_SET.c	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/constr_SET.c	2015-12-08 10:40:35.066558000 +0100
-@@ -1108,7 +1108,7 @@
- 	}
- }
- 
--int
-+long
- SET_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
- 		asn_app_constraint_failed_f *ctfailcb, void *app_key) {
- 	int edx;
-@@ -1159,3 +1159,58 @@
- 
- 	return 0;
- }
-+
-+asn_comp_rval_t *
-+SET_compare(asn_TYPE_descriptor_t *td1, const void *sptr1, asn_TYPE_descriptor_t *td2, const void *sptr2)
-+{
-+  int edx;
-+  asn_comp_rval_t *res = NULL;
-+  asn_comp_rval_t *res2 = NULL;
-+
-+  COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
-+
-+  if (td1->elements_count != td2->elements_count) {
-+    res = calloc(1, sizeof(asn_comp_rval_t));
-+    res->name = td1->name;
-+    res->structure1 = sptr1;
-+    res->structure2 = sptr2;
-+    res->err_code = COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS;
-+    return res;
-+  }
-+
-+  for(edx = 0; edx < td1->elements_count; edx++) {
-+    asn_TYPE_member_t *elm1 = &td1->elements[edx];
-+    asn_TYPE_member_t *elm2 = &td2->elements[edx];
-+    const void *memb_ptr1;
-+    const void *memb_ptr2;
-+
-+    if(elm1->flags & ATF_POINTER) {
-+      memb_ptr1 = *(const void * const *)((const char *)sptr1 + elm1->memb_offset);
-+      memb_ptr2 = *(const void * const *)((const char *)sptr2 + elm2->memb_offset);
-+      if(!memb_ptr1) {
-+        if(elm1->optional)
-+          continue;
-+        res = calloc(1, sizeof(asn_comp_rval_t));
-+        res->name = td1->name;
-+        res->structure1 = sptr1;
-+        res->structure2 = sptr2;
-+        res->err_code = COMPARE_ERR_CODE_SET_MALFORMED;
-+        return res;
-+      }
-+    } else {
-+      memb_ptr1 = (const void *)((const char *)sptr1 + elm1->memb_offset);
-+      memb_ptr2 = (const void *)((const char *)sptr2 + elm2->memb_offset);
-+    }
-+    res2 = elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2);
-+    if(res2) {
-+      if (NULL == res) {
-+        res = res2;
-+      } else {
-+        res2->next = res;
-+        res = res2;
-+      }
-+      res2 = NULL;
-+    }
-+  }
-+  return res;
-+}
---- skeletons/constr_SET.h	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/constr_SET.h	2015-11-26 14:49:09.243616000 +0100
-@@ -56,6 +56,7 @@
- per_type_decoder_f SET_decode_aper;
- per_type_encoder_f SET_encode_uper;
- per_type_encoder_f SET_encode_aper;
-+type_compare_f     SET_compare;
- 
- /***********************
-  * Some handy helpers. *
---- skeletons/constr_SET_OF.c	2015-12-08 14:39:33.338543533 +0100
-+++ skeletons/constr_SET_OF.c	2015-12-08 10:45:54.466557000 +0100
-@@ -1039,3 +1039,54 @@
- 	rv.consumed = 0;
- 	return rv;
- }
-+
-+asn_comp_rval_t *
-+SET_OF_compare(asn_TYPE_descriptor_t *td1, const void *sptr1, asn_TYPE_descriptor_t *td2, const void *sptr2)
-+{
-+  asn_TYPE_member_t *elm1 = td1->elements;
-+  asn_TYPE_member_t *elm2 = td2->elements;
-+  const asn_anonymous_set_ *list1 = _A_CSET_FROM_VOID(sptr1);
-+  const asn_anonymous_set_ *list2 = _A_CSET_FROM_VOID(sptr2);
-+  int i;
-+  asn_comp_rval_t *res = NULL;
-+  asn_comp_rval_t *res2 = NULL;
-+
-+  COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
-+
-+  if (td1->elements_count != td2->elements_count) {
-+    res = calloc(1, sizeof(asn_comp_rval_t));
-+    res->name = td1->name;
-+    res->structure1 = sptr1;
-+    res->structure2 = sptr2;
-+    res->err_code = COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS;
-+    return res;
-+  }
-+
-+
-+  if (list1->count != list2->count ) {
-+    res = calloc(1, sizeof(asn_comp_rval_t));
-+    res->name = td1->name;
-+    res->structure1 = sptr1;
-+    res->structure2 = sptr2;
-+    res->err_code = COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS;
-+    return res;
-+  }
-+
-+  for(i = 0; i < list1->count; i++) {
-+    const void *memb_ptr1 = list1->array[i];
-+    const void *memb_ptr2 = list2->array[i];
-+    if ((!memb_ptr1) & (!memb_ptr2)) continue;
-+
-+    res2 = elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2);
-+    if(res2) {
-+      if (NULL == res) {
-+        res = res2;
-+      } else {
-+        res2->next = res;
-+        res = res2;
-+      }
-+      res2 = NULL;
-+    }
-+  }
-+  return  res;
-+}
---- skeletons/constr_SET_OF.h	2015-12-08 14:39:33.338543533 +0100
-+++ skeletons/constr_SET_OF.h	2015-11-26 14:48:45.067616000 +0100
-@@ -36,6 +36,7 @@
- per_type_encoder_f SET_OF_encode_uper;
- per_type_decoder_f SET_OF_decode_aper;
- per_type_encoder_f SET_OF_encode_aper;
-+type_compare_f     SET_OF_compare;
- 
- #ifdef __cplusplus
- }
---- skeletons/constr_TYPE.h	2015-12-08 14:39:33.338543533 +0100
-+++ skeletons/constr_TYPE.h	2015-11-26 15:28:05.495613000 +0100
-@@ -41,7 +41,8 @@
- #include <xer_encoder.h>	/* Encoder into XER (XML, text) */
- #include <per_decoder.h>	/* Packet Encoding Rules decoder */
- #include <per_encoder.h>	/* Packet Encoding Rules encoder */
--#include <constraints.h>	/* Subtype constraints support */
-+#include <constraints.h>  /* Subtype constraints support */
-+#include <compare.h>      /* Comparison */
- 
- /*
-  * Free the structure according to its specification.
-@@ -101,6 +102,7 @@
- 	per_type_encoder_f *uper_encoder;	/* Unaligned PER encoder */
- 	per_type_decoder_f *aper_decoder;	/* Aligned PER decoder */
- 	per_type_encoder_f *aper_encoder;	/* Aligned PER encoder */
-+	type_compare_f     *compare;      /* Comparison between 2 instances */
- 
- 	/***********************************************************************
- 	 * Internally useful members. Not to be used by applications directly. *
---- skeletons/ENUMERATED.c	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/ENUMERATED.c	2015-12-08 10:40:55.986558000 +0100
-@@ -27,7 +27,8 @@
- 	ENUMERATED_decode_uper,	/* Unaligned PER decoder */
- 	ENUMERATED_encode_uper,	/* Unaligned PER encoder */
- 	ENUMERATED_decode_aper,	/* Aligned PER decoder */
--	ENUMERATED_encode_aper,	/* Aligned PER encoder */
-+  ENUMERATED_encode_aper, /* Aligned PER encoder */
-+  ENUMERATED_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_ENUMERATED_tags,
- 	sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]),
-@@ -103,3 +104,22 @@
- 	
- 	return NativeEnumerated_encode_aper(td, constraints, &value, po);
- }
-+
-+asn_comp_rval_t *
-+ENUMERATED_compare(asn_TYPE_descriptor_t *td1, const void *sptr1,
-+                   asn_TYPE_descriptor_t *td2, const void *sptr2) {
-+  const ENUMERATED_t *st1 = (const ENUMERATED_t *)sptr1;
-+  const ENUMERATED_t *st2 = (const ENUMERATED_t *)sptr2;
-+  asn_comp_rval_t *res = NULL;
-+
-+  COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
-+
-+  if (*st1 == *st2) return NULL;
-+  res = calloc(1, sizeof(asn_comp_rval_t));
-+  res->name = td1->name;
-+  res->structure1 = sptr1;
-+  res->structure2 = sptr2;
-+  res->err_code = COMPARE_ERR_CODE_NO_MATCH;
-+  return res;
-+}
-+
---- skeletons/ENUMERATED.h	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/ENUMERATED.h	2015-11-26 12:46:35.523623000 +0100
-@@ -19,6 +19,7 @@
- per_type_encoder_f ENUMERATED_encode_uper;
- per_type_decoder_f ENUMERATED_decode_aper;
- per_type_encoder_f ENUMERATED_encode_aper;
-+type_compare_f     ENUMERATED_compare;
- 
- #ifdef __cplusplus
- }
---- skeletons/file-dependencies	2015-12-08 14:39:12.678543554 +0100
-+++ skeletons/file-dependencies	2015-12-07 15:34:40.454629000 +0100
-@@ -39,12 +39,13 @@
- constr_SEQUENCE.h constr_SEQUENCE.c
- constr_SEQUENCE_OF.h constr_SEQUENCE_OF.c asn_SEQUENCE_OF.h constr_SET_OF.h
- constr_SET.h constr_SET.c
--constr_SET_OF.h constr_SET_OF.c asn_SET_OF.h
-+constr_SET_OF.h constr_SET_OF.c asn_SET_OF.h compare.h
- 
- COMMON-FILES:			# THIS IS A SPECIAL SECTION
--asn_application.h		# Applications should include this file
-+asn_application.h   # Applications should include this file
- asn_system.h			# Platform-dependent types
--asn_codecs.h			# Return types of encoders and decoders
-+asn_codecs.h      # Return types of encoders and decoders
-+asn_compare.h     # Return type of compare
- asn_internal.h			# Internal stuff
- OCTET_STRING.h OCTET_STRING.c	# This one is used too widely
- BIT_STRING.h BIT_STRING.c	# This one is necessary for the above one
---- skeletons/GeneralizedTime.c	2015-12-08 14:39:33.350543533 +0100
-+++ skeletons/GeneralizedTime.c	2015-11-26 15:09:03.899615000 +0100
-@@ -168,7 +168,8 @@
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_GeneralizedTime_tags,
- 	sizeof(asn_DEF_GeneralizedTime_tags)
---- skeletons/GeneralString.c	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/GeneralString.c	2015-11-26 14:50:11.843616000 +0100
-@@ -25,7 +25,8 @@
- 	OCTET_STRING_decode_uper,    /* Implemented in terms of OCTET STRING */
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_GeneralString_tags,
- 	sizeof(asn_DEF_GeneralString_tags)
---- skeletons/GraphicString.c	2015-12-08 14:39:33.350543533 +0100
-+++ skeletons/GraphicString.c	2015-11-26 15:33:33.255613000 +0100
-@@ -25,7 +25,8 @@
- 	OCTET_STRING_decode_uper,    /* Implemented in terms of OCTET STRING */
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_GraphicString_tags,
- 	sizeof(asn_DEF_GraphicString_tags)
---- skeletons/IA5String.c	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/IA5String.c	2015-11-26 14:50:44.219616000 +0100
-@@ -31,6 +31,7 @@
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
- 	OCTET_STRING_encode_aper,
-+	OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_IA5String_tags,
- 	sizeof(asn_DEF_IA5String_tags)
---- skeletons/INTEGER.c	2015-12-08 14:39:33.346543533 +0100
-+++ skeletons/INTEGER.c	2015-12-08 10:41:08.526558000 +0100
-@@ -35,6 +35,7 @@
- 	INTEGER_decode_aper,
- 	INTEGER_encode_aper,
- #endif	/* ASN_DISABLE_PER_SUPPORT */
-+	INTEGER_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_INTEGER_tags,
- 	sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]),
-@@ -1501,3 +1502,30 @@
- }
- 
- 
-+asn_comp_rval_t *
-+INTEGER_compare(asn_TYPE_descriptor_t *td1, const void *sptr1,
-+                asn_TYPE_descriptor_t *td2, const void *sptr2) {
-+  const INTEGER_t *st1 = (const INTEGER_t *)sptr1;
-+  const INTEGER_t *st2 = (const INTEGER_t *)sptr2;
-+  asn_comp_rval_t *res = NULL;
-+
-+  COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
-+
-+  if (st1->size != st2->size) {
-+    res = calloc(1, sizeof(asn_comp_rval_t));
-+    res->name = td1->name;
-+    res->structure1 = sptr1;
-+    res->structure2 = sptr2;
-+    res->err_code = COMPARE_ERR_CODE_NO_MATCH;
-+    return res;
-+  }
-+  if (0 != memcmp(st1->buf, st2->buf, st1->size)) {
-+    res = calloc(1, sizeof(asn_comp_rval_t));
-+    res->name = td1->name;
-+    res->structure1 = sptr1;
-+    res->structure2 = sptr2;
-+    res->err_code = COMPARE_ERR_CODE_NO_MATCH;
-+    return res;
-+  }
-+  return NULL;
-+}
---- skeletons/INTEGER.h	2015-12-08 14:39:33.346543533 +0100
-+++ skeletons/INTEGER.h	2015-11-26 12:50:41.551623000 +0100
-@@ -43,6 +43,7 @@
- per_type_encoder_f INTEGER_encode_uper;
- per_type_decoder_f INTEGER_decode_aper;
- per_type_encoder_f INTEGER_encode_aper;
-+type_compare_f     INTEGER_compare;
- 
- /***********************************
-  * Some handy conversion routines. *
---- skeletons/ISO646String.c	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/ISO646String.c	2015-11-26 12:55:48.327623000 +0100
-@@ -30,7 +30,8 @@
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_ISO646String_tags,
- 	sizeof(asn_DEF_ISO646String_tags)
---- skeletons/Makefile.am	2015-12-08 14:39:12.666543554 +0100
-+++ skeletons/Makefile.am	2015-12-07 15:54:00.150628000 +0100
-@@ -46,11 +46,11 @@
- 	asn_SET_OF.c asn_SET_OF.h			\
- 	asn_application.h asn_codecs.h			\
- 	asn_codecs_prim.c asn_codecs_prim.h		\
--	asn_internal.h asn_system.h			\
-+	asn_internal.h asn_system.h asn_compare.h			\
- 	ber_decoder.c ber_decoder.h			\
- 	ber_tlv_length.c ber_tlv_length.h		\
--	ber_tlv_tag.c ber_tlv_tag.h			\
--	constr_CHOICE.c constr_CHOICE.h			\
-+	ber_tlv_tag.c ber_tlv_tag.h compare.h			\
-+	comparison.h constr_CHOICE.c constr_CHOICE.h			\
- 	constr_SEQUENCE.c constr_SEQUENCE.h		\
- 	constr_SEQUENCE_OF.c constr_SEQUENCE_OF.h	\
- 	constr_SET.c constr_SET.h			\
---- skeletons/NativeEnumerated.c	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/NativeEnumerated.c	2015-12-08 10:41:17.662558000 +0100
-@@ -31,7 +31,8 @@
- 	NativeEnumerated_decode_uper,
- 	NativeEnumerated_encode_uper,
- 	NativeEnumerated_decode_aper,
--	NativeEnumerated_encode_aper,
-+  NativeEnumerated_encode_aper,
-+  NativeEnumerated_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_NativeEnumerated_tags,
- 	sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]),
-@@ -335,3 +336,22 @@
- 
- 	_ASN_ENCODED_OK(er);
- }
-+
-+asn_comp_rval_t *
-+NativeEnumerated_compare(asn_TYPE_descriptor_t *td1, const void *sptr1,
-+    asn_TYPE_descriptor_t *td2, const void *sptr2) {
-+  const asn_INTEGER_enum_map_t *a = sptr1;
-+  const asn_INTEGER_enum_map_t *b = sptr2;
-+  asn_comp_rval_t *res = NULL;
-+
-+  COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
-+
-+  if(a->nat_value == b->nat_value)
-+    return NULL;
-+  res = calloc(1, sizeof(asn_comp_rval_t));
-+  res->name = td1->name;
-+  res->structure1 = sptr1;
-+  res->structure2 = sptr2;
-+  res->err_code = COMPARE_ERR_CODE_NO_MATCH;
-+  return res;
-+}
---- skeletons/NativeEnumerated.h	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/NativeEnumerated.h	2015-11-26 14:51:43.315616000 +0100
-@@ -26,6 +26,7 @@
- per_type_encoder_f NativeEnumerated_encode_uper;
- per_type_decoder_f NativeEnumerated_decode_aper;
- per_type_encoder_f NativeEnumerated_encode_aper;
-+type_compare_f     NativeEnumerated_compare;
- 
- #ifdef __cplusplus
- }
---- skeletons/NativeInteger.c	2015-12-08 14:39:33.346543533 +0100
-+++ skeletons/NativeInteger.c	2015-12-08 10:41:24.550558000 +0100
-@@ -32,7 +32,8 @@
- 	NativeInteger_decode_uper,	/* Unaligned PER decoder */
- 	NativeInteger_encode_uper,	/* Unaligned PER encoder */
- 	NativeInteger_decode_aper,	/* Aligned PER decoder */
--	NativeInteger_encode_aper,	/* Aligned PER encoder */
-+  NativeInteger_encode_aper,  /* Aligned PER encoder */
-+  NativeInteger_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_NativeInteger_tags,
- 	sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]),
-@@ -410,3 +411,21 @@
- 	}
- }
- 
-+
-+asn_comp_rval_t *
-+NativeInteger_compare(asn_TYPE_descriptor_t *td1, const void *sptr1,
-+                      asn_TYPE_descriptor_t *td2, const void *sptr2) {
-+  const long *native1 = (const long *)sptr1;
-+  const long *native2 = (const long *)sptr2;
-+  asn_comp_rval_t *res = NULL;
-+
-+  COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
-+
-+  if (*native1 == *native2) return NULL;
-+  res = calloc(1, sizeof(asn_comp_rval_t));
-+  res->name = td1->name;
-+  res->structure1 = sptr1;
-+  res->structure2 = sptr2;
-+  res->err_code = COMPARE_ERR_CODE_NO_MATCH;
-+  return res;
-+}
---- skeletons/NativeInteger.h	2015-12-08 14:39:33.346543533 +0100
-+++ skeletons/NativeInteger.h	2015-11-26 14:52:13.931616000 +0100
-@@ -31,6 +31,7 @@
- per_type_encoder_f NativeInteger_encode_uper;
- per_type_decoder_f NativeInteger_decode_aper;
- per_type_encoder_f NativeInteger_encode_aper;
-+type_compare_f     NativeInteger_compare;
- 
- #ifdef __cplusplus
- }
---- skeletons/NativeReal.c	2015-12-08 14:39:33.350543533 +0100
-+++ skeletons/NativeReal.c	2015-12-08 10:41:32.666558000 +0100
-@@ -33,7 +33,8 @@
- 	NativeReal_decode_uper,
- 	NativeReal_encode_uper,
- 	NativeReal_decode_aper,
--	NativeReal_encode_aper,
-+  NativeReal_encode_aper,
-+  NativeReal_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_NativeReal_tags,
- 	sizeof(asn_DEF_NativeReal_tags) / sizeof(asn_DEF_NativeReal_tags[0]),
-@@ -405,3 +406,30 @@
- 	}
- }
- 
-+asn_comp_rval_t *
-+NativeReal_compare(asn_TYPE_descriptor_t *td1, const void *sptr1,
-+                   asn_TYPE_descriptor_t *td2, const void *sptr2) {
-+  const REAL_t *st1 = (const REAL_t *)sptr1;
-+  const REAL_t *st2 = (const REAL_t *)sptr2;
-+  asn_comp_rval_t *res = NULL;
-+
-+  COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
-+
-+  if (st1->size != st2->size) {
-+    res = calloc(1, sizeof(asn_comp_rval_t));
-+    res->name = td1->name;
-+    res->structure1 = sptr1;
-+    res->structure2 = sptr2;
-+    res->err_code = COMPARE_ERR_CODE_NO_MATCH;
-+    return res;
-+  }
-+  if (0 != memcmp(st1->buf, st2->buf, st1->size)) {
-+    res = calloc(1, sizeof(asn_comp_rval_t));
-+    res->name = td1->name;
-+    res->structure1 = sptr1;
-+    res->structure2 = sptr2;
-+    res->err_code = COMPARE_ERR_CODE_NO_MATCH;
-+    return res;
-+  }
-+  return NULL;
-+}
---- skeletons/NativeReal.h	2015-12-08 14:39:33.350543533 +0100
-+++ skeletons/NativeReal.h	2015-11-26 14:31:12.631617000 +0100
-@@ -29,6 +29,7 @@
- per_type_encoder_f NativeReal_encode_uper;
- per_type_decoder_f NativeReal_decode_aper;
- per_type_encoder_f NativeReal_encode_aper;
-+type_compare_f     NativeReal_compare;
- 
- #ifdef __cplusplus
- }
---- skeletons/NULL.c	2015-12-08 14:39:33.338543533 +0100
-+++ skeletons/NULL.c	2015-12-07 10:49:05.178647000 +0100
-@@ -26,7 +26,8 @@
- 	NULL_decode_uper,	/* Unaligned PER decoder */
- 	NULL_encode_uper,	/* Unaligned PER encoder */
- 	NULL_decode_aper,	/* Aligned PER decoder */
--	NULL_encode_aper,	/* Aligned PER encoder */
-+  NULL_encode_aper, /* Aligned PER encoder */
-+  NULL_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_NULL_tags,
- 	sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]),
-@@ -192,3 +193,10 @@
- 	er.encoded = 0;
- 	_ASN_ENCODED_OK(er);
- }
-+
-+asn_comp_rval_t *
-+NULL_compare(asn_TYPE_descriptor_t *td1, const void *sptr1,
-+             asn_TYPE_descriptor_t *td2, const void *sptr2) {
-+
-+  return NULL;
-+}
---- skeletons/NULL.h	2015-12-08 14:39:33.338543533 +0100
-+++ skeletons/NULL.h	2015-11-26 14:53:03.875616000 +0100
-@@ -27,6 +27,7 @@
- per_type_encoder_f NULL_encode_uper;
- per_type_decoder_f NULL_decode_aper;
- per_type_encoder_f NULL_encode_aper;
-+type_compare_f     NULL_compare;
- 
- #ifdef __cplusplus
- }
---- skeletons/NumericString.c	2015-12-08 14:39:33.338543533 +0100
-+++ skeletons/NumericString.c	2015-11-26 14:40:39.407616000 +0100
-@@ -50,7 +50,8 @@
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_NumericString_tags,
- 	sizeof(asn_DEF_NumericString_tags)
---- skeletons/ObjectDescriptor.c	2015-12-08 14:39:33.338543533 +0100
-+++ skeletons/ObjectDescriptor.c	2015-11-26 14:55:46.227615000 +0100
-@@ -25,7 +25,8 @@
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_ObjectDescriptor_tags,
- 	sizeof(asn_DEF_ObjectDescriptor_tags)
---- skeletons/OBJECT_IDENTIFIER.c	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/OBJECT_IDENTIFIER.c	2015-11-26 14:55:13.311615000 +0100
-@@ -28,7 +28,8 @@
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_OBJECT_IDENTIFIER_tags,
- 	sizeof(asn_DEF_OBJECT_IDENTIFIER_tags)
---- skeletons/OCTET_STRING.c	2015-12-08 14:39:44.554543521 +0100
-+++ skeletons/OCTET_STRING.c	2015-12-08 10:41:42.838558000 +0100
-@@ -37,7 +37,8 @@
- 	OCTET_STRING_decode_uper,	/* Unaligned PER decoder */
- 	OCTET_STRING_encode_uper,	/* Unaligned PER encoder */
- 	OCTET_STRING_decode_aper,	/* Aligned PER decoder */
--	OCTET_STRING_encode_aper,	/* Aligned PER encoder */
-+  OCTET_STRING_encode_aper, /* Aligned PER encoder */
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_OCTET_STRING_tags,
- 	sizeof(asn_DEF_OCTET_STRING_tags)
-@@ -2160,3 +2161,30 @@
- 	return st;
- }
- 
-+asn_comp_rval_t *
-+OCTET_STRING_compare(asn_TYPE_descriptor_t *td1,
-+  const void *sptr1, asn_TYPE_descriptor_t *td2, const void *sptr2) {
-+  const OCTET_STRING_t *st1 = (const OCTET_STRING_t *)sptr1;
-+  const OCTET_STRING_t *st2 = (const OCTET_STRING_t *)sptr2;
-+  asn_comp_rval_t *res = NULL;
-+
-+  COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
-+
-+  if (st1->size != st2->size) {
-+    res = calloc(1, sizeof(asn_comp_rval_t));
-+    res->name = td1->name;
-+    res->structure1 = sptr1;
-+    res->structure2 = sptr2;
-+    res->err_code = COMPARE_ERR_CODE_NO_MATCH;
-+    return res;
-+  }
-+  if (0 != memcmp(st1->buf, st2->buf, st1->size)) {
-+    res = calloc(1, sizeof(asn_comp_rval_t));
-+    res->name = td1->name;
-+    res->structure1 = sptr1;
-+    res->structure2 = sptr2;
-+    res->err_code = COMPARE_ERR_CODE_NO_MATCH;
-+    return res;
-+  }
-+  return NULL;
-+}
---- skeletons/OCTET_STRING.h	2015-12-08 14:39:33.350543533 +0100
-+++ skeletons/OCTET_STRING.h	2015-11-26 12:56:15.259623000 +0100
-@@ -34,6 +34,7 @@
- per_type_encoder_f OCTET_STRING_encode_uper;
- per_type_decoder_f OCTET_STRING_decode_aper;
- per_type_encoder_f OCTET_STRING_encode_aper;
-+type_compare_f     OCTET_STRING_compare;
- 
- /******************************
-  * Handy conversion routines. *
---- skeletons/PrintableString.c	2015-12-08 14:39:33.338543533 +0100
-+++ skeletons/PrintableString.c	2015-11-26 14:56:09.787615000 +0100
-@@ -60,7 +60,8 @@
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_PrintableString_tags,
- 	sizeof(asn_DEF_PrintableString_tags)
---- skeletons/REAL.c	2015-12-08 14:39:33.350543533 +0100
-+++ skeletons/REAL.c	2015-12-08 10:41:55.178558000 +0100
-@@ -46,7 +46,8 @@
- 	REAL_decode_uper,
- 	REAL_encode_uper,
- 	REAL_decode_aper,
--	REAL_encode_aper,
-+  REAL_encode_aper,
-+  REAL_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_REAL_tags,
- 	sizeof(asn_DEF_REAL_tags) / sizeof(asn_DEF_REAL_tags[0]),
-@@ -741,3 +742,32 @@
- 
- 	return 0;
- }
-+
-+
-+asn_comp_rval_t *
-+REAL_compare(asn_TYPE_descriptor_t *td1, const void *sptr1,
-+             asn_TYPE_descriptor_t *td2, const void *sptr2) {
-+  const REAL_t *st1 = (const REAL_t *)sptr1;
-+  const REAL_t *st2 = (const REAL_t *)sptr2;
-+  asn_comp_rval_t *res = NULL;
-+
-+  COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
-+
-+  if (st1->size != st2->size) {
-+    res = calloc(1, sizeof(asn_comp_rval_t));
-+    res->name = td1->name;
-+    res->structure1 = sptr1;
-+    res->structure2 = sptr2;
-+    res->err_code = COMPARE_ERR_CODE_NO_MATCH;
-+    return res;
-+  }
-+  if (0 != memcmp(st1->buf, st2->buf, st1->size)) {
-+    res = calloc(1, sizeof(asn_comp_rval_t));
-+    res->name = td1->name;
-+    res->structure1 = sptr1;
-+    res->structure2 = sptr2;
-+    res->err_code = COMPARE_ERR_CODE_NO_MATCH;
-+    return res;
-+  }
-+  return NULL;
-+}
---- skeletons/REAL.h	2015-12-08 14:39:33.350543533 +0100
-+++ skeletons/REAL.h	2015-11-26 13:00:46.183623000 +0100
-@@ -23,6 +23,7 @@
- per_type_encoder_f REAL_encode_uper;
- per_type_decoder_f REAL_decode_aper;
- per_type_encoder_f REAL_encode_aper;
-+type_compare_f     REAL_compare;
- 
- /***********************************
-  * Some handy conversion routines. *
---- skeletons/RELATIVE-OID.c	2015-12-08 14:39:33.338543533 +0100
-+++ skeletons/RELATIVE-OID.c	2015-11-26 14:56:31.703615000 +0100
-@@ -29,7 +29,8 @@
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_RELATIVE_OID_tags,
- 	sizeof(asn_DEF_RELATIVE_OID_tags)
---- skeletons/T61String.c	2015-12-08 14:39:33.338543533 +0100
-+++ skeletons/T61String.c	2015-11-26 14:57:07.235615000 +0100
-@@ -25,7 +25,8 @@
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_T61String_tags,
- 	sizeof(asn_DEF_T61String_tags)
---- skeletons/TeletexString.c	2015-12-08 14:39:33.338543533 +0100
-+++ skeletons/TeletexString.c	2015-11-26 14:57:17.643615000 +0100
-@@ -25,7 +25,8 @@
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_TeletexString_tags,
- 	sizeof(asn_DEF_TeletexString_tags)
---- skeletons/UniversalString.c	2015-12-08 14:39:33.350543533 +0100
-+++ skeletons/UniversalString.c	2015-11-26 14:57:29.015615000 +0100
-@@ -36,7 +36,8 @@
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_UniversalString_tags,
- 	sizeof(asn_DEF_UniversalString_tags)
---- skeletons/UTCTime.c	2015-12-08 14:39:33.350543533 +0100
-+++ skeletons/UTCTime.c	2015-11-26 14:57:44.127615000 +0100
-@@ -41,7 +41,8 @@
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_UTCTime_tags,
- 	sizeof(asn_DEF_UTCTime_tags)
---- skeletons/UTF8String.c	2015-12-08 14:39:33.314543533 +0100
-+++ skeletons/UTF8String.c	2015-11-26 14:06:54.563618000 +0100
-@@ -27,6 +27,7 @@
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
- 	OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_UTF8String_tags,
- 	sizeof(asn_DEF_UTF8String_tags)
---- skeletons/VideotexString.c	2015-12-08 14:39:33.342543533 +0100
-+++ skeletons/VideotexString.c	2015-11-26 14:07:06.139618000 +0100
-@@ -25,7 +25,8 @@
- 	OCTET_STRING_decode_uper,    /* Implemented in terms of OCTET STRING */
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_VideotexString_tags,
- 	sizeof(asn_DEF_VideotexString_tags)
---- skeletons/VisibleString.c	2015-12-08 14:39:33.350543533 +0100
-+++ skeletons/VisibleString.c	2015-11-26 14:07:15.283618000 +0100
-@@ -30,7 +30,8 @@
- 	OCTET_STRING_decode_uper,
- 	OCTET_STRING_encode_uper,
- 	OCTET_STRING_decode_aper,
--	OCTET_STRING_encode_aper,
-+  OCTET_STRING_encode_aper,
-+  OCTET_STRING_compare,
- 	0, /* Use generic outmost tag fetcher */
- 	asn_DEF_VisibleString_tags,
- 	sizeof(asn_DEF_VisibleString_tags)
diff --git a/openair3/S1AP/s1ap_eNB_nas_procedures.c b/openair3/S1AP/s1ap_eNB_nas_procedures.c
index dbe0fef09116f7f61408fc8eab433c44efb15ddf..43f5ad49e53f40edd3d5dd72836ed0df9bfc27ff 100644
--- a/openair3/S1AP/s1ap_eNB_nas_procedures.c
+++ b/openair3/S1AP/s1ap_eNB_nas_procedures.c
@@ -668,6 +668,8 @@ int s1ap_eNB_ue_capabilities(instance_t instance,
     return -1;
   }
 
+  free(ue_cap_info_ind_p->ue_radio_cap.buffer);
+
   MSC_LOG_TX_MESSAGE(
     MSC_S1AP_ENB,
     MSC_S1AP_MME,
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index b8e9b21866b4a65c5a54788f23e1a202ee75a4dd..f2cc289ed784d548d1595d5c0e533b87db93561b 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -45,7 +45,7 @@
 #include <complex>
 #include <fstream>
 #include <cmath>
-
+#include <time.h>
 #include "common_lib.h"
 #ifdef __SSE4_1__
 #  include <smmintrin.h>
@@ -172,7 +172,13 @@ static void trx_usrp_end(openair0_device *device)
 */ 
 static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags)
 {
-  int ret;
+   static long long int loop=0;
+   static long time_min=0, time_max=0, time_avg=0;
+   struct timespec tp_start, tp_end;
+   long time_diff;
+   clock_gettime(CLOCK_MONOTONIC_RAW, &tp_start);
+
+  int ret=0, ret_i=0;
   usrp_state_t *s = (usrp_state_t*)device->priv;
 
   s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate);
@@ -196,7 +202,21 @@ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp,
   if (ret != nsamps) {
     printf("[xmit] tx samples %d != %d\n",ret,nsamps);
   }
-      
+
+  clock_gettime(CLOCK_MONOTONIC_RAW, &tp_end);
+  time_diff = (tp_end.tv_sec - tp_start.tv_sec) *1E09  + (tp_end.tv_nsec - tp_start.tv_nsec);
+  if  (time_min==0 ||loop==1 || time_min > time_diff)
+    time_min=time_diff;
+  if  (time_max==0 ||loop==1 || time_max < time_diff)
+    time_max=time_diff;
+  if (time_avg ==0 ||loop==1)
+    time_avg= time_diff;
+  else
+    time_avg=(time_diff+time_avg) /2.0;
+  
+  if ( loop%10000 ==0)
+     printf("\n usrp_write: min(ns)=%d, max(ns)=%d, avg(ns)=%d", (int)time_min, (int)time_max,(int)time_avg);
+   loop++;
   return ret;
 }
 
@@ -213,6 +233,11 @@ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp,
 */
 static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc)
 {
+   static long long int loop=0;
+   static long time_min=0, time_max=0, time_avg=0;
+   struct timespec tp_start, tp_end;
+   long time_diff;
+   clock_gettime(CLOCK_MONOTONIC_RAW, &tp_start);
    usrp_state_t *s = (usrp_state_t*)device->priv;
    int samples_received=0,i,j;
    int nsamps2;  // aligned to upper 32 or 16 byte boundary
@@ -293,7 +318,20 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
   s->rx_timestamp = s->rx_md.time_spec.to_ticks(s->sample_rate);
   *ptimestamp = s->rx_timestamp;
 
-  return samples_received;
+   clock_gettime(CLOCK_MONOTONIC_RAW, &tp_end);
+   time_diff = (tp_end.tv_sec - tp_start.tv_sec) *1E09  + (tp_end.tv_nsec - tp_start.tv_nsec);
+   if  (time_min==0 ||loop==1 || time_min > time_diff)
+     time_min=time_diff;
+   if  (time_max==0 || loop==1|| time_max < time_diff)
+     time_max=time_diff;
+   if (time_avg ==0 ||loop==1)
+     time_avg= time_diff;
+   else
+     time_avg=(time_diff+time_avg) /2.0;
+   if ( loop % 10000==0)
+     printf("\n usrp_read: min(ns)=%d, max(ns)=%d, avg(ns)=%d", (int)time_min, (int)time_max,(int)time_avg);
+   loop++;
+   return samples_received;
 }
 
 /*! \brief Get current timestamp of USRP
@@ -500,6 +538,7 @@ extern "C" {
     
     // Initialize USRP device
 
+  device->openair0_cfg = openair0_cfg;
 
   std::string args = "type=b200";
 
@@ -523,6 +562,8 @@ extern "C" {
     // workaround for an api problem, master clock has to be set with the constructor not via set_master_clock_rate
     args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock);
     
+    args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=4096, recv_frame_size=4096";
+    
     uhd::device_addrs_t device_adds = uhd::device::find(args);
 
     if(device_adds.size() == 0)
@@ -554,25 +595,25 @@ extern "C" {
     switch ((int)openair0_cfg[0].sample_rate) {
     case 30720000:
             // from usrp_time_offset
-      openair0_cfg[0].samples_per_packet    = 2048;
+      //openair0_cfg[0].samples_per_packet    = 2048;
       openair0_cfg[0].tx_sample_advance     = 15;
       openair0_cfg[0].tx_bw                 = 20e6;
       openair0_cfg[0].rx_bw                 = 20e6;
       break;
     case 15360000:
-      openair0_cfg[0].samples_per_packet    = 2048;
+      //openair0_cfg[0].samples_per_packet    = 2048;
       openair0_cfg[0].tx_sample_advance     = 45;
       openair0_cfg[0].tx_bw                 = 10e6;
       openair0_cfg[0].rx_bw                 = 10e6;
       break;
     case 7680000:
-      openair0_cfg[0].samples_per_packet    = 1024;
+      //openair0_cfg[0].samples_per_packet    = 2048;
       openair0_cfg[0].tx_sample_advance     = 50;
       openair0_cfg[0].tx_bw                 = 5e6;
       openair0_cfg[0].rx_bw                 = 5e6;
       break;
     case 1920000:
-      openair0_cfg[0].samples_per_packet    = 256;
+      //openair0_cfg[0].samples_per_packet    = 2048;
       openair0_cfg[0].tx_sample_advance     = 50;
       openair0_cfg[0].tx_bw                 = 1.25e6;
       openair0_cfg[0].rx_bw                 = 1.25e6;
@@ -585,7 +626,7 @@ extern "C" {
 
   } else {
     printf("Found USRP B200");
-    args += ",num_recv_frames=256" ; 
+    args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=4096, recv_frame_size=4096" ; 
     s->usrp = uhd::usrp::multi_usrp::make(args);
 
     //  s->usrp->set_rx_subdev_spec(rx_subdev);
@@ -611,30 +652,35 @@ extern "C" {
     switch ((int)openair0_cfg[0].sample_rate) {
     case 30720000:
       s->usrp->set_master_clock_rate(30.72e6);
+      //openair0_cfg[0].samples_per_packet    = 1024;
       openair0_cfg[0].tx_sample_advance     = 115;
       openair0_cfg[0].tx_bw                 = 20e6;
       openair0_cfg[0].rx_bw                 = 20e6;
       break;
     case 23040000:
       s->usrp->set_master_clock_rate(23.04e6); //to be checked
+      //openair0_cfg[0].samples_per_packet    = 1024;
       openair0_cfg[0].tx_sample_advance     = 113;
       openair0_cfg[0].tx_bw                 = 20e6;
       openair0_cfg[0].rx_bw                 = 20e6;
       break;
     case 15360000:
       s->usrp->set_master_clock_rate(30.72e06);
+      //openair0_cfg[0].samples_per_packet    = 1024;
       openair0_cfg[0].tx_sample_advance     = 103; 
       openair0_cfg[0].tx_bw                 = 20e6;
       openair0_cfg[0].rx_bw                 = 20e6;
       break;
     case 7680000:
       s->usrp->set_master_clock_rate(30.72e6);
+      //openair0_cfg[0].samples_per_packet    = 1024;
       openair0_cfg[0].tx_sample_advance     = 80;
       openair0_cfg[0].tx_bw                 = 20e6;
       openair0_cfg[0].rx_bw                 = 20e6;
       break;
     case 1920000:
       s->usrp->set_master_clock_rate(30.72e6);
+      //openair0_cfg[0].samples_per_packet    = 1024;
       openair0_cfg[0].tx_sample_advance     = 40;
       openair0_cfg[0].tx_bw                 = 20e6;
       openair0_cfg[0].rx_bw                 = 20e6;
@@ -758,7 +804,8 @@ extern "C" {
   device->trx_stop_func  = trx_usrp_stop;
   device->trx_set_freq_func = trx_usrp_set_freq;
   device->trx_set_gains_func   = trx_usrp_set_gains;
-  
+  device->openair0_cfg = openair0_cfg;
+
   s->sample_rate = openair0_cfg[0].sample_rate;
   // TODO:
   // init tx_forward_nsamps based usrp_time_offset ex
diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c
index cddef6ccc8525070b58193c9cf78ec8de9274b9d..a7a0314bdc3c3fc52412d01a1f87fea9e2fbb783 100644
--- a/targets/RT/USER/lte-enb.c
+++ b/targets/RT/USER/lte-enb.c
@@ -188,7 +188,7 @@ static inline void thread_top_init(char *thread_name,
 
   if (sched_setattr(0, &attr, flags) < 0 ) {
     perror("[SCHED] eNB tx thread: sched_setattr failed\n");
-    return &eNB_thread_rxtx_status;
+    exit_fun("Error setting deadline scheduler");
   }
 
   LOG_I( HW, "[SCHED] eNB %s deadline thread (TID %ld) started on CPU %d\n", gettid(), thread_name,sched_getcpu() );
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index f3e51890f16f29eb79b9260ef206e6f915237b22..b9d6907c8e212fb9acf0ccf0fc4db47cf997b168 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -382,7 +382,8 @@ void help (void) {
   printf("  --ue-txgain set UE TX gain\n");
   printf("  --ue-scan_carrier set UE to scan around carrier\n");
   printf("  --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n");
-  printf("  --mmapped-dma sets flag for improved EXMIMO UE performance\n");   
+  printf("  --mmapped-dma sets flag for improved EXMIMO UE performance\n");  
+  printf("  --single-thread runs lte-softmodem in only one thread\n"); 
   printf("  -C Set the downlink frequency for all component carriers\n");
   printf("  -d Enable soft scope and L1 and L2 stats (Xforms)\n");
   printf("  -F Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n");