diff --git a/core/core_server.go b/core/core_server.go
index 2fc494b..c57a3e9 100644
--- a/core/core_server.go
+++ b/core/core_server.go
@@ -200,6 +200,15 @@
 	}
 }
 
+func (s *Server) updateOnuIntState (intfid uint32, onuid uint32, state device.DeviceState) error {
+	onu, err := s.GetOnuByID(onuid)	//TODO: IntfID should be included ?
+	if err != nil {
+		return err
+	}
+	s.updateDevIntState(onu, state)
+	return nil
+}
+
 func (s *Server) activateOLT(stream openolt.Openolt_EnableIndicationServer) error {
 	defer logger.Debug("activateOLT() Done")
 	logger.Debug("activateOLT() Start")
@@ -368,6 +377,7 @@
 	defer func() {
 		close(unichannel)
 		logger.Debug("Closed unichannel ")
+		logger.Debug("runMainPktLoop Done")
 	}()
 	for intfid, _ := range s.Onumap {
 		for _, onu := range s.Onumap[intfid] {
@@ -418,7 +428,7 @@
 			le, _ := layerEth.(*layers.Ethernet)
 			ethtype := le.EthernetType
 
-			if ethtype == 0x888e {
+			if ethtype == layers.EthernetTypeEAPOL {
 				utils.LoggerWithOnu(onu).WithFields(log.Fields{
 					"gemId": gemid,
 				}).Info("Received upstream packet is EAPOL.")
@@ -491,7 +501,7 @@
 	if layerEth != nil {
 		pkt, _ := layerEth.(*layers.Ethernet)
 		ethtype := pkt.EthernetType
-		if ethtype == 0x888e {
+		if ethtype == layers.EthernetTypeEAPOL {
 			utils.LoggerWithOnu(onu).Info("Received downstream packet is EAPOL.")
 		} else if layerDHCP := rawpkt.Layer(layers.LayerTypeDHCPv4); layerDHCP != nil {
 			utils.LoggerWithOnu(onu).WithFields(log.Fields{
@@ -543,6 +553,17 @@
 	return true
 }
 
+func (s *Server) isAllOnuOmciActive() bool {
+	for _, onus := range s.Onumap {
+		for _, onu := range onus{
+			if onu.GetIntState() != device.ONU_OMCIACTIVE {
+				return false
+			}
+		}
+	}
+	return true
+}
+
 func getGemPortID(intfid uint32, onuid uint32) (uint32, error) {
 	// FIXME - check for errors
 	return uint32(omci.GetGemPortId(intfid, onuid)), nil
diff --git a/core/grpc_service.go b/core/grpc_service.go
index 6c07833..f7bf672 100644
--- a/core/grpc_service.go
+++ b/core/grpc_service.go
@@ -25,6 +25,7 @@
 	"gerrit.opencord.org/voltha-bbsim/protos"
 	"github.com/google/gopacket"
 	"github.com/google/gopacket/layers"
+	omci "github.com/opencord/omci-sim"
 	log "github.com/sirupsen/logrus"
 	"golang.org/x/net/context"
 	"google.golang.org/grpc"
@@ -138,14 +139,27 @@
 }
 
 func (s *Server) FlowAdd(c context.Context, flow *openolt.Flow) (*openolt.Empty, error) {
+	logger.Debug("OLT %d receives FlowAdd() IntfID:%d OnuID:%d EType:%x:.", s.Olt.ID, flow.AccessIntfId, flow.OnuId, flow.Classifier.EthType)
+	onu, err := s.GetOnuByID(uint32(flow.OnuId))
 
-	onu, _ := s.GetOnuByID(uint32(flow.OnuId))
+	if err == nil {
+		intfid := onu.IntfID
+		onuid := onu.OnuID
 
-	utils.LoggerWithOnu(onu).WithFields(log.Fields{
-		"olt":   s.Olt.ID,
-		"c_tag": flow.Action.IVid,
-	}).Debug("OLT receives FlowAdd().")
+		utils.LoggerWithOnu(onu).WithFields(log.Fields{
+			"olt":   s.Olt.ID,
+			"c_tag": flow.Action.IVid,
+		}).Debug("OLT receives FlowAdd().")
 
+		if flow.Classifier.EthType == uint32(layers.EthernetTypeEAPOL) {
+			omcistate := omci.GetOnuOmciState(onu.OnuID, onu.IntfID)
+			if omcistate == omci.DONE {
+				s.updateOnuIntState(intfid, onuid, device.ONU_OMCIACTIVE)
+			} else {
+				logger.Error("FlowAdd() OMCI state %d is not \"DONE\"", omci.GetOnuOmciState(onu.OnuID, onu.IntfID))
+			}
+		}
+	}
 	return new(openolt.Empty), nil
 }
 
diff --git a/core/mediator.go b/core/mediator.go
index b973493..89715c6 100644
--- a/core/mediator.go
+++ b/core/mediator.go
@@ -170,7 +170,7 @@
 
 func transitOlt (s *Server, current device.DeviceState, next device.DeviceState, tester *Tester, o *option) error {
 	if current == device.OLT_PREACTIVE && next == device.OLT_ACTIVE {
-		tester.Start(s)
+
 	} else if current == device.OLT_ACTIVE && next == device.OLT_PREACTIVE{
 		tester.Stop(s)
 	}
@@ -178,5 +178,12 @@
 }
 
 func transitOnu (s *Server, key device.Devkey, current device.DeviceState, next device.DeviceState, tester *Tester, o *option) error {
+	if current == device.ONU_ACTIVE && next == device.ONU_OMCIACTIVE {
+		if s.isAllOnuOmciActive(){	//TODO: This should be per-ONU control, not by cheking All ONU's status
+			tester.Start(s)
+		}
+	} else if (current == device.ONU_OMCIACTIVE || current == device.ONU_ACTIVE) &&
+		next == device.ONU_INACTIVE {
+	}
 	return nil
 }
\ No newline at end of file
diff --git a/core/omci.go b/core/omci.go
index e35fd90..1d1a78c 100644
--- a/core/omci.go
+++ b/core/omci.go
@@ -17,8 +17,6 @@
 package core
 
 import (
-	"time"
-
 	"context"
 
 	"gerrit.opencord.org/voltha-bbsim/common/logger"
@@ -28,25 +26,6 @@
 )
 
 func RunOmciResponder(ctx context.Context, omciOut chan openolt.OmciMsg, omciIn chan openolt.OmciIndication, onumap map[uint32][]*device.Onu, errch chan error) {
-	go func() { //For monitoring the OMCI states TODO: This part should be eliminated because it is out of scope of this library
-		t := time.NewTicker(1 * time.Second)
-		defer t.Stop()
-		for {
-			select {
-			case <-t.C:
-				logger.Debug("Monitor omci init state")
-				if isAllOmciInitDone(onumap) {
-					logger.Info("OmciRun - All the omci initialization wes done")
-					close(errch)
-					return
-				}
-			case <-ctx.Done():
-				logger.Debug("Omci Monitoring process was done")
-				return
-			}
-		}
-	}()
-
 	go func() {
 		defer logger.Debug("Omci response process was done")
 
@@ -93,13 +72,3 @@
 	return p
 }
 
-func isAllOmciInitDone(onumap map[uint32][]*device.Onu) bool {
-	for _, onus := range onumap {
-		for _, onu := range onus {
-			if omci.GetOnuOmciState(onu.OnuID, onu.IntfID) == omci.INCOMPLETE {
-				return false
-			}
-		}
-	}
-	return true
-}
