diff --git a/python/adapters/brcm_openomci_onu/omci/brcm_vlan_filter_task.py b/python/adapters/brcm_openomci_onu/omci/brcm_vlan_filter_task.py
index 484ed45..83a517f 100644
--- a/python/adapters/brcm_openomci_onu/omci/brcm_vlan_filter_task.py
+++ b/python/adapters/brcm_openomci_onu/omci/brcm_vlan_filter_task.py
@@ -20,8 +20,10 @@
 from twisted.internet import reactor
 from twisted.internet.defer import inlineCallbacks, failure, returnValue
 from pyvoltha.adapters.extensions.omci.omci_defs import ReasonCodes, EntityOperations
+from pyvoltha.adapters.extensions.omci.omci_entities import VlanTaggingFilterData
 from pyvoltha.adapters.extensions.omci.omci_me import \
-    VlanTaggingOperation, VlanTaggingFilterDataFrame, ExtendedVlanTaggingOperationConfigurationDataFrame
+    VlanTaggingOperation, VlanTaggingFilterDataFrame, ExtendedVlanTaggingOperationConfigurationDataFrame, \
+    ExtendedVlanTaggingOperationConfigurationData
 from uni_port import UniType
 from uni_port import RESERVED_TRANSPARENT_VLAN
 from pon_port import DEFAULT_TPID
@@ -51,6 +53,7 @@
         :param handler: (BrcmOpenomciOnuHandler) ONU Device Handler Instance
         :param uni_port: (UniPort) Object instance representing the uni port and its settings
         :param set_vlan_id: (int) VLAN to filter for and set
+        :param add_tag: (bool) Flag to identify VLAN Tagging or Untagging
         :param tp_id: (int) TP ID for the flow
         :param priority: (int) OpenOMCI Task priority (0..255) 255 is the highest
         """
@@ -68,17 +71,40 @@
                                         uni_port=uni_port.port_number,
                                         set_vlan_id=set_vlan_id)
 
+        self._onu_handler = handler
         self._device = omci_agent.get_device(handler.device_id)
         self._uni_port = uni_port
         self._set_vlan_id = set_vlan_id
-        self._set_vlan_pcp = set_vlan_pcp
-        self._match_vlan = match_vlan
+
+        # If not setting any pbit, copy the pbit from the received vlan tag
+        if set_vlan_pcp is None:
+            self._set_vlan_pcp = 8  # Copy from the inner priority of the received frame
+        else:
+            self._set_vlan_pcp = set_vlan_pcp
+
+        # If not matching on any vlan do not filter for vlan value.  effectively match on untagged
+        if match_vlan is None:
+            self._match_vlan = RESERVED_TRANSPARENT_VLAN  # Do not filter on the VID
+        else:
+            self._match_vlan = match_vlan
+
+        self._vlan_pcp = 8  # Do not filter on priority
+
+        # If the tag is not transparent then need to remove it.
+        self._treatment_tags_to_remove = 1
+        if self._match_vlan == RESERVED_TRANSPARENT_VLAN:  # Do not filter on the VID
+            self._vlan_pcp = 15  # This entry is a no-tag rule; ignore all other VLAN tag filter fields
+            self._treatment_tags_to_remove = 0
+
+        # If matching on untagged and trying to copy pbit from non-existent received vlan, set pbit to zero
+        if self._match_vlan == RESERVED_TRANSPARENT_VLAN and self._set_vlan_pcp == 8:
+            self._set_vlan_pcp = 0
+
         self._add_tag = add_tag
         self._tp_id = tp_id
         self._results = None
         self._local_deferred = None
         self._config = self._device.configuration
-
         self._input_tpid = DEFAULT_TPID
         self._output_tpid = DEFAULT_TPID
 
@@ -113,223 +139,24 @@
         """
         Perform the vlan tagging
         """
-        self.log.debug('vlan-filter-tagging-task', device_id=self._device._device_id, uni_port=self._uni_port, set_vlan_id=self._set_vlan_id, \
-            set_vlan_pcp=self._set_vlan_pcp, match_vlan=self._match_vlan, tp_id=self._tp_id, add_tag=self._add_tag)
-
+        self.log.debug('vlan-filter-tagging-task', uni_port=self._uni_port, set_vlan_id=self._set_vlan_id,
+                       set_vlan_pcp=self._set_vlan_pcp, match_vlan=self._match_vlan, tp_id=self._tp_id,
+                       add_tag=self._add_tag)
         try:
             if self._add_tag:
-                ################################################################################
-                # VLAN Tagging Filter config
-                #
-                #  EntityID will be referenced by:
-                #            - Nothing
-                #  References:
-                #            - MacBridgePortConfigurationData for the ANI/PON side
-                #
-
-
-                # Delete bridge ani side vlan filter
-                eid = self._mac_bridge_port_ani_entity_id + self._uni_port.entity_id + self._tp_id  # Entity ID
-                msg = VlanTaggingFilterDataFrame(eid)
-                frame = msg.delete()
-                self.log.debug('openomci-msg', omci_msg=msg)
-                self.strobe_watchdog()
-                results = yield self._device.omci_cc.send(frame)
-                self.check_status_and_state(results, 'flow-delete-vlan-tagging-filter-data')
-
-                ################################################################################
-                # Create Extended VLAN Tagging Operation config (UNI-side)
-                #
-                #  EntityID relates to the VLAN TCIS later used int vlan filter task.  This only
-                #  sets up the inital MIB entry as it relates to port config, it does not set vlan
-                #  that is saved for the vlan filter task
-                #
-                #  References:
-                #            - PPTP Ethernet or VEIP UNI
-                #
-
-
-                # Delete uni side evto
-                msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
-                    self._mac_bridge_service_profile_entity_id + self._uni_port.mac_bridge_port_num,
-                )
-                frame = msg.delete()
-                self.log.debug('openomci-msg', omci_msg=msg)
-                results = yield self._device.omci_cc.send(frame)
-                self.check_status_and_state(results, 'delete-extended-vlan-tagging-operation-configuration-data')
-
-
-                # Re-Create uni side evto
-                # default to PPTP
-                association_type = 2
-                if self._uni_port.type.value == UniType.VEIP.value:
-                    association_type = 10
-                elif self._uni_port.type.value == UniType.PPTP.value:
-                    association_type = 2
-
-                attributes = dict(
-                    association_type=association_type,             # Assoc Type, PPTP/VEIP Ethernet UNI
-                    associated_me_pointer=self._uni_port.entity_id,      # Assoc ME, PPTP/VEIP Entity Id
-
-                    # See VOL-1311 - Need to set table during create to avoid exception
-                    # trying to read back table during post-create-read-missing-attributes
-                    # But, because this is a R/W attribute. Some ONU may not accept the
-                    # value during create. It is repeated again in a set below.
-                    input_tpid=self._input_tpid,    # input TPID
-                    output_tpid=self._output_tpid,  # output TPID
-                )
-
-                msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
-                    self._mac_bridge_service_profile_entity_id + self._uni_port.mac_bridge_port_num,  # Bridge Entity ID
-                    attributes=attributes
-                )
-
-                frame = msg.create()
-                self.log.debug('openomci-msg', omci_msg=msg)
-                results = yield self._device.omci_cc.send(frame)
-                self.check_status_and_state(results, 'create-extended-vlan-tagging-operation-configuration-data')
-
-                attributes = dict(
-                    # Specifies the TPIDs in use and that operations in the downstream direction are
-                    # inverse to the operations in the upstream direction
-                    input_tpid=self._input_tpid,    # input TPID
-                    output_tpid=self._output_tpid,  # output TPID
-                    downstream_mode=0,              # inverse of upstream
-                )
-
-                msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
-                    self._mac_bridge_service_profile_entity_id + self._uni_port.mac_bridge_port_num,  # Bridge Entity ID
-                    attributes=attributes
-                )
-
-                frame = msg.set()
-                self.log.debug('openomci-msg', omci_msg=msg)
-                self.strobe_watchdog()
-                results = yield self._device.omci_cc.send(frame)
-                self.check_status_and_state(results, 'set-extended-vlan-tagging-operation-configuration-data')
-
-                # Onu-Transparent
-                if self._set_vlan_id == RESERVED_TRANSPARENT_VLAN:
-                    # Transparently send any single tagged packet.
-                    # As the onu is to be transparent, no need to create VlanTaggingFilterData ME.
-                    # Any other specific rules will take priority over this, so not setting any other vlan specific rules
-                    attributes = dict(
-                        received_frame_vlan_tagging_operation_table=
-                        VlanTaggingOperation(
-                            filter_outer_priority=15,
-                            filter_outer_vid=4096,
-                            filter_outer_tpid_de=0,
-                            filter_inner_priority=14,
-                            filter_inner_vid=4096,
-                            filter_inner_tpid_de=0,
-                            filter_ether_type=0,
-                            treatment_tags_to_remove=0,
-                            treatment_outer_priority=15,
-                            treatment_outer_vid=0,
-                            treatment_outer_tpid_de=0,
-                            treatment_inner_priority=15,
-                            treatment_inner_vid=0,
-                            treatment_inner_tpid_de=4
-                        )
-                    )
-
-                    msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
-                        self._mac_bridge_service_profile_entity_id + self._uni_port.mac_bridge_port_num,  # Bridge Entity ID
-                        attributes=attributes
-                    )
-
-                    frame = msg.set()
-                    self.log.debug('openomci-msg', omci_msg=msg)
-                    self.strobe_watchdog()
-                    results = yield self._device.omci_cc.send(frame)
-                    self.check_status_and_state(results, 'set-evto-table-transparent-vlan')
-
+                if not self._onu_handler.args.accept_incremental_evto_update:
+                    yield self._bulk_update_evto_and_vlan_tag_filter()
                 else:
-                    # Re-Create bridge ani side vlan filter
-                    forward_operation = 0x10  # VID investigation
-
-                    msg = VlanTaggingFilterDataFrame(
-                        eid,
-                        vlan_tcis=[self._set_vlan_id],  # VLAN IDs
-                        forward_operation=forward_operation
-                    )
-                    frame = msg.create()
-                    self.log.debug('openomci-msg', omci_msg=msg)
-                    self.strobe_watchdog()
-                    results = yield self._device.omci_cc.send(frame)
-                    self.check_status_and_state(results, 'flow-create-vlan-tagging-filter-data')
-                    # Update uni side extended vlan filter
-                    # filter for untagged
-                    attributes = dict(
-                        received_frame_vlan_tagging_operation_table=
-                        VlanTaggingOperation(
-                            filter_outer_priority=15,
-                            filter_outer_vid=4096,
-                            filter_outer_tpid_de=0,
-                            filter_inner_priority=15,
-                            filter_inner_vid=4096,
-                            filter_inner_tpid_de=0,
-                            filter_ether_type=0,
-                            treatment_tags_to_remove=0,
-                            treatment_outer_priority=15,
-                            treatment_outer_vid=0,
-                            treatment_outer_tpid_de=0,
-                            treatment_inner_priority=0,
-                            treatment_inner_vid=self._set_vlan_id,
-                            treatment_inner_tpid_de=4
-                        )
-                    )
-
-                    msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
-                        self._mac_bridge_service_profile_entity_id + self._uni_port.mac_bridge_port_num,  # Bridge Entity ID
-                        attributes=attributes
-                    )
-
-                    frame = msg.set()
-                    self.log.debug('openomci-msg', omci_msg=msg)
-                    self.strobe_watchdog()
-                    results = yield self._device.omci_cc.send(frame)
-                    self.check_status_and_state(results, 'set-evto-table-untagged')
-
-                    # Update uni side extended vlan filter
-                    # filter for vlan 0
-                    attributes = dict(
-                        received_frame_vlan_tagging_operation_table=
-                        VlanTaggingOperation(
-                            filter_outer_priority=15,  # This entry is not a double-tag rule
-                            filter_outer_vid=4096,  # Do not filter on the outer VID value
-                            filter_outer_tpid_de=0,  # Do not filter on the outer TPID field
-
-                            filter_inner_priority=8,  # Filter on inner vlan
-                            filter_inner_vid=0x0,  # Look for vlan 0
-                            filter_inner_tpid_de=0,  # Do not filter on inner TPID field
-                            filter_ether_type=0,  # Do not filter on EtherType
-
-                            treatment_tags_to_remove=1,
-                            treatment_outer_priority=15,
-                            treatment_outer_vid=0,
-                            treatment_outer_tpid_de=0,
-
-                            treatment_inner_priority=8,  # Add an inner tag and insert this value as the priority
-                            treatment_inner_vid=self._set_vlan_id,  # use this value as the VID in the inner VLAN tag
-                            treatment_inner_tpid_de=4,  # set TPID
-                        )
-                    )
-                    msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
-                        self._mac_bridge_service_profile_entity_id + self._uni_port.mac_bridge_port_num,  # Bridge Entity ID
-                        attributes=attributes  # See above
-                    )
-                    frame = msg.set()
-                    self.log.debug('openomci-msg', omci_msg=msg)
-                    self.strobe_watchdog()
-                    results = yield self._device.omci_cc.send(frame)
-                    self.check_status_and_state(results, 'set-evto-table-zero-tagged')
-
-            else: #addTag = False
-                #TODO: needs to be implemented - future task.
-                self.log.debug('removing-vlan-filter-tag', uni_port=self._uni_port, match_vlan=self._match_vlan, )
+                    yield self._incremental_update_evto_and_vlan_tag_filter()
+            else:  # addTag = False
+                if self._onu_handler.args.accept_incremental_evto_update:
+                    self.log.info('removing-vlan-tagging')
+                    yield self._delete_service_flow()
+                    yield self._delete_vlan_filter_entity()
+                else:
+                    # Will be reset anyway on new vlan tagging operation
+                    self.log.info("not-removing-vlan-tagging")
             self.deferred.callback(self)
-
         except Exception as e:
             self.log.exception('setting-vlan-tagging', e=e)
             self.deferred.errback(failure.Failure(e))
@@ -361,3 +188,411 @@
         elif status == RC.InstanceExists:
             return False
 
+    @inlineCallbacks
+    def _delete_service_flow(self):
+        extended_vlan_tagging_entity_id = self._mac_bridge_service_profile_entity_id + \
+                                          self._uni_port.mac_bridge_port_num
+
+        # See G.988 regarding evto row deletes for "default" flows:
+        #
+        # As an exception to the rule on ordered processing, these default rules are always
+        # considered as a last resort for frames that do not match any other rule. Best
+        # practice dictates that these entries not be deleted by the OLT; however, they
+        # can be modified to produce the desired default behaviour.
+        #
+        # 15, 4096, x, 15, 4096, x, 0, (0, 15, x, x, 15, x, x) – no tags
+        # 15, 4096, x, 14, 4096, x, 0, (0, 15, x, x, 15, x, x) – 1 tag
+        # 14, 4096, x, 14, 4096, x, 0, (0, 15, x, x, 15, x, x) – 2 tags
+
+        # outer_prio is 15, outer vid is 4096  inner prio is 15, inner vid is 4096
+        # its a default rule... dont delete it.
+        if self._match_vlan == RESERVED_TRANSPARENT_VLAN and self._vlan_pcp == 15:
+            self.log.warn("should-not-delete-onu-builtin-no-tag-flow")
+            return
+
+        # outer_prio is 15, outer vid is 4096  inner prio is 14, inner vid is 4096
+        # its a default rule... dont delete it.
+        if self._match_vlan == RESERVED_TRANSPARENT_VLAN and self._vlan_pcp == 14:
+            self.log.warn("should-not-delete-onu-builtin-single-tag-flow")
+            return
+
+        entry = VlanTaggingOperation(
+            filter_outer_priority=15,
+            filter_outer_vid=4096,
+            filter_outer_tpid_de=0,
+
+            filter_inner_priority=self._vlan_pcp,
+            filter_inner_vid=self._match_vlan,
+            filter_inner_tpid_de=0,
+            filter_ether_type=0
+        )
+        # delete this entry using the filter rules as the key.
+        # this function automatically fills 0xFF in the last 8 treatment bytes
+        entry = entry.delete()
+        attributes = dict(received_frame_vlan_tagging_operation_table=entry)
+
+        msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
+            extended_vlan_tagging_entity_id,  # Bridge Entity ID
+            attributes=attributes  # See above
+        )
+        frame = msg.set()
+        self.log.debug('openomci-msg', omci_msg=msg)
+        results = yield self._device.omci_cc.send(frame)
+        self.check_status_and_state(results, 'delete-service-flow')
+
+    @inlineCallbacks
+    def _delete_vlan_filter_entity(self):
+        vlan_tagging_entity_id = int(self._mac_bridge_port_ani_entity_id + self._uni_port.entity_id
+                                     + self._tp_id)
+        self.log.debug("Vlan tagging filter data frame will be deleted.",
+                       expected_me_id=vlan_tagging_entity_id)
+        msg = VlanTaggingFilterDataFrame(vlan_tagging_entity_id)
+        frame = msg.delete()
+        self.log.debug('openomci-msg', omci_msg=msg)
+        results = yield self._device.omci_cc.send(frame)
+        self.check_status_and_state(results, 'flow-delete-vlan-tagging-filter-data')
+
+    @inlineCallbacks
+    def _create_vlan_filter_entity(self, vlan_tagging_entity_id):
+
+        self.log.debug("Vlan tagging filter data frame will be created.",
+                       expected_me_id=vlan_tagging_entity_id)
+        vlan_tagging_me = self._device.query_mib(VlanTaggingFilterData.class_id,
+                                                 instance_id=int(vlan_tagging_entity_id))
+        if len(vlan_tagging_me) == 0:
+            forward_operation = 0x10  # VID investigation
+            self.log.debug("vlan id isn't reserved")
+            self.log.debug("forward_operation", forward_operation=forward_operation)
+            self.log.debug("set_vlan_id", vlan_id=self._set_vlan_id)
+            # When the PUSH VLAN is RESERVED_VLAN (4095), let ONU be transparent
+            if self._set_vlan_id == RESERVED_TRANSPARENT_VLAN:
+                forward_operation = 0x00  # no investigation, ONU transparent
+
+            # Create bridge ani side vlan filter
+            msg = VlanTaggingFilterDataFrame(
+                int(vlan_tagging_entity_id),  # Entity ID
+                vlan_tcis=[self._set_vlan_id],  # VLAN IDs
+                forward_operation=forward_operation
+            )
+
+            self.log.debug("created vlan tagging data frame msg")
+            frame = msg.create()
+            self.log.debug('openomci-msg', omci_msg=msg)
+            results = yield self._device.omci_cc.send(frame)
+            self.check_status_and_state(results, 'create-vlan-tagging-filter-data')
+
+    @inlineCallbacks
+    def _reset_evto_and_vlan_tag_filter(self):
+        self.log.info("resetting-evto-and-vlan-tag-filter")
+        # Delete bridge ani side vlan filter
+        eid = self._mac_bridge_port_ani_entity_id + self._uni_port.entity_id + self._tp_id  # Entity ID
+        msg = VlanTaggingFilterDataFrame(eid)
+        frame = msg.delete()
+        self.log.debug('openomci-msg', omci_msg=msg)
+        self.strobe_watchdog()
+        results = yield self._device.omci_cc.send(frame)
+        self.check_status_and_state(results, 'flow-delete-vlan-tagging-filter-data')
+
+        ################################################################################
+        # Create Extended VLAN Tagging Operation config (UNI-side)
+        #
+        #  EntityID relates to the VLAN TCIS later used int vlan filter task.  This only
+        #  sets up the inital MIB entry as it relates to port config, it does not set vlan
+        #  that is saved for the vlan filter task
+        #
+        #  References:
+        #            - PPTP Ethernet or VEIP UNI
+        #
+
+        # Delete uni side evto
+        msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
+            self._mac_bridge_service_profile_entity_id + self._uni_port.mac_bridge_port_num,
+        )
+        frame = msg.delete()
+        self.log.debug('openomci-msg', omci_msg=msg)
+        results = yield self._device.omci_cc.send(frame)
+        self.check_status_and_state(results, 'delete-extended-vlan-tagging-operation-configuration-data')
+
+        # Re-Create uni side evto
+        # default to PPTP
+        association_type = 2
+        if self._uni_port.type.value == UniType.VEIP.value:
+            association_type = 10
+        elif self._uni_port.type.value == UniType.PPTP.value:
+            association_type = 2
+
+        attributes = dict(
+            association_type=association_type,  # Assoc Type, PPTP/VEIP Ethernet UNI
+            associated_me_pointer=self._uni_port.entity_id,  # Assoc ME, PPTP/VEIP Entity Id
+
+            # See VOL-1311 - Need to set table during create to avoid exception
+            # trying to read back table during post-create-read-missing-attributes
+            # But, because this is a R/W attribute. Some ONU may not accept the
+            # value during create. It is repeated again in a set below.
+            input_tpid=self._input_tpid,  # input TPID
+            output_tpid=self._output_tpid,  # output TPID
+        )
+
+        msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
+            self._mac_bridge_service_profile_entity_id + self._uni_port.mac_bridge_port_num,  # Bridge Entity ID
+            attributes=attributes
+        )
+
+        frame = msg.create()
+        self.log.debug('openomci-msg', omci_msg=msg)
+        results = yield self._device.omci_cc.send(frame)
+        self.check_status_and_state(results, 'create-extended-vlan-tagging-operation-configuration-data')
+
+    @inlineCallbacks
+    def _incremental_update_evto_and_vlan_tag_filter(self):
+        self.log.info("incremental-update-evto-and-vlan-tag-filter")
+        vlan_tagging_entity_id = int(self._mac_bridge_port_ani_entity_id + self._uni_port.entity_id
+                                     + self._tp_id)
+        extended_vlan_tagging_entity_id = self._mac_bridge_service_profile_entity_id + \
+                                          self._uni_port.mac_bridge_port_num
+        ################################################################################
+        # VLAN Tagging Filter config
+        #
+        #  EntityID will be referenced by:
+        #            - Nothing
+        #  References:
+        #            - MacBridgePortConfigurationData for the ANI/PON side
+        #
+
+        # TODO: check if its in our local mib first before blindly deleting
+        if self._tp_id != 0:
+            yield self._create_vlan_filter_entity(vlan_tagging_entity_id)
+
+        self.log.info('setting-vlan-tagging')
+        attributes = dict(
+            # Specifies the TPIDs in use and that operations in the downstream direction are
+            # inverse to the operations in the upstream direction
+            input_tpid=self._input_tpid,  # input TPID
+            output_tpid=self._output_tpid,  # output TPID
+            downstream_mode=0,  # inverse of upstream
+        )
+
+        msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
+            extended_vlan_tagging_entity_id,  # Bridge Entity ID
+            attributes=attributes
+        )
+
+        frame = msg.set()
+        self.log.debug('openomci-msg', omci_msg=msg)
+        self.strobe_watchdog()
+        results = yield self._device.omci_cc.send(frame)
+        self.check_status_and_state(results, 'set-extended-vlan-tagging-operation-configuration-data')
+
+        # Onu-Transparent
+        if self._set_vlan_id == RESERVED_TRANSPARENT_VLAN:
+            # Transparently send any single tagged packet.
+            # As the onu is to be transparent, no need to create VlanTaggingFilterData ME.
+            # Any other specific rules will take priority over this, so not setting any other vlan specific rules
+            entry = VlanTaggingOperation(
+                filter_outer_priority=15,  # not an outer tag rule, ignore all other outers
+                filter_outer_vid=4096,  # ignore
+                filter_outer_tpid_de=0,  # ignore
+                filter_inner_priority=14,  # default single tagged rule
+                filter_inner_vid=4096,  # do not match on vlan value
+                filter_inner_tpid_de=0,  # do not match on tpid
+                filter_ether_type=0,  # do not filter on untagged ethertype
+                treatment_tags_to_remove=0,  # do not remove any tags
+                treatment_outer_priority=15,  # do not add outer tag
+                treatment_outer_vid=0,  # ignore
+                treatment_outer_tpid_de=0,  # ignore
+                treatment_inner_priority=15,  # do not add inner tag
+                treatment_inner_vid=0,  # ignore
+                treatment_inner_tpid_de=4  # set TPID 0x8100
+            )
+
+            attributes = dict(received_frame_vlan_tagging_operation_table=entry)
+            msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
+                extended_vlan_tagging_entity_id,  # Bridge Entity ID
+                attributes=attributes
+            )
+
+            frame = msg.set()
+            self.log.debug('openomci-msg', omci_msg=msg)
+            self.strobe_watchdog()
+            results = yield self._device.omci_cc.send(frame)
+            self.check_status_and_state(results, 'set-evto-table-transparent-vlan')
+        else:
+            # Update uni side extended vlan filter
+            # filter for any set vlan - even its match tag is TRANSPARENT.
+            # For TRANSPARENT match_vlan tag case we modified vlan_pcp and treatment_tags_to_remove values during init.
+            entry = VlanTaggingOperation(
+                filter_outer_priority=15,  # This entry is not a double-tag rule
+                filter_outer_vid=4096,  # Do not filter on the outer VID value
+                filter_outer_tpid_de=0,  # Do not filter on the outer TPID field
+
+                filter_inner_priority=self._vlan_pcp,  # Filter on inner vlan
+                filter_inner_vid=self._match_vlan,  # Look for match vlan
+                filter_inner_tpid_de=0,  # Do not filter on inner TPID field
+                filter_ether_type=0,  # Do not filter on EtherType
+
+                treatment_tags_to_remove=self._treatment_tags_to_remove,
+                treatment_outer_priority=15,
+                treatment_outer_vid=0,
+                treatment_outer_tpid_de=0,
+
+                treatment_inner_priority=self._set_vlan_pcp,  # Add an inner priority
+                treatment_inner_vid=self._set_vlan_id,  # use this value as the VID in the inner VLAN tag
+                treatment_inner_tpid_de=4,  # set TPID
+            )
+
+            attributes = dict(received_frame_vlan_tagging_operation_table=entry)
+            msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
+                extended_vlan_tagging_entity_id,  # Bridge Entity ID
+                attributes=attributes  # See above
+            )
+            frame = msg.set()
+            self.log.debug('openomci-msg', omci_msg=msg)
+            self.strobe_watchdog()
+            results = yield self._device.omci_cc.send(frame)
+            self.check_status_and_state(results, 'set-evto-table')
+
+    @inlineCallbacks
+    def _bulk_update_evto_and_vlan_tag_filter(self):
+        self.log.info("bulk-update-evto-and-vlan-tag-filter")
+        # First reset any existing config EVTO and vlan tag filter on the ONU
+        yield self._reset_evto_and_vlan_tag_filter()
+
+        vlan_tagging_entity_id = int(self._mac_bridge_port_ani_entity_id + self._uni_port.entity_id
+                                     + self._tp_id)
+        extended_vlan_tagging_entity_id = self._mac_bridge_service_profile_entity_id + \
+                                          self._uni_port.mac_bridge_port_num
+        attributes = dict(
+            # Specifies the TPIDs in use and that operations in the downstream direction are
+            # inverse to the operations in the upstream direction
+            input_tpid=self._input_tpid,  # input TPID
+            output_tpid=self._output_tpid,  # output TPID
+            downstream_mode=0,  # inverse of upstream
+        )
+
+        msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
+            extended_vlan_tagging_entity_id,  # Bridge Entity ID
+            attributes=attributes
+        )
+
+        frame = msg.set()
+        self.log.debug('openomci-msg', omci_msg=msg)
+        self.strobe_watchdog()
+        results = yield self._device.omci_cc.send(frame)
+        self.check_status_and_state(results, 'set-extended-vlan-tagging-operation-configuration-data')
+
+        # Onu-Transparent
+        if self._set_vlan_id == RESERVED_TRANSPARENT_VLAN:
+            # Transparently send any single tagged packet.
+            # As the onu is to be transparent, no need to create VlanTaggingFilterData ME.
+            # Any other specific rules will take priority over this, so not setting any other vlan specific rules
+            attributes = dict(
+                received_frame_vlan_tagging_operation_table=
+                VlanTaggingOperation(
+                    filter_outer_priority=15,
+                    filter_outer_vid=4096,
+                    filter_outer_tpid_de=0,
+                    filter_inner_priority=14,
+                    filter_inner_vid=4096,
+                    filter_inner_tpid_de=0,
+                    filter_ether_type=0,
+                    treatment_tags_to_remove=0,
+                    treatment_outer_priority=15,
+                    treatment_outer_vid=0,
+                    treatment_outer_tpid_de=0,
+                    treatment_inner_priority=15,
+                    treatment_inner_vid=0,
+                    treatment_inner_tpid_de=4
+                )
+            )
+
+            msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
+                extended_vlan_tagging_entity_id,  # Bridge Entity ID
+                attributes=attributes
+            )
+
+            frame = msg.set()
+            self.log.debug('openomci-msg', omci_msg=msg)
+            self.strobe_watchdog()
+            results = yield self._device.omci_cc.send(frame)
+            self.check_status_and_state(results, 'set-evto-table-transparent-vlan')
+
+        else:
+            # Re-Create bridge ani side vlan filter
+            forward_operation = 0x10  # VID investigation
+
+            msg = VlanTaggingFilterDataFrame(
+                vlan_tagging_entity_id,
+                vlan_tcis=[self._set_vlan_id],  # VLAN IDs
+                forward_operation=forward_operation
+            )
+            frame = msg.create()
+            self.log.debug('openomci-msg', omci_msg=msg)
+            self.strobe_watchdog()
+            results = yield self._device.omci_cc.send(frame)
+            self.check_status_and_state(results, 'flow-create-vlan-tagging-filter-data')
+            # Update uni side extended vlan filter
+            # filter for untagged
+            attributes = dict(
+                received_frame_vlan_tagging_operation_table=
+                VlanTaggingOperation(
+                    filter_outer_priority=15,
+                    filter_outer_vid=4096,
+                    filter_outer_tpid_de=0,
+                    filter_inner_priority=15,
+                    filter_inner_vid=4096,
+                    filter_inner_tpid_de=0,
+                    filter_ether_type=0,
+                    treatment_tags_to_remove=0,
+                    treatment_outer_priority=15,
+                    treatment_outer_vid=0,
+                    treatment_outer_tpid_de=0,
+                    treatment_inner_priority=0,
+                    treatment_inner_vid=self._set_vlan_id,
+                    treatment_inner_tpid_de=4
+                )
+            )
+
+            msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
+                extended_vlan_tagging_entity_id,  # Bridge Entity ID
+                attributes=attributes
+            )
+
+            frame = msg.set()
+            self.log.debug('openomci-msg', omci_msg=msg)
+            self.strobe_watchdog()
+            results = yield self._device.omci_cc.send(frame)
+            self.check_status_and_state(results, 'set-evto-table-untagged')
+
+            # Update uni side extended vlan filter
+            # filter for vlan 0
+            attributes = dict(
+                received_frame_vlan_tagging_operation_table=
+                VlanTaggingOperation(
+                    filter_outer_priority=15,  # This entry is not a double-tag rule
+                    filter_outer_vid=4096,  # Do not filter on the outer VID value
+                    filter_outer_tpid_de=0,  # Do not filter on the outer TPID field
+
+                    filter_inner_priority=8,  # Filter on inner vlan
+                    filter_inner_vid=0x0,  # Look for vlan 0
+                    filter_inner_tpid_de=0,  # Do not filter on inner TPID field
+                    filter_ether_type=0,  # Do not filter on EtherType
+
+                    treatment_tags_to_remove=1,
+                    treatment_outer_priority=15,
+                    treatment_outer_vid=0,
+                    treatment_outer_tpid_de=0,
+
+                    treatment_inner_priority=8,  # Add an inner tag and insert this value as the priority
+                    treatment_inner_vid=self._set_vlan_id,  # use this value as the VID in the inner VLAN tag
+                    treatment_inner_tpid_de=4,  # set TPID
+                )
+            )
+            msg = ExtendedVlanTaggingOperationConfigurationDataFrame(
+                extended_vlan_tagging_entity_id,  # Bridge Entity ID
+                attributes=attributes  # See above
+            )
+            frame = msg.set()
+            self.log.debug('openomci-msg', omci_msg=msg)
+            self.strobe_watchdog()
+            results = yield self._device.omci_cc.send(frame)
+            self.check_status_and_state(results, 'set-evto-table-zero-tagged')
