diff --git a/TestON/bin/updatedriver.py b/TestON/bin/updatedriver.py
new file mode 100644
index 0000000..084286d
--- /dev/null
+++ b/TestON/bin/updatedriver.py
@@ -0,0 +1,370 @@
+import inspect
+import sys
+import os
+import re 
+sys.path.append("../")
+from core import xmldict
+'''
+@author: Raghav Kashyap (raghavkashyap@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/>.		
+
+
+'''
+
+
+class UpdateDriver:
+    def __init__(self):
+        self.default = ''
+        self.configFile = "/home/openflow/TestON/config/ofadriver.cfg"
+        self.methodDict = {}
+        self.fileDict = {}
+        
+
+    def getmethods(self,modulePath,Class) :
+        '''
+         This will get the list of methods in given module or class.
+         It accepts the module path and class name. If there is no 
+         class name then it has be mentioned as None.
+        '''
+        methodList = []
+        moduleList = modulePath.split("/")
+        newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
+        print "Message : Method list is being obatined , Please wait ..." 
+        try :
+            if Class :
+                Module = __import__(moduleList[len(moduleList) - 1], globals(), locals(), [Class], -1)
+                ClassList = [x.__name__ for x in Module.__dict__.values() if inspect.isclass(x)]
+                self.ClassList = ClassList
+                Class = vars(Module)[Class]
+                methodList = [x.__name__ for x in Class.__dict__.values() if inspect.isfunction(x)]
+            else :
+                Module = __import__(moduleList[len(moduleList) - 1], globals(), locals(),[moduleList[len(moduleList) - 2]], -1)
+                methodList = [x.__name__ for x in Module.__dict__.values() if inspect.isfunction(x)]
+                ClassList = [x.__name__ for x in Module.__dict__.values() if inspect.isclass(x)]
+                self.ClassList = ClassList
+        except :
+            print "Error : " +str(sys.exc_info()[1])
+         
+        
+        self.method = methodList
+        return self.method
+
+    def echo(self) :
+        print "Echoing !!!!!!"
+
+    def getargs(self,moduleName,className,method) :
+        '''
+          This will return the list of arguments in a method of python module of class.
+          It accepts method list as an argument.
+        '''
+        print "Message : Argument list is being obtained for each method"
+        methodArgsDict = {}
+        if className == None:
+            moduleList = moduleName.split(".")
+            for index,name in enumerate(method) :
+                Module = __import__(moduleList[len(moduleList) -1], globals(), locals(), [moduleList[len(moduleList) -2]], -1)
+                try :
+                    names = vars(Module)[name]
+                except KeyError:
+                    print "Message : method '" + name + "'does not exists,Continued with including it. "
+                    return False
+                argumentList = inspect.getargspec(names) #inspect.getargvalues(name)
+                methodArgsDict[name] = argumentList[0]
+        else :
+            moduleList = moduleName.split(".")
+            for index,name in enumerate(method) :
+                Module = __import__(moduleList[len(moduleList) - 1], globals(), locals(), [className], -1)
+                Class = getattr(Module, className)
+                try :
+                    names = vars(Class)[name]
+                except KeyError :
+                    print "Message : method '" + name + "'does not exists,Continued with include it."
+                    return False
+
+                argumentList = inspect.getargspec(names) #inspect.getargvalues(name)
+                methodArgsDict[name] = argumentList[0]
+
+        return methodArgsDict
+
+    def configparser(self,fileName):
+        '''
+         It will parse the config file (ofa.cfg) and return as dictionary
+        '''
+        
+        matchFileName = re.match(r'(.*)\.cfg', fileName, re.M | re.I)
+        if matchFileName:
+            self.configFile = fileName
+            try :
+                xml = open(fileName).read()
+                self.configDict = xmldict.xml_to_dict(xml)
+                return self.configDict
+            except :
+                print "Error : Config file " + self.configFile + " not defined properly or file path error"
+        
+ 
+    def getList(self):
+        '''
+          This method will maintain the hash with module->class->methodList or 
+          module -> methodList .It will return the same Hash.
+        '''
+        classList = []
+        try :
+            moduleList = self.configDict['config-driver']['importTypes'][self.driver]['modules'].keys()
+        except KeyError,e:
+            print "Error : Module Does not Exists"    
+            print e
+            return False
+     
+        for index,value in enumerate(moduleList):
+            modulePath = self.configDict['config-driver']['importTypes'][self.driver]['modules'][value]['path']
+            moduleName = self.configDict['config-driver']['importTypes'][self.driver]['modules'][value]['name']
+
+            try :
+                pathList = self.configDict['config-driver']['importTypes'][self.driver]['modules'][value]['set-path'].split(",")
+                sys.path.extend(pathList)  
+            except KeyError :
+                print "Error : No System Path is given "
+                pass
+            try :
+                Class = self.configDict['config-driver']['importTypes'][self.driver]['modules'][value]['classes']
+            except :
+                Class = None
+            if Class == None :
+                methodList = self.getmethods(modulePath,None)
+                self.methodDict[moduleName] =  methodList
+                self.method_ignoreList(value,None)
+                self.getMethodArgsHash(moduleName,value,None)
+            else :
+                classList = self.configDict['config-driver']['importTypes'][self.driver]['modules'][value]['classes'].keys()
+                for indx,className in enumerate(classList):
+                    if className == 'ignore-list' :
+                        pass
+                    else :
+                        methodList = self.getmethods(modulePath,className)
+                        self.methodDict[moduleName] = {className : methodList}
+                        self.method_ignoreList(value,className)
+                        self.class_ignoreList(value)
+                        self.getMethodArgsHash(moduleName,value,className)
+
+    def class_ignoreList(self,module) :
+        '''
+        It removes the ignored classes for each module mention in ofadriver.cfg 
+        '''
+        class_ignoreList = [] 
+        if self.configDict['config-driver']['importTypes'][self.driver]['modules'][module]['classes'] == None :
+            pass
+        else :
+            try :
+                class_ignoreList = str(self.configDict['config-driver']['importTypes'][self.driver]['modules'][module]['classes']['ignore-list']).split(",")
+            except KeyError :
+                print "Message : No Class Ignore List present"
+                return True
+        moduleName = self.configDict['config-driver']['importTypes'][self.driver]['modules'][module]['name']
+        try :
+            for index,className in enumerate(class_ignoreList):
+                if className in self.methodDict[moduleName].keys():
+                    del self.methodDict[moduleName][className]
+        except AttributeError:
+            pass      
+        return self.methodDict
+
+    def method_ignoreList(self,module,className):
+        '''
+        It removes the ignored methods of each module or class mentioned in ofadriver.cfg.
+        '''
+        method_ignoreList = []
+
+        try :
+            if className == None :
+                try :
+                    method_ignoreList = str(self.configDict['config-driver']['importTypes'][self.driver]['modules'][module]['methods']['ignore-list']).split(",")
+                except TypeError :
+                    pass
+            else :
+                try :
+                    method_ignoreList = str(self.configDict['config-driver']['importTypes'][self.driver]['modules'][module]['classes'][className]['methods']['ignore-list']).split(",")
+                except TypeError :
+                    pass 
+        except KeyError :
+            print "Message : No Ignore-List Exists , proceeding for looking add method"
+            self.add_method(module,className)
+            return True
+
+        moduleName = self.configDict['config-driver']['importTypes'][self.driver]['modules'][module]['name']
+        #import pprint
+        #pprint.pprint(self.methodDict[moduleName])
+        for index, method in enumerate(method_ignoreList) :
+            if className == None :
+                try :
+                    self.methodDict[moduleName].remove(method)
+                    #pprint.pprint(self.methodDict)
+                except ValueError:
+                    print "Message : Method " + method + "Does not exist in module " + moduleName + ", Continue to rest execution"
+                    pass
+
+            else :    
+                if method in self.methodDict[moduleName][className] :
+                    self.methodDict[moduleName][className].remove(method)
+        self.add_method(module,className)
+        return self.methodDict
+
+    def add_method(self,module,className) :
+        '''
+         This  will add the methods(mentioned in ofadriver.cfg file) into method list if it doesnot exists in list. 
+        '''
+        method_List = []
+        try :
+            if className == None :
+                try :
+                    method_List = str(self.configDict['config-driver']['importTypes'][self.driver]['modules'][module]['methods']['add-list']).split(",")
+                except TypeError :
+                    pass
+            else :
+                try :
+                    method_List = str(self.configDict['config-driver']['importTypes'][self.driver]['modules'][module]['classes'][className]['methods']['add-list']).split(",")
+                except TypeError :
+                    pass
+                
+        except KeyError :
+            print "Message : No Add-List Exists , Proceeding with all available methods"
+            return True
+        moduleName = self.configDict['config-driver']['importTypes'][self.driver]['modules'][module]['name']
+        for index, method in enumerate(method_List) :
+            if className == None :    
+                self.methodDict[moduleName] = []
+                self.methodDict[moduleName].append(method)
+            else :
+                self.methodDict[moduleName][className] = []
+                self.methodDict[moduleName][className].append(method)
+
+    def getMethodArgsHash(self,moduleName,module,className):
+        '''
+         This will maintain a Hash of class->method->argumentsList
+        '''
+        modulePath = self.configDict['config-driver']['importTypes'][self.driver]['modules'][module]['path']
+        moduleList = modulePath.split("/")
+        newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
+        if className == None :
+            methodArgs = self.getargs(newModule,None,self.methodDict[moduleName])  
+            self.fileDict[moduleName] = methodArgs 
+        else :
+            methodArgs = self.getargs(newModule,className,self.methodDict[moduleName][className])
+            self.fileDict[className] = methodArgs
+        return self.fileDict
+             
+    def appendDriver(self,fileName):
+        '''
+         This will append the given driver file with methods along with arguments.
+        '''
+        matchFileName = re.match(r'(.*)\.py', fileName, re.M | re.I)
+        
+        if matchFileName:
+            fileHandle = None
+            try :
+                print "Message : Writing Driver file at " + fileName
+                fileHandle = open(fileName,"a")
+                content = ''
+
+                for index, key in enumerate(self.fileDict.keys()):
+                    try :
+                        for ind, method in enumerate(self.fileDict[key].keys()):
+                            if not method == "__init__" :
+                                args = ''
+                                args = ",".join(self.fileDict[key][method])
+                                content = content + "\n" + " " * 4 + "def " + method + "(self," + args + ") :"
+                                content = content + "\n" + " " * 8 + "return " + key + "." + method + "(" + args + ")\n"
+                    except AttributeError :
+                        pass
+                fileHandle.write(content)
+                fileHandle.close()
+                return content
+
+            except :
+                print "Error : Driver file " + fileName + "does not exists"
+        else :
+             print "Error : File name " + fileName + "is not python module"
+             return False  
+
+
+    def writeDriver(self, driver) :
+        '''
+         This will accept the List of driver name and write those drivers if no driver name is specified
+         then it will write all of the driver specified in the ofadriver.cfg.
+        '''
+        self.printHeader(driver)
+        drivers = []
+        commaMatch  = re.search(",", driver, flags=0)
+        if commaMatch:
+            drivers = driver.split(",")
+        else :
+            drivers.append(driver)
+        self.driverList = []
+        if len(drivers) == 0:
+            for index, driverName in enumerate(self.configDict['config-driver']['importTypes'].keys()):
+                self.driver = driverName
+                result = self.getList()
+                if result : 
+                    self.getDriverPath()
+                    self.appendDriver(self.driverPath + self.driver + ".py")
+                    self.driverList.append(self.driverPath + self.driver + ".py")
+                else :
+                    return False 
+        else :
+            for index, driverName in enumerate(drivers) :
+                
+                self.driver = driverName
+                result = self.getList()
+                if result :
+                    self.getDriverPath()
+                    self.appendDriver(self.driverPath + self.driver + ".py")
+                    self.driverList.append(self.driverPath + self.driver + ".py")
+                else :
+                    return False 
+         
+        print "=" * 90
+        print " " * 30  + "Output Driver File :"
+        print ",\n".join(self.driverList)         
+        print "=" * 90
+        return True   
+       
+
+ 
+    def getDriverPath(self):
+        '''
+         It will set the driver path and returns it.If driver path is not specified then it will take 
+         default path (/lib/updatedriver/).
+        ''' 
+        self.driverPath = ''
+        try : 
+            self.driverPath = self.configDict['config-driver']['importTypes'][self.driver]['driver-path']
+              
+        except KeyError :
+            path = re.sub("(bin)$", "", os.getcwd()) 
+            self.driverPath = path + "/lib/updatedriver/"
+        return self.driverPath
+
+
+    def printHeader(self,driver):
+        content = ''
+        
+        print " " * 10 +"=" * 90 + "\n"
+        content = content + " " * 30 + "*-- Welcome to Updated Driver --*\n"       
+        content = content + "\n" + " " * 10 + " " * 10 + "Config File : " + "/home/openflow/TestON/config/ofadriver.py"
+        content = content + "\n" + " " * 10 + " " * 10 + "Drivers Name : " + driver      
+        print content 
+        print " " * 10 + "=" * 90 
+
+
+
