diff --git a/pom.xml b/pom.xml
index 9e5d316..86c8d26 100644
--- a/pom.xml
+++ b/pom.xml
@@ -42,6 +42,7 @@
         <dhcpl2relay.api.version>2.0.1</dhcpl2relay.api.version>
         <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>
     </properties>
 
     <dependencies>
@@ -105,6 +106,12 @@
             <version>${sadis.api.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.opencord</groupId>
+            <artifactId>onos-app-igmpproxy</artifactId>
+            <version>${igmp.version}</version>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/src/main/java/org/opencord/kafka/integrations/IgmpKafkaIntegration.java b/src/main/java/org/opencord/kafka/integrations/IgmpKafkaIntegration.java
new file mode 100644
index 0000000..4a16c8a
--- /dev/null
+++ b/src/main/java/org/opencord/kafka/integrations/IgmpKafkaIntegration.java
@@ -0,0 +1,130 @@
+/*
+ * 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.ObjectNode;
+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 org.opencord.kafka.EventBusService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.opencord.igmpproxy.IgmpStatisticsEvent;
+import org.opencord.igmpproxy.IgmpStatisticsEventListener;
+import org.opencord.igmpproxy.IgmpStatisticsService;
+
+/**
+ * Listens for IGMP events and pushes them on a Kafka bus.
+ */
+
+@Component(immediate = true)
+public class IgmpKafkaIntegration extends AbstractKafkaIntegration {
+
+    public Logger log = LoggerFactory.getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected EventBusService eventBusService;
+
+    @Reference(cardinality = ReferenceCardinality.OPTIONAL,
+            policy = ReferencePolicy.DYNAMIC,
+            bind = "bindIgmpStatService",
+            unbind = "unbindIgmpStatService")
+    protected volatile IgmpStatisticsService ignore;
+    private final AtomicReference<IgmpStatisticsService> igmpStatServiceRef = new AtomicReference<>();
+
+    private final IgmpStatisticsEventListener igmpStatisticsEventListener =
+            new InternalIgmpStatisticsListener();
+
+    //TOPIC
+    private static final String IGMP_STATISTICS_TOPIC = "onos.igmp.stats.kpis";
+
+    // IGMP stats event params
+    private static final String IGMP_JOIN_REQ = "igmpJoinReq";
+    private static final String IGMP_SUCCESS_JOIN_REJOIN_REQ = "igmpSuccessJoinRejoinReq";
+    private static final String IGMP_FAIL_JOIN_REQ = "igmpFailJoinReq";
+    private static final String IGMP_LEAVE_REQ = "igmpLeaveReq";
+    private static final String IGMP_DISCONNECT = "igmpDisconnect";
+    private static final String IGMP_V3_MEMBERSHIP_QUERY = "igmpv3MembbershipQuery";
+    private static final String IGMP_V1_MEMBERSHIP_REPORT = "igmpv1MembershipReport";
+    private static final String IGMP_V2_MEMBERSHIP_REPORT = "igmpv2MembershipReport";
+    private static final String IGMP_V3_MEMBERSHIP_REPORT = "igmpv3MembershipReport";
+    private static final String IGMP_V2_LEAVE_GROUP = "igmpv2LeaveGroup";
+    private static final String TOTAL_MSG_RECEIVED = "totalMsgReceived";
+    private static final String IGMP_MSG_RECEIVED = "igmpMsgReceived";
+    private static final String INVALID_IGMP_MSG_RECEIVED = "invalidIgmpMsgReceived";
+
+    protected void bindIgmpStatService(IgmpStatisticsService incomingService) {
+        bindAndAddListener(incomingService, igmpStatServiceRef, igmpStatisticsEventListener);
+    }
+
+    protected void unbindIgmpStatService(IgmpStatisticsService outgoingService) {
+        unbindAndRemoveListener(outgoingService, igmpStatServiceRef, igmpStatisticsEventListener);
+    }
+
+    @Activate
+    public void activate() {
+        log.info("Started IgmpKafkaIntegration");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        log.info("Stopped IgmpKafkaIntegration");
+    }
+
+    private void handleStat(IgmpStatisticsEvent event) {
+        eventBusService.send(IGMP_STATISTICS_TOPIC, serializeStat(event));
+        if (log.isTraceEnabled()) {
+            log.trace("IGMPStatisticsEvent sent successfully");
+        }
+    }
+
+    private JsonNode serializeStat(IgmpStatisticsEvent event) {
+        ObjectMapper mapper = new ObjectMapper();
+        ObjectNode igmpStatEvent = mapper.createObjectNode();
+        igmpStatEvent.put(IGMP_JOIN_REQ, event.subject().getIgmpJoinReq());
+        igmpStatEvent.put(IGMP_SUCCESS_JOIN_REJOIN_REQ, event.subject().getIgmpSuccessJoinRejoinReq());
+        igmpStatEvent.put(IGMP_FAIL_JOIN_REQ, event.subject().getIgmpFailJoinReq());
+        igmpStatEvent.put(IGMP_LEAVE_REQ, event.subject().getIgmpLeaveReq());
+        igmpStatEvent.put(IGMP_DISCONNECT, event.subject().getIgmpDisconnect());
+        igmpStatEvent.put(IGMP_V3_MEMBERSHIP_QUERY, event.subject().getIgmpv3MembershipQuery());
+        igmpStatEvent.put(IGMP_V1_MEMBERSHIP_REPORT, event.subject().getIgmpv1MemershipReport());
+        igmpStatEvent.put(IGMP_V2_MEMBERSHIP_REPORT, event.subject().getIgmpv2MembershipReport());
+        igmpStatEvent.put(IGMP_V3_MEMBERSHIP_REPORT, event.subject().getIgmpv3MembershipReport());
+        igmpStatEvent.put(IGMP_V2_LEAVE_GROUP, event.subject().getIgmpv2LeaveGroup());
+        igmpStatEvent.put(TOTAL_MSG_RECEIVED, event.subject().getTotalMsgReceived());
+        igmpStatEvent.put(IGMP_MSG_RECEIVED, event.subject().getIgmpMsgReceived());
+        igmpStatEvent.put(INVALID_IGMP_MSG_RECEIVED, event.subject().getInvalidIgmpMsgReceived());
+        return igmpStatEvent;
+    }
+
+    public class InternalIgmpStatisticsListener implements
+                              IgmpStatisticsEventListener {
+
+        @Override
+        public void event(IgmpStatisticsEvent igmpStatisticsEvent) {
+            handleStat(igmpStatisticsEvent);
+        }
+    }
+}
