diff --git a/core/api/src/main/java/org/onosproject/net/NshContextHeader.java b/core/api/src/main/java/org/onosproject/net/NshContextHeader.java
new file mode 100644
index 0000000..745b616
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/NshContextHeader.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2015 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;
+
+import java.util.Objects;
+
+import com.google.common.base.MoreObjects;
+
+/*
+ * Representation of NSH context header value
+ */
+public final class NshContextHeader {
+
+    private final int nshContextHeader;
+
+    /**
+     * Default constructor.
+     *
+     * @param nshContextHeader nsh context header value.
+     */
+    private NshContextHeader(int nshContextHeader) {
+        this.nshContextHeader = nshContextHeader;
+    }
+
+    /**
+     * Returns the NshContextHeader by setting its value.
+     *
+     * @param nshContextHeader nsh context header value.
+     * @return NshContextHeader
+     */
+    public static NshContextHeader of(int nshContextHeader) {
+        return new NshContextHeader(nshContextHeader);
+    }
+
+
+    /**
+     * Returns nsh context header value.
+     *
+     * @return the nsh context header
+     */
+    public int nshContextHeader() {
+        return nshContextHeader;
+    }
+
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(nshContextHeader);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof NshContextHeader)) {
+            return false;
+        }
+        final NshContextHeader other = (NshContextHeader) obj;
+        return   Objects.equals(this.nshContextHeader, other.nshContextHeader);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("nshContextHeader", nshContextHeader)
+                .toString();
+    }
+}
+
diff --git a/core/api/src/main/java/org/onosproject/net/NshServiceIndex.java b/core/api/src/main/java/org/onosproject/net/NshServiceIndex.java
new file mode 100644
index 0000000..7e0c914
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/NshServiceIndex.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2015 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;
+
+import java.util.Objects;
+
+import com.google.common.base.MoreObjects;
+
+/*
+ * Representation of NSH Service index
+ */
+public final class NshServiceIndex {
+    private static final short MASK = 0xFF;
+    private final short serviceIndex;
+
+    /**
+     * Default constructor.
+     *
+     * @param serviceIndex nsh service index
+     */
+    private NshServiceIndex(short serviceIndex) {
+        this.serviceIndex = (short) (serviceIndex & MASK);
+    }
+
+    /**
+     * Returns the NshServiceIndex by setting its value.
+     *
+     * @param serviceIndex nsh service index
+     * @return NshServiceIndex
+     */
+    public static NshServiceIndex of(short serviceIndex) {
+        return new NshServiceIndex(serviceIndex);
+    }
+
+
+    /**
+     * Returns nsh service index value.
+     *
+     * @return the nsh service index
+     */
+    public short serviceIndex() {
+        return serviceIndex;
+    }
+
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(serviceIndex);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof NshServiceIndex)) {
+            return false;
+        }
+        final NshServiceIndex other = (NshServiceIndex) obj;
+        return   Objects.equals(this.serviceIndex, other.serviceIndex);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("serviceIndex", serviceIndex)
+                .toString();
+    }
+}
+
diff --git a/core/api/src/main/java/org/onosproject/net/NshServicePathId.java b/core/api/src/main/java/org/onosproject/net/NshServicePathId.java
new file mode 100644
index 0000000..16fbc4e
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/NshServicePathId.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2015 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;
+
+import java.util.Objects;
+
+import com.google.common.base.MoreObjects;
+
+/*
+ * Representation of NSH Service path Identifier
+ */
+public final class NshServicePathId {
+
+    private final int servicePathId;
+
+    /**
+     * Default constructor.
+     *
+     * @param servicePathId nsh service path identifier
+     */
+    private NshServicePathId(int servicePathId) {
+        this.servicePathId = servicePathId;
+    }
+
+    /**
+     * Returns the NshServicePathId by setting its value.
+     *
+     * @param servicePathId nsh service path identifier
+     * @return NshServicePathId
+     */
+    public static NshServicePathId of(int servicePathId) {
+        return new NshServicePathId(servicePathId);
+    }
+
+
+    /**
+     * Returns nsh context service path identifier.
+     *
+     * @return the nsh context service path id
+     */
+    public int servicePathId() {
+        return servicePathId;
+    }
+
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(servicePathId);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof NshServicePathId)) {
+            return false;
+        }
+        final NshServicePathId other = (NshServicePathId) obj;
+        return   Objects.equals(this.servicePathId, other.servicePathId);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("servicePathId", servicePathId)
+                .toString();
+    }
+}
+
diff --git a/core/api/src/main/java/org/onosproject/net/flow/criteria/ExtensionSelectorType.java b/core/api/src/main/java/org/onosproject/net/flow/criteria/ExtensionSelectorType.java
index 982e5b1..fa8f092 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/criteria/ExtensionSelectorType.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/criteria/ExtensionSelectorType.java
@@ -32,7 +32,13 @@
      * These numbers have no impact on the actual OF type id.
      */
     public enum ExtensionSelectorTypes {
-        PLACEHOLDER(0); // TODO remove when actual extensions are added
+        NICIRA_MATCH_NSH_SPI(0),
+        NICIRA_MATCH_NSH_SI(1),
+        NICIRA_MATCH_NSH_CH1(2),
+        NICIRA_MATCH_NSH_CH2(3),
+        NICIRA_MATCH_NSH_CH3(4),
+        NICIRA_MATCH_NSH_CH4(5);
+
 
         private ExtensionSelectorType type;
 
diff --git a/drivers/src/main/java/org/onosproject/driver/extensions/DefaultMoveExtensionTreatment.java b/drivers/src/main/java/org/onosproject/driver/extensions/DefaultMoveExtensionTreatment.java
index f0840c8..140a816 100644
--- a/drivers/src/main/java/org/onosproject/driver/extensions/DefaultMoveExtensionTreatment.java
+++ b/drivers/src/main/java/org/onosproject/driver/extensions/DefaultMoveExtensionTreatment.java
@@ -50,6 +50,7 @@
      * @param nBits nbits
      * @param src source
      * @param dst destination
+     * @param type extension treatment type
      */
     public DefaultMoveExtensionTreatment(int srcOfs, int dstOfs, int nBits,
                                          int src, int dst, ExtensionTreatmentType type) {
diff --git a/drivers/src/main/java/org/onosproject/driver/extensions/NiciraExtensionSelectorInterpreter.java b/drivers/src/main/java/org/onosproject/driver/extensions/NiciraExtensionSelectorInterpreter.java
index b1a3c68..9f30299 100644
--- a/drivers/src/main/java/org/onosproject/driver/extensions/NiciraExtensionSelectorInterpreter.java
+++ b/drivers/src/main/java/org/onosproject/driver/extensions/NiciraExtensionSelectorInterpreter.java
@@ -33,11 +33,48 @@
 
     @Override
     public boolean supported(ExtensionSelectorType extensionSelectorType) {
+        if (extensionSelectorType.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_SPI.type())) {
+            return true;
+        }
+        if (extensionSelectorType.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_SI.type())) {
+            return true;
+        }
+        if (extensionSelectorType.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_CH1.type())) {
+            return true;
+        }
+        if (extensionSelectorType.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_CH2.type())) {
+            return true;
+        }
+        if (extensionSelectorType.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_CH3.type())) {
+            return true;
+        }
+        if (extensionSelectorType.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_CH4.type())) {
+            return true;
+        }
         return false;
     }
 
     @Override
     public OFOxm<?> mapSelector(OFFactory factory, ExtensionSelector extensionSelector) {
+        ExtensionSelectorType type = extensionSelector.type();
+        if (type.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_SPI.type())) {
+            // TODO
+        }
+        if (type.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_SI.type())) {
+            // TODO
+        }
+        if (type.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_CH1.type())) {
+            // TODO
+        }
+        if (type.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_CH2.type())) {
+            // TODO
+        }
+        if (type.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_CH3.type())) {
+            // TODO
+        }
+        if (type.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_CH4.type())) {
+            // TODO
+        }
         return null;
     }
 
@@ -48,6 +85,18 @@
 
     @Override
     public ExtensionSelector getExtensionSelector(ExtensionSelectorType type) {
+        if (type.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_SPI.type())) {
+            return new NiciraMatchNshSpi();
+        }
+        if (type.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_SI.type())) {
+            return new NiciraMatchNshSi();
+        }
+        if (type.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_CH1.type())
+                || type.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_CH2.type())
+                || type.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_CH3.type())
+                || type.equals(ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_CH4.type())) {
+            return new NiciraMatchNshContextHeader(type);
+        }
         return null;
     }
 }
diff --git a/drivers/src/main/java/org/onosproject/driver/extensions/NiciraMatchNshContextHeader.java b/drivers/src/main/java/org/onosproject/driver/extensions/NiciraMatchNshContextHeader.java
new file mode 100644
index 0000000..5f37247
--- /dev/null
+++ b/drivers/src/main/java/org/onosproject/driver/extensions/NiciraMatchNshContextHeader.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2015 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.driver.extensions;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+import org.onlab.util.KryoNamespace;
+import org.onosproject.net.NshContextHeader;
+import org.onosproject.net.flow.AbstractExtension;
+import org.onosproject.net.flow.criteria.ExtensionSelector;
+import org.onosproject.net.flow.criteria.ExtensionSelectorType;
+/**
+ * Implementation of Nsh context header criterion.
+ */
+public final class NiciraMatchNshContextHeader  extends AbstractExtension implements ExtensionSelector {
+    private NshContextHeader nshContextHeader;
+    private ExtensionSelectorType type;
+
+    private final KryoNamespace appKryo = new KryoNamespace.Builder().build();
+
+    /**
+     * Constructor to create Nsh context header.
+     *
+     * @param type extension selector type
+     */
+    public NiciraMatchNshContextHeader(ExtensionSelectorType type) {
+        this.nshContextHeader = null;
+        this.type = type;
+    }
+
+    /**
+     * Gets the nsh context header to match.
+     *
+     * @return the nsh context header to match
+     */
+    public NshContextHeader nshContextHeader() {
+        return nshContextHeader;
+    }
+
+    @Override
+    public byte[] serialize() {
+        return appKryo.serialize(nshContextHeader.nshContextHeader());
+    }
+
+    @Override
+    public void deserialize(byte[] data) {
+        nshContextHeader = nshContextHeader.of(appKryo.deserialize(data));
+
+    }
+
+    @Override
+    public ExtensionSelectorType type() {
+        return type;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(type().toString())
+                .add("nshContextHeader", nshContextHeader.toString())
+                .toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type(), nshContextHeader);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof NiciraMatchNshContextHeader) {
+            NiciraMatchNshContextHeader that = (NiciraMatchNshContextHeader) obj;
+            return Objects.equals(nshContextHeader, that.nshContextHeader) &&
+                    Objects.equals(this.type(), that.type());
+        }
+        return false;
+    }
+}
diff --git a/drivers/src/main/java/org/onosproject/driver/extensions/NiciraMatchNshSi.java b/drivers/src/main/java/org/onosproject/driver/extensions/NiciraMatchNshSi.java
new file mode 100644
index 0000000..c98a584
--- /dev/null
+++ b/drivers/src/main/java/org/onosproject/driver/extensions/NiciraMatchNshSi.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2015 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.driver.extensions;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+import org.onlab.util.KryoNamespace;
+import org.onosproject.net.NshServiceIndex;
+import org.onosproject.net.flow.AbstractExtension;
+import org.onosproject.net.flow.criteria.ExtensionSelector;
+import org.onosproject.net.flow.criteria.ExtensionSelectorType;
+/**
+ * Implementation of NSH Service Index(SI).
+ */
+public final class NiciraMatchNshSi extends AbstractExtension implements ExtensionSelector {
+
+    private NshServiceIndex nshSi;
+
+    private final KryoNamespace appKryo = new KryoNamespace.Builder().build();
+
+    /**
+     * Default constructor.
+     *
+     */
+    public NiciraMatchNshSi() {
+        this.nshSi = null;
+    }
+
+    /**
+     * Gets the nsh service index to match.
+     *
+     * @return the si to match
+     */
+    public NshServiceIndex nshSi() {
+        return nshSi;
+    }
+
+    @Override
+    public byte[] serialize() {
+        return appKryo.serialize(nshSi.serviceIndex());
+    }
+
+    @Override
+    public void deserialize(byte[] data) {
+        nshSi = NshServiceIndex.of(appKryo.deserialize(data));
+    }
+
+    @Override
+    public ExtensionSelectorType type() {
+        return ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_SI.type();
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(type().toString())
+                .add("nshSi", nshSi.toString())
+                .toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type(), nshSi);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof NiciraMatchNshSi) {
+            NiciraMatchNshSi that = (NiciraMatchNshSi) obj;
+            return Objects.equals(nshSi, that.nshSi);
+        }
+        return false;
+    }
+}
diff --git a/drivers/src/main/java/org/onosproject/driver/extensions/NiciraMatchNshSpi.java b/drivers/src/main/java/org/onosproject/driver/extensions/NiciraMatchNshSpi.java
new file mode 100644
index 0000000..42bb78d
--- /dev/null
+++ b/drivers/src/main/java/org/onosproject/driver/extensions/NiciraMatchNshSpi.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2015 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.driver.extensions;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+import org.onlab.util.KryoNamespace;
+import org.onosproject.net.NshServicePathId;
+import org.onosproject.net.flow.AbstractExtension;
+import org.onosproject.net.flow.criteria.ExtensionSelector;
+import org.onosproject.net.flow.criteria.ExtensionSelectorType;
+
+/**
+ * Implementation of NSH Service Path Id selector.
+ */
+public final class NiciraMatchNshSpi extends AbstractExtension implements ExtensionSelector  {
+    private NshServicePathId nshSpi;
+
+    private final KryoNamespace appKryo = new KryoNamespace.Builder().build();
+
+    /**
+     * Default constructor.
+     */
+    public NiciraMatchNshSpi() {
+        this.nshSpi = null;
+    }
+
+    /**
+     * Gets the network service path id to match.
+     *
+     * @return the nshSpi to match
+     */
+    public NshServicePathId nshSpi() {
+        return nshSpi;
+    }
+
+    @Override
+    public ExtensionSelectorType type() {
+        return ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_SPI.type();
+    }
+
+    @Override
+    public byte[] serialize() {
+        return appKryo.serialize(nshSpi);
+    }
+
+    @Override
+    public void deserialize(byte[] data) {
+        nshSpi = NshServicePathId.of(appKryo.deserialize(data));
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(type().toString())
+                .add("nshSpi", nshSpi.toString())
+                .toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type(), nshSpi);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof NiciraMatchNshSpi) {
+            NiciraMatchNshSpi that = (NiciraMatchNshSpi) obj;
+            return Objects.equals(nshSpi, that.nshSpi) &&
+                    Objects.equals(this.type(), that.type());
+        }
+        return false;
+    }
+}
