diff --git a/core/core_server.go b/core/core_server.go
index 8ebdaa0..c38419d 100644
--- a/core/core_server.go
+++ b/core/core_server.go
@@ -80,7 +80,7 @@
        <-              <-
 */
 
-func NewCore(opt *option, omciOut chan openolt.OmciMsg, omciIn chan openolt.OmciIndication) *Server {
+func NewCore(opt *option) *Server {
 	// TODO: make it decent
 	oltid := opt.oltid
 	npon := opt.npon
@@ -97,8 +97,8 @@
 		EnableServer: nil,
 		state:        INACTIVE,
 		stateChan:    make(chan coreState, 8),
-		omciIn:       omciIn,
-		omciOut:      omciOut,
+		omciIn:       make(chan openolt.OmciIndication, 1024),
+		omciOut:      make(chan openolt.OmciMsg, 1024),
 	}
 
 	nnni := s.Olt.NumNniIntf
@@ -330,6 +330,16 @@
 	defer logger.Debug("runPacketInDaemon Done")
 	unichannel := make(chan Packet, 2048)
 
+
+	logger.Debug("runOMCIDaemon Start")
+	defer logger.Debug("runOMCIDaemon Done")
+	errch := make (chan error)
+	OmciRun(s.omciOut, s.omciIn, s.Onumap, errch)
+	go func(){
+		<-errch	// Wait for OmciInitialization
+		s.updateState(ACTIVE)
+	}()
+
 	for intfid, _ := range s.Onumap {
 		for _, onu := range s.Onumap[intfid] {
 			onuid := onu.OnuID
@@ -352,7 +362,6 @@
 	go RecvWorker(ioinfo, nhandler, nnichannel)
 
 	data := &openolt.Indication_PktInd{}
-	s.updateState(ACTIVE)
 	for {
 		select {
 		case msg := <-s.omciIn:
@@ -505,7 +514,7 @@
 
 func getGemPortID(intfid uint32, onuid uint32) (uint32, error) {
 	key := OnuKey{intfid, onuid}
-	if onuState, ok := Onus[key]; !ok {
+	if onuState, ok := OnuOmciStateMap[key]; !ok {
 		idx := uint32(0)
 		// Backwards compatible with bbsim_olt adapter
 		return 1024 + (((MAX_ONUS_PER_PON*intfid + onuid - 1) * 7) + idx), nil
diff --git a/core/mediator.go b/core/mediator.go
index 2bf2c40..ee25264 100644
--- a/core/mediator.go
+++ b/core/mediator.go
@@ -26,7 +26,6 @@
 	"sync"
 
 	"gerrit.opencord.org/voltha-bbsim/common/logger"
-	"gerrit.opencord.org/voltha-bbsim/protos"
 	log "github.com/sirupsen/logrus"
 )
 
@@ -126,10 +125,7 @@
 func (m *mediator) Start() {
 	var wg sync.WaitGroup
 	opt := m.opt
-	omciOut := make(chan openolt.OmciMsg, 1024)
-	omciIn := make(chan openolt.OmciIndication, 1024)
-	go OmciRun(omciOut, omciIn)
-	server := NewCore(opt, omciOut, omciIn)
+	server := NewCore(opt)
 	wg.Add(1)
 	go func() {
 		if err := server.Start(); err != nil { //Blocking
diff --git a/core/omci.go b/core/omci.go
index 25701b0..acf7bbe 100644
--- a/core/omci.go
+++ b/core/omci.go
@@ -22,6 +22,8 @@
 
 	"gerrit.opencord.org/voltha-bbsim/common/logger"
 	"gerrit.opencord.org/voltha-bbsim/protos"
+	"gerrit.opencord.org/voltha-bbsim/device"
+	"time"
 )
 
 //
@@ -89,13 +91,21 @@
 	IntfId, OnuId uint32
 }
 
-type OnuState struct {
+type OnuOmciState struct {
 	gemPortId    uint16
 	mibUploadCtr uint16
 	uniGInstance uint8
 	pptpInstance uint8
+	init  istate
 }
 
+type istate int
+
+const (
+	INCOMPLETE istate = iota
+	DONE
+)
+
 type OmciMsgHandler func(class OmciClass, content OmciContent, key OnuKey) []byte
 
 var Handlers = map[OmciMsgType]OmciMsgHandler{
@@ -108,40 +118,52 @@
 	GetAllAlarms:  getAllAlarms,
 }
 
-var Onus = map[OnuKey]*OnuState{}
+var OnuOmciStateMap = map[OnuKey]*OnuOmciState{}
 
-func OmciRun(omciOut chan openolt.OmciMsg, omciIn chan openolt.OmciIndication) {
-
-	for {
-		var resp openolt.OmciIndication
-
-		m := <-omciOut
-
-		transactionId, deviceId, msgType, class, instance, content := ParsePkt(m.Pkt)
-
-		logger.Debug("OmciRun - transactionId: %d msgType: %d, ME Class: %d, ME Instance: %d",
-			transactionId, msgType, class, instance)
-
-		key := OnuKey{m.IntfId, m.OnuId}
-		if _, ok := Onus[key]; !ok {
-			Onus[key] = NewOnuState()
+func OmciRun(omciOut chan openolt.OmciMsg, omciIn chan openolt.OmciIndication, onumap map[uint32][] *device.Onu, errch chan error) {
+	go func() { //For monitoring the OMCI states
+		for {
+			time.Sleep(1 * time.Second)
+			if isAllOmciInitDone(onumap) {
+				logger.Info("OmciRun - All the omci init process were done")
+				close(errch)
+				break
+			}
 		}
+	}()
 
-		if _, ok := Handlers[msgType]; !ok {
-			logger.Warn("Ignore omci msg (msgType %d not handled)", msgType)
-			continue
+	go func(){
+		for {
+			var resp openolt.OmciIndication
+
+			m := <-omciOut
+
+			transactionId, deviceId, msgType, class, instance, content := ParsePkt(m.Pkt)
+
+			logger.Debug("OmciRun - transactionId: %d msgType: %d, ME Class: %d, ME Instance: %d",
+				transactionId, msgType, class, instance)
+
+			key := OnuKey{m.IntfId, m.OnuId}
+			if _, ok := OnuOmciStateMap[key]; !ok {
+				OnuOmciStateMap[key] = NewOnuOmciState()
+			}
+
+			if _, ok := Handlers[msgType]; !ok {
+				logger.Warn("Ignore omci msg (msgType %d not handled)", msgType)
+				continue
+			}
+
+			resp.Pkt = Handlers[msgType](class, content, key)
+
+			resp.Pkt[0] = byte(transactionId >> 8)
+			resp.Pkt[1] = byte(transactionId & 0xFF)
+			resp.Pkt[2] = 0x2<<4 | byte(msgType)
+			resp.Pkt[3] = deviceId
+			resp.IntfId = m.IntfId
+			resp.OnuId = m.OnuId
+			omciIn <- resp
 		}
-
-		resp.Pkt = Handlers[msgType](class, content, key)
-
-		resp.Pkt[0] = byte(transactionId >> 8)
-		resp.Pkt[1] = byte(transactionId & 0xFF)
-		resp.Pkt[2] = 0x2<<4 | byte(msgType)
-		resp.Pkt[3] = deviceId
-		resp.IntfId = m.IntfId
-		resp.OnuId = m.OnuId
-		omciIn <- resp
-	}
+	}()
 }
 
 func ParsePkt(pkt []byte) (uint16, uint8, OmciMsgType, OmciClass, uint16, OmciContent) {
@@ -154,7 +176,6 @@
 	}
 	logger.Debug("OmciRun - TransactionId: %d MessageType: %d, ME Class: %d, ME Instance: %d, Content: %x",
 		m.TransactionId, m.MessageType&0x0F, m.MessageId.Class, m.MessageId.Instance, m.Content)
-
 	return m.TransactionId, m.DeviceId, m.MessageType & 0x0F, m.MessageId.Class, m.MessageId.Instance, m.Content
 
 }
@@ -173,8 +194,8 @@
 	return p
 }
 
-func NewOnuState() *OnuState {
-	return &OnuState{gemPortId: 0, mibUploadCtr: 0, uniGInstance: 1, pptpInstance: 1}
+func NewOnuOmciState() *OnuOmciState {
+	return &OnuOmciState{gemPortId: 0, mibUploadCtr: 0, uniGInstance: 1, pptpInstance: 1}
 }
 
 func mibReset(class OmciClass, content OmciContent, key OnuKey) []byte {
@@ -215,7 +236,7 @@
 
 	logger.Debug("Omci MibUploadNext")
 
-	state := Onus[key]
+	state := OnuOmciStateMap[key]
 
 	switch state.mibUploadCtr {
 	case 0:
@@ -277,11 +298,12 @@
 	var pkt []byte
 
 	if class == GEMPortNetworkCTP {
-		if onuState, ok := Onus[key]; !ok {
+		if onuOmciState, ok := OnuOmciStateMap[key]; !ok {
 			logger.Error("ONU Key Error - IntfId: %d, OnuId:", key.IntfId, key.OnuId)
 		} else {
-			onuState.gemPortId = binary.BigEndian.Uint16(content[:2])
-			logger.Debug("Gem Port Id %d", onuState.gemPortId)
+			onuOmciState.gemPortId = binary.BigEndian.Uint16(content[:2])
+			logger.Debug("Gem Port Id %d", onuOmciState.gemPortId)
+			OnuOmciStateMap[key].init = DONE
 		}
 	}
 
@@ -329,3 +351,17 @@
 
 	return pkt
 }
+
+func isAllOmciInitDone(onumap map[uint32][] *device.Onu) bool {
+	for _, onus := range onumap {
+		for _, onu := range onus{
+			key := OnuKey{onu.IntfID, onu.OnuID}
+			state := OnuOmciStateMap[key]
+			if state.init == INCOMPLETE{
+				return false
+			}
+		}
+	}
+	return true
+}
+
