diff --git a/TestON/bin/cli.py b/TestON/bin/cli.py
new file mode 100755
index 0000000..47b027e
--- /dev/null
+++ b/TestON/bin/cli.py
@@ -0,0 +1,597 @@
+#!/usr/bin/env python
+'''
+Created on 20-Dec-2012
+    
+@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)
+
+
+
+    TestON 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.
+
+    TestON 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 TestON.  If not, see <http://www.gnu.org/licenses/>.		
+
+
+'''
+
+
+"""
+cli will provide the CLI shell for teston framework.
+
+A simple command-line interface for TestON.
+
+The TestON CLI provides a simple console which
+makes it easy to launch the test. For example, the command run will execute the test.
+
+teston> run test DpctlTest
+Several useful commands are provided.
+"""
+
+from subprocess import call
+from cmd import Cmd
+from os import isatty
+import sys
+import re
+import os
+import time
+import threading
+import __builtin__
+import pprint
+dump = pprint.PrettyPrinter(indent=4)
+__builtin__.testthread = False
+introduction = "TestON is the testing framework \nDeveloped by Paxterra Solutions (www.paxterrasolutions.com)"
+
+path = re.sub("teston$", "", os.getcwd())
+sys.path.append(path+"/Core")
+sys.path.append("../")
+from core.teston import * 
+
+class CLI( threading.Thread,Cmd,object ):
+    "command-line interface to execute the test."
+
+    prompt = 'teston> '
+
+    def __init__( self, teston, stdin=sys.stdin ):
+        self.teston = teston
+        
+        self._mainevent = threading.Event()
+        threading.Thread.__init__(self)
+        self.main_stop = False
+        self.locals = { 'test': teston }
+        self.stdin = stdin
+        Cmd.__init__( self )
+        self.pause = False
+        self.stop = False
+        __builtin__.cli = self
+
+    def emptyline( self ):
+        "Don't repeat last command when you hit return."
+        pass
+
+    helpStr = (
+              " teston help"
+    )
+
+    def do_help( self, line ):
+        "Describe available CLI commands."
+        Cmd.do_help( self, line )
+        if line is '':
+            output( self.helpStr )
+    def do_run(self,args):
+        '''
+        run command will execute the test with following optional command line arguments
+        logdir <directory to store logs in>
+        testcases <list of testcases separated by comma or range of testcases separated by hypen>
+        mail <mail-id or list of mail-ids seperated by comma>
+        example 1, to execute the examples specified in the ~/examples diretory.
+        '''
+        args = args.split()
+        options = {}
+        options = self.parseArgs(args,options)
+        options = dictToObj(options)
+        if not testthread:
+            test = TestThread(options)
+            test.start()
+        else :
+            print main.TEST+ " test execution paused, please resume that before executing to another test"
+                    
+    def do_resume(self, line):
+        '''
+        resume command will continue the execution of paused test.
+        teston>resume
+        [2013-01-07 23:03:44.640723] [PoxTest] [STEP]  1.1: Checking the host reachability using pingHost
+        2013-01-07 23:03:44,858 - PoxTest - INFO - Expected Prompt Found
+        ....
+        '''
+        if testthread:
+            testthread.play()
+        else :
+            print "There is no test to resume"
+    
+    def do_nextstep(self,line):
+        '''
+        nextstep will execute the next-step of the paused test and 
+        it will pause the test after finishing of step.
+        
+        teston> nextstep
+        Will pause the test's execution, after completion of this step.....
+        
+        teston> [2013-01-07 21:24:26.286601] [PoxTest] [STEP]  1.8: Checking the host reachability using pingHost
+        2013-01-07 21:24:26,455 - PoxTest - INFO - Expected Prompt Found
+        .....
+        teston>
+        
+        '''
+        if testthread:
+            main.log.info("Executing the nextstep, Will pause test execution, after completion of the step")
+            testthread.play()
+            time.sleep(.1)
+            testthread.pause()
+        else:
+            print "There is no paused test "
+        
+    def do_dumpvar(self,line):
+        '''
+        dumpvar will print all the test data in raw format.
+        usgae : 
+        teston>dumpvar main
+        Here 'main' will be the test object.
+        
+        teston>dumpvar params 
+        here 'params' will be the parameters specified in the params file.
+        
+        teston>dumpvar topology
+        here 'topology' will be topology specification of the test specified in topo file.
+        '''
+        if testthread:
+            if line == "main":
+                dump.pprint(vars(main))
+            else :
+                try :
+                    dump.pprint(vars(main)[line])
+                except KeyError,e:
+                    print e
+        else :
+            print "There is no paused test "
+            
+    def do_currentcase(self,line):
+        '''
+        currentcase will return the current case in the test execution.
+        
+        teston>currentcase
+        Currently executing test case is: 2
+         
+        '''
+        if testthread:
+            print "Currently executing test case is: "+str(main.CurrentTestCaseNumber)
+        else :
+            print "There is no paused test "
+            
+            
+    def do_currentstep(self,line):
+        '''
+        currentstep will return the current step in the test execution.
+         
+        teston>currentstep
+        Currently executing test step is: 2.3
+        '''
+        if testthread:
+            print "Currently executing test step is: "+str(main.CurrentTestCaseNumber)+'.'+str(main.stepCount)
+        else :
+            print "There is no paused test "
+    
+    
+    def do_stop(self,line):
+        '''
+        Will stop the paused test, if any !
+        '''
+        if testthread:
+            testthread.stop()
+            
+        return 'exited by user command'
+        
+    def do_gettest(self,line):
+        '''
+        gettest will return the test name which is under execution or recently executed.
+        
+        Test under execution:
+        teston>gettest 
+        Currently executing Test is: PoxTest
+        
+        Test recently executed:
+        Recently executed test is: MininetTest
+        '''
+        try :
+            if testthread :
+                print "Currently executing Test is: "+main.TEST
+            else :
+                print "Recently executed test is: "+main.TEST
+            
+        except NameError:
+            print "There is no previously executed Test"
+            
+    def do_showlog(self,line):
+        '''
+        showlog will show the test's Log
+        teston>showlog
+        Last executed test's log is : //home/openflow/TestON/logs/PoxTest_07_Jan_2013_21_42_11/PoxTest_07_Jan_2013_21_42_11.log
+        .....
+        teston>showlog
+        Currently executing Test's log is: /home/openflow/TestON/logs/PoxTest_07_Jan_2013_21_46_58/PoxTest_07_Jan_2013_21_46_58.log
+        .....
+        '''
+        try :
+            if testthread :
+                print "Currently executing Test's log is: "+main.LogFileName
+                
+            else :
+                print "Last executed test's log is : "+main.LogFileName
+            
+            logFile = main.LogFileName
+            logFileHandler = open(logFile, 'r')
+            for msg in logFileHandler.readlines() :
+                print msg,
+                
+            logFileHandler.close()
+            
+        except NameError:
+            print "There is no previously executed Test"
+            
+    
+            
+    def parseArgs(self,args,options):
+        '''
+        This will parse the command line arguments.
+        '''
+        options = self.initOptions(options)
+        try :
+            for index, option in enumerate(args):
+                if index > 0 :
+                    if re.match("logdir|mail|example|testdir|testcases", option, flags = 0):
+                        index = index+1
+                        options[option] = args[index]
+                        options = self.testcasesInRange(index,option,args,options)
+                else :
+                    options['testname'] = option
+        except IndexError,e:
+            print e
+            
+        return options
+    
+    def initOptions(self,options):
+        '''
+        This will initialize the commandline options.
+        '''
+        options['logdir'] = None
+        options['mail'] = None
+        options['example'] = None
+        options['testdir'] = None
+        options['testcases'] = None
+        return options   
+    
+    def testcasesInRange(self,index,option,args,options):
+        '''
+        This method will handle testcases list,specified in range [1-10].
+        '''
+        if re.match("testcases",option,1):
+            testcases = []
+            args[index] = re.sub("\[|\]","",args[index],0)
+            m = re.match("(\d+)\-(\d+)",args[index],flags=0)
+            if m:
+                start_case = eval(m.group(1))
+                end_case = eval(m.group(2))
+                if (start_case <= end_case):
+                    i = start_case
+                    while i <= end_case:
+                        testcases.append(i)
+                        i= i+1         
+                else :
+                    print "Please specify testcases properly like 1-5"
+            else :
+                options[option] = args[index]
+                return options
+            options[option] = str(testcases)
+            
+        return options
+    
+    def cmdloop(self, intro=introduction):
+        print introduction
+        while True:
+            try:
+                super(CLI, self).cmdloop(intro="")
+                self.postloop()
+            except KeyboardInterrupt:
+                testthread.pause()
+
+    def do_echo( self, line ):
+        '''
+        Echoing of given input.
+        '''
+        output(line)
+
+    def do_sh( self, line ):
+        '''
+        Run an external shell command
+        sh pwd
+        sh ifconfig etc.
+        '''
+        call( line, shell=True )
+
+
+    def do_py( self, line ):
+        '''
+        Evaluate a Python expression.
+        
+        py main.log.info("Sample Log Information")
+        2013-01-07 12:07:26,804 - PoxTest - INFO - Sample Log Information
+        
+        '''
+        try:
+            exec( line )
+        except Exception, e:
+            output( str( e ) + '\n' )
+            
+    def do_interpret(self,line):
+        '''
+        interpret will translate the single line openspeak statement to equivalent python script.
+        
+        teston> interpret ASSERT result EQUALS main.TRUE ONPASS "Ping executed successfully" ONFAIL "Ping failed"
+        utilities.assert_equals(expect=main.TRUE,actual=result,onpass="Ping executed successfully",onfail="Ping failed")
+ 
+        '''
+        from core import openspeak
+        ospk = openspeak.OpenSpeak()
+        try :
+            translated_code = ospk.interpret(text=line)
+            print translated_code
+        except AttributeError, e:
+            print 'Dynamic params are not allowed in single statement translations'
+        
+    def do_do (self,line):
+        '''
+        Do will translate and execute the openspeak statement for the paused test.
+        do <OpenSpeak statement>
+        '''
+        if testthread:
+            from core import openspeak
+            ospk = openspeak.OpenSpeak()
+            try :
+                translated_code = ospk.interpret(text=line)
+                eval(translated_code)
+            except (AttributeError,SyntaxError), e:
+                print 'Dynamic params are not allowed in single statement translations'
+        else :
+            print "Do will translate and execute the openspeak statement for the paused test.\nPlease use interpret to translate the OpenSpeak statement."
+            
+    def do_compile(self,line):
+        '''
+        compile will translate the openspeak (.ospk) file into TestON test script (python).
+        It will receive the openspeak file path as input and will generate 
+        equivalent test-script file in the same directory. 
+        
+        usage:
+        -----
+        teston>compile /home/openflow/TestON/PoxTest.ospk
+        
+        Auto-generated test-script file is /home/openflow/TestON/PoxTest.py
+        '''
+        from core import openspeak
+        openspeak = openspeak.OpenSpeak()      
+        openspeakfile = line
+        if os.path.exists(openspeakfile) :
+            openspeak.compiler(openspeakfile=openspeakfile,writetofile=1)
+            print "Auto-generated test-script file is "+ re.sub("ospk","py",openspeakfile,0)
+        else:
+            print 'There is no such file : '+line
+
+    def do_exit( self, _line ):
+        "Exit"
+        if testthread:
+            testthread.stop()
+            
+        sys.exit()
+
+        return 'exited by user command'
+
+    def do_quit( self, line ):
+        "Exit"
+        return self.do_exit( line )
+
+    def do_EOF( self, line ):
+        "Exit"
+        output( '\n' )
+        return self.do_exit( line )
+
+    def isatty( self ):
+        "Is our standard input a tty?"
+        return isatty( self.stdin.fileno() )
+
+    def do_source( self, line ):
+        '''
+        Read shell commands from an input file and execute them sequentially.
+        cmdsource.txt :
+        
+        "pwd
+         ls "
+         
+        teston>source /home/openflow/cmdsource.txt
+        /home/openflow/TestON/bin/
+        cli.py  __init__.py
+        
+        '''
+        
+        args = line.split()
+        if len(args) != 1:
+            error( 'usage: source <file>\n' )
+            return
+        try:
+            self.inputFile = open( args[ 0 ] )
+            while True:
+                line = self.inputFile.readline()
+                if len( line ) > 0:
+                    call( line, shell=True )
+                else:
+                    break
+        except IOError:
+            error( 'error reading file %s\n' % args[ 0 ] )
+    
+    def do_updatedriver(self,line):
+        '''
+         updatedriver will update the given driver name which exists into mentioned config file.
+         It will receive two optional arguments :
+         
+         1. Config File Path 
+         2. Drivers List to be updated.
+        
+         Default : config file = "~/TestON/config/updatedriver" ,
+                   Driver List = all drivers specified in config file .
+        '''
+        args = line.split()
+        config = ''
+        drivers = ''
+        try :
+            for index, option in enumerate(args):
+                if option == 'config':
+                    index = index + 1
+                    config = args[index]
+                elif option == 'drivers' :
+                    index = index + 1 
+                    drivers = args[index]
+        except IndexError:
+            pass        
+        import updatedriver
+        converter = updatedriver.UpdateDriver()
+        
+        if config == '':
+            path = re.sub("(bin)$", "", os.getcwd())
+            config = path + "/config/updatedriver.cfg"
+            configDict = converter.configparser(config)
+            
+        else :
+            converter.configparser(config)
+            configDict = converter.configparser(config)
+           
+            
+        converter.writeDriver(drivers)
+                      
+       
+                     
+        
+    def do_time( self, line ):
+        "Measure time taken for any command in TestON."
+        start = time.time()
+        self.onecmd(line)
+        elapsed = time.time() - start
+        self.stdout.write("*** Elapsed time: %0.6f secs\n" % elapsed)
+
+    def default( self, line ):
+        """Called on an input line when the command prefix is not recognized."""
+        first, args, line = self.parseline( line )
+        if not args:
+            return
+        if args and len(args) > 0 and args[ -1 ] == '\n':
+            args = args[ :-1 ]
+        rest = args.split( ' ' )
+
+        error( '*** Unknown command: %s\n' % first )
+
+
+
+class TestThread(threading.Thread):
+    '''
+    TestThread class will handle the test execution and will communicate with the thread in the do_run.
+    '''
+    def __init__(self,options):
+        self._stopevent = threading.Event()
+        threading.Thread.__init__(self)
+        self.is_stop = False
+        self.options = options
+        __builtin__.testthread = self
+
+    def run(self):
+        '''
+        Will execute the test.
+        '''
+        while not self.is_stop :
+            if not self._stopevent.isSet():
+                self.test_on = TestON(self.options)
+                try :
+                    if self.test_on.init_result:
+                        result = self.test_on.run()
+                        if not self.is_stop :
+                            result = self.test_on.cleanup()
+                        self.is_stop = True
+                except(KeyboardInterrupt):
+                    print "Recevied Interrupt,cleaning-up the logs and drivers before exiting"
+                    result = self.test_on.cleanup()
+                    self.is_stop = True
+
+        __builtin__.testthread = False       
+
+    def pause(self):
+        '''
+        Will pause the test.
+        '''
+        print "Will pause the test's execution, after completion of this step.....\n\n\n\n"
+        cli.pause = True
+        self._stopevent.set()
+
+    def play(self):
+        '''
+        Will resume the paused test.
+        '''
+        self._stopevent.clear()
+        cli.pause = False
+        
+    def stop(self):
+        '''
+        Will stop the test execution.
+        '''
+        
+        print "Stopping the test"
+        self.is_stop = True
+        cli.stop = True
+        __builtin__.testthread = False
+        
+def output(msg):
+    '''
+    Simply, print the message in console
+    '''
+    print msg
+
+def error(msg):
+    '''
+    print the error message.
+    '''
+    print msg
+
+def dictToObj(dictionary):
+    '''
+    This will facilitates the converting of the dictionary to the object.
+    This method will help to send options as object format to the test.
+    '''
+    if isinstance(dictionary, list):
+        dictionary = [dictToObj(x) for x in dictionary]
+    if not isinstance(dictionary, dict):
+        return dictionary
+    class Convert(object):
+        pass
+    obj = Convert()
+    for k in dictionary:
+        obj.__dict__[k] = dictToObj(dictionary[k])
+    return obj
+
+
+if __name__ == '__main__':
+    if len(sys.argv) > 1:
+        CLI("test").onecmd(' '.join(sys.argv[1:]))
+    else:
+        CLI("test").cmdloop()
