diff --git a/voltha/adapters/tlgs_onu/tlgs_constants.py b/voltha/adapters/tlgs_onu/tlgs_constants.py
deleted file mode 100644
index 0729b42..0000000
--- a/voltha/adapters/tlgs_onu/tlgs_constants.py
+++ /dev/null
@@ -1,300 +0,0 @@
-#
-# Copyright 2017 the original author or authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-from enum import Enum
-
-"""
-PAS5211 Constants
-"""
-
-# from enum PON_true_false_t
-PON_FALSE = 0
-PON_TRUE = 1
-
-# from enum PON_enable_disable_t
-PON_DISABLE = 0
-PON_ENABLE = 1
-
-# from enym PON_mac_t
-PON_MII = 0
-PON_GMII = 1
-PON_TBI = 2
-
-PON_POLARITY_ACTIVE_LOW = 0
-PON_POLARITY_ACTIVE_HIGH = 1
-
-PON_OPTICS_VOLTAGE_IF_UNDEFINED = 0
-PON_OPTICS_VOLTAGE_IF_CML = 1
-PON_OPTICS_VOLTAGE_IF_LVPECL = 2
-
-PON_SD_SOURCE_LASER_SD = 0
-PON_SD_SOURCE_BCDR_LOCK = 1
-PON_SD_SOURCE_BCDR_SD = 2
-
-PON_RESET_TYPE_DELAY_BASED = 0
-PON_RESET_TYPE_SINGLE_RESET = 1
-PON_RESET_TYPE_DOUBLE_RESET = 2
-
-PON_RESET_TYPE_NORMAL_START_BURST_BASED = 0
-PON_RESET_TYPE_NORMAL_END_BURST_BASED = 1
-
-PON_GPIO_LINE_0 = 0
-PON_GPIO_LINE_1 = 1
-PON_GPIO_LINE_2 = 2
-PON_GPIO_LINE_3 = 3
-PON_GPIO_LINE_4 = 4
-PON_GPIO_LINE_5 = 5
-PON_GPIO_LINE_6 = 6
-PON_GPIO_LINE_7 = 7
-def PON_EXT_GPIO_LINE(line):
-    return line + 8
-
-PON_ALARM_SOFTWARE_ERROR = 0
-PON_ALARM_LOS = 1
-PON_ALARM_LOSI = 2
-PON_ALARM_DOWI = 3
-PON_ALARM_LOFI = 4
-PON_ALARM_RDII = 5
-PON_ALARM_LOAMI = 6
-PON_ALARM_LCDGI = 7
-PON_ALARM_LOAI = 8
-PON_ALARM_SDI = 9
-PON_ALARM_SFI = 10
-PON_ALARM_PEE = 11
-PON_ALARM_DGI = 12
-PON_ALARM_LOKI = 13
-PON_ALARM_TIWI = 14
-PON_ALARM_TIA = 15
-PON_ALARM_AUTH_FAILED_IN_REGISTRATION_ID_MODE = 20
-PON_ALARM_SUFI = 21
-
-PON_ALARM_VIRTUAL_SCOPE_ONU_LASER_ALWAYS_ON = 16
-PON_ALARM_VIRTUAL_SCOPE_ONU_SIGNAL_DEGRADATION = 17
-PON_ALARM_VIRTUAL_SCOPE_ONU_EOL = 18
-PON_ALARM_VIRTUAL_SCOPE_ONU_EOL_DATABASE_IS_FULL = 19
-
-PON_ALARM_LAST_ALARM = 22
-
-# from enum PON_general_parameters_type_t
-PON_COMBINED_LOSI_LOFI = 1000
-PON_TX_ENABLE_DEFAULT = 1001
-
-# Enable or disable False queue full event from DBA
-PON_FALSE_Q_FULL_EVENT_MODE = 1002
-
-# Set PID_AID_MISMATCH min silence period. 0 - disable, Else - period in secs
-PON_PID_AID_MISMATCH_MIN_SILENCE_PERIOD = 1003
-
-# Set if FW generate clear alarm. 0 - generate clear alarm, Else - don't
-# generate clear alarm
-PON_ENABLE_CLEAR_ALARM = 1004
-
-# Enable or disabl send assign alloc id ploam. 0 - disable, 1 - enable
-PON_ASSIGN_ALLOC_ID_PLOAM = 1005
-
-# BIP error polling period, 200 - 65000, 0 - Disabled, Recommended: 5000
-# (default)
-PON_BIP_ERR_POLLING_PERIOD_MS = 1006
-
-# Ignore SN when decatived 0 - consider SN (deactivate the onu if received
-# same SN when activated (default)	1 - Ignore
-PON_IGNORE_SN_WHEN_ACTIVE = 1007
-
-# 0xffffffff - Disabled (default). Any other value (0 - 0xfffe) indicates
-# that PA delay is enabled, with the specified delay value and included in
-# the US_OVERHEAD PLOAM
-PON_ONU_PRE_ASSIGNED_DELAY = 1008
-
-# Enable or disable DS fragmentation, 0 disable, 1 enable
-PON_DS_FRAGMENTATION = 1009
-
-# Set if fw report rei alarm when errors is 0, 0 disable (default), 1 enable
-PON_REI_ERRORS_REPORT_ALL = 1010
-
-# Set if igonre sfi deactivation, 0 disable (default), 1 enable
-PON_IGNORE_SFI_DEACTIVATION = 1011
-
-# Allows to override the allocation overhead set by optic-params
-# configuration. This configuration is only allowed when the the pon channel
-# is disabled
-PON_OVERRIDE_ALLOCATION_OVERHEAD = 1012
-
-# Optics timeline offset, -128-127, : this parameter is very sensitive and
-# requires coordination with PMC
-PON_OPTICS_TIMELINE_OFFSET = 1013
-
-# Last general meter
-PON_LAST_GENERAL_PARAMETER = PON_OPTICS_TIMELINE_OFFSET
-
-# from enum PON_dba_mode_t
-PON_DBA_MODE_NOT_LOADED = 0
-PON_DBA_MODE_LOADED_NOT_RUNNING = 1
-PON_DBA_MODE_RUNNING = 2
-PON_DBA_MODE_LAST = 3
-
-# from enum type typedef enum PON_port_frame_destination_t
-PON_PORT_PON = 0
-PON_PORT_SYSTEM = 1
-
-PON_PORT_TYPE_GEM  = 0
-PON_PORT_TYPE_TDM  = 1
-PON_PORT_TYPE_OMCI = 2
-
-PON_PORT_DESTINATION_CNI0 = 0
-PON_PORT_DESTINATION_CNI1 = 1
-PON_PORT_DESTINATION_CNI2 = 2
-PON_PORT_DESTINATION_CPU  = 3
-
-# from enum PON_olt_hw_classification_t
-
-PON_OLT_HW_CLASSIFICATION_PAUSE = 0
-PON_OLT_HW_CLASSIFICATION_LINK_CONSTRAINT = 1
-PON_OLT_HW_CLASSIFICATION_IGMP = 2
-PON_OLT_HW_CLASSIFICATION_MPCP = 3
-PON_OLT_HW_CLASSIFICATION_OAM = 4
-PON_OLT_HW_CLASSIFICATION_802_1X = 5
-PON_OLT_HW_CLASSIFICATION_PPPOE_DISCOVERY = 6
-PON_OLT_HW_CLASSIFICATION_PPPOE_SESSION = 7
-PON_OLT_HW_CLASSIFICATION_DHCP_V4 = 8
-PON_OLT_HW_CLASSIFICATION_PIM  = 9
-PON_OLT_HW_CLASSIFICATION_DHCP_V6 = 10
-PON_OLT_HW_CLASSIFICATION_ICMP_V4 = 11
-PON_OLT_HW_CLASSIFICATION_MLD = 12
-PON_OLT_HW_CLASSIFICATION_ARP = 13
-PON_OLT_HW_CLASSIFICATION_CONF_DA = 14
-PON_OLT_HW_CLASSIFICATION_CONF_RULE = 15
-PON_OLT_HW_CLASSIFICATION_DA_EQ_SA = 16
-PON_OLT_HW_CLASSIFICATION_DA_EQ_MAC = 17
-PON_OLT_HW_CLASSIFICATION_DA_EQ_SEC_MAC = 18
-PON_OLT_HW_CLASSIFICATION_SA_EQ_MAC = 19
-PON_OLT_HW_CLASSIFICATION_SA_EQ_SEC_MAC = 20
-PON_OLT_HW_CLASSIFICATION_ETHERNET_MANAGEMENT = 100
-PON_OLT_HW_CLASSIFICATION_IPV4_LOCAL_MULTICAST = 101
-PON_OLT_HW_CLASSIFICATION_IPV4_MANAGEMENT = 102
-PON_OLT_HW_CLASSIFICATION_ALL_IPV4_MULTICAST  = 103
-PON_OLT_HW_CLASSIFICATION_IPV6_LOCAL_MULTICAST = 104
-PON_OLT_HW_CLASSIFICATION_IPV6_MANAGEMENT = 105
-PON_OLT_HW_CLASSIFICATION_ALL_IPV6_MULTICAST = 106
-PON_OLT_HW_CLASSIFICATION_OTHER	 = 107
-PON_OLT_HW_CLASSIFICATION_LAST_RULE  = 108
-
-PON_ACTIVATION_AUTH_AUTO = 0
-PON_ACTIVATION_AUTH_HOST_CONTROLLED_SEPARATE_EVENTS = 1 # Host controlled: Separate events
-PON_ACTIVATION_AUTH_HOST_CONTROLLED_LUMPED_SN = 2 # Host controlled: Lumped-SN-Response
-PON_ACTIVATION_AUTH_REGISTRATION_ID_RAW = 3 # Registration-ID Raw
-PON_ACTIVATION_AUTH_REGISTRATION_ID_LEARN = 4  # Registration-ID Learn
-
-PON_LOGICAL_OBJECT_TYPE_ALLOC_ID = 0
-PON_LOGICAL_OBJECT_TYPE_ONU_ID_BY_ALLOC_ID  = 1
-PON_LOGICAL_OBJECT_TYPE_MAX	= PON_LOGICAL_OBJECT_TYPE_ONU_ID_BY_ALLOC_ID
-
-PMC_OFAL_MAX_BI_DIRECTIONAL_FLOW_PER_ONU = 16
-PMC_OFAL_START_FLOW_ID_BASE = 1000
-
-PON_DL_VLAN_SVLAN_REMOVE = 3
-PON_DL_VLAN_CVLAN_NO_CHANGE = 0
-
-PON_VLAN_DONT_CHANGE_TAG = 0
-PON_VLAN_CHANGE_TAG = 1
-PON_VLAN_CHANGE_OTHER_TAG = 2
-PON_VLAN_CHANGE_REMOVE_TAG = 3
-
-PON_VLAN_UNUSED_TAG = -1
-PON_VLAN_DEST_DATAPATH = 1
-PON_VLAN_UNCHANGED_PRIORITY = -1
-PON_VLAN_REPLACE_PRIORITY = -2
-PON_VLAN_UNUSED_PRIORITY = -1
-
-PON_OUTPUT_VLAN_PRIO_HANDLE_DONT_CHANGE = 0
-PON_OUTPUT_VLAN_PRIO_HANDLE_INCOMING_VLAN = 1
-PON_OUTPUT_VLAN_PRIO_HANDLE_DL_VLAN_TABLE  = 2
-
-PON_N_TO_1_VLAN_MODE = 0
-PON_1_TO_1_VLAN_MODE = 1
-
-# OMCI
-
-OMCI_8021P_MSP_UNMARKED_FRAME_TAG_FRAME = 1
-OMCI_8021P_MSP_TP_TYPE_NULL = 0
-
-# GEM interworking option for MAC Bridge LAN
-OMCI_GEM_IWTP_IW_OPT_8021P_MAPPER = 5
-#LLC frame encapsulation method
-OMCI_MAC_BRIDGE_PCD_ENCAP_METHOD_LLC = 1
-# Frame Check Sequence will forward
-OMCI_MAC_BRIDGE_PCD_LANFCS_FORWARDED = 0
-# in DS, perform the inverse of US operation
-OMCI_EX_VLAN_TAG_OCD_DS_MODE_US_INVERSE = 0
-# Physical path termination point Ethernet UNI
-OMCI_EX_VLAN_TAG_OCD_ASSOCIATION_TYPE_PPTP_ETH_UNI = 2
-
-# GEM Port Network CTP
-
-# Direction definitions
-GEM_DIR_BIDIRECT = 3 # bi-directional
-
-# PMC
-PMC_UPSTREAM_PORT = 129
-
-# SLA
-
-PYTHAGORAS_UPDATE_AID_SLA = 21
-PYTHAGORAS_DBA_DATA_COS = 0
-PYTHAGORAS_DBA_STATUS_REPORT_NSR = 0
-PYTHAGORAS_SET_SLA_RESP_SIZE = 10
-
-# Random values found in PMC code
-SLA_gr_bw_gros = 30
-SLA_be_bw_gros = 300
-SLA_gr_bw_fine = 0
-SLA_be_bw_fine = 0
-
-PON_MAX_DS_POLICING_CONFIGURATION_INDEX = 255
-PMC_OFAL_NO_POLICY = PON_MAX_DS_POLICING_CONFIGURATION_INDEX+1
-
-#Enum classes to set alarm parameters
-
-class AlarmEventType(Enum):
-    COMMUNICATION = 0
-    ENVIRONMENT = 1
-    EQUIPTMENT = 2
-    SERVICE = 3
-    PROCESSING = 4
-    SECURITY = 5
-
-class AlarmEventCategory(Enum):
-    PON = 0
-
-class AlarmEventState(Enum):
-    RAISED = 1
-    CLEARED = 0
-
-class AlarmEventSeverity(Enum):
-    INDETERMINATE = 0
-    WARNING = 1
-    MINOR = 2
-    MAJOR = 3
-    CRITICAL = 4
-
-AlarmEventStateDefault = 1
-
-UPSTREAM = 1
-DOWNSTREAM = 2
-
-PASCOMM_RETRIES = 5
-
-# Number of ONU LAN PORTS
-PORT_NUMBER = 1
-
diff --git a/voltha/adapters/tlgs_onu/tlgs_onu.py b/voltha/adapters/tlgs_onu/tlgs_onu.py
index 11fff22..e899eed 100644
--- a/voltha/adapters/tlgs_onu/tlgs_onu.py
+++ b/voltha/adapters/tlgs_onu/tlgs_onu.py
@@ -25,10 +25,34 @@
 import voltha.core.flow_decomposer as fd
 
 from voltha.adapters.interface import IAdapterInterface
+from voltha.adapters.microsemi_olt.DeviceManager import mac_str_to_tuple
+from voltha.adapters.microsemi_olt.PAS5211 import PAS5211GetOnuAllocs, PAS5211GetOnuAllocsResponse, PAS5211GetSnInfo, \
+    PAS5211GetSnInfoResponse, PAS5211GetOnusRange, PAS5211GetOnusRangeResponse, PAS5211MsgSetOnuOmciPortId, \
+    PAS5211MsgSetOnuOmciPortIdResponse, PAS5211MsgSetOnuAllocId, PAS5211MsgSetOnuAllocIdResponse, \
+    PAS5211SetSVlanAtConfig, PAS5211SetSVlanAtConfigResponse, PAS5211SetVlanDownConfig, \
+    PAS5211SetVlanDownConfigResponse, PAS5211SetDownVlanHandl, PAS5211SetDownVlanHandlResponse, \
+    PAS5211SetUplinkVlanHandl, PAS5211SetDownstreamPolicingConfigResponse, PAS5211SetDownstreamPolicingConfig, \
+    PAS5211SetPortIdPolicingConfig, PAS5211UnsetPortIdPolicingConfig, \
+    PAS5211MsgSendDbaAlgorithmMsg, PAS5211MsgSendDbaAlgorithmMsgResponse, \
+    PAS5211SetUpstreamPolicingConfigResponse, PAS5211SetUpstreamPolicingConfig, \
+    PAS5211MsgSetPortIdConfig, PAS5211MsgSetPortIdConfigResponse, \
+    PAS5211MsgGetOnuIdByPortId, PAS5211MsgGetOnuIdByPortIdResponse, \
+    PAS5211SetVlanUplinkConfiguration, PAS5211SetVlanUplinkConfigurationResponse, PAS5211SetUplinkVlanHandlResponse, PAS5211SetVlanGenConfig, PAS5211SetVlanGenConfigResponse, \
+    PAS5211GetPortIdDownstreamPolicingConfig, PAS5211GetPortIdDownstreamPolicingConfigResponse, PAS5211RemoveDownstreamPolicingConfig, \
+    PAS5211MsgHeader, PAS5211UnsetPortIdPolicingConfigResponse, PAS5211RemoveDownstreamPolicingConfigResponse, \
+    PAS5211SetPortIdPolicingConfigResponse
+from voltha.adapters.microsemi_olt.PAS5211_constants import OMCI_GEM_IWTP_IW_OPT_8021P_MAPPER, PON_FALSE, \
+    PON_1_TO_1_VLAN_MODE, PON_TRUE, PON_VLAN_UNUSED_TAG, PON_VLAN_UNUSED_PRIORITY, PON_VLAN_REPLACE_PRIORITY, \
+    PON_OUTPUT_VLAN_PRIO_HANDLE_INCOMING_VLAN, PON_VLAN_UNCHANGED_PRIORITY, PON_OUTPUT_VLAN_PRIO_HANDLE_DONT_CHANGE, \
+    PON_OUTPUT_VLAN_PRIO_HANDLE_DL_VLAN_TABLE, PON_DL_VLAN_SVLAN_REMOVE, PON_DL_VLAN_CVLAN_NO_CHANGE, \
+    PON_VLAN_DEST_DATAPATH, GEM_DIR_BIDIRECT, OMCI_MAC_BRIDGE_PCD_LANFCS_FORWARDED, \
+    OMCI_MAC_BRIDGE_PCD_ENCAP_METHOD_LLC, OMCI_8021P_MSP_UNMARKED_FRAME_TAG_FRAME, OMCI_8021P_MSP_TP_TYPE_NULL, \
+    OMCI_EX_VLAN_TAG_OCD_ASSOCIATION_TYPE_PPTP_ETH_UNI, OMCI_EX_VLAN_TAG_OCD_DS_MODE_US_INVERSE, PMC_UPSTREAM_PORT, \
+    PON_DISABLE, PON_VLAN_CHANGE_TAG, PON_VLAN_DONT_CHANGE_TAG, PON_PORT_TYPE_GEM, PON_PORT_DESTINATION_CNI0, PON_ENABLE, SLA_gr_bw_gros, PYTHAGORAS_UPDATE_AID_SLA, \
+    SLA_gr_bw_gros, SLA_be_bw_gros, SLA_gr_bw_fine, SLA_be_bw_fine, PYTHAGORAS_DBA_DATA_COS, PYTHAGORAS_DBA_STATUS_REPORT_NSR, \
+    PMC_OFAL_NO_POLICY, UPSTREAM, DOWNSTREAM
 
 from voltha.extensions.omci.omci_frame import OmciFrame
-from voltha.extensions.omci.omci_entities import Ieee8021pMapperServiceProfile
-
 from voltha.protos import third_party
 from voltha.protos.adapter_pb2 import Adapter
 from voltha.protos.adapter_pb2 import AdapterConfig
@@ -36,24 +60,16 @@
 from voltha.protos.device_pb2 import DeviceType, DeviceTypes, Port
 from voltha.protos.health_pb2 import HealthStatus
 from voltha.protos.logical_device_pb2 import LogicalPort
-from voltha.protos.openflow_13_pb2 import OFPPF_10GB_FD, OFPPF_FIBER, ofp_port, OFPPS_LIVE, OFPXMC_OPENFLOW_BASIC
+from voltha.protos.openflow_13_pb2 import OFPPF_1GB_FD, OFPPF_FIBER, ofp_port, OFPPS_LIVE, OFPXMC_OPENFLOW_BASIC
 
 from voltha.extensions.omci.omci_messages import OmciGet, OmciGetResponse, OmciCreate, OmciMibResetResponse, OmciSet, \
     OmciSetResponse, OmciCreateResponse, OmciMibReset, OmciDelete, OmciDeleteResponse
-
-from voltha.adapters.microsemi_olt.PAS5211_comm import PAS5211Communication
+from adapters.microsemi_olt.OMCIProxy import OMCIProxy
+from voltha.adapters.microsemi_olt.APIProxy import APIProxy
 from voltha.registry import registry
 from voltha.extensions.omci.omci_entities import VlanTaggingOperation
 from voltha.protos.openflow_13_pb2 import Flows, FlowGroups
 
-from common.frameio.frameio import hexify
-
-from tlgs_constants import OMCI_GEM_IWTP_IW_OPT_8021P_MAPPER, PON_FALSE, \
-    GEM_DIR_BIDIRECT, OMCI_MAC_BRIDGE_PCD_LANFCS_FORWARDED, \
-    OMCI_MAC_BRIDGE_PCD_ENCAP_METHOD_LLC, OMCI_8021P_MSP_UNMARKED_FRAME_TAG_FRAME, OMCI_8021P_MSP_TP_TYPE_NULL, \
-    OMCI_EX_VLAN_TAG_OCD_ASSOCIATION_TYPE_PPTP_ETH_UNI, OMCI_EX_VLAN_TAG_OCD_DS_MODE_US_INVERSE, PMC_UPSTREAM_PORT, \
-    SLA_gr_bw_gros, SLA_be_bw_gros, SLA_gr_bw_fine, SLA_be_bw_fine, PORT_NUMBER
-
 import Queue
 from struct import pack, unpack
 
@@ -72,13 +88,14 @@
 OMCI_EX_VLAN_TAG_OCD_TREAT_TPID_DE_COPY_FROM_INNER = 0
 OMCI_EX_VLAN_TAG_OCD_TREAT_TPID_EQ_8100 = 4
 
+MAX_FLOW_EVENT_RETRIES = 5
+
 def sequence_generator(init):
     num = init
     while True:
         yield num
         num += 1
 
-
 @implementer(IAdapterInterface)
 class TlgsOnuAdapter(object):
 
@@ -109,7 +126,6 @@
         #self.trangen = sequence_generator(1)
 
         # As of broadcom_onu.py
-        # [channel_id] and [onu_id] -> BrcmOnuHandler()
         self.device_handlers = dict()
         # register for adapter messages
         self.adapter_agent.register_for_inter_adapter_messages()
@@ -181,9 +197,11 @@
         if device.proxy_address.channel_id not in self.device_handlers:
             self.device_handlers[device.proxy_address.channel_id] = dict()
 
-        self.device_handlers[device.proxy_address.channel_id] = TlgsOnuHandler(self, device.id)
+        self.device_handlers[device.proxy_address.channel_id][
+            device.proxy_address.onu_id] = TlgsOnuHandler(self, device.id)
 
-        reactor.callLater(1, self.device_handlers[device.proxy_address.channel_id].activate, device)
+        reactor.callLater(1, self.device_handlers[device.proxy_address.channel_id][
+                          device.proxy_address.onu_id].activate, device)
 
         return device
 
@@ -195,13 +213,20 @@
 
     def disable_device(self, device):
         log.debug('disable-device', device=device.id)
-        reactor.callLater(0, self.device_handlers[device.proxy_address.channel_id].deactivate, device)
+
+        reactor.callLater(0, self.device_handlers[device.proxy_address.channel_id][
+            device.proxy_address.onu_id].deactivate, device)
+        #raise NotImplementedError()
 
     def reenable_device(self, device):
         raise NotImplementedError()
 
     def reboot_device(self, device):
-        raise NotImplementedError()
+        log.debug('reboot-device', device=device.id)
+
+        reactor.callLater(0, self.device_handlers[device.proxy_address.channel_id][
+            device.proxy_address.onu_id].reboot, device)
+        # raise NotImplementedError()
 
     def download_image(self, device, request):
         raise NotImplementedError()
@@ -219,12 +244,16 @@
         raise NotImplementedError()
 
     def self_test_device(self, device):
+        """
+        This is called to Self a device based on a NBI call.
+        :param device: A Voltha.Device object.
+        :return: Will return result of self test
+        """
         log.debug('self-test-device', device=device.id)
         raise NotImplementedError()
 
     def delete_device(self, device):
         log.debug('delete-device', device_id=device.id)
-        raise NotImplementedError()
 
     def get_device_details(self, device):
         raise NotImplementedError()
@@ -232,7 +261,7 @@
     def deactivate(self, device):
         try:
             handler = self.device_handlers[
-                device.proxy_address.channel_id]
+                device.proxy_address.channel_id][device.proxy_address.onu_id]
             return handler.deactivate(device)
         except Exception as e:
             log.exception('failed-to-deactivate-onu', e=e)
@@ -241,6 +270,7 @@
     def update_pm_config(self, device, pm_configs):
         raise NotImplementedError()
 
+    # @inlineCallbacks
     def update_flows_bulk(self, device, flows, groups):
         log.debug('onu-bulk-flow-update', device_id=device.id,
             flows=flows, groups=groups)
@@ -248,7 +278,7 @@
         try:
             assert len(groups.items) == 0
             handler = self.device_handlers[
-                device.proxy_address.channel_id]
+                device.proxy_address.channel_id][device.proxy_address.onu_id]
             handler.update_flow_table(device, flows.items)
         except Exception as e:
             log.exception('failed-to-update-flow-table', e=e)
@@ -261,17 +291,16 @@
         log.debug("send-proxied-message in TLGS ONU")
 
     def receive_proxied_message(self, proxy_address, msg):
-        log.debug('receive-proxied-message', msg=hexify(msg))
+        log.debug('receive-proxied-message')
+        # mgs - > onu_id
+        if PAS5211MsgHeader in msg:
+            if msg['PAS5211MsgHeader'].onu_id != -1:
+                handler = self.device_handlers[
+                    proxy_address.channel_id][msg.onu_id]
+                handler.receive_message(msg)
 
-        handler = self.device_handlers[
-            proxy_address.channel_id]
-
-        omci = OmciFrame(msg)
-        if omci is not None:
-            if omci.message_type in (16, 17):
-                return
-
-        handler.receive_message(msg)
+        # for onu, handler in self.device_handlers[proxy_address.channel_id].iteritems():
+        #     handler.receive_message(msg)
 
     def receive_packet_out(self, logical_device_id, egress_port_no, msg):
         log.debug('packet-out', logical_device_id=logical_device_id,
@@ -309,6 +338,7 @@
         self.adapter_agent = adapter.adapter_agent
         self.device_id = device_id
         self.log = structlog.get_logger(device_id=device_id)
+        #self.incoming_messages = Queue.Queue()
         self.incoming_messages = DeferredQueue()
         self.event_messages = Queue.Queue()
         self.proxy_address = None
@@ -317,7 +347,7 @@
         self.port_id = None
         self.alloc_id = None
         self.cvlan_id = None
-        self.subsvlan_id = 0
+        self.subsvlan_id = None
         self.bandwidth = None
         self.flows_lock = 0
         self.flows = None
@@ -325,112 +355,120 @@
         self.flow_queue = DeferredQueue()
 
     def receive_message(self, msg):
-        log.debug("receive-message")
+        log.debug("receive-message",msg=msg.show(dump=True))
         self.incoming_messages.put(msg)
 
-    @inlineCallbacks
     def activate(self, device):
         log.debug('activate-onu-handler', device=device)
         try:
+
             # register for proxied messages right away
             self.proxy_address = device.proxy_address
             self.adapter_agent.register_for_proxied_messages(device.proxy_address)
 
-            response = yield self.create_common_omci_config(device)
+            # First we verify that we got parent reference and proxy info
+            assert device.parent_id
+            assert device.proxy_address.device_id
+            # == 0 # We want to activate multiple ONT's
+            assert device.proxy_address.channel_id is not None
+            # to get onu_id = device.proxy_address.onu_id
 
-            if response:
-                # First we verify that we got parent reference and proxy info
-                assert device.parent_id
-                assert device.proxy_address.device_id
-                # == 0 # We want to activate multiple ONT's
-                assert device.proxy_address.channel_id is not None
-                # to get onu_id = device.proxy_address.onu_id
+            # From PMC code:
+            self.port_id = 1000 + 16 * device.proxy_address.onu_id
+            self.alloc_id = self.port_id
 
-                # From PMC code:
-                self.port_id = 1000 + 16 * device.proxy_address.onu_id
-                self.alloc_id = self.port_id
+            # we are going to use the proxy_address.channel_id as unique number
+            # and name for the virtual ports, as this is guaranteed to be unique
+            # in the context of the OLT port, so it is also unique in the context
+            # of the logical device
 
-                device.model = 'GPON ONU'
-                device.hardware_version = 'tbd'
-                device.firmware_version = 'tbd'
+            device.model = 'GPON ONU'
+            device.hardware_version = 'tbd'
+            device.firmware_version = 'tbd'
 
-                device.connect_status = ConnectStatus.REACHABLE
+            device.connect_status = ConnectStatus.REACHABLE
 
-                uni_port = Port(port_no=1,
-                                label="{} ONU".format('TLGS'),
-                                type=Port.ETHERNET_UNI,
-                                admin_state=AdminState.ENABLED,
-                                oper_status=OperStatus.ACTIVE
-                                )
-
-                self.adapter_agent.add_port(device.id, uni_port)
-
-                log.debug('add-onu-port')
-
-                pon_port = Port(
-                                port_no=2,
-                                label='PON port',
-                                type=Port.PON_ONU,
-                                admin_state=AdminState.ENABLED,
-                                oper_status=OperStatus.ACTIVE,
-                                peers=[
-                                    Port.PeerPort(
-                                        device_id=device.parent_id,
-                                        port_no=device.parent_port_no
-                                    )
-                                ]
+            uni_port = Port(port_no=1,
+                            label="{} ONU".format('TLGS'),
+                            type=Port.ETHERNET_UNI,
+                            admin_state=AdminState.ENABLED,
+                            oper_status=OperStatus.ACTIVE
                             )
 
-                self.adapter_agent.add_port(device.id, pon_port)
+            self.adapter_agent.add_port(device.id, uni_port)
 
-                log.debug('add-onu-port')
+            log.debug('add-onu-port')
 
-                # obtain logical device id
-                parent_device = self.adapter_agent.get_device(device.parent_id)
-                logical_device_id = parent_device.parent_id
-                assert logical_device_id
-                port_no = device.proxy_address.channel_id
-                cap = OFPPF_10GB_FD | OFPPF_FIBER
+            pon_port = Port(
+                            port_no=2,
+                            label='PON port',
+                            type=Port.PON_ONU,
+                            admin_state=AdminState.ENABLED,
+                            oper_status=OperStatus.ACTIVE,
+                            peers=[
+                                Port.PeerPort(
+                                    device_id=device.parent_id,
+                                    port_no=device.parent_port_no
+                                )
+                            ]
+                        )
 
-                self.adapter_agent.add_logical_port(logical_device_id, LogicalPort(
-                    id=str(port_no),
-                    ofp_port=ofp_port(
-                        port_no=port_no,
-                        hw_addr=mac_str_to_tuple(device.mac_address),
-                        name='uni-{}'.format(port_no),
-                        config=0,
-                        state=OFPPS_LIVE,
-                        curr=cap,
-                        advertised=cap,
-                        peer=cap,
-                        curr_speed=OFPPF_10GB_FD,
-                        max_speed=OFPPF_10GB_FD
-                    ),
-                    device_id=device.id,
-                    device_port_no=uni_port.port_no
-                ))
+            self.adapter_agent.add_port(device.id, pon_port)
 
-                log.debug('add-onu-logical-port')
+            log.debug('add-onu-port')
 
-                # Input logical port from ONT
-                self.port_no = port_no
+            # obtain logical device id
+            parent_device = self.adapter_agent.get_device(device.parent_id)
+            logical_device_id = parent_device.parent_id
+            assert logical_device_id
+            port_no = (device.proxy_address.channel_id * 32) + \
+                (device.proxy_address.onu_id + 1)
+            cap = OFPPF_1GB_FD | OFPPF_FIBER
 
-                # Finally update to "ACTIVE"
-                device = self.adapter_agent.get_device(device.id)
-                # In broadcom_onu.py this state is DISCOVERED
-                device.oper_status = OperStatus.ACTIVE
-                self.adapter_agent.update_device(device)
+            self.adapter_agent.add_logical_port(logical_device_id, LogicalPort(
+                id=str(port_no),
+                ofp_port=ofp_port(
+                    port_no=port_no,
+                    hw_addr=mac_str_to_tuple(device.serial_number)[2:8],
+                    # name='uni-{}'.format(port_no),
+                    name=device.serial_number[0:6],
+                    config=0,
+                    state=OFPPS_LIVE,
+                    curr=cap,
+                    advertised=cap,
+                    peer=cap,
+                    curr_speed=OFPPF_1GB_FD,
+                    max_speed=OFPPF_1GB_FD
+                ),
+                device_id=device.id,
+                device_port_no=uni_port.port_no
+            ))
 
-                log.info('Device activated', device=device)
+            log.debug('add-onu-logical-port')
 
-                reactor.callLater(0, self.wait_for_flow_events, device)
+            # Input logical port from ONT
+            self.port_no = port_no
 
-            else:
-                raise Exception('Exception during onu activation')
+            # Finally update to "ACTIVE"
+            device = self.adapter_agent.get_device(device.id)
+            # In broadcom_onu.py this state is DISCOVERED
+            device.oper_status = OperStatus.ACTIVE
+            self.adapter_agent.update_device(device)
+
+            log.info('activate-onu-end', device=device)
+
+            # # Just in case, pull for existing flows...
+            # flows = self.adapter_agent.root_proxy.get('/devices/{}/flows'.format(device.id))
+
+            # log.debug('flows-got-from-deviceid', flows=flows.items)
+            # reactor.callLater(0, self.update_flow_table, device, flows.items)
+
+            # Listening thread (we wait 5 secs to start reading from queue)
+            reactor.callLater(0, self.wait_for_flow_events, device)
 
         except Exception as e:
             log.exception('activate-failed', e=e)
-            raise Exception('Exception during onu activation')
+            # raise Exception('Exception during onu activation')
 
     @inlineCallbacks
     def wait_for_flow_events(self, device):
@@ -451,62 +489,91 @@
                 log.debug("Event handled flow successfully")
             else:
                 log.debug("Error handling flow event")
+                # if event['retries'] < MAX_FLOW_EVENT_RETRIES:
+                #     # Failed install events are turned into reinstall...
+                #     if event['action'] == 'install':
+                #         event['action'] = 'reinstall'
+                #     event['retries'] += 1
+                #     log.debug("Flow event retry")
+                #     self.flow_queue.put(event)
+                # else:
+                #     log.debug("Max retries done for flow event handling.", event=event)
+                #     # If we were trying to install a flow, we remove it...
+                #     if event['action'] !=  'remove':
+                #         event['action'] = 'remove'
+                #         event['retries'] = 0
+                #         self.flow_queue.put(event)
 
         except Exception as e:
             log.exception('wait-for-flow-events-exception', e=e)
 
         reactor.callLater(0, self.wait_for_flow_events, device)
 
+    def reboot(self, device):
+        log.debug('onu-reboot-start', device=device)
+
+        if self.cvlan_id is not None and self.subsvlan_id is not None:
+            flow_event = {'action': 'reinstall', 'cvlan': self.cvlan_id,
+                    'subsvlan': self.subsvlan_id, 'retries': 0}
+            self.flow_queue.put(flow_event)
+            log.debug('onu-reinstall-event-created')
+        else:
+            log.debug('onu-reboot-ignored')
+
+        log.debug('onu-reboot-end', device=device)
+
     def deactivate(self, device):
-        log.debug('deactivate', device=device)
-        # Check parent reference and proxy info exists
-        assert device.parent_id
-        assert device.proxy_address.device_id
+        try:
+            log.debug('deactivate-onu', device=device)
+            # Check parent reference and proxy info exists
+            assert device.parent_id
+            assert device.proxy_address.device_id
 
-        # unregister from proxy messages
-        self.adapter_agent.unregister_for_proxied_messages(device.proxy_address)
-        self.proxy_address = None
+            # unregister from proxy messages
+            self.adapter_agent.unregister_for_proxied_messages(device.proxy_address)
+            self.proxy_address = None
 
-        # Delete references to ports
-        onu_port = self.adapter_agent.get_ports(device.id, Port.ETHERNET_UNI)[0]
-        self.adapter_agent.delete_port_reference_from_parent(device.id, onu_port)
+            # Delete references to ports, if any
 
-        pon_port = self.adapter_agent.get_ports(device.id, Port.PON_ONU)[0]
-        self.adapter_agent.delete_port_reference_from_parent(device.id, pon_port)
+            if self.adapter_agent.get_ports(device.id, Port.ETHERNET_UNI):
+                onu_port = self.adapter_agent.get_ports(device.id, Port.ETHERNET_UNI)[0]
+                self.adapter_agent.delete_port_reference_from_parent(device.id, onu_port)
 
-        # Delete device and logical ports
-        parent_device = self.adapter_agent.get_device(device.parent_id)
-        logical_device_id = parent_device.parent_id
-        # logical_device = self.adapter_agent.get_logical_device(logical_device_id)
-        # self.adapter_agent.delete_logical_device(logical_device)
+            if  self.adapter_agent.get_ports(device.id, Port.PON_ONU):
+                pon_port = self.adapter_agent.get_ports(device.id, Port.PON_ONU)[0]
+                self.adapter_agent.delete_port_reference_from_parent(device.id, pon_port)
 
-        logical_port = self.adapter_agent.get_logical_port(logical_device_id, self.port_no)
-        self.adapter_agent.delete_logical_port(logical_device_id, logical_port)
+            # Delete device and logical ports
+            parent_device = self.adapter_agent.get_device(device.parent_id)
+            logical_device_id = parent_device.parent_id
+            # logical_device = self.adapter_agent.get_logical_device(logical_device_id)
+            # self.adapter_agent.delete_logical_device(logical_device)
 
-        device = self.adapter_agent.get_device(device.id)
-        self.adapter_agent.update_child_device_state(device, connect_status=ConnectStatus.UNREACHABLE)
+            if logical_device_id:
+                logical_port = self.adapter_agent.get_logical_port(logical_device_id, self.port_no)
+                if logical_port:
+                    self.adapter_agent.delete_logical_port(logical_device_id, logical_port)
 
-        device = self.adapter_agent.get_device(device.id)
-        self.adapter_agent.update_child_device_state(device, oper_status=OperStatus.FAILED)
-        # device.connect_status = ConnectStatus.UNREACHABLE
-        # self.adapter_agent.update_device(device)
+            # Finally delete device
+            self.adapter_agent.delete_child_device(
+                parent_device_id=device.proxy_address.device_id,
+                child_device_id=device.id)
 
-        # Finally delete device
-        self.adapter_agent.delete_child_device(
-            parent_device_id=device.proxy_address.device_id,
-            child_device_id=device.id)
+            log.debug('deactivate-onu-end')
 
-        log.debug('deactivate ended')
+        except Exception as e:
+            log.exception('deactivate-failed', e=e)
+            # raise Exception('Exception during onu deactivation')
 
     # @inlineCallbacks
     def update_flow_table(self, device, flows):
         cvlan_found = None
         subsvlan_found = 0
 
-        log.debug('onu-update-flow-table', device_id=device.id, flows=flows)
-        port_no = device.proxy_address.channel_id
-        log.debug('Checking {} flows for port:{}'.format(len(flows), port_no))
 
+        log.debug('onu-update-flow-table', device_id=device.id, flows=flows)
+        port_no = (device.proxy_address.channel_id * 32) + (device.proxy_address.onu_id + 1)
+        log.debug('Checking {} flows for port:{}'.format(len(flows), port_no))
         try:
 
             for flow in flows:
@@ -521,19 +588,17 @@
                                         cvlan_found = action.set_field.field.ofb_field.vlan_vid & 0xfff
                                         log.debug('CVLAN found:{}'.format(cvlan_found))
 
-
             if cvlan_found:
                 if cvlan_found != self.cvlan_id:
                     if self.cvlan_id:
-
                         log.debug('Reinstall flow triggered')
                         flow_event = {'action': 'reinstall', 'cvlan': cvlan_found,
-                                'subsvlan': subsvlan_found}
+                                'subsvlan': subsvlan_found, 'retries': 0}
                         self.flow_queue.put(flow_event)
                     else:
                         log.debug('Flows installation triggered')
                         flow_event = {'action': 'install', 'cvlan': cvlan_found,
-                                'subsvlan': subsvlan_found}
+                                'subsvlan': subsvlan_found, 'retries': 0}
                         self.flow_queue.put(flow_event)
                 else:
                     log.debug('Flows already installed')
@@ -541,7 +606,7 @@
                 if self.cvlan_id:
                     log.debug('Flows deinstallation triggered')
                     flow_event = {'action': 'remove', 'cvlan': self.cvlan_id,
-                                'subsvlan': self.subsvlan_id}
+                                'subsvlan': self.subsvlan_id, 'retries': 0}
                     self.flow_queue.put(flow_event)
                 else:
                     log.debug('Incomplete flow')
@@ -570,7 +635,6 @@
                 response = yield self.install_flows_sequence(device, cvlan_id, subsvlan_id)
                 returnValue(response)
             returnValue(False)
-
         except Exception as e:
             log.exception('failed-to-launch-reinstall-flow', e=e)
 
@@ -585,20 +649,19 @@
             log.exception('failed-to-launch-install-flow', e=e)
 
     @inlineCallbacks
-    def wait_for_omci_response(self):
+    def wait_for_response(self):
         log.debug('wait-for-response')
         response = yield self.incoming_messages.get()
-        log.debug("unqueued-message", msg=hexify(response))
-        returnValue(OmciFrame(response))
+        log.debug("unqueued-message",msg=response.show(dump=True))
+        returnValue(response)
 
+
+    # PMC_OFAL.c line:2554
     @inlineCallbacks
-    def create_common_omci_config(self, device):
-        log.debug('create-common-omci-config')
-
-        alloc_id = 0x408 + device.proxy_address.onu_id
+    def create_data_flow_omci_config(self, device, cvlan_id, subsvlan_id):
 
         self.OMCI_ont_data_mib_reset(device)
-        response = yield self.wait_for_omci_response()
+        response = yield self.wait_for_response()
 
         if OmciMibResetResponse not in response:
             log.error("Failed to perform a MIB reset for {}".format(
@@ -606,8 +669,8 @@
             returnValue(False)
         log.debug("[RESPONSE] OMCI_ont_data_mib_reset")
 
-        self.OMCI_tcont_set(device, alloc_id)
-        response = yield self.wait_for_omci_response()
+        self.OMCI_tcont_set(device)
+        response = yield self.wait_for_response()
         if OmciSetResponse not in response:
             log.error("Failed to set alloc id for {}".format(
                 device.proxy_address))
@@ -615,7 +678,7 @@
         log.debug("[RESPONSE] OMCI_tcont_set")
 
         self.pmc_omci_mac_bridge_sp_me_create(device)
-        response = yield self.wait_for_omci_response()
+        response = yield self.wait_for_response()
         if OmciCreateResponse not in response:
             log.error("Failed to set parameter on {}".format(
                 device.proxy_address))
@@ -623,70 +686,65 @@
         log.debug("[RESPONSE] OMCI_mac_bridge_sp_me_create")
 
         self.pmc_omci_mac_bridge_pcd_me_create(device)
-        response = yield self.wait_for_omci_response()
+        response = yield self.wait_for_response()
         if OmciCreateResponse not in response:
             log.error("Failed to set info for {}".format(device.proxy_address))
             returnValue(False)
         log.debug("[RESPONSE] OMCI_mac_bridge_pcd_me_create")
 
-        for port in range(1, PORT_NUMBER+1):
-            self.pmc_omci_mac_bridge_pcd_me_allocate(device, port)
-            response = yield self.wait_for_omci_response()
-            if OmciCreateResponse not in response:
-                log.error("Failed to create mac bridge pcd on {}".format(
-                    device.proxy_address))
-                returnValue(False)
-            log.debug("[RESPONSE] OMCI_mac_bridge_pcd_me_allocate")
+        self.pmc_omci_evto_create(device)
+        response = yield self.wait_for_response()
+        if OmciCreateResponse not in response:
+            log.error("Failed to set association info for {}".format(
+                device.proxy_address))
+            returnValue(False)
+        log.debug("[RESPONSE] OMCI_evto_create")
 
-        returnValue(True)
+        self.pmc_omci_evto_set(device)
+        response = yield self.wait_for_response()
+        if OmciSetResponse not in response:
+            log.error("Failed to set association tpid info for {}".format(
+                device.proxy_address))
+            returnValue(False)
+        log.debug("[RESPONSE] OMCI_evto_set")
 
-    @inlineCallbacks
-    def create_data_flow_omci_config(self, device, cvlan_id, subsvlan_id):
-
+        # Reuse create_default_data_flow_omci_config (confirmed from logs)
         self.pmc_omci_8021p_msp_me_allocate(device)
-        response = yield self.wait_for_omci_response()
+        response = yield self.wait_for_response()
         if OmciCreateResponse not in response:
             log.error("Failed to create 8021p msp on {}".format(
                 device.proxy_address))
             if response is not None:
-                log.error("Response received: {}".format(response.summary())) 
+                log.error("Response received: {}".format(response.summary()))
             returnValue(False)
         log.debug("[RESPONSE] OMCI_8021p_msp_me_allocate")
 
+        # Reuse create_default_data_flow_omci_config?
+        self.pmc_omci_mac_bridge_pcd_me_allocate(device)
+        response = yield self.wait_for_response()
+        if OmciCreateResponse not in response:
+            log.error("Failed to create mac bridge pcd on {}".format(
+                device.proxy_address))
+            returnValue(False)
+        log.debug("[RESPONSE] OMCI_mac_bridge_pcd_me_allocate")
+
+        response = yield self.send_set_extended_vlan_tagging_operation_vlan_configuration_data(
+            device, cvlan_id, subsvlan_id)
+
+        if not response:
+            returnValue(False)
+        log.debug("[RESPONSE] OMCI_send_set_extended_vlan_tagging")
+
         self.send_create_vlan_tagging_filter_data(device, cvlan_id)
-        response = yield self.wait_for_omci_response()
+        response = yield self.wait_for_response()
         if OmciCreateResponse not in response:
             log.error("Failed to set vlan tagging filter in {}".format(
                 device.proxy_address))
             returnValue(False)
         log.debug("[RESPONSE] OMCI_send_create_vlan_tagging_filter_data")
 
-        for port in range(1, PORT_NUMBER+1):
-            self.pmc_omci_evto_create(device, port)
-            response = yield self.wait_for_omci_response()
-            if OmciCreateResponse not in response:
-                log.error("Failed to set association info for {}".format(
-                    device.proxy_address))
-                returnValue(False)
-            log.debug("[RESPONSE] OMCI_evto_create")
-
-            self.pmc_omci_evto_set(device, port)
-            response = yield self.wait_for_omci_response()
-            if OmciSetResponse not in response:
-                log.error("Failed to set association tpid info for {}".format(
-                    device.proxy_address))
-                returnValue(False)
-            log.debug("[RESPONSE] OMCI_evto_set")
-
-            response = yield self.send_set_extended_vlan_tagging_operation_vlan_configuration_data(
-            device, cvlan_id, subsvlan_id, port)
-
-            if not response:
-                returnValue(False)
-            log.debug("[RESPONSE] OMCI_send_set_extended_vlan_tagging")
-
         self.pmc_omci_gem_nctp_me_allocate(device)
-        response = yield self.wait_for_omci_response()
+        response = yield self.wait_for_response()
         if OmciCreateResponse not in response:
             log.error("Failed to Create gem nctp on {}".format(
                 device.proxy_address))
@@ -694,7 +752,7 @@
         log.debug("[RESPONSE] OMCI_gem_nctp_me_allocate")
 
         self.pmc_omci_gem_iwtp_me_allocate(device)
-        response = yield self.wait_for_omci_response()
+        response = yield self.wait_for_response()
         if OmciCreateResponse not in response:
             log.error("Failed to Create gem iwtp on {}".format(
                 device.proxy_address))
@@ -702,7 +760,8 @@
         log.debug("[RESPONSE] OMCI_gem_iwtp_me_allocate")
 
         self.pmc_omci_8021p_msp_me_assign(device)
-        response = yield self.wait_for_omci_response()
+
+        response = yield self.wait_for_response()
         if OmciSetResponse not in response:
             log.error("Failed to assign sp {}".format(
                 device.proxy_address))
@@ -711,31 +770,32 @@
 
         returnValue(True)
 
+    # PMC_OFAL.c line:3065
     @inlineCallbacks
     def delete_data_flow_omci_config(self, device):
-        for port in range(1, PORT_NUMBER+1):
-            self.pmc_omci_evto_deallocate(device, port)
-            response = yield self.wait_for_omci_response()
-            if OmciDeleteResponse not in response:
-                log.error(
-                    "Failed to deallocate evt for {}".format(device.proxy_address))
-                if response is not None:
-                    log.error("Response received: {}".format(response.summary()))
-                returnValue(False)
-            log.debug("[RESPONSE] pmc_omci_evto_deallocate", device=device)
+
+        self.pmc_omci_evto_deallocate(device)
+        response = yield self.wait_for_response()
+        if OmciDeleteResponse not in response:
+            log.error(
+                "Failed to deallocate evt for {}".format(device.proxy_address))
+            if response is not None:
+                log.error("Response received: {}".format(response.summary()))
+            returnValue(False)
+        log.debug("[RESPONSE] pmc_omci_evto_deallocate", device=device)
 
         self.pmc_omci_gem_iwtp_me_deallocate(device)
-        response = yield self.wait_for_omci_response()
+        response = yield self.wait_for_response()
         if OmciDeleteResponse not in response:
             log.error(
                 "Failed to deallocate iwtp for {}".format(device.proxy_address))
             if response is not None:
-                log.error("Response received: {}".format(response.summary())) 
+                log.error("Response received: {}".format(response.summary()))
             returnValue(False)
         log.debug("[RESPONSE] pmc_omci_gem_iwtp_me_deallocate", device=device)
 
         self.pmc_omci_gem_nctp_me_deallocate(device)
-        response = yield self.wait_for_omci_response()
+        response = yield self.wait_for_response()
         if OmciDeleteResponse not in response:
             log.error(
                 "Failed to deallocate nctp for {}".format(device.proxy_address))
@@ -743,15 +803,23 @@
         log.debug("[RESPONSE] pmc_omci_gem_nctp_me_deallocate", device=device)
 
         self.pmc_omci_vlan_tagging_filter_me_deallocate(device)
-        response = yield self.wait_for_omci_response()
+        response = yield self.wait_for_response()
         if OmciDeleteResponse not in response:
             log.error(
                 "Failed to deallocate vlan tagging for {}".format(device.proxy_address))
             returnValue(False)
         log.debug("[RESPONSE] pmc_omci_vlan_tagging_filter_me_deallocate", device=device)
 
+        self.pmc_omci_mac_bridge_pcd_me_deallocate(device)
+        response = yield self.wait_for_response()
+        if OmciDeleteResponse not in response:
+            log.error(
+                "Failed to deallocate bridge pcd for {}".format(device.proxy_address))
+            returnValue(False)
+        log.debug("[RESPONSE] pmc_omci_mac_bridge_pcd_me_deallocate", device=device)
+
         self.pmc_omci_8021p_msp_me_deallocate(device)
-        response = yield self.wait_for_omci_response()
+        response = yield self.wait_for_response()
         if OmciDeleteResponse not in response:
             log.error(
                 "Failed to deallocate msp for {}".format(device.proxy_address))
@@ -760,7 +828,9 @@
 
         returnValue(True)
 
-    """ -   -   -   -   -   -   -   create_common_omci_config   -   -   -   -   -   -   - """
+
+    """ -   -   -   -   -   -   -     create_data_flow_omci_config      -   -   -   -   -   -   - """
+
 
     def OMCI_ont_data_mib_reset(self, device):
         # DO things to the ONU
@@ -780,11 +850,11 @@
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciMibReset.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] OMCI_ont_data_mib_reset")
 
-    def OMCI_tcont_set(self, device, alloc_id):
+    def OMCI_tcont_set(self, device):
         # | ###[ OmciFrame ]###
         # | transaction_id = 2
         # | message_type = 72
@@ -806,13 +876,12 @@
         # TODO: maskdata
         msg = OmciSet(entity_class=262, entity_id=32769, attributes_mask=32768,
                       data=dict(
-                          alloc_id=alloc_id
+                          alloc_id=self.alloc_id
                       ))
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciSet.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] OMCI_tcont_set")
 
     def pmc_omci_mac_bridge_sp_me_create(self, device):
@@ -859,8 +928,7 @@
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciCreate.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] pmc_omci_mac_bridge_sp_me_create")
 
     def pmc_omci_mac_bridge_pcd_me_create(self, device):
@@ -883,11 +951,11 @@
 
         msg = OmciCreate(entity_class=47, entity_id=0,
                          data=dict(
-                             tp_pointer=1,
+                             tp_pointer=257,
                              encapsulation_methods=OMCI_MAC_BRIDGE_PCD_ENCAP_METHOD_LLC,
                              port_num=0,
                              port_priority=10,
-                             tp_type=3,
+                             tp_type=1,
                              port_path_cost=100,
                              port_spanning_tree_in=PON_FALSE,
                              lan_fcs_ind=OMCI_MAC_BRIDGE_PCD_LANFCS_FORWARDED,
@@ -897,11 +965,11 @@
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciCreate.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] pmc_omci_mac_bridge_pcd_me_create")
 
-    def pmc_omci_evto_create(self, device, port):
+    def pmc_omci_evto_create(self, device):
         # |###[ OmciFrame ]###
         # |  transaction_id= 5
         # |  message_type= 68
@@ -914,20 +982,20 @@
         # |  omci_trailer= 40
 
         # Found in method: pmc_omci_evto_create from: PMC_OFAL.c
-        msg = OmciCreate(entity_class=171, entity_id=port,
+        msg = OmciCreate(entity_class=171, entity_id=0,
                          data=dict(
                              association_type=OMCI_EX_VLAN_TAG_OCD_ASSOCIATION_TYPE_PPTP_ETH_UNI,
-                             associated_me_pointer=0x100+port
+                             associated_me_pointer=257
                          ))
 
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciCreate.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] pmc_omci_evto_create")
 
-    def pmc_omci_evto_set(self, device, port):
+    def pmc_omci_evto_set(self, device):
         # |###[ OmciFrame ]###
         # |  transaction_id= 6
         # |  message_type= 72
@@ -941,25 +1009,23 @@
         # |  omci_trailer= 40
 
         # Found in method: pmc_omci_evto_set from: PMC_OFAL.c
-        msg = OmciSet(entity_class=171, entity_id=port, attributes_mask=47616,
+        msg = OmciSet(entity_class=171, entity_id=0, attributes_mask=47616,
                       data=dict(
                           association_type=OMCI_EX_VLAN_TAG_OCD_ASSOCIATION_TYPE_PPTP_ETH_UNI,
-                          input_tpid=0x8100,
-                          associated_me_pointer=0x100+port,
+                          input_tpid=33024,
+                          associated_me_pointer=257,
                           downstream_mode=OMCI_EX_VLAN_TAG_OCD_DS_MODE_US_INVERSE,
-                          output_tpid=0x8100
+                          output_tpid=33024
                       ))
 
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciSet.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] pmc_omci_evto_set")
 
-    """ -   -   -   -   -   -   -     END create_common_omci_config     -   -   -   -   -   -   - """
 
-    """ -   -   -   -   -   -   create_default_data_flow_omci_config    -   -   -   -   -   -   - """
 
     def pmc_omci_8021p_msp_me_allocate(self, device):
         # |###[ OmciFrame ]###
@@ -997,11 +1063,11 @@
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciCreate.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] pmc_omci_8021p_msp_me_allocate")
 
-    def pmc_omci_mac_bridge_pcd_me_allocate(self, device, port):
+    def pmc_omci_mac_bridge_pcd_me_allocate(self, device):
         # |###[ OmciFrame ]###
         # |  transaction_id= 8
         # |  message_type= 68
@@ -1017,13 +1083,13 @@
         # Params
         #   - port_path_cost: The cost contribution of the port to the path cost towards the spanning tree root bridge
         #   - bridge_id_pointer: MAC bridge controlling the port
-        msg = OmciCreate(entity_class=47, entity_id=port,
+        msg = OmciCreate(entity_class=47, entity_id=1,
                          data=dict(
-                             tp_pointer=0x100 + port,
+                             tp_pointer=1,
                              encapsulation_methods=OMCI_MAC_BRIDGE_PCD_ENCAP_METHOD_LLC,
-                             port_num=port,
+                             port_num=1,
                              port_priority=10,
-                             tp_type=1,
+                             tp_type=3,
                              port_path_cost=100,
                              port_spanning_tree_in=PON_FALSE,
                              lan_fcs_ind=OMCI_MAC_BRIDGE_PCD_LANFCS_FORWARDED,
@@ -1033,8 +1099,8 @@
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciCreate.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] pmc_omci_mac_bridge_pcd_me_allocate")
 
     def pmc_omci_gem_nctp_me_allocate(self, device):
@@ -1056,7 +1122,7 @@
                              direction=GEM_DIR_BIDIRECT,
                              tcont_pointer=32769,
                              traffic_descriptor_profile_pointer=0,
-                             traffic_management_pointer_upstream=4,  # 4 for default
+                             traffic_management_pointer_upstream=4,  # 4 for feault
                              # Same as GEM port
                              # port_id=(1000 + device.proxy_address.onu_id)
                              port_id = self.port_id
@@ -1065,8 +1131,8 @@
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciCreate.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] pmc_omci_gem_nctp_me_allocate")
 
     def pmc_omci_gem_iwtp_me_allocate(self, device):
@@ -1100,16 +1166,57 @@
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciCreate.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] pmc_omci_gem_iwtp_me_allocate")
 
-    """ -   -   -   -   -   -    END create_default_data_flow_omci_config   -   -   -   -   -   - """
 
-    """ -   -   -   -   -   -   -     create_data_flow_omci_config      -   -   -   -   -   -   - """
+
+    def send_create_extended_vlan_tagging_operation_configuration_data(self, device):
+
+        msg = OmciCreate(entity_class=171,
+                         entity_id=0,
+                         data=dict(
+                             association_type=2,
+                             associated_me_pointer=257
+                         ))
+
+        frame = OmciFrame(transaction_id=self.trangen.next(),
+                          message_type=OmciCreate.message_id,
+                          omci_message=msg)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
+        log.debug(
+            "[SENT] create_extended_vlan_tagging_operation_configuration_data")
+
+    # self.send_set_extended_vlan_tagging_operation_tpid_configuration_data(0x202, 0x8100, 0x8100)
+    def send_set_extended_vlan_tagging_operation_tpid_configuration_data(self, device):
+
+        data = dict(
+            association_type=2,
+            input_tpid=33024,
+            associated_me_pointer=257,
+            downstream_mode=OMCI_EX_VLAN_TAG_OCD_DS_MODE_US_INVERSE,
+            output_tpid=33024,
+        )
+
+        msg = OmciSet(entity_class=171,
+                      entity_id=0,
+                      attributes_mask=47616,  # 1024 in broadcom but 47616 observed from PMC
+                      data=data
+                      )
+
+        frame = OmciFrame(
+            transaction_id=self.trangen.next(),
+            message_type=OmciSet.message_id,
+            omci_message=msg
+        )
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
+        log.debug(
+            "[SENT] set_extended_vlan_tagging_operation_tpid_configuration_data")
 
     @inlineCallbacks
-    def send_set_extended_vlan_tagging_operation_vlan_configuration_data(self, device, cvlan_id, subs_vlan, port):
+    def send_set_extended_vlan_tagging_operation_vlan_configuration_data(self, device, cvlan_id, subs_vlan):
         # ###[ PAS5211MsgSendFrame ]###
         #            length    = 44
         #            port_type = 0
@@ -1128,6 +1235,10 @@
         #             |   |  data      = {'received_frame_vlan_tagging_operation_table': '\xf8\x00\x00\x00\x00\x00@\x00@\x0f\x00\x04\x00\x00\x00\x0c'}
         #             |  omci_trailer= 40
 
+        # TODO  Check filter_inner_priority value
+        """vlan_oper_table_entry.filter_configuration.filter_inner_tagging.vlan_priority = filter_inner_vlan_pcp;
+            vlan_oper_table_entry.filter_configuration.filter_inner_tagging.vlan_vid = filter_inner_vlan_id;
+        """
         self.send_vlan_tagging_operation_msg(device,
             VlanTaggingOperation(
                 filter_outer_priority=OMCI_EX_VLAN_TAG_OCD_FILTER_PRIO_NO_TAG,
@@ -1147,8 +1258,9 @@
                 treatment_inner_priority=0,
                 treatment_inner_vid=cvlan_id,
                 treatment_inner_tpid_de=OMCI_EX_VLAN_TAG_OCD_TREAT_TPID_EQ_8100
-            ), port)
-        response = yield self.wait_for_omci_response()
+            )
+            )
+        response = yield self.wait_for_response()
 
         log.debug(
             "[SENT] send_set_extended_vlan_tagging_operation_vlan_configuration_data")
@@ -1180,12 +1292,13 @@
                 treatment_inner_priority=OMCI_EX_VLAN_TAG_OCD_TREAT_PRIO_NONE,
                 treatment_inner_vid=OMCI_EX_VLAN_TAG_OCD_TREAT_PRIO_COPY_FROM_INNER,
                 treatment_inner_tpid_de=OMCI_EX_VLAN_TAG_OCD_TREAT_TPID_DE_COPY_FROM_INNER
-            ), port)
+            )
+            )
 
         log.debug(
             "[SENT] send_set_extended_vlan_tagging_operation_vlan_configuration_data")
 
-        response = yield self.wait_for_omci_response()
+        response = yield self.wait_for_response()
         if OmciSetResponse not in response:
             log.error("Failed to set vlan extended table entry {}".format(
                 device.proxy_address))
@@ -1213,12 +1326,13 @@
                 treatment_inner_priority=OMCI_EX_VLAN_TAG_OCD_TREAT_PRIO_NONE,
                 treatment_inner_vid=OMCI_EX_VLAN_TAG_OCD_TREAT_PRIO_COPY_FROM_INNER,
                 treatment_inner_tpid_de=OMCI_EX_VLAN_TAG_OCD_TREAT_TPID_DE_COPY_FROM_INNER
-            ), port)
+            )
+            )
 
         log.debug(
             "[SENT] send_set_extended_vlan_tagging_operation_vlan_configuration_data")
 
-        response = yield self.wait_for_omci_response()
+        response = yield self.wait_for_response()
         if OmciSetResponse not in response:
             log.error("Failed to set vlan extended table entry {}".format(
                 device.proxy_address))
@@ -1246,22 +1360,25 @@
                 treatment_inner_priority=OMCI_EX_VLAN_TAG_OCD_TREAT_PRIO_NONE,
                 treatment_inner_vid=OMCI_EX_VLAN_TAG_OCD_TREAT_PRIO_COPY_FROM_INNER,
                 treatment_inner_tpid_de=OMCI_EX_VLAN_TAG_OCD_TREAT_TPID_DE_COPY_FROM_INNER
-            ), port)
+            )
+            )
 
         log.debug(
             "[SENT] send_set_extended_vlan_tagging_operation_vlan_configuration_data")
 
-        response = yield self.wait_for_omci_response()
+        response = yield self.wait_for_response()
         if OmciSetResponse not in response:
             log.error("Failed to set vlan extended table entry {}".format(
                 device.proxy_address))
             returnValue(False)
+
         log.debug(
             "[RESPONSE] send_set_extended_vlan_tagging_operation_vlan_configuration_data")
 
         returnValue(True)
 
-    def send_vlan_tagging_operation_msg(self, device, vlan_tagging_operation_table, port):
+
+    def send_vlan_tagging_operation_msg(self, device, vlan_tagging_operation_table):
 
         data = dict(
             received_frame_vlan_tagging_operation_table=vlan_tagging_operation_table
@@ -1269,7 +1386,7 @@
 
         msg = OmciSet(
             entity_class=171,
-            entity_id=port,
+            entity_id=0,
             attributes_mask=1024,
             data=data
         )
@@ -1279,8 +1396,8 @@
             message_type=OmciSet.message_id,
             omci_message=msg
         )
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] create_vlan_tagging_filter_data")
 
     def send_create_vlan_tagging_filter_data(self, device, cvlan_id):
@@ -1318,10 +1435,91 @@
             message_type=OmciCreate.message_id,
             omci_message=msg
         )
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] create_vlan_tagging_filter_data")
 
+    def pmc_ofal_remove_default_onu_flow_omci(self, device):  # TODO
+        # ###[ PAS5211Dot3 ]###
+        #     dst = 00:0
+        #     c: d5:00: 04:10
+        #     src = 02:00: d3:77: 47:49
+        #     len = 74
+        # ###[ PAS5211FrameHeader ]###
+        #     part = 1
+        #     total_parts = 1
+        #     size = 68
+        #     magic_number = 0x1234abcd
+        # ###[ PAS5211MsgHeader ]###
+        #     sequence_number = 201
+        #     opcode = 0x302a
+        #     event_type = 0
+        #     channel_id = 1
+        #     onu_id = 0
+        #     onu_session_id = 1
+        # ###[ PAS5211MsgSendFrame ]###
+        #     length = 44
+        #     port_type = 0
+        #     port_id = 0
+        #     management_frame = 1
+        #     \frame \
+        #      |  ###[ OmciFrame ]###
+        #         | transaction_id = 44
+        #         | message_type = 70
+        #         | omci = 10
+        #         |   \omci_message \
+        #              | |  ###[ OmciDelete ]###
+        #         | | entity_class = 47
+        #         | | entity_id = 1
+        #     | omci_trailer = 40
+        log.debug("[SENT] pmc_ofal_remove_default_onu_flow_omci")
+        pass
+
+    def pmc_omci_evto_vlan_oper_table_entry_assign(self, device):  # TODO
+
+        # /* Fill the set message */
+        # entity.entity_class    = OMCI_ENT_EX_VLAN_TAGGING_OPER_CONFIG_DATA;
+        # entity.entity_instance = entity_instance;
+        # set_req_msg.attr_mask  = attributes_mask;
+
+        # typedef struct OMCI_ex_vlan_tagging_operation_config_me_set_t
+        # {
+        #     INT8U             association_type;    /* Association type  ,R,W,C  (ASSOCIATION_TYPE_)*/
+        #     INT16U            input_tpid;         /* Input TPID value   ,R,W (16 bit value)*/
+        #     INT16U            output_tpid;        /* Output TPID value  ,R,W (16 bit value)*/
+        #     INT8U             downstream_mode;    /* downstream mode    ,R,W (OCD_DS_MODE_)*/
+        #
+        #     OMCI_ex_vlan_tag_op_table_entry_t       /* Operation entry    ,R,W (16 bytes)    */
+        #                         operations_entry;
+        #
+        #     OMCI_instance_id_t    associated_me_ptr;
+        #
+        #     INT8U               dscp2pbit_mapping[OMCI_EX_VLAN_TAG_ATTR_DSCP2PBIT_MAPPING_SIZE];/*dscp-to-pbit mapping ,R,W (24 bytes)*/
+        #
+        # } OMCI_ex_vlan_tagging_operation_config_me_set_t;
+
+        # attibute_mask = 0
+        # # attibute_mask |= ( (INT16U)1 << ((OMCI_ATTR_MAX-1)-(OMCI_EX_VLAN_TAG_OCD_ATTR_RX_FRAME_OP_TABLE)))
+        # msg = OmciSet(entity_class=OMCI_ENT_EX_VLAN_TAGGING_OPER_CONFIG_DATA, entity_id=0, attributes_mask=attibute_mask,
+        #               data=dict(
+        #                   association_type=,
+        #                   input_tpid=,
+        #                   output_tpid=,
+        #                   downstream_mode=,
+        #                   associated_me_pointer=,
+        #                   dscp2pbit_mapping=
+        #               ))
+
+        # frame = OmciFrame(transaction_id=self.trangen.next(),
+        #                   message_type=OmciSet.message_id,
+        #                   omci_message=msg)
+
+        # self.adapter_agent.send_proxied_message(device.proxy_address, frame)
+
+        # TODO: Sends up to three OMCI Set messages
+        log.debug("[SENT] pmc_omci_evto_vlan_oper_table_entry_assign")
+        pass
+
     @inlineCallbacks
     def pmc_omci_vlan_tagging_filter_me_allocate(self, device):  # TODO
 
@@ -1377,8 +1575,7 @@
             message_type=OmciSet.message_id,
             omci_message=msg
         )
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
 
         log.debug("[SENT] pmc_omci_8021p_msp_me_assign")
 
@@ -1423,8 +1620,8 @@
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciDelete.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] pmc_omci_gem_iwtp_me_deallocate")
 
     def pmc_omci_gem_nctp_me_deallocate(self, device):
@@ -1442,8 +1639,8 @@
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciDelete.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] pmc_omci_gem_nctp_me_allocate")
 
     def pmc_omci_vlan_tagging_filter_me_deallocate(self, device):
@@ -1461,8 +1658,8 @@
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciDelete.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] pmc_omci_vlan_tagging_filter_me_deallocate")
 
 
@@ -1481,8 +1678,8 @@
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciDelete.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] pmc_omci_mac_bridge_pcd_me_deallocate")
 
 
@@ -1502,23 +1699,25 @@
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciDelete.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] pmc_omci_8021p_msp_me_deallocate")
 
-    def pmc_omci_evto_deallocate(self, device, port):
+    def pmc_omci_evto_deallocate(self, device):
 
-        msg = OmciDelete(entity_class=171, entity_id=port)
+        msg = OmciDelete(entity_class=171, entity_id=1)
 
         frame = OmciFrame(transaction_id=self.trangen.next(),
                           message_type=OmciDelete.message_id,
                           omci_message=msg)
-        _frame = hexify(str(frame))
-        self.adapter_agent.send_proxied_message(device.proxy_address, _frame)
+        self.adapter_agent.send_proxied_message(device.proxy_address, frame)
         log.debug("[SENT] pmc_omci_evto_deallocate")
 
 
+
     """ -   -   -   -   -   -   -   END delete_data_flow_omci_config   -   -   -   -   -   -   - """
 
-def mac_str_to_tuple(mac):
-    return tuple(int(d, 16) for d in mac.split(':'))
+
+
+
+
