diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py
new file mode 100644
index 0000000000000000000000000000000000000000..101e610bfd95dc790b0afff3585363386f97395b
--- /dev/null
+++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py
@@ -0,0 +1,878 @@
+#! /usr/bin/python
+#******************************************************************************
+
+#    OpenAirInterface 
+#    Copyright(c) 1999 - 2014 Eurecom
+
+#    OpenAirInterface 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 3 of the License, or
+#    (at your option) any later version.
+
+
+#    OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is 
+#   included in this distribution in the file called "COPYING". If not, 
+#   see <http://www.gnu.org/licenses/>.
+
+#  Contact Information
+#  OpenAirInterface Admin: openair_admin@eurecom.fr
+#  OpenAirInterface Tech : openair_tech@eurecom.fr
+#  OpenAirInterface Dev  : openair4g-devel@lists.eurecom.fr
+  
+#  Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+
+# *******************************************************************************/
+
+# \file test01.py
+# \brief test 01 for OAI
+# \author Navid Nikaein
+# \date 2013 - 2015
+# \version 0.1
+# @ingroup _test
+
+import tempfile
+import threading
+import sys
+import traceback
+import wave
+import os
+import time
+import datetime
+import getpass
+import math #from time import clock 
+import xml.etree.ElementTree as ET
+
+import log
+import case01
+import case02
+import case03
+import case04
+import case05
+
+from  openair import *
+
+import paramiko
+
+def write_file(filename, string, mode="w"):
+   text_file = open(filename, mode)
+   text_file.write(string)
+   text_file.close()
+   
+
+def sftp_module (username, password, hostname, ports, localfile, remotefile, logfile, operation):
+   localD = localfile
+   remoteD = remotefile
+   #fd, paramiko_logfile  = tempfile.mkstemp()
+   #res = os.close(fd )
+   #paramiko logfile path should not be changed with multiple calls. The logs seem to in first file regardless
+   paramiko_logfile = os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/log/paramiko.log')
+   error = ""
+   try:
+      res=os.system(' echo > ' + paramiko_logfile)
+      paramiko.util.log_to_file(paramiko_logfile)
+      transport = paramiko.Transport((hostname, ports))
+      transport.connect(username = username, password = password)
+      sftp = paramiko.SFTPClient.from_transport(transport)
+      if operation == "put":
+        sftp.put(remotepath=remoteD, localpath=localD)
+      elif operation == "get":
+        sftp.get(remotepath=remoteD, localpath=localD)
+      else :
+        print "sftp_module: unidentified operation. Exiting now"
+        print "hostname = " + hostname
+        print "ports = " + ports
+        print "localfile = " + localfile
+        print "remotefile = " + remotefile
+        print "logfile = " + logfile
+        print "operation = " + operation
+        sys.exit()
+        sftp.close()
+        transport.close()
+   except Exception, e:
+        error = ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: '  + str(e.__class__) + " : " + str( e)
+        error = error + '\n username = ' + username + '\n hostname = ' + hostname + '\n localfile = ' + localfile + '\n remotefile = ' + remotefile + '\n operation = ' + operation + '\nlogfile = ' + logfile + '\n ports = ' + str(ports) + '\n'  
+        error = error + traceback.format_exc()
+   
+   res = os.system('\n echo \'SFTP Module Log for Machine: <' + hostname + '> starts...\' >> ' + logfile + ' 2>&1 ')
+   res = os.system('cat ' + paramiko_logfile + ' >> ' + logfile + ' 2>&1 \n')
+   write_file(logfile, error, "a")
+   res = os.system('\n echo \'SFTP Module Log for Machine: <' + hostname + '> ends...\' >> ' + logfile + ' 2>&1 \n')
+
+def finalize_deploy_script (timeout_cmd, terminate_missing_procs='True'):
+  cmd = 'declare -i timeout_cmd='+str(timeout_cmd) + '\n'
+  if terminate_missing_procs == 'True':
+    cmd = cmd +  """
+    #The code below checks if one the processes launched in background has crashed.
+    #If it does, then the code below terminates all the child processes created by this script
+    declare -i wakeup_interval=1
+    declare -i step=0
+    echo \"Array pid =  ${array_exec_pid[@]}\"
+    while [ "$step" -lt "$timeout_cmd" ]
+      do
+       declare -i break_while_loop=0
+       #Iterate over each process ID in array_exec_pid
+       for i in "${array_exec_pid[@]}"
+       do
+        numchild=`pstree -p $i | perl -ne 's/\((\d+)\)/print " $1"/ge' |wc -w`
+        echo "PID = $i, numchild = $numchild"
+        if  [ "$numchild" -eq "0" ] ; then
+            echo "Process ID $i has finished unexpectedly. Now preparing to kill all the processes "
+            break_while_loop=1
+            break
+        fi
+     done
+    if  [ "$break_while_loop" -eq "1" ] ; then
+             break
+    fi
+    step=$(( step + wakeup_interval ))
+    sleep $wakeup_interval
+    done
+    echo "Final time step (Duration of test case) = $step "
+    """
+  else:
+    #We do not terminate the script if one of the processes has existed prematurely
+    cmd = cmd + 'sleep ' + str(timeout_cmd) + '\n'
+  
+  return cmd
+
+def update_config_file(oai, config_string, logdirRepo, python_script):
+  if config_string :
+    stringArray = config_string.splitlines()
+    cmd=""
+    #python_script = '$OPENAIR_DIR/targets/autotests/tools/search_repl.py'
+    for string in stringArray:
+       #split the string based on space now
+       string1=string.split()
+       cmd = cmd + 'python ' + python_script + ' ' + logdirRepo+'/'+string1[0] + '  ' + string1[1] +  ' '+ string1[2] + '\n'
+       #cmd = cmd + 'perl -p -i  -e \'s/'+ string1[1] + '\\s*=\\s*"\\S*"\\s*/' + string1[1] + ' = "' + string1[2] +'"' + '/g\'   ' + logdirRepo + '/' +string1[0] + '\n'
+    return cmd
+    #result = oai.send_recv(cmd)
+
+
+ 
+#Function to clean old programs that might be running from earlier execution
+#oai - parameter for making connection to machine
+#programList - list of programs that must be terminated before execution of any test case 
+def cleanOldPrograms(oai, programList, CleanUpAluLteBox):
+  cmd = 'killall -q -r ' + programList
+  result = oai.send(cmd, True)
+  print "Killing old programs..." + result
+  programArray = programList.split()
+  programListJoin = '|'.join(programArray)
+  cmd = cleanupOldProgramsScript + ' ' + '\''+programListJoin+'\''
+  #result = oai.send_recv(cmd)
+  #print result
+  result = oai.send_expect_false(cmd, 'Match found', False)
+  print result
+  res=oai.send_recv(CleanUpAluLteBox, True)
+
+
+class myThread (threading.Thread):
+    def __init__(self, threadID, name, counter):
+        threading.Thread.__init__(self)
+        self.threadID = threadID
+        self.name = name
+        self.counter = counter
+    def run(self):
+        print "Starting " + self.name
+
+
+class oaiThread (threading.Thread):
+    def __init__(self, threadID, name, oai, cmd, sudo, timeout):
+        threading.Thread.__init__(self)
+        self.threadID = threadID
+        self.name = name
+        #self.counter = counter
+        self.oai = oai
+        self.cmd = cmd
+        self.sudo = sudo
+        self.timeout = timeout
+    def run(self):
+        print "Starting " + self.name
+        result = self.oai.send_recv(self.cmd, self.sudo, self.timeout)
+        print "result = " + result
+        print "Exiting " + self.name
+
+def addsudo (cmd, password=""):
+  cmd = 'echo \'' + password + '\' | sudo -S -E bash -c \' ' + cmd + '\' '
+  return cmd
+  
+#Function to handle test case class : lte-softmodem
+def handle_testcaseclass_softmodem (testcase, oldprogramList, oai_list, logdirOAI5GRepo , logdirOpenaircnRepo, MachineList, password, CleanUpAluLteBox):
+  #We ignore the password sent to this function for secuirity reasons for password present in log files
+  #It is recommended to add a line in /etc/sudoers that looks something like below. The line below will run sudo without password prompt
+  # your_user_name ALL=(ALL:ALL) NOPASSWD: ALL
+  mypassword=''
+  #addsudo = 'echo \'' + mypassword + '\' | sudo -S -E '
+  addpass = 'echo \'' + mypassword + '\' | '
+  user = getpass.getuser()
+  testcasename = testcase.get('id')
+  timeout_cmd = testcase.findtext('TimeOut_cmd',default='')
+  timeout_cmd = int(float(timeout_cmd))
+  #Timeout_thread is more than that of cmd to have room for compilation time, etc
+  timeout_thread = timeout_cmd + 300 
+  nruns = testcase.findtext('nruns',default='')
+  nruns = int(float(nruns))
+
+  eNBMachine = testcase.findtext('eNB',default='')
+  eNB_config_file = testcase.findtext('eNB_config_file',default='')
+  eNB_compile_prog = testcase.findtext('eNB_compile_prog',default='')
+  eNB_compile_prog_args = testcase.findtext('eNB_compile_prog_args',default='')
+  eNB_pre_exec = testcase.findtext('eNB_pre_exec',default='')
+  eNB_pre_exec_args = testcase.findtext('eNB_pre_exec_args',default='')
+  eNB_main_exec = testcase.findtext('eNB_main_exec',default='')
+  eNB_main_exec_args = testcase.findtext('eNB_main_exec_args',default='')
+  eNB_traffic_exec = testcase.findtext('eNB_traffic_exec',default='')
+  eNB_traffic_exec_args = testcase.findtext('eNB_traffic_exec_args',default='')
+  eNB_terminate_missing_procs = testcase.findtext('eNB_terminate_missing_procs',default='True')
+
+  UEMachine = testcase.findtext('UE',default='')
+  UE_config_file = testcase.findtext('UE_config_file',default='')
+  UE_compile_prog = testcase.findtext('UE_compile_prog',default='')
+  UE_compile_prog_args = testcase.findtext('UE_compile_prog_args',default='')
+  UE_pre_exec = testcase.findtext('UE_pre_exec',default='')
+  UE_pre_exec_args = testcase.findtext('UE_pre_exec_args',default='')
+  UE_main_exec = testcase.findtext('UE_main_exec',default='')
+  UE_main_exec_args = testcase.findtext('UE_main_exec_args',default='')
+  UE_traffic_exec = testcase.findtext('UE_traffic_exec',default='')
+  UE_traffic_exec_args = testcase.findtext('UE_traffic_exec_args',default='')
+  UE_terminate_missing_procs = testcase.findtext('UE_terminate_missing_procs',default='True')
+
+  EPCMachine = testcase.findtext('EPC',default='')
+  EPC_config_file = testcase.findtext('EPC_config_file',default='')
+  EPC_compile_prog = testcase.findtext('EPC_compile_prog',default='')
+  EPC_compile_prog_args = testcase.findtext('EPC_compile_prog_args',default='')
+  HSS_compile_prog = testcase.findtext('HSS_compile_prog',default='')
+  HSS_compile_prog_args = testcase.findtext('HSS_compile_prog_args',default='')
+  
+  EPC_pre_exec= testcase.findtext('EPC_pre_exec',default='')
+  EPC_pre_exec_args = testcase.findtext('EPC_pre_exec_args',default='')  
+  EPC_main_exec= testcase.findtext('EPC_main_exec',default='')
+  EPC_main_exec_args = testcase.findtext('EPC_main_exec_args',default='')  
+  HSS_main_exec= testcase.findtext('HSS_main_exec',default='')
+  HSS_main_exec_args = testcase.findtext('HSS_main_exec_args',default='')  
+  EPC_traffic_exec = testcase.findtext('EPC_traffic_exec',default='')
+  EPC_traffic_exec_args = testcase.findtext('EPC_traffic_exec_args',default='')
+  EPC_terminate_missing_procs = testcase.findtext('EPC_terminate_missing_procs',default='True')
+
+  index_eNBMachine = MachineList.index(eNBMachine)
+  index_UEMachine = MachineList.index(UEMachine)
+  index_EPCMachine = MachineList.index(EPCMachine)
+  oai_eNB = oai_list[index_eNBMachine]
+  oai_UE = oai_list[index_UEMachine]
+  
+  #We need to create two ssh sessions to avoid race conditions 
+  if index_eNBMachine == index_EPCMachine:
+     oai_EPC = openair('localdomain', EPCMachine)
+     oai_EPC.connect(user,password)
+  else:
+     oai_EPC = oai_list[index_EPCMachine]
+  cleanOldPrograms(oai_eNB, oldprogramList, CleanUpAluLteBox)
+  cleanOldPrograms(oai_UE, oldprogramList, CleanUpAluLteBox)
+  cleanOldPrograms(oai_EPC, oldprogramList, CleanUpAluLteBox)
+  logdir_eNB = logdirOAI5GRepo+'/cmake_targets/autotests/log/'+ testcasename
+  logdir_UE =  logdirOAI5GRepo+'/cmake_targets/autotests/log/'+ testcasename
+  logdir_EPC = logdirOpenaircnRepo+'/TEST/autotests/log/'+ testcasename
+  logdir_local = os.environ.get('OPENAIR_DIR')
+  if logdir_local is None:
+     print "Environment variable OPENAIR_DIR not set correctly"
+     sys.exit()
+   
+  #Make the log directory of test case
+  #cmd = 'mkdir -p ' + logdir_eNB
+  #result = oai_eNB.send_recv(cmd)
+  #cmd = 'mkdir -p ' +  logdir_UE
+  #result = oai_UE.send_recv(cmd)
+  #cmd = 'mkdir -p ' + logdir_EPC
+  #result = oai_EPC.send_recv(cmd)
+  
+  print "Updating the config files for ENB/UE/EPC..."
+  #updating the eNB/UE/EPC configuration file from the test case 
+  #update_config_file(oai_eNB, eNB_config_file, logdirOAI5GRepo)
+  #update_config_file(oai_UE, UE_config_file, logdirOAI5GRepo)
+  #update_config_file(oai_EPC, EPC_config_file, logdirOpenaircnRepo)
+  
+  for run in range(0,nruns):
+    logdir_eNB = logdirOAI5GRepo+'/cmake_targets/autotests/log/'+ testcasename + '/run_' + str(run)
+    logdir_UE =  logdirOAI5GRepo+'/cmake_targets/autotests/log/'+ testcasename + '/run_' + str(run)
+    logdir_EPC = logdirOpenaircnRepo+'/TEST/autotests/log/'+ testcasename + '/run_' + str(run)
+    logdir_local_testcase = logdir_local + '/cmake_targets/autotests/log/'+ testcasename + '/run_' + str(run)
+    #Make the log directory of test case
+    cmd = 'rm -fr ' + logdir_eNB + ' ; mkdir -p ' + logdir_eNB
+    result = oai_eNB.send_recv(cmd)
+    cmd = 'rm -fr ' + logdir_UE + ' ; mkdir -p ' +  logdir_UE
+    result = oai_UE.send_recv(cmd)
+    cmd = 'rm -fr ' + logdir_EPC + '; mkdir -p ' + logdir_EPC
+    result = oai_EPC.send_recv(cmd)
+    cmd = ' rm -fr ' + logdir_local_testcase + ' ; mkdir -p ' + logdir_local_testcase
+    result = os.system(cmd)
+    
+    logfile_compile_eNB = logdir_eNB + '/eNB_compile' + '_' + str(run) + '_.log'
+    logfile_exec_eNB = logdir_eNB + '/eNB_exec' + '_' + str(run) + '_.log'
+    logfile_pre_exec_eNB = logdir_eNB + '/eNB_pre_exec' + '_' + str(run) + '_.log'
+    logfile_traffic_eNB = logdir_eNB + '/eNB_traffic' + '_' + str(run) + '_.log'
+    logfile_task_eNB_out = logdir_eNB + '/eNB_task_out' + '_' + str(run) + '_.log'
+    logfile_task_eNB = logdir_local_testcase + '/eNB_task' + '_' + str(run) + '_.log'
+    task_eNB = ' ( \n'
+    task_eNB = task_eNB + 'cd ' + logdirOAI5GRepo + ' ; source oaienv ; source cmake_targets/tools/build_helper \n'
+    task_eNB = task_eNB + 'env |grep OPENAIR  \n'
+    task_eNB = task_eNB + update_config_file(oai_eNB, eNB_config_file, logdirOAI5GRepo, '$OPENAIR_DIR/cmake_targets/autotests/tools/search_repl.py') + '\n'
+    if eNB_compile_prog != "":
+       task_eNB  = task_eNB +  ' ( ' + eNB_compile_prog + ' '+ eNB_compile_prog_args + ' ) > ' + logfile_compile_eNB + ' 2>&1 \n'
+    if eNB_pre_exec != "":
+       task_eNB  = task_eNB +  ' ( ' + eNB_pre_exec + ' '+ eNB_pre_exec_args + ' ) > ' + logfile_pre_exec_eNB + ' 2>&1 \n'
+    if eNB_main_exec != "":
+       task_eNB = task_eNB + ' ( ' + addsudo(eNB_main_exec + ' ' + eNB_main_exec_args, mypassword) + ' ) > ' + logfile_exec_eNB + ' 2>&1 & \n'
+       task_eNB = task_eNB + 'array_exec_pid+=($!) \n'
+       task_eNB = task_eNB + 'echo eNB_main_exec PID = $! \n'
+    if eNB_traffic_exec != "":
+       task_eNB = task_eNB + ' ( ' + eNB_traffic_exec + ' ' + eNB_traffic_exec_args + ' ) > ' + logfile_traffic_eNB + ' 2>&1 & \n '
+       task_eNB = task_eNB + 'array_exec_pid+=($!) \n'
+       task_eNB = task_eNB + 'echo eNB_traffic_exec PID = $! \n'
+    #terminate the eNB test case after timeout_cmd seconds
+    task_eNB  = task_eNB + finalize_deploy_script (timeout_cmd, eNB_terminate_missing_procs) + ' \n'
+    #task_eNB  = task_eNB + 'sleep ' +  str(timeout_cmd) + ' \n'
+    task_eNB  = task_eNB + 'handle_ctrl_c' + '\n' 
+    task_eNB  = task_eNB + ' ) > ' + logfile_task_eNB_out + ' 2>&1  '
+    write_file(logfile_task_eNB, task_eNB, mode="w")
+
+    #task_eNB =  'echo \" ' + task_eNB + '\" > ' + logfile_script_eNB + ' 2>&1 ; ' + task_eNB 
+    logfile_compile_UE = logdir_UE + '/UE_compile' + '_' + str(run) + '_.log'
+    logfile_exec_UE = logdir_UE + '/UE_exec' + '_' + str(run) + '_.log'
+    logfile_pre_exec_UE = logdir_UE + '/UE_pre_exec' + '_' + str(run) + '_.log'
+    logfile_traffic_UE = logdir_UE + '/UE_traffic' + '_' + str(run) + '_.log'    
+    logfile_task_UE_out = logdir_UE + '/UE_task_out' + '_' + str(run) + '_.log'
+    logfile_task_UE = logdir_local_testcase + '/UE_task' + '_' + str(run) + '_.log'
+    task_UE = ' ( \n'
+    task_UE = task_UE + 'array_exec_pid=()' + '\n'
+    task_UE = task_UE + 'cd ' + logdirOAI5GRepo + '\n'  
+    task_UE = task_UE + 'source oaienv \n'
+    task_UE = task_UE + 'source cmake_targets/tools/build_helper \n'
+    task_UE = task_UE + 'env |grep OPENAIR  \n'
+    task_UE = task_UE + update_config_file(oai_UE, UE_config_file, logdirOAI5GRepo, '$OPENAIR_DIR/cmake_targets/autotests/tools/search_repl.py') + '\n'
+    if UE_compile_prog != "":
+       task_UE = task_UE + ' ( ' + UE_compile_prog + ' '+ UE_compile_prog_args + ' ) > ' + logfile_compile_UE + ' 2>&1 \n'
+    if UE_pre_exec != "":
+       task_UE  = task_UE +  ' ( ' + UE_pre_exec + ' '+ UE_pre_exec_args + ' ) > ' + logfile_pre_exec_UE + ' 2>&1 \n'
+    if UE_main_exec != "":
+       task_UE = task_UE + ' ( ' + addsudo(UE_main_exec + ' ' + UE_main_exec_args, mypassword)  + ' ) > ' + logfile_exec_UE + ' 2>&1 & \n'
+       task_UE = task_UE + 'array_exec_pid+=($!) \n'
+       task_UE = task_UE + 'echo UE_main_exec PID = $! \n'
+    if UE_traffic_exec != "":
+       task_UE = task_UE + ' ( ' + UE_traffic_exec + ' ' + UE_traffic_exec_args + ' ) >' + logfile_traffic_UE + ' 2>&1 & \n'
+       task_UE = task_UE + 'array_exec_pid+=($!) \n'
+       task_UE = task_UE + 'echo UE_traffic_exec PID = $! \n'
+    #terminate the UE test case after timeout_cmd seconds
+    task_UE  = task_UE + finalize_deploy_script (timeout_cmd, UE_terminate_missing_procs) + ' \n'
+    #task_UE  = task_UE + 'sleep ' +  str(timeout_cmd) + ' \n'
+    task_UE  = task_UE + 'handle_ctrl_c' + '\n' 
+    task_UE  = task_UE + ' ) > ' + logfile_task_UE_out + ' 2>&1 '
+    write_file(logfile_task_UE, task_UE, mode="w")
+    #task_UE = 'echo \" ' + task_UE + '\" > ' + logfile_script_UE + ' 2>&1 ; ' + task_UE
+
+    logfile_compile_EPC = logdir_EPC + '/EPC_compile' + '_' + str(run) + '_.log'
+    logfile_compile_HSS = logdir_EPC + '/HSS_compile' + '_' + str(run) + '_.log'
+    logfile_exec_EPC = logdir_EPC + '/EPC_exec' + '_' + str(run) + '_.log'
+    logfile_pre_exec_EPC = logdir_EPC + '/EPC_pre_exec' + '_' + str(run) + '_.log'
+    logfile_exec_HSS = logdir_EPC + '/HSS_exec' + '_' + str(run) + '_.log'
+    logfile_traffic_EPC = logdir_EPC + '/EPC_traffic' + '_' + str(run) + '_.log'
+    logfile_task_EPC_out = logdir_EPC + '/EPC_task_out' + '_' + str(run) + '_.log'
+    logfile_task_EPC = logdir_local_testcase + '/EPC_task' + '_' + str(run) + '_.log'
+    task_EPC = ' ( \n'
+    task_EPC = task_EPC + 'array_exec_pid=()' + '\n'
+    task_EPC = task_EPC + 'cd ' + logdirOpenaircnRepo + '\n'
+    task_EPC = task_EPC + update_config_file(oai_EPC, EPC_config_file, logdirOpenaircnRepo, logdirOpenaircnRepo+'/TEST/autotests/tools/search_repl.py') + '\n'
+    task_EPC = task_EPC +  'source BUILD/TOOLS/build_helper \n'
+    if EPC_compile_prog != "":
+       task_EPC = task_EPC + '(' + EPC_compile_prog + ' ' + EPC_compile_prog_args +  ' ) > ' + logfile_compile_EPC + ' 2>&1 \n'
+    if HSS_compile_prog != "":
+       task_EPC = task_EPC + '(' + HSS_compile_prog + ' ' + HSS_compile_prog_args + ' ) > ' + logfile_compile_HSS + ' 2>&1 \n'
+    if EPC_pre_exec != "":
+       task_EPC  = task_EPC +  ' ( ' + EPC_pre_exec + ' '+ EPC_pre_exec_args + ' ) > ' + logfile_pre_exec_EPC + ' 2>&1 \n'
+    if EPC_main_exec !=  "":
+       task_EPC  = task_EPC + '(' + addsudo (EPC_main_exec + ' ' + EPC_main_exec_args, mypassword) + ' ) > ' + logfile_exec_EPC  +  ' 2>&1   & \n'
+       task_EPC = task_EPC + 'array_exec_pid+=($!) \n'
+       task_EPC = task_EPC + 'echo EPC_main_exec PID = $! \n'
+    if HSS_main_exec !=  "":
+       task_EPC  = task_EPC + '(' + addsudo (HSS_main_exec + ' ' + HSS_main_exec_args, mypassword) + ' ) > ' + logfile_exec_HSS  +  ' 2>&1   & \n'
+       task_EPC = task_EPC + 'array_exec_pid+=($!) \n'
+       task_EPC = task_EPC + 'echo HSS_main_exec PID = $! \n'
+    if EPC_traffic_exec !=  "":
+       task_EPC  = task_EPC + '(' + EPC_traffic_exec + ' ' + EPC_traffic_exec_args + ' ) > ' + logfile_traffic_EPC  +  ' 2>&1   & \n' 
+       task_EPC = task_EPC + 'array_exec_pid+=($!) \n'  
+       task_EPC = task_EPC + 'echo EPC_traffic_exec PID = $! \n'
+    #terminate the EPC test case after timeout_cmd seconds   
+    task_EPC = task_EPC + finalize_deploy_script (timeout_cmd, EPC_terminate_missing_procs) + '\n'
+    #task_EPC  = task_EPC + 'sleep ' +  str(timeout_cmd) + '\n'
+    task_EPC  = task_EPC + 'handle_ctrl_c' '\n' 
+    task_EPC  = task_EPC + ' ) > ' + logfile_task_EPC_out + ' 2>&1 ' 
+    write_file(logfile_task_EPC, task_EPC, mode="w")
+    
+    thread_EPC = oaiThread(1, "EPC_thread", oai_EPC , task_EPC, False, timeout_thread)
+    thread_eNB = oaiThread(2, "eNB_thread", oai_eNB , task_eNB, False, timeout_thread)
+    thread_UE = oaiThread(3, "UE_thread", oai_UE , task_UE, False, timeout_thread) 
+
+    threads=[]
+    threads.append(thread_eNB)
+    threads.append(thread_UE)
+    threads.append(thread_EPC)
+    # Start new Threads
+
+    thread_eNB.start()
+    thread_UE.start()
+    thread_EPC.start()
+
+    #Wait for all the compile threads to complete
+    for t in threads:
+       t.join()
+    #Now we get the log files from remote machines on the local machine
+
+    cleanOldPrograms(oai_eNB, oldprogramList, CleanUpAluLteBox)
+    cleanOldPrograms(oai_UE, oldprogramList, CleanUpAluLteBox)
+    cleanOldPrograms(oai_EPC, oldprogramList, CleanUpAluLteBox)
+
+    localfile = logdir_local_testcase + '/eNB_compile' + '_' + str(run) + '_.log'
+    remotefile = logdir_eNB + '/eNB_compile' + '_' + str(run) + '_.log'
+    sftp_log = os.path.expandvars(logdir_local_testcase + '/sftp_module.log')
+    ports = 22
+    sftp_module (user, password, eNBMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/eNB_exec' + '_' + str(run) + '_.log'
+    remotefile = logdir_eNB + '/eNB_exec' + '_' + str(run) + '_.log'
+    sftp_module (user, password, eNBMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/eNB_pre_exec' + '_' + str(run) + '_.log'
+    remotefile = logdir_eNB + '/eNB_pre_exec' + '_' + str(run) + '_.log'
+    sftp_module (user, password, eNBMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/eNB_traffic' + '_' + str(run) + '_.log'
+    remotefile = logdir_eNB + '/eNB_traffic' + '_' + str(run) + '_.log'
+    sftp_module (user, password, eNBMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/eNB_task_out' + '_' + str(run) + '_.log'
+    remotefile = logdir_eNB + '/eNB_task_out' + '_' + str(run) + '_.log'
+    sftp_module (user, password, eNBMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/UE_compile' + '_' + str(run) + '_.log'
+    remotefile = logdir_UE + '/UE_compile' + '_' + str(run) + '_.log'
+    sftp_module (user, password, UEMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/UE_exec' + '_' + str(run) + '_.log'
+    remotefile = logdir_UE + '/UE_exec' + '_' + str(run) + '_.log'
+    sftp_module (user, password, UEMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/UE_pre_exec' + '_' + str(run) + '_.log'
+    remotefile = logdir_UE + '/UE_pre_exec' + '_' + str(run) + '_.log'
+    sftp_module (user, password, UEMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/UE_traffic' + '_' + str(run) + '_.log'
+    remotefile = logdir_UE + '/UE_traffic' + '_' + str(run) + '_.log'
+    sftp_module (user, password, UEMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/UE_task_out' + '_' + str(run) + '_.log'
+    remotefile = logdir_UE + '/UE_task_out' + '_' + str(run) + '_.log'
+    sftp_module (user, password, UEMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/EPC_compile' + '_' + str(run) + '_.log'
+    remotefile = logdir_EPC + '/EPC_compile' + '_' + str(run) + '_.log'
+    sftp_module (user, password, EPCMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/EPC_exec' + '_' + str(run) + '_.log'
+    remotefile = logdir_EPC + '/EPC_exec' + '_' + str(run) + '_.log'
+    sftp_module (user, password, EPCMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/HSS_compile' + '_' + str(run) + '_.log'
+    remotefile = logdir_EPC + '/HSS_compile' + '_' + str(run) + '_.log'
+    sftp_module (user, password, EPCMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/HSS_exec' + '_' + str(run) + '_.log'
+    remotefile = logdir_EPC + '/HSS_exec' + '_' + str(run) + '_.log'
+    sftp_module (user, password, EPCMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/EPC_pre_exec' + '_' + str(run) + '_.log'
+    remotefile = logdir_EPC + '/EPC_pre_exec' + '_' + str(run) + '_.log'
+    sftp_module (user, password, EPCMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/EPC_traffic' + '_' + str(run) + '_.log'
+    remotefile = logdir_EPC + '/EPC_traffic' + '_' + str(run) + '_.log'
+    sftp_module (user, password, EPCMachine, ports, localfile, remotefile, sftp_log, "get")
+
+    localfile = logdir_local_testcase + '/EPC_task_out' + '_' + str(run) + '_.log'
+    remotefile = logdir_EPC + '/EPC_task_out' + '_' + str(run) + '_.log'
+    sftp_module (user, password, EPCMachine, ports, localfile, remotefile, sftp_log, "get")
+    #We need to close the new ssh session that was created  
+    if index_eNBMachine == index_EPCMachine:
+        oai_EPC.disconnect()
+
+
+#thread1 = myThread(1, "Thread-1", 1)
+debug = 0
+pw =''
+i = 0
+dlsim=0
+localshell=0
+is_compiled = 0
+timeout=2000
+xmlInputFile="./test_case_list.xml"
+NFSResultsDir = '/mnt/sradio'
+cleanupOldProgramsScript = '$OPENAIR_DIR/cmake_targets/autotests/tools/remove_old_programs.bash'
+
+logdir = '/tmp/' + 'OAITestFrameWork-' + getpass.getuser() + '/'
+logdirOAI5GRepo = logdir + 'openairinterface5g/'
+logdirOpenaircnRepo = logdir + 'openair-cn/'
+
+openairdir_local = os.environ.get('OPENAIR_DIR')
+if openairdir_local is None:
+   print "Environment variable OPENAIR_DIR not set correctly"
+   sys.exit()
+locallogdir = openairdir_local + '/cmake_targets/autotests/log/'
+#Remove  the contents of local log directory
+os.system(' rm -fr ' + locallogdir + '; mkdir -p ' +  locallogdir  )
+
+for arg in sys.argv:
+    if arg == '-d':
+        debug = 1
+    elif arg == '-dd':
+        debug = 2
+    elif arg == '-p' :
+        prompt2 = sys.argv[i+1]
+    elif arg == '-w' :
+        pw = sys.argv[i+1]
+    elif arg == '-P' :
+        dlsim = 1
+    elif arg == '-l' :
+        localshell = 1
+    elif arg == '-c' :
+        is_compiled = 1
+    elif arg == '-t' :
+        timeout = sys.argv[i+1]
+    elif arg == '-h' :
+        print "-d:  low debug level"
+        print "-dd: high debug level"
+        print "-p:  set the prompt"
+        print "-w:  set the password for ssh to localhost"
+        print "-l:  use local shell instead of ssh connection"
+        print "-t:  set the time out in second for commands"
+        sys.exit()
+    i= i + 1     
+
+try:  
+   os.environ["OPENAIR1_DIR"]
+except KeyError: 
+   print "Please set the environment variable OPENAIR1_DIR in the .bashrc"
+   sys.exit(1)
+
+try:  
+   os.environ["OPENAIR2_DIR"]
+except KeyError: 
+   print "Please set the environment variable OPENAIR2_DIR in the .bashrc"
+   sys.exit(1)
+
+try:  
+   os.environ["OPENAIR_TARGETS"]
+except KeyError: 
+   print "Please set the environment variable OPENAIR_TARGETS in the .bashrc"
+   sys.exit(1)
+
+# get the oai object
+host = os.uname()[1]
+#oai = openair('localdomain','calisson')
+oai_list = {}
+
+
+#start_time = time.time()  # datetime.datetime.now()
+user = getpass.getuser()
+print "host = " + host 
+print "user = " + user
+pw=getpass.getpass()
+
+#Now we parse the xml file for basic configuration
+xmlTree = ET.parse(xmlInputFile)
+xmlRoot = xmlTree.getroot()
+
+
+
+
+MachineList = xmlRoot.findtext('MachineList',default='')
+NFSResultsShare = xmlRoot.findtext('NFSResultsShare',default='')
+GitOpenaircnRepo = xmlRoot.findtext('GitOpenair-cnRepo',default='')
+GitOAI5GRepo = xmlRoot.findtext('GitOAI5GRepo',default='')
+GitOAI5GRepoBranch = xmlRoot.findtext('GitOAI5GRepoBranch',default='')
+GitOpenaircnRepoBranch = xmlRoot.findtext('GitOpenair-cnRepoBranch',default='')
+CleanUpOldProgs = xmlRoot.findtext('CleanUpOldProgs',default='')
+CleanUpAluLteBox = xmlRoot.findtext('CleanUpAluLteBox',default='')
+
+print "MachineList = " + MachineList
+print "GitOpenair-cnRepo = " + GitOpenaircnRepo
+print "GitOAI5GRepo = " + GitOAI5GRepo
+print "GitOAI5GBranch = " + GitOAI5GRepoBranch
+print "GitOpenaircnRepoBranch = " + GitOpenaircnRepoBranch
+print "NFSResultsShare = " + NFSResultsShare
+cmd = "git show-ref --heads -s "+ GitOAI5GRepoBranch
+GitOAI5GHeadVersion = subprocess.check_output ([cmd], shell=True)
+print "GitOAI5GHeadVersion = " + GitOAI5GHeadVersion
+print "CleanUpOldProgs = " + CleanUpOldProgs
+
+
+MachineList = MachineList.split()
+
+index=0
+for machine in MachineList: 
+  oai_list[index] = openair('localdomain',machine)
+  index = index + 1
+
+
+#myThread (1,"sddsf", 1)
+
+
+#thread1 = oaiThread1(1, "Thread-1", 1)
+#def __init__(self, threadID, name, counter, oai, cmd, sudo, timeout):
+
+#sys.exit()
+
+
+
+
+
+
+
+print "\nTesting the sanity of machines used for testing..."
+if localshell == 0:
+    try:
+        index=0
+        for machine in MachineList:
+           print '\n******* Note that the user <'+user+'> should be a sudoer *******\n'
+           print '******* Connecting to the machine <'+machine+'> to perform the test *******\n'
+           if not pw :
+              print "username: " + user 
+              #pw = getpass.getpass() 
+              #print "password: " + pw            
+           else :
+              print "username: " + user 
+              #print "password: " + pw 
+           # issues in ubuntu 12.04
+           oai_list[index].connect(user,pw)
+           #print "result = " + result
+           
+
+           #print '\nCleaning Older running programs : ' + CleanUpOldProgs
+           #cleanOldPrograms(oai_list[index], CleanUpOldProgs)
+
+
+
+           print '\nChecking for sudo permissions on machine <'+machine+'>...'
+           result = oai_list[index].send_expect_false('sudo -S -v','may not run sudo',True)
+           print "Sudo permissions..." + result
+           
+           print '\nCleaning Older running programs : ' + CleanUpOldProgs
+           cleanOldPrograms(oai_list[index], CleanUpOldProgs, CleanUpAluLteBox)
+
+           result = oai_list[index].send('mount ' + NFSResultsDir, True)
+           print "Mounting NFS Share " + NFSResultsDir + "..." + result
+
+           # Check if NFS share is mounted correctly.
+           print 'Checking if NFS Share<' + NFSResultsDir + '> is mounted correctly...'
+           #result = oai_list[index].send_expect('mount | grep ' + NFSResultsDir,  NFSResultsDir )
+           cmd = 'if grep -qs '+NFSResultsDir+ ' /proc/mounts; then  echo \'' + NFSResultsDir  + ' is mounted\' ; fi'
+           search_expr = NFSResultsDir + ' is mounted'
+           print "cmd = " + cmd
+           print "search_expr = " + search_expr
+           result = oai_list[index].send_expect(cmd, search_expr)
+           print "Mount NFS_Results_Dir..." + result
+           index = index + 1
+           
+           #oai.connect2(user,pw) 
+           #oai.get_shell()
+    except :
+        print 'Fail to connect to the machine: '+ machine 
+        sys.exit(1)
+else:
+    pw = ''
+    oai_list[0].connect_localshell()
+
+
+
+
+
+cpu_freq = int(oai_list[0].cpu_freq())
+if timeout == 2000 : 
+    if cpu_freq <= 2000 : 
+        timeout = 3000
+    elif cpu_freq < 2700 :
+        timeout = 2000 
+    elif cpu_freq < 3300 :
+        timeout = 1500
+print "cpu freq(MHz): " + str(cpu_freq) + "timeout(s): " + str(timeout)
+
+# The log files are stored in branch/version/
+
+
+
+#result = oai_list[0].send('uname -a ' )
+#print result
+
+#We now prepare the machines for testing
+#index=0
+for index in oai_list:
+  try:
+      print "setting up machine: " + MachineList[index]
+      #print oai_list[oai].send_recv('echo \''+pw+'\' |sudo -S -v')
+      #print oai_list[oai].send_recv('sudo su')
+      #print oai_list[oai].send_recv('who am i') 
+      #cleanUpPrograms(oai_list[oai]
+      cmd =  'mkdir -p ' + logdir + ' ; rm -fr ' + logdir + '/*'
+      result = oai_list[index].send_recv(cmd)
+     
+      setuplogfile  = logdir  + '/setup_log_' + MachineList[index] + '_.txt'
+      setup_script  = locallogdir  + '/setup_script_' + MachineList[index] +  '_.txt'
+      cmd = ' ( \n'
+      #cmd = cmd  + 'rm -fR ' +  logdir + '\n'
+      #cmd = cmd + 'mkdir -p ' + logdir + '\n'
+      cmd = cmd + 'cd '+ logdir   + '\n'
+      cmd = cmd + 'git clone '+ GitOAI5GRepo  + '\n'
+      cmd = cmd + 'git clone '+ GitOpenaircnRepo   + '\n'
+      cmd = cmd +  'cd ' + logdirOAI5GRepo  + '\n'
+      cmd = cmd + 'git checkout ' + GitOAI5GHeadVersion   + '\n'
+      cmd = cmd + 'source oaienv'   + '\n'
+      cmd = cmd +  'cd ' + logdirOpenaircnRepo  + '\n'
+      cmd = cmd +  'git checkout ' + GitOpenaircnRepoBranch  + '\n'
+      cmd = cmd +  'env |grep OPENAIR'  + '\n'
+      cmd = cmd + ' cd ' + logdir   + '\n'
+      cmd = cmd + ' ) > ' +  setuplogfile + ' 2>&1   '
+      #cmd = cmd + 'echo \' ' + cmd  + '\' > ' + setup_script + ' 2>&1 \n '
+      result = oai_list[index].send_recv(cmd, False, 300 )
+      write_file(setup_script, cmd, mode="w")
+      localfile = locallogdir + '/setup_log_' + MachineList[index] + '_.txt'
+      remotefile = logdir  + '/setup_log_' + MachineList[index] + '_.txt'
+
+      sftp_log = os.path.expandvars(locallogdir + '/sftp_module.log')
+      sftp_module (user, pw, MachineList[index], 22, localfile, remotefile, sftp_log, "get")
+
+
+      #Now we copy test_case_list.xml on the remote machines
+      localfile = os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/test_case_list.xml')
+      remotefile = logdirOAI5GRepo + '/cmake_targets/autotests/test_case_list.xml'
+
+      sftp_log = os.path.expandvars(locallogdir + '/sftp_module.log')
+      sftp_module (user, pw, MachineList[index], 22, localfile, remotefile, sftp_log, "put")
+
+
+      #print oai_list[index].send('rm -fR ' +  logdir)
+      #print oai_list[index].send('mkdir -p ' + logdir)
+      #print oai_list[index].send('cd '+ logdir)
+      #print oai_list[index].send('git clone '+ GitOAI5GRepo )
+      #print oai_list[index].send('git clone '+ GitOpenaircnRepo)
+      #print oai_list[index].send('cd ' + logdirOAI5GRepo)
+      #print oai_list[index].send('git checkout ' + GitOAI5GHeadVersion)
+      #print oai_list[index].send('source oaienv')
+      #print oai_list[index].send('cd ' + logdirOpenaircnRepo)
+      #print oai_list[index].send('git checkout ' + GitOpenaircnRepoBranch)
+      #print oai_list[index].send_recv('cd ' + logdirOAI5GRepo)
+      #print oai_list[index].send_recv('source oaienv')
+      #print oai_list[index].send_recv('env |grep OPENAIR')
+
+      #print '\nCleaning Older running programs : ' + CleanUpOldProgs
+      #cleanOldPrograms(oai_list[index], CleanUpOldProgs)
+
+  except :
+      print 'There is error in one of the commands to setup the machine '+ MachineList[index] 
+      sys.exit(1)
+
+
+#Now we process all the test cases
+
+
+testcaseList=xmlRoot.findall('testCase')
+#print testcaseList
+for testcase in testcaseList:
+   testcasename = testcase.get('id')
+   testcaseclass = testcase.findtext('class',default='')
+   desc = testcase.findtext('desc',default='')
+   if testcaseclass == 'lte-softmodem' :
+     if testcasename != '015700':
+     	continue
+     eNBMachine = testcase.findtext('eNB',default='')
+     UEMachine = testcase.findtext('UE',default='')
+     EPCMachine = testcase.findtext('EPC',default='')
+     index_eNBMachine = MachineList.index(eNBMachine)
+     index_UEMachine = MachineList.index(UEMachine)
+     index_EPCMachine = MachineList.index(EPCMachine)
+     print "testcasename = " + testcasename + " class = " + testcaseclass
+     handle_testcaseclass_softmodem (testcase, CleanUpOldProgs, oai_list, logdirOAI5GRepo, logdirOpenaircnRepo, MachineList, pw, CleanUpAluLteBox )
+
+   elif testcaseclass == 'compilation' :
+     continue
+     handle_testcaseclass_compilation (testcase)
+   elif testcaseclass == 'execution' :
+     continue
+     handle_testcaseclass_oaisim (testcase)
+   else :
+     print "Unknown test case class: " + testcaseclass
+     sys.exit()
+
+
+sys.exit()
+
+
+   #+ "class = "+ classx
+
+
+
+      #index = index +1
+
+test = 'test01'
+ctime=datetime.datetime.utcnow().strftime("%Y-%m-%d.%Hh%M")
+logfile = user+'.'+test+'.'+ctime+'.txt'  
+logdir = os.getcwd() + '/pre-ci-logs-'+host;
+oai.create_dir(logdir,debug)    
+print 'log dir: ' + logdir
+print 'log file: ' + logfile
+pwd = oai.send_recv('pwd') 
+print "pwd = " + pwd
+result = oai.send('echo linux | sudo -S ls -al;sleep 5')
+print "result =" + result
+sys.exit()
+
+#oai.send_nowait('mkdir -p -m 755' + logdir + ';')
+
+#print '=================start the ' + test + ' at ' + ctime + '=================\n'
+#print 'Results will be reported in log file : ' + logfile
+log.writefile(logfile,'====================start'+test+' at ' + ctime + '=======================\n')
+log.set_debug_level(debug)
+
+oai.kill(user, pw)   
+oai.rm_driver(oai,user,pw)
+
+# start te test cases 
+if is_compiled == 0 :
+    is_compiled=case01.execute(oai, user, pw, host,logfile,logdir,debug,timeout)
+    
+if is_compiled != 0 :
+    case02.execute(oai, user, pw, host, logfile,logdir,debug)
+    case03.execute(oai, user, pw, host, logfile,logdir,debug)
+    case04.execute(oai, user, pw, host, logfile,logdir,debug)
+    case05.execute(oai, user, pw, host, logfile,logdir,debug)
+else :
+    print 'Compilation error: skip test case 02,03,04,05'
+
+oai.kill(user, pw) 
+oai.rm_driver(oai,user,pw)
+
+# perform the stats
+log.statistics(logfile)
+
+
+oai.disconnect()
+
+ctime=datetime.datetime.utcnow().strftime("%Y-%m-%d_%Hh%M")
+log.writefile(logfile,'====================end the '+ test + ' at ' + ctime +'====================')
+print 'Test results can be found in : ' + logfile 
+#print '\nThis test took %f minutes\n' % math.ceil((time.time() - start_time)/60) 
+
+#print '\n=====================end the '+ test + ' at ' + ctime + '====================='