diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/DefaultMirroringDescription.java b/core/api/src/main/java/org/onosproject/net/behaviour/DefaultMirroringDescription.java
new file mode 100644
index 0000000..f5295a4
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/DefaultMirroringDescription.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.onosproject.net.behaviour;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.MoreObjects;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.AbstractDescription;
+import org.onosproject.net.SparseAnnotations;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Default implementation of mirroring description entity.
+ */
+@Beta
+public class DefaultMirroringDescription extends AbstractDescription
+    implements MirroringDescription {
+
+    private final MirroringName mirroringName;
+    private final List<String> monitorSrcPorts;
+    private final List<String> monitorDstPorts;
+    private final List<VlanId> monitorVlans;
+    private final Optional<String> mirrorPort;
+    private final Optional<VlanId> mirrorVlan;
+
+    /**
+     * Creates a mirroring description using the supplied information.
+     *
+     * @param name the name of the mirroring
+     * @param monitorsrcports the monitored src ports
+     * @param monitordstports the monitored dst ports
+     * @param monitorvlans the monitored vlans
+     * @param mirrorport the mirror port
+     * @param mirrorvlan the mirror vlan
+     * @param annotations optional key/value annotations
+     */
+    public DefaultMirroringDescription(MirroringName name,
+                                       List<String> monitorsrcports,
+                                       List<String> monitordstports,
+                                       List<VlanId> monitorvlans,
+                                       Optional<String> mirrorport,
+                                       Optional<VlanId> mirrorvlan,
+                                       SparseAnnotations... annotations) {
+        super(annotations);
+        this.mirroringName = name;
+        this.monitorSrcPorts = monitorsrcports;
+        this.monitorDstPorts = monitordstports;
+        this.monitorVlans = monitorvlans;
+        this.mirrorPort = mirrorport;
+        this.mirrorVlan = mirrorvlan;
+    }
+
+
+    /**
+     * Returns mirroring name.
+     *
+     * @return mirroring name
+     */
+    @Override
+    public MirroringName name() {
+        return mirroringName;
+    }
+
+    /**
+     * Returns src ports to monitor.
+     * If it is empty, then no src port has
+     * to be monitored.
+     *
+     * @return set of src ports to monitor
+     */
+    @Override
+    public List<String> monitorSrcPorts() {
+        return monitorSrcPorts;
+    }
+
+    /**
+     * Returns dst ports to monitor.
+     * If it is empty, then no dst port has
+     * to be monitored.
+     *
+     * @return set of dst ports to monitor
+     */
+    @Override
+    public List<String> monitorDstPorts() {
+        return monitorDstPorts;
+    }
+
+    /**
+     * Returns vlans to monitor.
+     * If it is empty, then no vlan has
+     * to be monitored.
+     *
+     * @return monitored vlan
+     */
+    @Override
+    public List<VlanId> monitorVlans() {
+        return monitorVlans;
+    }
+
+    /**
+     * Returns mirror port.
+     * If it is not set, then no destination
+     * port for mirrored packets.
+     *
+     * @return mirror port
+     */
+    @Override
+    public Optional<String> mirrorPort() {
+        return mirrorPort;
+    }
+
+    /**
+     * Returns mirror vlan.
+     * If it is not set the no destination
+     * vlan for mirrored packets.
+     *
+     * @return mirror vlan
+     */
+    @Override
+    public Optional<VlanId> mirrorVlan() {
+        return mirrorVlan;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("name", name())
+                .add("monitorsrcports", monitorSrcPorts())
+                .add("monitordstports", monitorDstPorts())
+                .add("monitorvlans", monitorVlans())
+                .add("mirrorport", mirrorPort())
+                .add("mirrorvlan", mirrorVlan())
+                .toString();
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/MirroringConfig.java b/core/api/src/main/java/org/onosproject/net/behaviour/MirroringConfig.java
new file mode 100644
index 0000000..7b749a2d
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/MirroringConfig.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.onosproject.net.behaviour;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.driver.HandlerBehaviour;
+
+import java.util.Collection;
+
+/**
+ * Behaviour for handling various drivers for mirroring configurations.
+ */
+@Beta
+public interface MirroringConfig extends HandlerBehaviour {
+
+    /**
+     * Adds a mirroring with a given description.
+     *
+     * @param bridge the bridge name
+     * @param mirroringDescription mirroring description
+     * @return true if succeeds, or false
+     */
+    boolean addMirroring(BridgeName bridge, MirroringDescription mirroringDescription);
+
+    /**
+     * Removes a mirroring.
+     *
+     * @param mirroringName mirroring name
+     */
+    void deleteMirroring(MirroringName mirroringName);
+
+    /**
+     * Returns a collection of MirroringStatistics.
+     *
+     * @return statistics collection
+     */
+    Collection<MirroringStatistics> getMirroringStatistics();
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/MirroringDescription.java b/core/api/src/main/java/org/onosproject/net/behaviour/MirroringDescription.java
new file mode 100644
index 0000000..2870314
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/MirroringDescription.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.onosproject.net.behaviour;
+
+import com.google.common.annotations.Beta;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.Annotated;
+import org.onosproject.net.Description;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * The abstraction of a mirroring. Port mirroring is a method of monitoring
+ * network traffic that forwards a copy of each incoming or outgoing packet from
+ * one port (Monitor port) on a network switch to another port (Mirror port)
+ * where the packet can be analyzed.
+ */
+@Beta
+public interface MirroringDescription extends Description, Annotated {
+
+    /**
+     * Returns mirroring name.
+     *
+     * @return mirroring name
+     */
+    MirroringName name();
+
+    /**
+     * Returns src ports to monitor.
+     * If it is empty, then no src port has
+     * to be monitored.
+     *
+     * @return set of src ports to monitor
+     */
+    List<String> monitorSrcPorts();
+
+    /**
+     * Returns dst ports to monitor.
+     * If it is empty, then no dst port has
+     * to be monitored.
+     *
+     * @return set of dst ports to monitor
+     */
+    List<String> monitorDstPorts();
+
+    /**
+     * Returns vlans to monitor.
+     * If it is empty, then no vlan has
+     * to be monitored.
+     *
+     * @return monitored vlan
+     */
+    List<VlanId> monitorVlans();
+
+    /**
+     * Returns mirror port.
+     * If it is not set, then no destination
+     * port for mirrored packets.
+     *
+     * @return mirror port
+     */
+    Optional<String> mirrorPort();
+
+    /**
+     * Returns mirror vlan.
+     * If it is not set then no destination
+     * vlan for mirrored packets.
+     *
+     * @return mirror vlan
+     */
+    Optional<VlanId> mirrorVlan();
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/MirroringName.java b/core/api/src/main/java/org/onosproject/net/behaviour/MirroringName.java
new file mode 100644
index 0000000..82b0eb7
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/MirroringName.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.onosproject.net.behaviour;
+
+import com.google.common.base.MoreObjects;
+
+import java.util.Objects;
+
+/**
+ * Represents for a mirroring name.
+ */
+public final class MirroringName {
+
+    private final String name;
+
+    private MirroringName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Creates a mirroring name using the supplied string.
+     *
+     * @param name mirroring name
+     * @return a port mirroring name
+     */
+    public static MirroringName mirroringName(String name) {
+        return new MirroringName(name);
+    }
+
+    /**
+     * Returns the mirroring name string.
+     *
+     * @return name string
+     */
+    public String name() {
+        return name;
+    }
+
+    @Override
+    public int hashCode() {
+        return name.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof MirroringName) {
+            final MirroringName that = (MirroringName) obj;
+            return this.getClass() == that.getClass() &&
+                    Objects.equals(this.name, that.name);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("name", name)
+                .toString();
+    }
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/MirroringStatistics.java b/core/api/src/main/java/org/onosproject/net/behaviour/MirroringStatistics.java
new file mode 100644
index 0000000..bcbaf74
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/MirroringStatistics.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.onosproject.net.behaviour;
+
+import com.google.common.base.MoreObjects;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Represents statistics associated to a mirroring.
+ */
+public final class MirroringStatistics {
+
+    private MirroringName mirroringName;
+    private int txBytes;
+    private int txPackets;
+
+    /**
+     * Statistics associated to a named mirroring.
+     *
+     * @param name the name of the mirroring
+     * @param bytes transmitted bytes
+     * @param packets transmitted packets
+     */
+    private MirroringStatistics(String name, int bytes, int packets) {
+        this.mirroringName = MirroringName.mirroringName(name);
+        this.txBytes = bytes;
+        this.txPackets = packets;
+    }
+
+    /**
+     *
+     * Creates a MirroringStatistics using the supplied information.
+     *
+     * @param name the name of the mirroring
+     * @param statistics the associated statistics
+     * @return the MirroringStatistics object
+     */
+    public static MirroringStatistics mirroringStatistics(String name, Map<String, Integer> statistics) {
+        return new MirroringStatistics(name, statistics.get("tx_bytes"), statistics.get("tx_packets"));
+    }
+
+    /**
+     * Returns the mirroring name string.
+     *
+     * @return name string
+     */
+    public MirroringName name() {
+        return mirroringName;
+    }
+
+    /**
+     * Returns the transmitted bytes.
+     *
+     * @return the bytes
+     */
+    public long bytes() {
+        return txBytes;
+    }
+
+    /**
+     * Returns the transmitted packtes.
+     *
+     * @return the packets
+     */
+    public long packtes() {
+        return txPackets;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(name().name(), txBytes, txPackets);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof MirroringStatistics) {
+            final MirroringStatistics that = (MirroringStatistics) obj;
+            return this.getClass() == that.getClass() &&
+                    Objects.equals(this.mirroringName, that.mirroringName) &&
+                    Objects.equals(this.txBytes, that.txBytes) &&
+                    Objects.equals(this.txPackets, that.txPackets);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("name", name())
+                .add("tx_bytes", bytes())
+                .add("tx_packets", packtes())
+                .toString();
+    }
+
+}
