diff --git a/TestON/drivers/common/api/fvtapidriver.py b/TestON/drivers/common/api/fvtapidriver.py
new file mode 100644
index 0000000..620b3e9
--- /dev/null
+++ b/TestON/drivers/common/api/fvtapidriver.py
@@ -0,0 +1,186 @@
+#!/usr/bin/env python
+'''
+Created on 26-Oct-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/>.		
+
+
+fvtapidriver is the basic driver which will handle the fvtapidriver functions
+'''
+'''
+There are two changes required in flowvisor-test framework :
+
+1. In ~/flowvisortests/tests/templatetest.py line : 15 comment 'basic_logger = None'
+2. In ~/flowvisortests/tests/testutils.py line : 50 specify config file path CONFIG_FILE = "~/flowvisor-test/tests/tests-base.json"
+
+'''
+import pexpect
+import struct
+import fcntl
+import os
+import signal
+import re
+import sys
+sys.path.append("../")
+from common.apidriver import API
+import logging
+
+sys.path.append(path+"/lib/flowvisor-test/tests")
+sys.path.append(path+"/lib/flowvisor-test/src/python/")
+
+import templatetest
+import testutils
+import oftest.cstruct as ofp
+import oftest.message as message
+import oftest.parse as parse
+import oftest.action as action
+import oftest.error as error
+import socket
+import __builtin__
+
+config_default = {
+    "param"              : None,
+    "fv_cmd"             : "/home/openflow/flowvisor/scripts/flowvisor.sh",
+    "platform"           : "local",
+    "controller_host"    : "127.0.0.1",
+    "controller_port"    : 6633,
+    "timeout"            : 3,
+    "port_count"         : 4,
+    "base_of_port"       : 1,
+    "base_if_index"      : 1,
+    "test_spec"          : "all",
+    "test_dir"           : ".",
+    "log_file"           : "/home/openflow/fvt.log",
+    "list"               : False,
+    "debug"              : "debug",
+    "dbg_level"          : logging.DEBUG,
+    "port_map"           : {},
+    "test_params"        : "None"
+}
+
+def test_set_init(config):
+    """
+    Set up function for basic test classes
+    @param config The configuration dictionary; see fvt
+    """
+    global basic_port_map
+    global basic_fv_cmd
+    global basic_logger
+    global basic_timeout
+    global basic_config
+    global baisc_logger
+
+    basic_fv_cmd = config["fv_cmd"]
+    basic_timeout = config["timeout"]
+    basic_port_map = config["port_map"]
+    basic_config = config
+
+class FvtApiDriver(API,templatetest.TemplateTest):
+
+    def __init__(self):
+        super(API, self).__init__()
+        print 'init'
+                                                
+
+    def connect(self,**connectargs):
+        for key in connectargs:
+            vars(self)[key] = connectargs[key]
+        
+        self.name = self.options['name']
+        connect_result = super(API,self).connect()
+        self.logFileName = main.logdir+"/"+self.name+".session"
+        config_default["log_file"] = self.logFileName
+        test_set_init(config_default)
+        __builtin__.basic_logger = vars(main)[self.name+'log']
+        __builtin__.basic_logger.info("Calling my test setup")
+        self.setUp(basic_logger)
+
+        (self.fv, self.sv, sv_ret, ctl_ret, sw_ret) = testutils.setUpTestEnv(self, fv_cmd=basic_fv_cmd)
+        
+        self.chkSetUpCondition(self.fv, sv_ret, ctl_ret, sw_ret)
+        return main.TRUE
+
+    def simplePacket(self,dl_src):
+        dl_src = vars(testutils)[dl_src]
+        return testutils.simplePacket(dl_src = dl_src)
+   
+    def genPacketIn(self, in_port, pkt):
+        return testutils.genPacketIn(in_port=in_port, pkt=pkt)
+     
+    def ofmsgSndCmp(self, snd_list, exp_list, xid_ignore=True, hdr_only=True):
+        return testutils.ofmsgSndCmp(self, snd_list, exp_list, xid_ignore, hdr_only)
+    
+    def setRule(self,sv,rule,num_try) :
+        return testutils.setRule(self,sv,rule,num_try)
+    
+    def chkFlowdb(self,controller_number,switch_number,exp_count,exp_rewrites) :
+        return testutils.chkFlowdb(self,controller_number,switch_number,exp_count,exp_rewrites)
+    
+    def chkSwitchStats(self, switch_number, ofproto, exp_snd_count, exp_rcv_count):
+        return testutils.chkSwitchStats(self, switch_number, ofproto, exp_snd_count, exp_rcv_count)
+    
+    def chkSliceStats(self,controller_number,ofproto,exp_snd_count,exp_rcv_count) :
+        return testutils.chkSliceStats(self,controller_number,ofproto,exp_snd_count,exp_rcv_count)
+    
+    def recvStats(self,swId,typ) :
+        return testutils.recvStats(self,swId,typ)
+    
+    def ofmsgSndCmpWithXid(self,snd_list,exp_list,xid_ignore,hdr_only) :
+        return testutils.ofmsgSndCmpWithXid(self,snd_list,exp_list,xid_ignore,hdr_only)
+    
+    def genPacketOut(self,xid,buffer_id,in_port,action_ports,pkt) :
+        return testutils.genPacketOut(self,xid,buffer_id,in_port,action_ports,pkt)
+    
+    def genFlowModFlush(self) :
+        return testutils.genFlowModFlush()
+    
+    def genPhyPort(self,name,addr,port_no) :
+        return testutils.genPhyPort(name,addr,port_no)
+    
+    def disconnect(self,handle):
+        response = ''
+        '''
+        if self.handle:
+            self.handle = handle
+            response = self.execute(cmd="exit",prompt="(.*)",timeout=120)
+        else :
+            main.log.error("Connection failed to the host")
+            response = main.FALSE
+        '''
+        return response  
+    
+    def setUp(self,basic_logger):
+        self.logger = basic_logger
+        #basic_logger.info("** START TEST CASE " + str(self))
+        if basic_timeout == 0:
+            self.timeout = None
+        else:
+            self.timeout = basic_timeout
+        self.fv = None
+        self.sv = None
+        self.controllers = []
+        self.switches = []
+    
+    def close_log_handles(self) :
+        self.tearDown() 
+        vars(main)[self.name+'log'].removeHandler(self.log_handler)
+        #if self.logfile_handler:
+        #    self.logfile_handler.close()
+        
+        return main.TRUE
+
+    
