diff --git a/src/main/java/net/floodlightcontroller/core/IOF13Switch.java b/src/main/java/net/floodlightcontroller/core/IOF13Switch.java
new file mode 100644
index 0000000..425c6a9
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/core/IOF13Switch.java
@@ -0,0 +1,101 @@
+package net.floodlightcontroller.core;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.onrc.onos.core.matchaction.MatchActionOperationEntry;
+import net.onrc.onos.core.util.Dpid;
+
+import com.google.common.primitives.Longs;
+
+
+public interface IOF13Switch extends IOFSwitch {
+
+    // **************************
+    // Flow related
+    // **************************
+
+    /**
+     * Pushes a single flow to the switch as described by the match-action
+     * operation and match-action definition, and subject to the TTP supported
+     * by a switch implementing this interface. It is up to the implementation
+     * to translate the 'matchActionOp' into a match-instruction with actions,
+     * as expected by OF 1.3 switches.
+     *
+     * @param matchActionOp
+     */
+    public void pushFlow(MatchActionOperationEntry matchActionOp);
+
+    /**
+     * Pushes a collection of flows to the switch.
+     * 
+     * @param matchActionOps
+     */
+    public void pushFlows(Collection<MatchActionOperationEntry> matchActionOps);
+
+    // ****************************
+    // Group related
+    // ****************************
+
+    /**
+     * Representation of a set of neighbor switch dpids. Meant to be used as a
+     * lookup-key in a hash-map to retrieve an ECMP-group that hashes packets to
+     * a set of ports connecting to the neighbors in this set.
+     */
+    public class NeighborSet {
+        Set<Dpid> dpids;
+
+        /**
+         * Constructor
+         *
+         * @param dpids A variable number of Dpids represention neighbor
+         *        switches
+         */
+        public NeighborSet(Dpid... dpids) {
+            this.dpids = new HashSet<Dpid>();
+            for (Dpid d : dpids) {
+                this.dpids.add(d);
+            }
+        }
+
+        public void addDpid(Dpid d) {
+            dpids.add(d);
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (!(o instanceof NeighborSet)) {
+                return false;
+            }
+            NeighborSet that = (NeighborSet) o;
+            return this.dpids.equals(that.dpids);
+        }
+
+        @Override
+        public int hashCode() {
+            int result = 17;
+            for (Dpid d : dpids) {
+                result = 31 * result + Longs.hashCode(d.value());
+            }
+            return result;
+        }
+
+        @Override
+        public String toString() {
+            return " Sw: {} Neighbors: " + dpids;
+        }
+    }
+
+    /**
+     * Get the ECMP group-id for the ECMP group in this switch that includes
+     * ports that connect to the neighbor-switches included in the NeighborSet
+     * 'ns'
+     *
+     * @param ns the set of Neighbor Dpids
+     * @return the ecmp group id, or -1 if no such group exists
+     */
+    public int getEcmpGroupId(NeighborSet ns);
+
+
+}
