diff --git a/xos/synchronizer/event_steps/auth_event.py b/xos/synchronizer/event_steps/auth_event.py
index 5713f9f..9842406 100644
--- a/xos/synchronizer/event_steps/auth_event.py
+++ b/xos/synchronizer/event_steps/auth_event.py
@@ -36,27 +36,18 @@
 
         return onu_sn
 
-    def get_hippie_oss_si_by_sn(self, serial_number):
+    def get_si_by_sn(self, serial_number):
         try:
             return AttWorkflowDriverServiceInstance.objects.get(serial_number=serial_number)
         except IndexError:
             self.log.exception("authentication.events: Cannot find hippie-oss service instance for this event", kafka_event=value)
             raise Exception("authentication.events: Cannot find hippie-oss service instance for this event")
 
-
-    def activate_subscriber(self, subscriber):
-        subscriber.status = 'enabled'
-        subscriber.save()
-
-    def disable_subscriber(self, subscriber):
-        subscriber.status = 'auth-failed'
-        subscriber.save()
-
     def process_event(self, event):
         value = json.loads(event.value)
 
         onu_sn = self.get_onu_sn(value)
-        si = self.get_hippie_oss_si_by_sn(onu_sn)
+        si = self.get_si_by_sn(onu_sn)
         if not si:
             self.log.exception("authentication.events: Cannot find hippie-oss service instance for this event", kafka_event=value)
             raise Exception("authentication.events: Cannot find hippie-oss service instance for this event")
diff --git a/xos/synchronizer/event_steps/onu_event.py b/xos/synchronizer/event_steps/onu_event.py
index 045198f..14c6d9b 100644
--- a/xos/synchronizer/event_steps/onu_event.py
+++ b/xos/synchronizer/event_steps/onu_event.py
@@ -30,15 +30,12 @@
     def __init__(self, *args, **kwargs):
         super(ONUEventStep, self).__init__(*args, **kwargs)
 
-    def handle_onu_activate_event(self, event):
-
-        # NOTE do we need to wait of the ONU to be there?
-
-        self.log.info("onu.events: validating ONU %s" % event["serial_number"], event_data=event)
-
+    def get_att_si(self, event):
         try:
             att_si = AttWorkflowDriverServiceInstance.objects.get(serial_number=event["serial_number"])
             att_si.no_sync = False;
+            att_si.uni_port_id = event["uni_port_id"]
+            att_si.of_dpid = event["of_dpid"]
             self.log.debug("onu.events: Found existing AttWorkflowDriverServiceInstance", si=att_si)
         except IndexError:
             # create an AttWorkflowDriverServiceInstance, the validation will be triggered in the corresponding sync step
@@ -48,13 +45,19 @@
                 uni_port_id=event["uni_port_id"]
             )
             self.log.debug("onu.events: Created new AttWorkflowDriverServiceInstance", si=att_si)
-        att_si.save()
+        return att_si
 
     def process_event(self, event):
         value = json.loads(event.value)
         self.log.info("onu.events: received event", value=value)
 
+        att_si = self.get_att_si(value)
         if value["status"] == "activated":
-            self.log.info("onu.events: activate onu", value=value)
-            self.handle_onu_activate_event(value)
+            self.log.info("onu.events: activated onu", value=value)
+            att_si.onu_state = "ACTIVE"
+        elif value["status"] == "disabled":
+            self.log.info("onu.events: disabled onu", value=value)
+            att_si.onu_state = "DISABLED"
+        att_si.save(always_update_timestamp=True)
+
 
diff --git a/xos/synchronizer/event_steps/test_onu_events.py b/xos/synchronizer/event_steps/test_onu_events.py
index e81f876..b690663 100644
--- a/xos/synchronizer/event_steps/test_onu_events.py
+++ b/xos/synchronizer/event_steps/test_onu_events.py
@@ -94,7 +94,7 @@
         with patch.object(AttWorkflowDriverServiceInstance.objects, "get_items") as att_si_mock , \
             patch.object(AttWorkflowDriverServiceInstance, "save", autospec=True) as mock_save:
 
-            att_si_mock.side_effect = IndexError
+            att_si_mock.return_value = []
 
             self.event_step.process_event(self.event)
 
@@ -105,3 +105,56 @@
             self.assertEqual(att_si.serial_number, self.event_dict['serial_number'])
             self.assertEqual(att_si.of_dpid, self.event_dict['of_dpid'])
             self.assertEqual(att_si.uni_port_id, self.event_dict['uni_port_id'])
+            self.assertEqual(att_si.onu_state, "ACTIVE")
+
+    def test_reuse_instance(self):
+
+        si = AttWorkflowDriverServiceInstance(
+            serial_number=self.event_dict["serial_number"],
+            of_dpid="foo",
+            uni_port_id="foo"
+        )
+
+        with patch.object(AttWorkflowDriverServiceInstance.objects, "get_items") as att_si_mock , \
+            patch.object(AttWorkflowDriverServiceInstance, "save", autospec=True) as mock_save:
+
+            att_si_mock.return_value = [si]
+
+            self.event_step.process_event(self.event)
+
+            att_si = mock_save.call_args[0][0]
+
+            self.assertEqual(mock_save.call_count, 1)
+
+            self.assertEqual(att_si.serial_number, self.event_dict['serial_number'])
+            self.assertEqual(att_si.of_dpid, self.event_dict['of_dpid'])
+            self.assertEqual(att_si.uni_port_id, self.event_dict['uni_port_id'])
+            self.assertEqual(att_si.onu_state, "ACTIVE")
+
+    def test_disable_onu(self):
+        self.event_dict = {
+            'status': 'disabled',
+            'serial_number': 'BRCM1234',
+            'of_dpid': 'of:109299321',
+            'uni_port_id': 16
+        }
+        self.event.value = json.dumps(self.event_dict)
+
+        with patch.object(AttWorkflowDriverServiceInstance.objects, "get_items") as att_si_mock , \
+            patch.object(AttWorkflowDriverServiceInstance, "save", autospec=True) as mock_save:
+
+            att_si_mock.return_value = []
+
+            self.event_step.process_event(self.event)
+
+            att_si = mock_save.call_args[0][0]
+
+            self.assertEqual(mock_save.call_count, 1)
+
+            self.assertEqual(att_si.serial_number, self.event_dict['serial_number'])
+            self.assertEqual(att_si.of_dpid, self.event_dict['of_dpid'])
+            self.assertEqual(att_si.uni_port_id, self.event_dict['uni_port_id'])
+            self.assertEqual(att_si.onu_state, "DISABLED")
+
+if __name__ == '__main__':
+    unittest.main()
\ No newline at end of file
