diff --git a/pom.xml b/pom.xml
index 86c8d26..e575e00 100644
--- a/pom.xml
+++ b/pom.xml
@@ -43,6 +43,7 @@
         <bng.api.version>1.0.0</bng.api.version>
         <sadis.api.version>5.0.0</sadis.api.version>
         <igmp.version>2.0.0-SNAPSHOT</igmp.version>
+        <mcast.version>2.0.0-SNAPSHOT</mcast.version>
     </properties>
 
     <dependencies>
@@ -88,6 +89,13 @@
         </dependency>
 
         <dependency>
+            <groupId>org.opencord</groupId>
+            <artifactId>mcast</artifactId>
+            <version>${mcast.version}</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
             <scope>provided</scope>
diff --git a/src/main/java/org/opencord/kafka/integrations/McastKafkaIntegration.java b/src/main/java/org/opencord/kafka/integrations/McastKafkaIntegration.java
new file mode 100644
index 0000000..8712333
--- /dev/null
+++ b/src/main/java/org/opencord/kafka/integrations/McastKafkaIntegration.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2018-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.
+ */
+
+package org.opencord.kafka.integrations;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.opencord.cordmcast.CordMcastStatistics;
+import org.opencord.cordmcast.CordMcastStatisticsEvent;
+import org.opencord.cordmcast.CordMcastStatisticsEventListener;
+import org.opencord.cordmcast.CordMcastStatisticsService;
+import org.opencord.kafka.EventBusService;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Listens to Mcast events and pushes them into kafka bus.
+ */
+@Component(immediate = true)
+public class McastKafkaIntegration extends AbstractKafkaIntegration {
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected EventBusService eventBusService;
+
+    @Reference(cardinality = ReferenceCardinality.OPTIONAL,
+            policy = ReferencePolicy.DYNAMIC,
+            bind = "bindMcastStatisticsService",
+            unbind = "unbindMcastStatisticsService")
+    protected volatile CordMcastStatisticsService cordMcastStatisticsService;
+    protected final AtomicReference<CordMcastStatisticsService> cordMcastStatisticsServiceRef = new AtomicReference<>();
+
+    private final CordMcastStatisticsEventListener cordMcastStatisticsEventListener =
+            new InternalCorcMcastStatisticsListener();
+
+    private static final String MCAST_OPERATIONAL_STATUS_TOPIC = "mcastOperationalStatus.events";
+
+    //cord mcast stats event params
+    private static final String TIMESTAMP = "timestamp";
+    private static final String GROUP = "Group";
+    private static final String SOURCE = "Source";
+    private static final String VLAN = "Vlan";
+    private static final String MCAST_EVENT_DATA = "McastEventData";
+
+    protected void bindMcastStatisticsService(CordMcastStatisticsService cordMcastStatisticsService) {
+        bindAndAddListener(cordMcastStatisticsService, cordMcastStatisticsServiceRef, cordMcastStatisticsEventListener);
+    }
+
+    protected void unbindMcastStatisticsService(CordMcastStatisticsService cordMcastStatisticsService) {
+        unbindAndRemoveListener(cordMcastStatisticsService,
+                                cordMcastStatisticsServiceRef, cordMcastStatisticsEventListener);
+    }
+
+    @Activate
+    public void activate() {
+        log.info("Started McastKafkaIntegration");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        log.info("Stopped McastKafkaIntegration");
+    }
+
+    private void handleMcastStat(CordMcastStatisticsEvent mcastStatEvent) {
+        eventBusService.send(MCAST_OPERATIONAL_STATUS_TOPIC, serializeMcastStat(mcastStatEvent));
+        log.info("CordMcastStatisticsEvent sent successfully");
+    }
+
+    private JsonNode serializeMcastStat(CordMcastStatisticsEvent mcastStatEvent) {
+        log.debug("Serializing AuthenticationStatisticsEvent");
+        ObjectMapper mapper = new ObjectMapper();
+        ObjectNode mcastStat = mapper.createObjectNode();
+        mcastStat.put(TIMESTAMP, Instant.now().toString());
+        ArrayNode mcastArrayNode = mcastStat.putArray(MCAST_EVENT_DATA);
+        List<CordMcastStatistics> cordMcastStatsList = mcastStatEvent.subject();
+        cordMcastStatsList.forEach(stats -> {
+            ObjectNode mcastNode = mapper.createObjectNode();
+            if (stats.getGroupAddress() != null) {
+                mcastNode.put(GROUP, stats.getGroupAddress().toString());
+            }
+            if (stats.getSourceAddress() != null) {
+                mcastNode.put(SOURCE, stats.getSourceAddress().toString());
+            }
+            mcastNode.put(VLAN, stats.getVlanId().toShort());
+            mcastArrayNode.add(mcastNode);
+        });
+        return mcastStat;
+    }
+
+    private class InternalCorcMcastStatisticsListener implements CordMcastStatisticsEventListener {
+
+        @Override
+        public void event(CordMcastStatisticsEvent mcastStatEvent) {
+            handleMcastStat(mcastStatEvent);
+        }
+    }
+}
