diff --git a/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.params b/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.params
new file mode 100644
index 0000000..3ca917f
--- /dev/null
+++ b/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.params
@@ -0,0 +1,45 @@
+<PARAMS>
+    # CASE - Description
+    # 1 - Variable initialization and optional pull and build ONOS package
+    # 2 - Create Network northbound test
+    # 3 - Update Network northbound test
+    # 4 - Delete Network northbound test
+    # 5 - Create Subnet northbound test
+    # 6 - Update Subnet northbound test
+    # 7 - Delete Subnet northbound test
+    # 8 - Create Virtualport northbound test
+    # 9 - Update Virtualport northbound test
+    #10 - Delete Virtualport northbound test
+
+    <testcases>1,2,3,4</testcases>
+
+    <SLEEP>
+        <startup>15</startup>
+    </SLEEP>
+
+    <ENV>
+        <cellName>singlenode</cellName>
+        <cellApps>drivers,openflow,proxyarp,mobility</cellApps>
+    </ENV>
+
+    <CTRL>
+        <ip1>OC1</ip1>
+        <port1>6633</port1>
+    </CTRL>
+
+    <HTTP>
+        <port>8181</port>
+        <path>/onos/vtn/</path>
+    </HTTP>
+
+    <GIT>
+        <pull>False</pull>
+        <branch>master</branch>
+    </GIT>
+
+    <MININET>
+        <switch>7</switch>
+        <links>20</links>
+    </MININET>
+
+</PARAMS>
diff --git a/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.py b/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.py
new file mode 100644
index 0000000..e3c3cc4
--- /dev/null
+++ b/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.py
@@ -0,0 +1,402 @@
+"""
+Description: This test is to determine if North bound
+    can handle the request
+
+List of test cases:
+CASE1 - Variable initialization and optional pull and build ONOS package
+CASE2 - Create Network northbound test
+CASE3 - Update Network northbound test
+CASE4 - Delete Network northbound test
+CASE5 - Create Subnet northbound test
+CASE6 - Update Subnet northbound test
+CASE7 - Delete Subnet northbound test
+CASE8 - Create Virtualport northbound test
+CASE9 - Update Virtualport northbound test
+CASE10 - Delete Virtualport northbound test
+
+lanqinglong@huawei.com
+"""
+import os
+
+class FUNCvirNetNB:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        """
+        CASE1 is to compile ONOS and push it to the test machines
+
+        Startup sequence:
+        cell<name>
+        onos-verify-cell
+        NOTE:temporary - onos-remove-raft-logs
+        onos-uninstall
+        git pull
+        mvn clean install
+        onos-package
+        onos-install -f
+        onos-wait-for-start
+        start cli sessions
+        start vtnrsc
+        """
+
+        import time
+        import os
+        main.log.info( "ONOS Single node Start "+
+                      "VirtualNet Northbound test - initialization" )
+        main.case( "Setting up test environment" )
+        main.caseExplanation  = "Setup the test environment including "+\
+                                "installing ONOS,start ONOS."
+
+        # load some variables from the params file
+        PULLCODE = False
+        if main.params['GIT']['pull'] =='True':
+            PULLCODE = True
+        gitBranch = main.params['GIT']['branch']
+        cellName = main.params['ENV']['cellName']
+        ipList = os.getenv( main.params['CTRL']['ip1'] )
+
+        main.step("Create cell file")
+        cellAppString = main.params['ENV']['cellApps']
+        main.ONOSbench.createCellFile(main.ONOSbench.ip_address,cellName,
+                                      main.Mininet1.ip_address,
+                                      cellAppString,ipList )
+
+        main.step( "Applying cell variable to environment" )
+        cellResult = main.ONOSbench.setCell(cellName)
+        verifyResult = main.ONOSbench.verifyCell()
+
+        #FIXME:this is short term fix
+        main.log.info( "Removing raft logs" )
+        main.ONOSbench.onosRemoveRaftlogs()
+
+        main.CLIs = []
+        main.nodes = []
+        main.numCtrls=1
+        main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
+
+        for i in range ( 1, main.numCtrls +1):
+            try:
+                main.CLIs.append( getattr( main, 'ONOScli' + str(i) ) )
+                main.nodes.append( getattr( main, 'ONOS' + str(i) ) )
+                ipList.append( main.nodes[ -1 ].ip_address )
+            except AttributeError:
+                break
+
+        main.log.info( "Uninstalling ONOS" )
+        for node in main.nodes:
+            main.ONOSbench.onosUninstall( node.ip_address )
+
+        #Make sure ONOS is DEAD
+        main.log.info( "Killing any ONOS processes" )
+        killResults = main.TRUE
+        for node in main.nodes:
+            killed = main.ONOSbench.onosKill( node.ip_address )
+            killResults = killResults and killed
+
+        cleanInstallResult = main.TRUE
+        gitPullResult = main.TRUE
+        main.step( "Git checkout and pull " + gitBranch )
+        if PULLCODE:
+            main.ONOSbench.gitCheckout ( gitBranch )
+            gitPullResult = main.ONOSbench.gitPull()
+            # values of 1 or 3 are good
+            utilities.assert_lesser ( expect=0, actual=gitPullResult,
+                                      onpass="Git pull successful",
+                                      onfail ="Git pull failed" )
+        main.ONOSbench.getVersion( report =True )
+        main.step( "Using mvn clean install" )
+        cleanInstallResult= main.TRUE
+        if PULLCODE and gitPullResult == main.TRUE:
+            cleanInstallResult = main.ONOSbench.cleanInstall()
+        else:
+            main.log.warn("Did not pull new code so skipping mvn "+
+                          "clean install")
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=cleanInstallResult,
+                                 onpass="MCI successful",
+                                 onfail="MCI failed" )
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=packageResult,
+                                 onpass="Successfully created ONOS package",
+                                 onfail="Failed to create ONOS package " )
+        time.sleep( main.startUpSleep )
+
+        main.step( "Installing ONOS package" )
+        onosInstallResult = main.ONOSbench.onosInstall(
+            options="-f",node=main.nodes[0].ip_address )
+        utilities.assert_equals( expect=main.TRUE, actual=onosInstallResult,
+                                onpass="ONOS install successful",
+                                onfail="ONOS install failed" )
+        time.sleep( main.startUpSleep )
+
+        main.step( "Checking if ONOS is up yet" )
+
+        for i in range( 2 ):
+            onos1Isup =  main.ONOSbench.isup( main.nodes[0].ip_address )
+            if onos1Isup:
+                break
+        utilities.assert_equals( expect=main.TRUE, actual=onos1Isup,
+                     onpass="ONOS startup successful",
+                     onfail="ONOS startup failed" )
+        time.sleep( main.startUpSleep )
+
+        main.log.step( "Starting ONOS CLI sessions" )
+
+        print main.nodes[0].ip_address
+        cliResults = main.ONOScli1.startOnosCli(main.nodes[0].ip_address)
+        utilities.assert_equals( expect=main.TRUE, actual=cliResults,
+                                onpass="ONOS cli startup successful",
+                                onfail="ONOS cli startup failed" )
+        time.sleep( main.startUpSleep )
+
+        main.step( "App Ids check" )
+        appCheck = main.ONOScli1.appToIDCheck()
+        if appCheck != main.TRUE:
+            main.log.warn( main.CLIs[0].apps() )
+            main.log.warn( main.CLIs[0].appIDs() )
+        utilities.assert_equals( expect=main.TRUE, actual=appCheck,
+                     onpass="App Ids seem to be correct",
+                     onfail="Something is wrong with app Ids" )
+
+        if cliResults == main.FALSE:
+            main.log.error( "Failed to start ONOS, stopping test" )
+            main.cleanup()
+            main.exit()
+
+        main.step( "Install onos-app-vtnrsc app" )
+        installResults = main.ONOScli1.featureInstall( "onos-app-vtnrsc" )
+        utilities.assert_equals( expect=main.TRUE, actual=installResults,
+                     onpass="Install onos-app-vtnrsc successful",
+                     onfail="Install onos-app-vtnrsc app failed" )
+
+        time.sleep( main.startUpSleep )
+        
+        main.step( "Install onos-app-vtnweb app" )
+        installResults = main.ONOScli1.featureInstall( "onos-app-vtnweb" )
+        utilities.assert_equals( expect=main.TRUE, actual=installResults,
+                     onpass="Install onos-app-vtnweb successful",
+                     onfail="Install onos-app-vtnweb app failed" )
+
+        time.sleep( main.startUpSleep )
+
+    def CASE2 ( self,main ):
+
+        """
+        Test Post Network
+        """
+        import os,sys
+        sys.path.append("..")
+        try:
+            from tests.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error,please check!" )
+
+        main.log.info( "ONOS Network Post test Start" )
+        main.case( "Virtual Network NBI Test - Network" )
+        main.caseExplanation  = "Test Network Post NBI " +\
+                                "Verify Post Data same with Stored Data"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        port = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.step( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        postdata = network.DictoJson()
+
+        main.step( "Post Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path+'networks/',
+                                                'POST', None, postdata)
+
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Success",
+                onfail="Post Failed " + str( Poststatus ) + str( result ) )
+
+        main.step( "Get Data via HTTP" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                'GET', None, None)
+        utilities.assert_equals(
+                expect='200',
+                actual=Getstatus,
+                onpass="Get Success",
+                onfail="Get Failed " + str( Getstatus ) + str( result ) )
+
+        main.log.info("Post Network Data is :%s\nGet Network Data is:%s"%(postdata,result))
+
+        main.step( "Compare Send Id and Get Id" )
+        IDcmpresult = network.JsonCompare( postdata, result, 'network', 'id' )
+        TanantIDcmpresult = network.JsonCompare( postdata, result, 'network', 'tenant_id' )
+        Cmpresult = IDcmpresult and TanantIDcmpresult
+
+        utilities.assert_equals(
+                expect=True,
+                actual=Cmpresult,
+                onpass="Compare Success",
+                onfail="Compare Failed:ID compare: " + str( IDcmpresult ) + \
+                       ",Tenant id compare :" + str( TanantIDcmpresult ) )
+
+        deletestatus,result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                 'DELETE', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=deletestatus,
+                onpass="Delete Network Success",
+                onfail="Delete Network Failed")
+
+        if Cmpresult !=True:
+            main.log.error( "Post Network compare failed" )
+
+    def CASE3( self,main ):
+
+        """
+        Test Update Network
+        """
+        import os,sys
+        sys.path.append("..")
+        try:
+            from tests.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error,please check!" )
+
+        main.log.info( "ONOS Network Update test Start" )
+        main.case( "Virtual Network NBI Test - Network" )
+        main.caseExplanation  = "Test Network Update NBI " +\
+                                "Verify Update Data same with Stored Data"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        port = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.step( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        network.shared = 'false'
+        postdata = network.DictoJson()
+
+        network.shared = 'true'
+        postdatanew = network.DictoJson()
+
+        main.step( "Post Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path+'networks',
+                                                 'POST', None, postdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Success",
+                onfail="Post Failed " + str( Poststatus ) + str( result ) )
+
+        main.step( "Update Data via HTTP" )
+        Updatestatus, result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                   'PUT', None, postdatanew)
+        utilities.assert_equals(
+                expect='200',
+                actual=Updatestatus,
+                onpass="Update Success",
+                onfail="Update Failed " + str( Updatestatus ) + str( result ) )
+
+        main.step( "Get Data via HTTP" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                'GET', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=Getstatus,
+                onpass="Get Success",
+                onfail="Get Failed " + str( Getstatus ) + str( result ) )
+
+        main.step( "Compare Update data." )
+        IDcmpresult = network.JsonCompare( postdatanew, result, 'network', 'id' )
+        TanantIDcmpresult = network.JsonCompare( postdatanew, result, 'network', 'tenant_id' )
+        Shareresult = network.JsonCompare( postdatanew, result, 'network', 'shared' )
+
+        Cmpresult = IDcmpresult and TanantIDcmpresult and Shareresult
+        utilities.assert_equals(
+                expect=True,
+                actual=Cmpresult,
+                onpass="Compare Success",
+                onfail="Compare Failed:ID compare:" + str( IDcmpresult ) + \
+                       ",Tenant id compare:"+ str( TanantIDcmpresult ) + \
+                       ",Name compare:" + str( Shareresult ) )
+
+        deletestatus,result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                 'DELETE', None, None )
+
+        utilities.assert_equals(
+                expect='200',
+                actual=deletestatus,
+                onpass="Delete Network Success",
+                onfail="Delete Network Failed" )
+
+        if Cmpresult!=True:
+            main.log.error( "Update Network compare failed" )
+
+    def CASE4( self,main ):
+
+        """
+        Test Delete Network
+        """
+        import os,sys
+        sys.path.append("..")
+        try:
+            from tests.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error,please check!" )
+
+        main.log.info( "ONOS Network Delete test Start" )
+        main.case( "Virtual Network NBI Test - Network" )
+        main.caseExplanation = "Test Network Delete NBI " +\
+                                "Verify Stored Data is NULL after Delete"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        port = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.step( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        postdata = network.DictoJson()
+
+        main.step( "Post Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port , '' , path + 'networks/',
+                                                 'POST', None , postdata )
+
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Success",
+                onfail="Post Failed " + str( Poststatus ) + str( result ) )
+
+        main.step( "Delete Data via HTTP" )
+        Deletestatus, result = main.ONOSrest.send( ctrlip,port,network.id,path+'networks/',
+                                                'DELETE', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=Deletestatus,
+                onpass="Delete Success",
+                onfail="Delete Failed " + str( Getstatus ) + str( result ) )
+
+        main.step( "Get Data is NULL" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                'GET', None, None )
+        utilities.assert_equals(
+                expect='The tenantNetwork does not exists',
+                actual=result,
+                onpass="Get Success",
+                onfail="Get Failed " + str( Getstatus ) + str( result ) )
+
+        if result != 'The tenantNetwork does not exists':
+            main.log.error( "Delete Network failed" )
diff --git a/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.topo b/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.topo
new file mode 100644
index 0000000..fbe743b
--- /dev/null
+++ b/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.topo
@@ -0,0 +1,53 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSbench>
+
+        <ONOScli1>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli1>
+
+        <ONOS1>
+            <host>OC1</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1>
+
+        <ONOSrest>
+            <host>OC1</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOSrest>
+
+        <Mininet1>
+            <host>OCN</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>MininetCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS>
+                <controller> none </controller>
+            </COMPONENTS>
+        </Mininet1>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/FUNCvirNetNB/__init__.py b/TestON/tests/FUNCvirNetNB/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNCvirNetNB/__init__.py
diff --git a/TestON/tests/FUNCvirNetNB/dependencies/Nbdata.py b/TestON/tests/FUNCvirNetNB/dependencies/Nbdata.py
new file mode 100644
index 0000000..c002c4a
--- /dev/null
+++ b/TestON/tests/FUNCvirNetNB/dependencies/Nbdata.py
@@ -0,0 +1,221 @@
+"""
+This file provide the data
+lanqinglong@huawei.com
+"""
+import json
+
+class NetworkData:
+
+    def __init__(self):
+        self.id = ''
+        self.state = 'ACTIVE'
+        self.name = 'onosfw-1'
+        self.physicalNetwork = 'none'
+        self.admin_state_up = 'true'
+        self.tenant_id = ''
+        self.routerExternal = 'false'
+        self.type ='LOCAL'
+        self.segmentationID = '6'
+        self.shared = 'false'
+
+    def DictoJson(self):
+
+        if self.id =='' or self.tenant_id == '':
+            print 'Id and tenant id is necessary!'
+
+        Dicdata = {}
+        if self.id !='':
+            Dicdata['id'] = self.id
+        if self.state != '':
+            Dicdata['status'] = self.state
+        if self.name !='':
+            Dicdata['name'] = self.name
+        if self.physicalNetwork !='':
+            Dicdata['provider:physical_network'] = self.physicalNetwork
+        if self.admin_state_up !='':
+            Dicdata['admin_state_up'] = self.admin_state_up
+        if self.tenant_id !='':
+            Dicdata['tenant_id'] = self.tenant_id
+        if self.routerExternal !='':
+            Dicdata['router:external'] = self.routerExternal
+        if self.type !='':
+            Dicdata['provider:network_type'] = self.type
+        if self.segmentationID !='':
+            Dicdata['provider:segmentation_id'] = self.segmentationID
+        if self.shared !='':
+            Dicdata['shared'] = self.shared
+
+        Dicdata = {'network': Dicdata}
+
+        return json.dumps(Dicdata,indent=4)
+
+    def Ordered(self,obj):
+
+        if isinstance(obj, dict):
+            return sorted((k,self.Ordered(v)) for k,  v in obj.items())
+        if isinstance(obj, list):
+            return sorted(self.Ordered(x) for x in obj )
+        else:
+            return obj
+
+    def JsonCompare(self,SourceData,DestiData,FirstPara,SecondPara):
+
+        try:
+            SourceCompareDataDic = json.loads(SourceData)
+            DestiCompareDataDic = json.loads(DestiData)
+        except ValueError:
+            print "SourceData or DestData is not JSON Type!"
+            return False
+
+        Socom = SourceCompareDataDic[FirstPara][SecondPara]
+        Decom = DestiCompareDataDic[FirstPara][SecondPara]
+        if Socom == Decom:
+            return True
+        else:
+            print "Source Compare data:"+FirstPara+"."+SecondPara+"="+Socom
+            print "Dest Compare data: "+FirstPara+"."+SecondPara+"="+str(Decom)
+            return False
+
+class SubnetData(NetworkData):
+
+    def __init__(self):
+        self.id = ''
+        self.tenant_id = ''
+        self.network_id = ''
+        self.nexthop = '192.168.1.1'
+        self.destination = '192.168.1.1/24'
+        self.start = '192.168.2.2'
+        self.end = '192.168.2.254'
+        self.ipv6_address_mode = 'DHCPV6_STATELESS'
+        self.ipv6_ra_mode = 'DHCPV6_STATELESS'
+        self.cidr = '192.168.1.1/24'
+        self.enable_dhcp = 'true'
+        self.dns_nameservers = 'aaa'
+        self.gateway_ip = '192.168.2.1'
+        self.ip_version = 'INET'
+        self.shared = 'false'
+        self.name = 'demo-subnet'
+
+    def DictoJson(self):
+        if self.id =='' or self.tenant_id == '':
+            print 'Id and tenant id is necessary!'
+
+        Dicdata = {}
+        host_routesdata = []
+        host_routesdata.append({'nexthop': self.nexthop,'destination': self.destination})
+        allocation_pools = []
+        allocation_pools.append({'start': self.start,'end':self.end})
+
+        if self.id != '':
+            Dicdata['id'] = self.id
+        if self.network_id != '':
+            Dicdata['network_id'] = self.network_id
+        if self.name != '':
+            Dicdata['name'] = self.name
+        if self.nexthop != '':
+            Dicdata['host_routes'] = host_routesdata
+        if self.tenant_id != '':
+            Dicdata['tenant_id'] = self.tenant_id
+        if self.start != '':
+            Dicdata['allocation_pools'] = allocation_pools
+        if self.shared != '':
+            Dicdata['shared'] = self.shared
+        if self.ipv6_address_mode != '':
+            Dicdata['ipv6_address_mode'] = self.ipv6_address_mode
+        if self.ipv6_ra_mode != '':
+            Dicdata['ipv6_ra_mode'] = self.ipv6_ra_mode
+        if self.cidr != '':
+            Dicdata['cidr'] = self.cidr
+        if self.enable_dhcp != '':
+            Dicdata['enable_dhcp'] = self.enable_dhcp
+        if self.dns_nameservers != '':
+            Dicdata['dns_nameservers'] = self.dns_nameservers
+        if self.gateway_ip != '':
+            Dicdata['gateway_ip'] = self.gateway_ip
+        if self.ip_version != '':
+            Dicdata['ip_version'] = self.ip_version
+
+        Dicdata = {'subnet': Dicdata}
+
+        return json.dumps(Dicdata,indent=4)
+
+    def Ordered(self,obj):
+        super(NetworkData,self).Ordered(obj)
+
+    def JsonCompare(self,SourceData,DestiData,FirstPara,SecondPara):
+        super(NetworkData,self).JsonCompare(SourceData,DestiData,FirstPara,SecondPara)
+
+class VirtualPortData(NetworkData):
+
+    def __init__(self):
+        self.id = ''
+        self.state = 'ACTIVE'
+        self.bindingHostId = 'fa:16:3e:76:8e:88'
+        self.allowedAddressPairs = [{'macAddress':'fa:16:3e:76:8e:88','ipAddress':'192.168.1.1'}]
+        self.deviceOwner = 'none'
+        self.fixedIp = []
+        self.securityGroups = [{'securityGroup':'asd'}]
+        self.adminStateUp = 'true'
+        self.networkId = ''
+        self.tenantId = ''
+        self.subnetId = ''
+        self.bindingvifDetails = 'port_filter'
+        self.bindingvnicType = 'normal'
+        self.bindingvifType = 'ovs'
+        self.macAddress = 'fa:16:3e:76:8e:88'
+        self.deviceId = 'a08aa'
+        self.name = 'u'
+
+    def DictoJson(self):
+        if self.id == '' or self.tenant_id == ' ' or self.networkId == '':
+            print 'Id/tenant id/networkid/subnetId is necessary!'
+
+        Dicdata = {}
+        fixedIp =[]
+        fixedIp.append({'subnetId':self.subnetId,'ipAddress':'192.168.1.4'})
+        allocation_pools = []
+
+        if self.id != '':
+            Dicdata['id'] = self.id
+        if self.state != '':
+            Dicdata['state'] = self.state
+        if self.bindingHostId != '':
+            Dicdata['bindingHostId'] = self.bindingHostId
+        if self.allowedAddressPairs != '':
+            Dicdata['allowedAddressPairs'] = self.allowedAddressPairs
+        if self.deviceOwner != '':
+            Dicdata['deviceOwner'] = self.deviceOwner
+        if self.fixedIp != []:
+            Dicdata['fixedIp'] = fixedIp
+        if self.securityGroups != '':
+            Dicdata['securityGroups'] = self.securityGroups
+        if self.adminStateUp != '':
+            Dicdata['adminStateUp'] = self.adminStateUp
+        if self.networkId != '':
+            Dicdata['networkId'] = self.networkId
+        if self.tenantId != '':
+            Dicdata['tenantId'] = self.tenantId
+        if self.subnetId != '':
+            Dicdata['subnetId'] = self.subnetId
+        if self.bindingvifDetails != '':
+            Dicdata['bindingvifDetails'] = self.bindingvifDetails
+        if self.bindingvnicType != '':
+            Dicdata['bindingvnicType'] = self.bindingvnicType
+        if self.bindingvifType != '':
+            Dicdata['bindingvifType'] = self.bindingvifType
+        if self.macAddress != '':
+            Dicdata['macAddress'] = self.macAddress
+        if self.deviceId != '':
+            Dicdata['deviceId'] = self.deviceId
+        if self.name != '':
+            Dicdata['name'] = self.name
+
+            Dicdata = {'virtualport': Dicdata}
+
+            return json.dumps(Dicdata,indent=4)
+
+    def Ordered(self,obj):
+        super(NetworkData,self).Ordered(obj)
+
+    def JsonCompare(self,SourceData,DestiData,FirstPara,SecondPara):
+        super(NetworkData,self).JsonCompare(SourceData,DestiData,FirstPara,SecondPara)
\ No newline at end of file
diff --git a/TestON/tests/FUNCvirNetNB/dependencies/__init__.py b/TestON/tests/FUNCvirNetNB/dependencies/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNCvirNetNB/dependencies/__init__.py
