diff --git a/xos/synchronizer/event_steps/__init__.py b/xos/synchronizer/event_steps/__init__.py
new file mode 100644
index 0000000..8612cfd
--- /dev/null
+++ b/xos/synchronizer/event_steps/__init__.py
@@ -0,0 +1,13 @@
+# Copyright 2020-present Open Networking Foundation
+#
+# 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.
diff --git a/xos/synchronizer/event_steps/auth_event.py b/xos/synchronizer/event_steps/auth_event.py
new file mode 100644
index 0000000..f51855c
--- /dev/null
+++ b/xos/synchronizer/event_steps/auth_event.py
@@ -0,0 +1,34 @@
+# Copyright 2020-present Open Networking Foundation
+#
+# 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.
+
+import json
+from xossynchronizer.event_steps.eventstep import EventStep
+from helpers import NttHelpers
+
+
+class SubscriberAuthEventStep(EventStep):
+    topics = ["authentication.events"]
+    technology = "kafka"
+
+    def __init__(self, *args, **kwargs):
+        super(SubscriberAuthEventStep, self).__init__(*args, **kwargs)
+
+    def process_event(self, event):
+        value = json.loads(event.value)
+        self.log.info("authentication.events: Got event for subscriber", event_value=value)
+        
+        si = NttHelpers.find_or_create_ntt_si(self.model_accessor, self.log, value)
+        self.log.debug("authentication.events: Updating service instance", si=si)
+        si.authentication_state = value["authenticationState"]
+        si.save_changed_fields(always_update_timestamp=True)
\ No newline at end of file
diff --git a/xos/synchronizer/event_steps/onu_event.py b/xos/synchronizer/event_steps/onu_event.py
new file mode 100644
index 0000000..14a95ac
--- /dev/null
+++ b/xos/synchronizer/event_steps/onu_event.py
@@ -0,0 +1,81 @@
+
+# Copyright 2020-present Open Networking Foundation
+#
+# 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.
+
+
+import json
+from xossynchronizer.event_steps.eventstep import EventStep
+from helpers import NttHelpers
+import requests
+from requests.auth import HTTPBasicAuth
+
+class ONUEventStep(EventStep):
+    topics = ["onu.events"]
+    technology = "kafka"
+
+    max_onu_retry = 50
+
+    def __init__(self, *args, **kwargs):
+        super(ONUEventStep, self).__init__(*args, **kwargs)
+
+    def process_event(self, event):
+        value = json.loads(event.value)
+        self.log.info("onu.events: received event", value=value)
+        # This is needed to be compatible with both Voltha 1.7 and Voltha 2.x
+        # It supposes to have only 1 subscriber per ONU and the subscriber is connected to the first port
+        if "-" in value["serialNumber"] and not value["serialNumber"].endswith("-1"):
+            self.log.info("Skip event, only consider [serialNumber]-1 events")
+            return
+
+        ntt_oi = NttHelpers.find_or_create_ntt_oi(self.model_accessor, self.log, value)
+        ntt_oi.no_sync = False
+        ntt_oi.of_dpid = value["deviceId"]
+        ntt_oi.save_changed_fields(always_update_timestamp=True)
+        ntt_si = NttHelpers.find_or_create_ntt_si(self.model_accessor, self.log, value)
+        if value["status"] == "activated":
+            self.log.info("onu.events: activated onu", value=value)
+            ntt_si.no_sync = False
+            ntt_si.uni_port_id = long(value["portNumber"])
+            ntt_si.of_dpid = value["deviceId"]
+            ntt_si.oper_onu_status = "ENABLED"
+            ntt_si.save_changed_fields(always_update_timestamp=True)
+        elif value["status"] == "disabled":
+            self.log.info("onu.events: disabled onu, resetting the subscriber", value=value)
+            ntt_si.oper_onu_status = "DISABLED"
+            ntt_si.save_changed_fields(always_update_timestamp=True)
+            
+            log.debug("Removing subscriber with info",
+                uni_port_id = ntt_si.uni_port_id,
+                dp_id = ntt_si.of_dpid
+            )
+
+            onos_voltha_basic_auth = HTTPBasicAuth("karaf", "karaf")
+
+            handle = "%s/%s" % (ntt_si.of_dpid, ntt_si.uni_port_id)
+            # TODO store URL and PORT in the vOLT Service model
+            full_url = "http://129.60.110.180:8181/onos/olt/oltapp/%s" % (handle)
+
+            log.info("Sending request to onos-voltha", url=full_url)
+
+            request = requests.delete(full_url, auth=onos_voltha_basic_auth)
+
+            if request.status_code != 204:
+                raise Exception("Failed to remove subscriber from onos-voltha: %s" % request.text)
+
+            log.info("Removed Subscriber from onos voltha", response=request.text)
+
+            return
+        else:
+            self.log.warn("onu.events: Unknown status value: %s" % value["status"], value=value)
+            return
\ No newline at end of file
diff --git a/xos/synchronizer/event_steps/test_auth_event.py b/xos/synchronizer/event_steps/test_auth_event.py
new file mode 100644
index 0000000..9b1b954
--- /dev/null
+++ b/xos/synchronizer/event_steps/test_auth_event.py
@@ -0,0 +1,95 @@
+# Copyright 2020-present Open Networking Foundation
+#
+# 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.
+
+import unittest
+from mock import patch, Mock
+import json
+
+import os
+import sys
+
+test_path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
+
+
+class TestSubscriberAuthEvent(unittest.TestCase):
+
+    def setUp(self):
+
+        self.sys_path_save = sys.path
+
+        # Setting up the config module
+        from xosconfig import Config
+        config = os.path.join(test_path, "../test_config.yaml")
+        Config.clear()
+        Config.init(config, "synchronizer-config-schema.yaml")
+        from multistructlog import create_logger
+        log = create_logger(Config().get('logging'))
+        # END Setting up the config module
+
+        from xossynchronizer.mock_modelaccessor_build import mock_modelaccessor_config
+        mock_modelaccessor_config(test_path, [("ntt-workflow-driver", "ntt-workflow-driver.xproto"),
+                                              ("olt-service", "volt.xproto"),
+                                              ("rcord", "rcord.xproto")])
+
+        import xossynchronizer.modelaccessor
+        import mock_modelaccessor
+        reload(mock_modelaccessor)  # in case nose2 loaded it in a previous test
+        reload(xossynchronizer.modelaccessor)      # in case nose2 loaded it in a previous test
+
+        from xossynchronizer.modelaccessor import model_accessor
+        from auth_event import SubscriberAuthEventStep
+
+        # import all class names to globals
+        for (k, v) in model_accessor.all_model_classes.items():
+            globals()[k] = v
+
+        self.model_accessor = model_accessor
+        self.log = log
+
+        self.event_step = SubscriberAuthEventStep(model_accessor=self.model_accessor, log=self.log)
+
+        self.event = Mock()
+
+        self.ntt_si = NttWorkflowDriverServiceInstance()
+        self.ntt_si.serial_number = "BRCM1234"
+        self.ntt_si.save = Mock()
+
+    def tearDown(self):
+        sys.path = self.sys_path_save
+
+    def test_authenticate_subscriber(self):
+
+        self.event.value = json.dumps({
+            'authenticationState': "APPROVED",
+            'deviceId': "of:0000000ce2314000",
+            'portNumber': "101",
+            'serialNumber': "BRCM1234",
+        })
+
+        with patch.object(NttWorkflowDriverServiceInstance.objects, "get_items") as ntt_si_mock:
+
+            ntt_si_mock.return_value = [self.ntt_si]
+
+            self.event_step.process_event(self.event)
+
+            self.ntt_si.save.assert_called()
+            self.ntt_si.save.assert_called_with(
+                always_update_timestamp=True, update_fields=[
+                    'authentication_state', 'serial_number', 'updated'])
+            self.assertEqual(self.ntt_si.authentication_state, 'APPROVED')
+
+
+if __name__ == '__main__':
+    sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))  # for import of helpers.py
+    unittest.main()
\ No newline at end of file
diff --git a/xos/synchronizer/event_steps/test_onu_events.py b/xos/synchronizer/event_steps/test_onu_events.py
new file mode 100644
index 0000000..22e031e
--- /dev/null
+++ b/xos/synchronizer/event_steps/test_onu_events.py
@@ -0,0 +1,226 @@
+# Copyright 2020-present Open Networking Foundation
+#
+# 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.
+
+import unittest
+from mock import patch, Mock
+import json
+
+import os
+import sys
+
+test_path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
+
+
+class TestSyncOLTDevice(unittest.TestCase):
+
+    def setUp(self):
+
+        self.sys_path_save = sys.path
+
+        # Setting up the config module
+        from xosconfig import Config
+        config = os.path.join(test_path, "../test_config.yaml")
+        Config.clear()
+        Config.init(config, "synchronizer-config-schema.yaml")
+        # END Setting up the config module
+
+        from xossynchronizer.mock_modelaccessor_build import mock_modelaccessor_config
+        mock_modelaccessor_config(test_path, [("ntt-workflow-driver", "ntt-workflow-driver.xproto"),
+                                              ("olt-service", "volt.xproto"),
+                                              ("rcord", "rcord.xproto")])
+
+        import xossynchronizer.modelaccessor
+        import mock_modelaccessor
+        reload(mock_modelaccessor)  # in case nose2 loaded it in a previous test
+        reload(xossynchronizer.modelaccessor)      # in case nose2 loaded it in a previous test
+
+        from xossynchronizer.modelaccessor import model_accessor
+        from onu_event import ONUEventStep
+
+        # import all class names to globals
+        for (k, v) in model_accessor.all_model_classes.items():
+            globals()[k] = v
+
+        self.model_accessor = model_accessor
+        self.log = Mock()
+
+        self.event_step = ONUEventStep(model_accessor=self.model_accessor, log=self.log)
+
+        self.event = Mock()
+        self.event_dict = {
+            'status': 'activated',
+            'serialNumber': 'BRCM1234',
+            'deviceId': 'of:109299321',
+            'portNumber': '16'
+        }
+        self.event.value = json.dumps(self.event_dict)
+
+        self.pppoe = NttWorkflowDriverService(name="ntt-workflow-driver")
+
+        self.pon_port = PONPort()
+        self.pon_port.port_no = 1234
+
+        self.onu = ONUDevice()
+        self.onu.pon_port = self.pon_port
+        self.onu.serial_number = "BRCM1234"
+        self.onu.mac_address = "0a0a0a"
+        
+        self.technologyProfile = TechnologyProfile()
+        self.technologyProfile.profile_id = 64
+        self.technologyProfile.profile_value = '{"profile_type": "EPON","epon_attribute": {"package_type": "A"}}'
+
+    def tearDown(self):
+        sys.path = self.sys_path_save
+
+    def test_create_instance(self):
+
+        with patch.object(NttWorkflowDriverServiceInstance.objects, "get_items") as ntt_si_mock, \
+             patch.object(NttWorkflowDriverOltInformation.objects, "get_items") as ntt_oi_mock, \
+                patch.object(NttWorkflowDriverService.objects, "get_items") as service_mock, \
+                patch.object(NttWorkflowDriverServiceInstance, "save", autospec=True) as mock_save, \
+                patch.object(ONUDevice.objects, "get_items") as onu_mock, \
+                patch.object(TechnologyProfile.objects, "get_items") as technologyProfile_mock:
+
+            ntt_si_mock.return_value = []
+            ntt_oi_mock.return_value = []
+            service_mock.return_value = [self.pppoe]
+            onu_mock.return_value = [self.onu]
+            technologyProfile_mock.return_value = [self.technologyProfile]
+
+            self.event_step.process_event(self.event)
+
+            ntt_si = mock_save.call_args[0][0]
+
+            self.assertEqual(mock_save.call_count, 1)
+
+            self.assertEqual(ntt_si.serial_number, self.event_dict['serialNumber'])
+            self.assertEqual(ntt_si.of_dpid, self.event_dict['deviceId'])
+            self.assertEqual(ntt_si.uni_port_id, long(self.event_dict['portNumber']))
+            # Receiving an ONU event doesn't change the admin_onu_state until the model policy runs
+            self.assertEqual(ntt_si.admin_onu_state, "AWAITING")
+            self.assertEqual(ntt_si.oper_onu_status, "ENABLED")
+
+    def test_reuse_instance(self):
+
+        si = NttWorkflowDriverServiceInstance(
+            serial_number=self.event_dict["serialNumber"],
+            of_dpid="foo",
+            uni_port_id="foo"
+        )
+
+        oi = NttWorkflowDriverOltInformation(
+            of_dpid="of:109299321"
+        )
+
+        with patch.object(NttWorkflowDriverServiceInstance.objects, "get_items") as ntt_si_mock, \
+                patch.object(NttWorkflowDriverOltInformation.objects, "get_items") as ntt_oi_mock, \
+                patch.object(NttWorkflowDriverServiceInstance, "save", autospec=True) as mock_save:
+
+            ntt_si_mock.return_value = [si]
+            ntt_oi_mock.return_value = [oi]
+
+            self.event_step.process_event(self.event)
+
+            ntt_si = mock_save.call_args[0][0]
+
+            self.assertEqual(mock_save.call_count, 1)
+
+            self.assertEqual(ntt_si.serial_number, self.event_dict['serialNumber'])
+            self.assertEqual(ntt_si.of_dpid, self.event_dict['deviceId'])
+            self.assertEqual(ntt_si.uni_port_id, long(self.event_dict['portNumber']))
+            # Receiving an ONU event doesn't change the admin_onu_state until the model policy runs
+            self.assertEqual(ntt_si.admin_onu_state, "AWAITING")
+            self.assertEqual(ntt_si.oper_onu_status, "ENABLED")
+
+    def test_disable_onu(self):
+        self.event_dict = {
+            'status': 'disabled',
+            'serialNumber': 'BRCM1234',
+            'deviceId': 'of:109299321',
+            'portNumber': '16',
+        }
+
+        si = NttWorkflowDriverServiceInstance(
+            serial_number=self.event_dict["serialNumber"],
+            of_dpid="foo",
+            uni_port_id="foo",
+            admin_onu_state="ENABLED",
+            oper_onu_status="ENABLED",
+        )
+
+        oi = NttWorkflowDriverOltInformation(
+            of_dpid="of:109299321"
+        )
+
+        self.event.value = json.dumps(self.event_dict)
+
+        with patch.object(NttWorkflowDriverServiceInstance.objects, "get_items") as ntt_si_mock, \
+                patch.object(NttWorkflowDriverOltInformation.objects, "get_items") as ntt_oi_mock, \
+                patch.object(NttWorkflowDriverServiceInstance, "save_changed_fields", autospec=True) as mock_save:
+            ntt_si_mock.return_value = [si]
+            ntt_oi_mock.return_value = [oi]
+
+            self.event_step.process_event(self.event)
+
+            ntt_si = mock_save.call_args[0][0]
+
+            self.assertEqual(mock_save.call_count, 1)
+
+            # Receiving an ONU event doesn't change the admin_onu_state until the model policy runs
+            self.assertEqual(ntt_si.admin_onu_state, 'ENABLED')
+            self.assertEqual(ntt_si.oper_onu_status, 'DISABLED')
+
+    def test_enable_onu(self):
+        self.event_dict = {
+            'status': 'activated',
+            'serialNumber': 'BRCM1234',
+            'deviceId': 'of:109299321',
+            'portNumber': '16',
+        }
+
+        si = NttWorkflowDriverServiceInstance(
+            serial_number=self.event_dict["serialNumber"],
+            of_dpid="foo",
+            uni_port_id="foo",
+            admin_onu_state="DISABLED",
+            oper_onu_status="DISABLED",
+        )
+
+        oi = NttWorkflowDriverOltInformation(
+            of_dpid="of:109299321"
+        )
+
+        self.event.value = json.dumps(self.event_dict)
+
+        with patch.object(NttWorkflowDriverServiceInstance.objects, "get_items") as ntt_si_mock, \
+                patch.object(NttWorkflowDriverOltInformation.objects, "get_items") as ntt_oi_mock, \
+                patch.object(NttWorkflowDriverServiceInstance, "save_changed_fields", autospec=True) as mock_save:
+            ntt_si_mock.return_value = [si]
+            ntt_oi_mock.return_value = [oi]
+
+            self.event_step.process_event(self.event)
+
+            ntt_si = mock_save.call_args[0][0]
+
+            self.assertEqual(mock_save.call_count, 1)
+
+            # Receiving an ONU event doesn't change the admin_onu_state until the model policy runs
+            self.assertEqual(ntt_si.admin_onu_state, 'DISABLED')
+            self.assertEqual(ntt_si.oper_onu_status, 'ENABLED')
+
+
+
+if __name__ == '__main__':
+    sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))  # for import of helpers.py
+    unittest.main()
