diff --git a/core/api/src/main/java/org/onosproject/net/flow/criteria/Criteria.java b/core/api/src/main/java/org/onosproject/net/flow/criteria/Criteria.java
index 7ee17fd..be4b90d 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/criteria/Criteria.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/criteria/Criteria.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.net.flow.criteria;
 
+import org.onosproject.net.IndexedLambda;
 import org.onosproject.net.Lambda;
 import org.onosproject.net.OchSignal;
 import org.onosproject.net.PortNumber;
@@ -359,6 +360,7 @@
      * @param lambda lambda to match on (16 bits unsigned integer)
      * @return match criterion
      */
+    @Deprecated
     public static Criterion matchLambda(int lambda) {
         return new LambdaCriterion(lambda, Type.OCH_SIGID);
     }
@@ -370,7 +372,9 @@
      * @return match criterion
      */
     public static Criterion matchLambda(Lambda lambda) {
-        if (lambda instanceof OchSignal) {
+        if (lambda instanceof IndexedLambda) {
+            return new IndexedLambdaCriterion((IndexedLambda) lambda);
+        } else if (lambda instanceof OchSignal) {
             return new OchSignalCriterion((OchSignal) lambda);
         } else {
             throw new UnsupportedOperationException(String.format("Unsupported type of Lambda: %s", lambda));
diff --git a/core/api/src/main/java/org/onosproject/net/flow/criteria/IndexedLambdaCriterion.java b/core/api/src/main/java/org/onosproject/net/flow/criteria/IndexedLambdaCriterion.java
new file mode 100644
index 0000000..824e00e
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/flow/criteria/IndexedLambdaCriterion.java
@@ -0,0 +1,80 @@
+/*
+ * 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.flow.criteria;
+
+import com.google.common.base.MoreObjects;
+import org.onosproject.net.IndexedLambda;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Implementation of indexed lambda criterion.
+ */
+public class IndexedLambdaCriterion implements Criterion {
+
+    private final IndexedLambda lambda;
+
+    /**
+     * Creates a criterion with the specified value.
+     *
+     * @param lambda lambda index number
+     */
+    IndexedLambdaCriterion(IndexedLambda lambda) {
+        this.lambda = checkNotNull(lambda);
+    }
+
+    @Override
+    public Type type() {
+        // TODO: consider defining a new specific type
+        // Now OCH_SIGID is used due to compatibility concerns
+        return Type.OCH_SIGID;
+    }
+
+    /**
+     * Returns the indexed lambda to match.
+     *
+     * @return the indexed lambda to match
+     */
+    public IndexedLambda lambda() {
+        return lambda;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(lambda);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof IndexedLambdaCriterion)) {
+            return false;
+        }
+        final IndexedLambdaCriterion that = (IndexedLambdaCriterion) obj;
+        return Objects.equals(this.lambda, that.lambda);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("lambda", lambda)
+                .toString();
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/net/flow/criteria/CriteriaTest.java b/core/api/src/test/java/org/onosproject/net/flow/criteria/CriteriaTest.java
index 724edc5..97badd3 100644
--- a/core/api/src/test/java/org/onosproject/net/flow/criteria/CriteriaTest.java
+++ b/core/api/src/test/java/org/onosproject/net/flow/criteria/CriteriaTest.java
@@ -220,6 +220,10 @@
     Criterion sameAsMatchLambda1 = Criteria.matchLambda(lambda1);
     Criterion matchLambda2 = Criteria.matchLambda(lambda2);
 
+    Criterion matchIndexedLambda1 = Criteria.matchLambda(Lambda.indexedLambda(1));
+    Criterion sameAsMatchIndexedLambda1 = Criteria.matchLambda(Lambda.indexedLambda(1));
+    Criterion matchIndexedLambda2 = Criteria.matchLambda(Lambda.indexedLambda(2));
+
     short signalLambda1 = 1;
     short signalLambda2 = 2;
     Criterion matchSignalLambda1 = Criteria.matchOpticalSignalType(signalLambda1);
@@ -1038,6 +1042,14 @@
     }
 
     @Test
+    public void testIndexedLambdaCriterionEquals() {
+        new EqualsTester()
+                .addEqualityGroup(matchIndexedLambda1, sameAsMatchIndexedLambda1)
+                .addEqualityGroup(matchIndexedLambda2)
+                .testEquals();
+    }
+
+    @Test
     public void testOchSignalCriterionEquals() {
         new EqualsTester()
                 .addEqualityGroup(matchOchSignal1, sameAsMatchOchSignal1)
diff --git a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
index 4f4748f..a4892c3 100644
--- a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
+++ b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
@@ -97,6 +97,7 @@
 import org.onosproject.net.flow.criteria.IcmpTypeCriterion;
 import org.onosproject.net.flow.criteria.Icmpv6CodeCriterion;
 import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion;
+import org.onosproject.net.flow.criteria.IndexedLambdaCriterion;
 import org.onosproject.net.flow.criteria.LambdaCriterion;
 import org.onosproject.net.flow.criteria.MetadataCriterion;
 import org.onosproject.net.flow.criteria.MplsCriterion;
@@ -291,6 +292,7 @@
                     MplsCriterion.class,
                     IPv6ExthdrFlagsCriterion.class,
                     LambdaCriterion.class,
+                    IndexedLambdaCriterion.class,
                     OchSignalCriterion.class,
                     OpticalSignalTypeCriterion.class,
                     Criterion.class,
