diff --git a/tests/itests/README.md b/tests/itests/README.md
index 555df7b..644b4ee 100644
--- a/tests/itests/README.md
+++ b/tests/itests/README.md
@@ -157,10 +157,10 @@
 cd /cord/incubator/voltha
 . ./env.sh
 nosetests -s tests/itests/voltha/test_dispatcher.py
-```
+```  
 
-* **Voltha_Xpon**: This tests uses the ponsim OLT to verfiy addition, modification and deletion 
-of channelgroups, channelpartition, channelpair, channeltermination for xpon
+* **Voltha_Xpon**: This test uses the ponsim-OLT to verfiy addition, modification and deletion 
+of channelgroups, channelpartition, channelpair, channeltermination, VOntani, Ontani, VEnet for xpon
 
 First start the Voltha ensemble:
 ```
diff --git a/tests/itests/voltha/test_voltha_xpon.py b/tests/itests/voltha/test_voltha_xpon.py
index 50b89c1..ebaed72 100644
--- a/tests/itests/voltha/test_voltha_xpon.py
+++ b/tests/itests/voltha/test_voltha_xpon.py
@@ -1,35 +1,49 @@
 from tests.itests.voltha.rest_base import RestBase
 
-from google.protobuf.json_format import MessageToDict
+from google.protobuf.json_format import MessageToDict, ParseDict
 import unittest
 
 from voltha.protos import bbf_fiber_base_pb2 as fb
-from voltha.protos import bbf_fiber_channelgroup_body_pb2 as cg
-from voltha.protos import bbf_fiber_channelpair_body_pb2 as cpair
-from voltha.protos import bbf_fiber_channelpartition_body_pb2 as cpart
-from voltha.protos import bbf_fiber_channeltermination_body_pb2 as cterm
-from voltha.protos import ietf_interfaces_pb2 as itf
-from voltha.protos import bbf_fiber_types_pb2 as fbtypes
 from voltha.protos.device_pb2 import Device
 from common.utils.consulhelpers import get_endpoint_from_consul
 
+'''
+These tests uses the ponsim OLT to verfiy addition, modification and deletion 
+of channelgroups, channelpartition, channelpair, channeltermination, vOntAni, OntAni
+and VEnets for xpon
+The prerequisite for this test are:
+ 1. voltha ensemble is running
+      docker-compose -f compose/docker-compose-system-test.yml up -d
+ 2. ponsim olt is running with PONSIM-OLT
+      sudo -s
+      . ./env.sh
+      ./ponsim/main.py -v
+'''
+
 device_type = 'ponsim_olt'
 host_and_port = '172.17.0.1:50060'
 scenario = [
-        {'cg-add': {"interface": {
-                        "enabled": True,
-                        "name": "Manhattan",
-                        "description": "Channel Group for Manhattan"
-                        },
-                    "data": {
-                        "polling_period": 100,
-                        "system_id": "000000",
-                        "raman_mitigation": "RAMAN_NONE"
-                        },
-                    "name": "Manhattan"
+        {'cg-add': {
+                'pb2': fb.ChannelgroupConfig(),
+                'rpc': {
+                        "interface": {
+                            "enabled": True,
+                            "name": "Manhattan",
+                            "description": "Channel Group for Manhattan.."
+                            },
+                        "data": {
+                            "polling_period": 100,
+                            "system_id": "000000",
+                            "raman_mitigation": "RAMAN_NONE"
+                            },
+                        "name": "Manhattan" 
                         }
-                    },
-        {'cpart-add': {"interface": {
+                    }
+                },
+        {'cpart-add': {
+                'pb2': fb.ChannelpartitionConfig(),
+                'rpc': {
+                        "interface": {
                             "enabled": True,
                             "name": "WTC",
                             "description": "Channel Partition for World Trade Center in Manhattan"
@@ -44,8 +58,12 @@
                             },
                         "name": "WTC"
                         }
-                    },
-        {'cpair-add': {"interface": {
+                    }
+                },
+        {'cpair-add': {
+                'pb2': fb.ChannelpairConfig(),
+                'rpc': {
+                        "interface": {
                             "enabled": True,
                             "name": "PON port",
                             "description": "Channel Pair for Freedom Tower in WTC"
@@ -60,8 +78,12 @@
                             },
                         "name": "PON port"
                         }
-                    },
-        {'cterm-add': {"interface": {
+                    }
+                },
+        {'cterm-add': {
+                'pb2': fb.ChannelterminationConfig(),
+                'rpc': {
+                        "interface": {
                             "enabled": True,
                             "name": "PON port",
                             "description": "Channel Termination for Freedom Tower"
@@ -72,16 +94,84 @@
                             },
                         "name": "PON port"
                         }
-                    },
-        {'cterm-del': {"name": "PON port"}},
-        {'cpair-del': {"name": "PON port"}},
-        {'cpart-del': {"name": "WTC"}},
-        {'cg-del': {"name": "Manhattan"}}
+                    }
+                },
+        {'vontani-add': {
+                'pb2': fb.VOntaniConfig(),
+                'rpc': {
+                        "interface": {
+                            "enabled": True,
+                            "name": "ATT Silver User",
+                            "description": "ATT Silver User in Freedom Tower"
+                            },
+                        "data": {
+                            "preferred_chanpair": "PON port",
+                            "expected_serial_number": "ALCL00000000",
+                            "parent_ref": "WTC",
+                            "onu_id": 1
+                            },
+                        "name": "ATT Silver User"
+                        }
+                    }
+                },
+        {'ontani-add': {
+                'pb2': fb.OntaniConfig(),
+                'rpc': {
+                        "interface": {
+                            "enabled": True,
+                            "name": "ATT Silver User",
+                            "description": "ATT Silver User in Freedom Tower"
+                            }, 
+                        "data": { 
+                            "upstream_fec_indicator": True, 
+                            "mgnt_gemport_aes_indicator": False  
+                            }, 
+                        "name": "ATT Silver User" 
+                        }
+                    }
+                },
+        {'venet-add': {
+                'pb2': fb.VEnetConfig(),
+                'rpc': {
+                        "interface": {
+                            "enabled": True,
+                            "name": "ATT SU Enet UNI-1-1",
+                            "description": "Ethernet port - 1"
+                            },
+                        "data": {
+                            "v_ontani_ref": "ATT Silver User"
+                            },
+                        "name": "ATT SU Enet UNI-1-1"
+                        }
+                    }
+                },
+        {'cg-mod': {
+                'pb2': fb.ChannelgroupConfig(),
+                'rpc': {
+                        "interface": {
+                            "enabled": True,
+                            "name": "Manhattan",
+                            "description": "Channel Group for Manhattan"
+                            },
+                        "data": {
+                            "polling_period": 100,
+                            "system_id": "000000",
+                            "raman_mitigation": "RAMAN_NONE"
+                            },
+                        "name": "Manhattan"
+                        }
+                    }
+                },
+        {'venet-del': { 'rpc': {"name": "ATT SU Enet UNI-1-1"}, 'pb2': fb.VEnetConfig()}},
+        {'ontani-del': { 'rpc': {"name": "ATT Silver User"}, 'pb2': fb.OntaniConfig()}},
+        {'vontani-del': { 'rpc': {"name": "ATT Silver User"}, 'pb2': fb.VOntaniConfig()}},
+        {'cterm-del': { 'rpc': {"name": "PON port"}, 'pb2': fb.ChannelterminationConfig()}},
+        {'cpair-del': { 'rpc': {"name": "PON port"}, 'pb2': fb.ChannelpairConfig()}},
+        {'cpart-del': { 'rpc': {"name": "WTC"}, 'pb2': fb.ChannelpartitionConfig()}},
+        {'cg-del': { 'rpc': {"name": "Manhattan"}, 'pb2': fb.ChannelgroupConfig()}}
     ]
-EMPTY_STRING=''
-DEFAULT_INT=0
+
 id = 3      #for ordering the test cases
-ref = dict([])
 LOCAL_CONSUL = "localhost:8500"
 # Retrieve details of the REST entry point
 rest_endpoint = get_endpoint_from_consul(LOCAL_CONSUL, 'chameleon-rest')
@@ -98,15 +188,6 @@
         self.assertEqual(res['state'], 'HEALTHY')
 
 class TestXPon(RestBase):
-    """
-    The prerequisite for this test are:
-     1. voltha ensemble is running
-          docker-compose -f compose/docker-compose-system-test.yml up -d
-     2. ponsim olt is running with PONSIM-OLT
-          sudo -s
-          . ./env.sh
-          ./ponsim/main.py -v
-    """
     def test_002_setup_device(self):
         global device
         device = self.add_device()
@@ -206,168 +287,23 @@
             return True
         return False
 
-#~~~~~~~~~~~~~~~~~~~~~~~~ Config Classes ~~~~~~~~~~~~~~~~~~~~~~~~~~
-class ChannelGroupConfig:
-    #Class Variables
-    name=EMPTY_STRING
-    description=EMPTY_STRING
-    type=EMPTY_STRING
-    enabled=True
-    link_up_down_trap_enable=itf.Interface.LinkUpDownTrapEnableType.Name(0)
-    #channelgroup data
-    system_id='0000000'
-    polling_period=DEFAULT_INT
-    raman_mitigation=fbtypes.RamanMitigationType.Name(0)
-
-    def mk_config(self):
-        #returns the default values if not intialized by the caller
-        return fb.ChannelgroupConfig(
-                name=self.name,
-                interface=itf.Interface(
-                    name=self.name,
-                    description=self.description,
-                    type=self.type,
-                    enabled=self.enabled,
-                    link_up_down_trap_enable=self.link_up_down_trap_enable
-                ),
-                data=cg.ChannelgroupConfigData(
-                    polling_period=self.polling_period,
-                    system_id=self.system_id,
-                    raman_mitigation=self.raman_mitigation
-                )
-            )
-
-class ChannelPartitionConfig:
-    #Class Variables
-    name=EMPTY_STRING
-    description=EMPTY_STRING
-    type=EMPTY_STRING
-    enabled=True
-    link_up_down_trap_enable=itf.Interface.LinkUpDownTrapEnableType.Name(0)
-    #channelpartition config data
-    channelgroup_ref=EMPTY_STRING
-    fec_downstream=True
-    closest_ont_distance=DEFAULT_INT
-    differential_fiber_distance=DEFAULT_INT
-    authentication_method=fbtypes.AuthMethodType.Name(0)
-    multicast_aes_indicator=True
-
-    def mk_config(self):
-        #returns the default values if not intialized by the caller
-        return fb.ChannelpartitionConfig(
-                name=self.name,
-                interface=itf.Interface(
-                    name=self.name,
-                    description=self.description,
-                    type=self.type,
-                    enabled=self.enabled,
-                    link_up_down_trap_enable=self.link_up_down_trap_enable
-                ),
-                data=cpart.ChannelpartitionConfigData(
-                    channelgroup_ref=self.channelgroup_ref,
-                    fec_downstream=self.fec_downstream,
-                    closest_ont_distance=self.closest_ont_distance,
-                    differential_fiber_distance=self.differential_fiber_distance,
-                    authentication_method=self.authentication_method,
-                    multicast_aes_indicator=self.multicast_aes_indicator
-                )
-            )
-
-class ChannelPairConfig:
-    #Class Variables
-    name=EMPTY_STRING
-    description=EMPTY_STRING
-    type=EMPTY_STRING
-    enabled=True
-    link_up_down_trap_enable=itf.Interface.LinkUpDownTrapEnableType.Name(0)
-    #channel pair config data
-    channelgroup_ref=EMPTY_STRING
-    channelpartition_ref=EMPTY_STRING
-    channelpair_type=fbtypes.ChannelpairType.Name(0)
-    channelpair_linerate=fbtypes.ChannelpairSpeedType.Name(0)
-    gpon_ponid_interval=DEFAULT_INT
-    gpon_ponid_odn_class=fbtypes.PonIdOdnClassType.Name(0)
-
-    def mk_config(self):
-        #returns the default values if not intialized by the caller
-        return fb.ChannelpairConfig(
-                name=self.name,
-                interface=itf.Interface(
-                    name=self.name,
-                    description=self.description,
-                    type=self.type,
-                    enabled=self.enabled,
-                    link_up_down_trap_enable=self.link_up_down_trap_enable
-                ),
-                data=cpair.ChannelpairConfigData(
-                    channelgroup_ref=self.channelgroup_ref,
-                    channelpartition_ref=self.channelpartition_ref,
-                    channelpair_type=self.channelpair_type,
-                    channelpair_linerate=self.channelpair_linerate,
-                    gpon_ponid_interval=self.gpon_ponid_interval,
-                    gpon_ponid_odn_class=self.gpon_ponid_odn_class
-                )
-            )
-
-class ChannelTerminationConfig:
-    #Class Variables
-    name=EMPTY_STRING
-    description=EMPTY_STRING
-    type=EMPTY_STRING
-    enabled=True
-    link_up_down_trap_enable=itf.Interface.LinkUpDownTrapEnableType.Name(0)
-    #channel termination config data
-    channelpair_ref=EMPTY_STRING
-    meant_for_type_b_primary_role=True
-    ngpon2_twdm_admin_label=DEFAULT_INT
-    ngpon2_ptp_admin_label=DEFAULT_INT
-    xgs_ponid=DEFAULT_INT
-    xgpon_ponid=DEFAULT_INT
-    gpon_ponid=EMPTY_STRING
-    pon_tag=EMPTY_STRING
-    ber_calc_period=DEFAULT_INT
-    location=EMPTY_STRING
-    url_to_reach=EMPTY_STRING
-
-    def mk_config(self):
-        #returns the default values if not intialized by the caller
-        return fb.ChannelterminationConfig(
-                name=self.name,
-                interface=itf.Interface(
-                    name=self.name,
-                    description=self.description,
-                    type=self.type,
-                    enabled=self.enabled,
-                    link_up_down_trap_enable=self.link_up_down_trap_enable
-                ),
-                data=cterm.ChannelterminationConfigData(
-                    channelpair_ref=self.channelpair_ref,
-                    meant_for_type_b_primary_role=self.meant_for_type_b_primary_role,
-                    ngpon2_twdm_admin_label=self.ngpon2_twdm_admin_label,
-                    ngpon2_ptp_admin_label=self.ngpon2_ptp_admin_label,
-                    xgs_ponid=self.xgs_ponid,
-                    xgpon_ponid=self.xgpon_ponid,
-                    gpon_ponid=self.gpon_ponid,
-                    pon_tag=self.pon_tag,
-                    ber_calc_period=self.ber_calc_period,
-                    location=self.location,
-                    url_to_reach=self.url_to_reach
-                )
-            )
-
 #~~~~~~~~~~~~~~ Function to create test cases on the fly ~~~~~~~~~~~~~~~~
 def create_dynamic_method(key, value):
     obj_type_config = {
-            'cg': { 'type': 'channel_groups', 'config' : 'channelgroup_config', 'class' : ChannelGroupConfig() },
-            'cpart': { 'type': 'channel_partitions', 'config' : 'channelpartition_config', 'class' : ChannelPartitionConfig() },
-            'cpair': { 'type': 'channel_pairs', 'config' : 'channelpair_config', 'class' : ChannelPairConfig() },
-            'cterm': { 'type': 'channel_terminations', 'config' : 'channeltermination_config', 'class' : ChannelTerminationConfig() }
+            'cg': { 'type': 'channel_groups', 'config' : 'channelgroup_config' },
+            'cpart': { 'type': 'channel_partitions', 'config' : 'channelpartition_config' },
+            'cpair': { 'type': 'channel_pairs', 'config' : 'channelpair_config' },
+            'cterm': { 'type': 'channel_terminations', 'config' : 'channeltermination_config' },
+            'vontani': { 'type': 'v_ont_anis', 'config': 'v_ontani_config' },
+            'ontani': { 'type': 'ont_anis', 'config': 'ontani_config' },
+            'venet': { 'type': 'v_enets', 'config': 'v_enet_config' }
         }
 
     def _add(self, type, config, req, name):
         result, prev_len = self.add(type, config, req, name)
         self.assertEqual(result[config][prev_len]['name'], name)
         self.assertEqual(len(result[config]), prev_len+1)
+        self.assertEqual(self.search(req, result[config]), True)
 
     def _mod(self, type, config, req, name):
         result = self.modify(type, req, name)
@@ -384,21 +320,16 @@
             _mod(self, type_config['type'], type_config['config'], req, name)
         elif obj_action == 'del':
             _del(self, type_config['type'], type_config['config'], req, name)
+    
+    def _config(self):
+        ParseDict(value['rpc'], value['pb2'])
+        return value['pb2']
 
     def dynamic_test_method(self):
-        for k,v in value.items():   #this should be a dictionary
-            _obj_action = [val for val in key.split('-')]
-            _type_config = obj_type_config[_obj_action[0]]
-            name = '{}-{}'.format(_obj_action[0], value['name'])
-            if(name not in ref):
-                ref.update({name: _type_config['class']})
-            if(isinstance(v, dict)):
-                for nk, nv in v.items():
-                    setattr(ref[name], nk, nv)
-            else:
-                setattr(ref[name], k, v)
-        req = ref[name].mk_config()
-        _operate(self, _obj_action[1], _type_config, req, name.replace('{}-'.format(_obj_action[0]), ''))
+        _obj_action = [val for val in key.split('-')]
+        _type_config = obj_type_config[_obj_action[0]]
+        _req = _config(self)
+        _operate(self, _obj_action[1], _type_config, _req, value['rpc']['name'])
 
     return dynamic_test_method
 
@@ -413,4 +344,4 @@
             del dynamic_method
 
 if __name__ == '__main__':
-    unittest.main()
\ No newline at end of file
+    unittest.main()
