diff --git a/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java b/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java
index c3d6f44..465dd06 100644
--- a/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java
+++ b/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java
@@ -22,7 +22,6 @@
 import org.onosproject.net.Device;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.onosproject.openflow.controller.Dpid;
-import org.onosproject.openflow.controller.OpenFlowEventListener;
 import org.onosproject.openflow.controller.RoleState;
 import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
 import org.projectfloodlight.openflow.protocol.OFErrorMsg;
@@ -37,7 +36,6 @@
 import org.projectfloodlight.openflow.protocol.OFPortStatus;
 import org.projectfloodlight.openflow.protocol.OFRoleReply;
 import org.projectfloodlight.openflow.protocol.OFRoleRequest;
-import org.projectfloodlight.openflow.protocol.OFType;
 import org.projectfloodlight.openflow.protocol.OFVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,16 +46,10 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
-import static org.onlab.util.Tools.groupedThreads;
-
 /**
  * An abstract representation of an OpenFlow switch. Can be extended by others
  * to serve as a base for their vendor specific representation of a switch.
@@ -90,11 +82,6 @@
     protected OFFeaturesReply features;
     protected OFDescStatsReply desc;
 
-    protected Set<OpenFlowEventListener> ofOutgoingMsgListener = new CopyOnWriteArraySet<>();
-
-    protected ExecutorService executorMsgs =
-            Executors.newCachedThreadPool(groupedThreads("onos/of", "event-outgoing-msg-stats-%d", log));
-
     // messagesPendingMastership is used as synchronization variable for
     // all mastership related changes. In this block, mastership (including
     // role update) will have either occurred or not.
@@ -133,9 +120,9 @@
            a synchronization primitive, because the message would have just been
            dropped anyway.
         */
+
         if (role == RoleState.MASTER) {
             // fast path send when we are master
-
             sendMsgsOnChannel(msgs);
             return;
         }
@@ -166,23 +153,10 @@
         }
     }
 
-    private void countOutgoingMsg(List<OFMessage> msgs) {
-        // listen to outgoing control messages only if listeners are registered
-        if (ofOutgoingMsgListener.size() != 0) {
-            msgs.forEach(m -> {
-                if (m.getType() == OFType.PACKET_OUT ||
-                        m.getType() == OFType.FLOW_MOD ||
-                        m.getType() == OFType.STATS_REQUEST) {
-                    executorMsgs.execute(new OFMessageHandler(dpid, m));
-                }
-            });
-        }
-    }
-
     private void sendMsgsOnChannel(List<OFMessage> msgs) {
         if (channel.isConnected()) {
             channel.write(msgs);
-            countOutgoingMsg(msgs);
+            agent.processDownstreamMessage(dpid, msgs);
         } else {
             log.warn("Dropping messages for switch {} because channel is not connected: {}",
                      dpid, msgs);
@@ -335,16 +309,6 @@
     }
 
     @Override
-    public void addEventListener(OpenFlowEventListener listener) {
-        ofOutgoingMsgListener.add(listener);
-    }
-
-    @Override
-    public void removeEventListener(OpenFlowEventListener listener) {
-        ofOutgoingMsgListener.remove(listener);
-    }
-
-    @Override
     public OFFactory factory() {
         return OFFactories.getFactory(ofVersion);
     }
@@ -535,25 +499,4 @@
                 ? channel.getRemoteAddress() : "?")
                 + " DPID[" + ((getStringId() != null) ? getStringId() : "?") + "]]";
     }
-
-    /**
-     * OpenFlow message handler for outgoing control messages.
-     */
-    protected final class OFMessageHandler implements Runnable {
-
-        protected final OFMessage msg;
-        protected final Dpid dpid;
-
-        public OFMessageHandler(Dpid dpid, OFMessage msg) {
-            this.msg = msg;
-            this.dpid = dpid;
-        }
-
-        @Override
-        public void run() {
-            for (OpenFlowEventListener listener : ofOutgoingMsgListener) {
-                listener.handleMessage(dpid, msg);
-            }
-        }
-    }
 }
