diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
index 013ac89..7fdd08e 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
@@ -19,15 +19,13 @@
 import org.apache.karaf.shell.api.action.Command;
 import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.TpPort;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstackvtap.api.OpenstackVtap;
 import org.onosproject.openstackvtap.api.OpenstackVtapAdminService;
-import org.onosproject.openstackvtap.impl.DefaultOpenstackVtapCriterion;
+import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
 
-import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getProtocolTypeFromString;
 import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getVtapTypeFromString;
+import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.makeVtapCriterion;
 
 /**
  * Adds a openstack vtap rule.
@@ -76,38 +74,19 @@
 
     @Override
     protected void doExecute() {
-        DefaultOpenstackVtapCriterion.Builder vtapCriterionBuilder = DefaultOpenstackVtapCriterion.builder();
-        if (makeCriterion(vtapCriterionBuilder)) {
-            OpenstackVtap.Type type = getVtapTypeFromString(vtapTypeStr);
-
-            if (type == null) {
-                print("Invalid vtap type");
-                return;
-            }
-
-            OpenstackVtap vtap = vtapService.createVtap(type, vtapCriterionBuilder.build());
-            if (vtap != null) {
-                print("Created OpenstackVtap with id { %s }", vtap.id().toString());
-            } else {
-                print("Failed to create OpenstackVtap");
-            }
-        }
-    }
-
-    private boolean makeCriterion(DefaultOpenstackVtapCriterion.Builder vtapCriterionBuilder) {
-        try {
-            vtapCriterionBuilder.srcIpPrefix(IpPrefix.valueOf(srcIp));
-            vtapCriterionBuilder.dstIpPrefix(IpPrefix.valueOf(dstIp));
-        } catch (Exception e) {
-            print("Inputted valid source IP & destination IP in CIDR (e.g., \"10.1.0.4/32\")");
-            return false;
+        OpenstackVtapCriterion criterion =
+                makeVtapCriterion(srcIp, dstIp, ipProto, srcTpPort, dstTpPort);
+        OpenstackVtap.Type type = getVtapTypeFromString(vtapTypeStr);
+        if (type == null) {
+            print("Invalid vtap type");
+            return;
         }
 
-        vtapCriterionBuilder.ipProtocol(getProtocolTypeFromString(ipProto.toLowerCase()));
-
-        vtapCriterionBuilder.srcTpPort(TpPort.tpPort(srcTpPort));
-        vtapCriterionBuilder.dstTpPort(TpPort.tpPort(dstTpPort));
-
-        return true;
+        OpenstackVtap vtap = vtapService.createVtap(type, criterion);
+        if (vtap != null) {
+            print("Created OpenstackVtap with id { %s }", vtap.id().toString());
+        } else {
+            print("Failed to create OpenstackVtap");
+        }
     }
 }
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/codec/OpenstackVtapCriterionCodec.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/codec/OpenstackVtapCriterionCodec.java
new file mode 100644
index 0000000..608362b
--- /dev/null
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/codec/OpenstackVtapCriterionCodec.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * 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.openstackvtap.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.TpPort;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
+import org.onosproject.openstackvtap.impl.DefaultOpenstackVtapCriterion;
+
+import static org.onlab.util.Tools.nullIsIllegal;
+import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getProtocolStringFromType;
+import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getProtocolTypeFromString;
+
+/**
+ * Openstack vTap codec used for serializing and de-serializing JSON string.
+ */
+public final class OpenstackVtapCriterionCodec extends JsonCodec<OpenstackVtapCriterion> {
+
+    private static final String SRC_IP = "srcIp";
+    private static final String DST_IP = "dstIp";
+    private static final String IP_PROTOCOL = "ipProto";
+    private static final String SRC_PORT = "srcPort";
+    private static final String DST_PORT = "dstPort";
+
+    private static final String MISSING_MESSAGE = " is required in OpenstackVtapCriterion";
+
+    @Override
+    public ObjectNode encode(OpenstackVtapCriterion entity, CodecContext context) {
+        String protoStr = getProtocolStringFromType(entity.ipProtocol());
+
+        return context.mapper().createObjectNode()
+                .put(SRC_IP, entity.srcIpPrefix().address().toString())
+                .put(DST_IP, entity.dstIpPrefix().address().toString())
+                .put(IP_PROTOCOL, protoStr)
+                .put(SRC_PORT, entity.srcTpPort().toString())
+                .put(DST_PORT, entity.dstTpPort().toString());
+    }
+
+    @Override
+    public OpenstackVtapCriterion decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        OpenstackVtapCriterion.Builder cBuilder = DefaultOpenstackVtapCriterion.builder();
+
+        // parse source IP address
+        IpPrefix srcIp = IpPrefix.valueOf(IpAddress.valueOf(nullIsIllegal(
+                json.get(SRC_IP).asText(), SRC_IP + MISSING_MESSAGE)), 32);
+        // parse destination IP address
+        IpPrefix dstIp = IpPrefix.valueOf(IpAddress.valueOf(nullIsIllegal(
+                json.get(DST_IP).asText(), DST_IP + MISSING_MESSAGE)), 32);
+
+        cBuilder.srcIpPrefix(srcIp);
+        cBuilder.dstIpPrefix(dstIp);
+
+        // parse IP protocol
+        String ipProtoStr = json.get(IP_PROTOCOL).asText();
+        if (ipProtoStr != null) {
+            cBuilder.ipProtocol(getProtocolTypeFromString(ipProtoStr));
+        }
+
+        // parse source port number
+        int srcPort = json.get(SRC_PORT).asInt(0);
+
+        // parse destination port number
+        int dstPort = json.get(DST_PORT).asInt(0);
+
+        cBuilder.srcTpPort(TpPort.tpPort(srcPort));
+        cBuilder.dstTpPort(TpPort.tpPort(dstPort));
+
+        return cBuilder.build();
+    }
+}
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/util/OpenstackVtapUtil.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/util/OpenstackVtapUtil.java
index 7950bee..6907d4b 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/util/OpenstackVtapUtil.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/util/OpenstackVtapUtil.java
@@ -18,6 +18,7 @@
 import org.onlab.packet.IPv4;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
+import org.onlab.packet.TpPort;
 import org.onosproject.net.Host;
 import org.onosproject.net.behaviour.TunnelDescription;
 import org.onosproject.net.group.DefaultGroupKey;
@@ -25,7 +26,9 @@
 import org.onosproject.openstackvtap.api.OpenstackVtap;
 import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
 import org.onosproject.openstackvtap.api.OpenstackVtapNetwork;
+import org.onosproject.openstackvtap.impl.DefaultOpenstackVtapCriterion;
 import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.ByteArrayOutputStream;
 import java.nio.charset.StandardCharsets;
@@ -38,6 +41,8 @@
  */
 public final class OpenstackVtapUtil {
 
+    private static final Logger log = LoggerFactory.getLogger(OpenstackVtapUtil.class);
+
     private static final String VTAP_TUNNEL_GRE = "vtap_gre";
     private static final String VTAP_TUNNEL_VXLAN = "vtap_vxlan";
     private static final String VTAP_GROUP_KEY = "VTAP_GROUP_KEY";
@@ -70,6 +75,27 @@
     }
 
     /**
+     * Obtains IP protocol string from the given type.
+     *
+     * @param type protocol type
+     * @return IP protocol string
+     */
+    public static String getProtocolStringFromType(byte type) {
+        switch (type) {
+            case IPv4.PROTOCOL_TCP:
+                return "tcp";
+            case IPv4.PROTOCOL_UDP:
+                return "udp";
+            case IPv4.PROTOCOL_ICMP:
+                return "icmp";
+            case 0:
+                return "any";
+            default:
+                throw new IllegalArgumentException("Invalid vtap protocol type");
+        }
+    }
+
+    /**
      * Obtains openstack vtap type from the given string.
      *
      * @param str vtap type string
@@ -179,6 +205,38 @@
     }
 
     /**
+     * Makes Openstack vTap criterion from the given src, dst IP and port.
+     *
+     * @param srcIp     source IP address
+     * @param dstIp     destination IP address
+     * @param ipProto   IP protocol
+     * @param srcPort   source port
+     * @param dstPort   destination port
+     * @return openstack vTap criterion
+     */
+    public static OpenstackVtapCriterion makeVtapCriterion(String srcIp,
+                                                           String dstIp,
+                                                           String ipProto,
+                                                           int srcPort,
+                                                           int dstPort) {
+        OpenstackVtapCriterion.Builder cBuilder = DefaultOpenstackVtapCriterion.builder();
+
+        try {
+            cBuilder.srcIpPrefix(IpPrefix.valueOf(srcIp));
+            cBuilder.dstIpPrefix(IpPrefix.valueOf(dstIp));
+        } catch (Exception e) {
+            log.error("The given IP addresses are invalid");
+         }
+
+        cBuilder.ipProtocol(getProtocolTypeFromString(ipProto.toLowerCase()));
+
+        cBuilder.srcTpPort(TpPort.tpPort(srcPort));
+        cBuilder.dstTpPort(TpPort.tpPort(dstPort));
+
+        return cBuilder.build();
+    }
+
+    /**
      * Print stack trace of given exception.
      *
      * @param log logger for using print
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapNetworkCodecRegister.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapNetworkCodecRegister.java
index 509a286..a318320 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapNetworkCodecRegister.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapNetworkCodecRegister.java
@@ -19,7 +19,9 @@
 
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.codec.CodecService;
+import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
 import org.onosproject.openstackvtap.api.OpenstackVtapNetwork;
+import org.onosproject.openstackvtap.codec.OpenstackVtapCriterionCodec;
 import org.onosproject.openstackvtap.codec.OpenstackVtapNetworkCodec;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -44,6 +46,7 @@
     @Activate
     protected void activate() {
         codecService.registerCodec(OpenstackVtapNetwork.class, new OpenstackVtapNetworkCodec());
+        codecService.registerCodec(OpenstackVtapCriterion.class, new OpenstackVtapCriterionCodec());
 
         log.info("Started");
     }
@@ -51,6 +54,7 @@
     @Deactivate
     protected void deactivate() {
         codecService.unregisterCodec(OpenstackVtapNetwork.class);
+        codecService.unregisterCodec(OpenstackVtapCriterion.class);
 
         log.info("Stopped");
     }
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapWebResource.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapWebResource.java
index f4c3084..5021887 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapWebResource.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapWebResource.java
@@ -15,14 +15,38 @@
  */
 package org.onosproject.openstackvtap.web;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Sets;
+import org.onosproject.openstackvtap.api.OpenstackVtap;
+import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
+import org.onosproject.openstackvtap.api.OpenstackVtapId;
+import org.onosproject.openstackvtap.api.OpenstackVtapService;
 import org.onosproject.rest.AbstractWebResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
+import javax.ws.rs.POST;
 import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriBuilder;
+import javax.ws.rs.core.UriInfo;
+import java.io.InputStream;
+import java.util.Set;
+
+import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
+import static javax.ws.rs.core.Response.created;
+import static javax.ws.rs.core.Response.noContent;
+import static org.onlab.util.Tools.readTreeFromStream;
+import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getVtapTypeFromString;
 
 /**
  * Handles REST API call of openstack vtap.
@@ -30,16 +54,119 @@
 @Path("vtap")
 public class OpenstackVtapWebResource extends AbstractWebResource {
 
-    private final ObjectNode root = mapper().createObjectNode();
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private static final String MESSAGE_VTAP = "Received vtap %s request";
+    private static final String CREATE = "CREATE";
+    private static final String QUERY = "QUERY";
+    private static final String DELETE = "DELETE";
+
+    private static final String VTAP = "vtap";
+    private static final String CRITERION = "criterion";
+    private static final String TYPE = "type";
+    private static final String ID = "id";
+
+    private final ObjectNode  root = mapper().createObjectNode();
+    private final ArrayNode jsonVtaps = root.putArray("vtaps");
+
+    private final OpenstackVtapService vtapService = get(OpenstackVtapService.class);
+
+    @Context
+    private UriInfo uriInfo;
 
     /**
-     * OpenstackVtapServiceImpl method.
+     * Creates an openstack vTap from the JSON input stream.
      *
-     * @return 200 OK
+     * @param input openstack vtap JSON input stream
+     * @return 201 CREATED if the JSON is correct, 400 BAD_REQUEST if the JSON
+     * is invalid or duplicated vtap already exists
+     *
+     * @onos.rsModel OpenstackVtap
+     */
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response createVtap(InputStream input) {
+        log.trace(String.format(MESSAGE_VTAP, CREATE));
+
+        OpenstackVtap vtap = readAndCreateVtap(input);
+
+        UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
+                .path(VTAP)
+                .path(vtap.id().toString());
+
+        return created(locationBuilder.build()).build();
+    }
+
+    /**
+     * Removes an openstack vTap with the given vTap UUID.
+     *
+     * @param id openstack vtap UUID
+     * @return 204 NO_CONTENT, 400 BAD_REQUEST if the JSON is malformed
+     */
+    @DELETE
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("{id}")
+    public Response deleteVtap(@PathParam(ID) String id) {
+        log.trace(String.format(MESSAGE_VTAP, DELETE + id));
+
+        vtapService.removeVtap(OpenstackVtapId.vtapId(id));
+        return noContent().build();
+    }
+
+    /**
+     * Gets openstack vtap entities.
+     *
+     * @return 200 OK with openstack vtap entities
+     *         404 NOT_FOUND if openstack vtap does not exist
      */
     @GET
     @Produces(MediaType.APPLICATION_JSON)
-    public Response dummy() {
+    public Response getVtaps() {
+        log.trace(String.format(MESSAGE_VTAP, QUERY));
+
+        Set<OpenstackVtap> allVtaps = vtapService.getVtaps(OpenstackVtap.Type.VTAP_ALL);
+        Set<OpenstackVtap> txVtaps = vtapService.getVtaps(OpenstackVtap.Type.VTAP_TX);
+        Set<OpenstackVtap> rxVtaps = vtapService.getVtaps(OpenstackVtap.Type.VTAP_RX);
+        Set<OpenstackVtap> anyVtaps = vtapService.getVtaps(OpenstackVtap.Type.VTAP_ANY);
+
+        Set<OpenstackVtap> vTaps = Sets.newConcurrentHashSet();
+        vTaps.addAll(allVtaps);
+        vTaps.addAll(txVtaps);
+        vTaps.addAll(rxVtaps);
+        vTaps.addAll(anyVtaps);
+
+        for (OpenstackVtap vtap : vTaps) {
+            ObjectNode json = mapper().createObjectNode();
+            json.set(CRITERION, codec(OpenstackVtapCriterion.class)
+                    .encode(vtap.vtapCriterion(), this));
+            json.put(TYPE, vtap.type().name());
+            json.put(ID, vtap.id().toString());
+
+            jsonVtaps.add(json);
+        }
+
         return ok(root).build();
     }
+
+    private OpenstackVtap readAndCreateVtap(InputStream input) {
+        OpenstackVtap.Type type = OpenstackVtap.Type.VTAP_ALL;
+        OpenstackVtapCriterion criterion;
+        try {
+            JsonNode jsonTree = readTreeFromStream(mapper().enable(INDENT_OUTPUT), input);
+            String typeStr = jsonTree.path(TYPE).asText();
+
+            if (typeStr != null) {
+                type = getVtapTypeFromString(typeStr);
+            }
+
+            ObjectNode jsonCriterion = jsonTree.path(CRITERION).deepCopy();
+            criterion = codec(OpenstackVtapCriterion.class).decode(jsonCriterion, this);
+        } catch (Exception e) {
+            throw new IllegalArgumentException(e);
+        }
+
+        return vtapService.createVtap(type, criterion);
+    }
 }
diff --git a/apps/openstackvtap/app/src/main/resources/definitions/OpenstackVtap.json b/apps/openstackvtap/app/src/main/resources/definitions/OpenstackVtap.json
new file mode 100644
index 0000000..4cd7c9e
--- /dev/null
+++ b/apps/openstackvtap/app/src/main/resources/definitions/OpenstackVtap.json
@@ -0,0 +1,45 @@
+{
+  "type": "object",
+  "required": [
+    "type",
+    "criterion"
+  ],
+  "properties": {
+    "type": {
+      "type": "string",
+      "example": "all"
+    },
+    "criterion": {
+      "type": "object",
+      "required": [
+        "srcIp",
+        "dstIp",
+        "ipProto",
+        "srcPort",
+        "dstPort"
+      ],
+      "properties": {
+        "srcIp": {
+          "type": "string",
+          "example": "10.20.1.1"
+        },
+        "dstIp": {
+          "type": "String",
+          "example": "10.20.1.2"
+        },
+        "ipProto": {
+          "type": "string",
+          "example": "tcp"
+        },
+        "srcPort": {
+          "type": "integer",
+          "example": 8080
+        },
+        "dstPort": {
+          "type": "integer",
+          "example": 9090
+        }
+      }
+    }
+  }
+}
diff --git a/apps/openstackvtap/app/src/test/java/org/onosproject/openstackvtap/codec/OpenstackVtapCriterionCodecTest.java b/apps/openstackvtap/app/src/test/java/org/onosproject/openstackvtap/codec/OpenstackVtapCriterionCodecTest.java
new file mode 100644
index 0000000..c647a73
--- /dev/null
+++ b/apps/openstackvtap/app/src/test/java/org/onosproject/openstackvtap/codec/OpenstackVtapCriterionCodecTest.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * 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.openstackvtap.codec;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.hamcrest.MatcherAssert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.TpPort;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.codec.impl.CodecManager;
+import org.onosproject.core.CoreService;
+import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
+import org.onosproject.openstackvtap.impl.DefaultOpenstackVtapCriterion;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.onosproject.net.NetTestTools.APP_ID;
+import static org.onosproject.openstackvtap.codec.OpenstackVtapCriterionJsonMatcher.matchVtapCriterion;
+import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getProtocolStringFromType;
+import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getProtocolTypeFromString;
+
+/**
+ * Unit tests for OpenstackVtapCriterion codec.
+ */
+public class OpenstackVtapCriterionCodecTest {
+
+    MockCodecContext context;
+    JsonCodec<OpenstackVtapCriterion> vtapCriterionCodec;
+
+    final CoreService mockCoreService = createMock(CoreService.class);
+    private static final String REST_APP_ID = "org.onosproject.rest";
+
+    @Before
+    public void setUp() {
+        context = new MockCodecContext();
+        vtapCriterionCodec = new OpenstackVtapCriterionCodec();
+
+        assertThat(vtapCriterionCodec, notNullValue());
+
+        expect(mockCoreService.registerApplication(REST_APP_ID))
+                .andReturn(APP_ID).anyTimes();
+        replay(mockCoreService);
+        context.registerService(CoreService.class, mockCoreService);
+    }
+
+    /**
+     * Tests the openstack vtap criterion encoding.
+     */
+    @Test
+    public void testOpenstackVtapCriterionEncode() {
+        OpenstackVtapCriterion criterion = DefaultOpenstackVtapCriterion.builder()
+                .srcIpPrefix(IpPrefix.valueOf(IpAddress.valueOf("10.10.10.10"), 32))
+                .dstIpPrefix(IpPrefix.valueOf(IpAddress.valueOf("20.20.20.20"), 32))
+                .ipProtocol(getProtocolTypeFromString("tcp"))
+                .srcTpPort(TpPort.tpPort(8080))
+                .dstTpPort(TpPort.tpPort(9090))
+                .build();
+
+        ObjectNode criterionJson = vtapCriterionCodec.encode(criterion, context);
+        assertThat(criterionJson, matchVtapCriterion(criterion));
+    }
+
+    /**
+     * Tests the openstack vtap criterion decoding.
+     */
+    @Test
+    public void testOpenstackVtapCriterionDecode() throws IOException {
+        OpenstackVtapCriterion criterion = getVtapCriterion("OpenstackVtapCriterion.json");
+
+        assertThat(criterion.srcIpPrefix().address().toString(), is("10.10.10.10"));
+        assertThat(criterion.dstIpPrefix().address().toString(), is("20.20.20.20"));
+        assertThat(getProtocolStringFromType(criterion.ipProtocol()), is("tcp"));
+        assertThat(criterion.srcTpPort().toInt(), is(8080));
+        assertThat(criterion.dstTpPort().toInt(), is(9090));
+    }
+
+    /**
+     * Reads in an openstack vtap criterion from the given resource and decodes it.
+     *
+     * @param resourceName resource to use to read the JSON for the rule
+     * @return decoded openstack vtap criterion
+     * @throws IOException if processing the resource fails
+     */
+    private OpenstackVtapCriterion getVtapCriterion(String resourceName) throws IOException {
+        InputStream jsonStream = OpenstackVtapCriterionCodecTest.class.getResourceAsStream(resourceName);
+        JsonNode json = context.mapper().readTree(jsonStream);
+        MatcherAssert.assertThat(json, notNullValue());
+        OpenstackVtapCriterion criterion = vtapCriterionCodec.decode((ObjectNode) json, context);
+        assertThat(criterion, notNullValue());
+        return criterion;
+    }
+
+    /**
+     * Mock codec context for use in codec unit tests.
+     */
+    private class MockCodecContext implements CodecContext {
+        private final ObjectMapper mapper = new ObjectMapper();
+        private final CodecManager manager = new CodecManager();
+        private final Map<Class<?>, Object> services = new HashMap<>();
+
+        /**
+         * Constructs a new mock codec context.
+         */
+        public MockCodecContext() {
+            manager.activate();
+        }
+
+        @Override
+        public ObjectMapper mapper() {
+            return mapper;
+        }
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public <T> JsonCodec<T> codec(Class<T> entityClass) {
+            if (entityClass == OpenstackVtapCriterion.class) {
+                return (JsonCodec<T>) vtapCriterionCodec;
+            }
+            return manager.getCodec(entityClass);
+        }
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public <T> T getService(Class<T> serviceClass) {
+            return (T) services.get(serviceClass);
+        }
+
+        // for registering mock services
+        public <T> void registerService(Class<T> serviceClass, T impl) {
+            services.put(serviceClass, impl);
+        }
+    }
+}
diff --git a/apps/openstackvtap/app/src/test/java/org/onosproject/openstackvtap/codec/OpenstackVtapCriterionJsonMatcher.java b/apps/openstackvtap/app/src/test/java/org/onosproject/openstackvtap/codec/OpenstackVtapCriterionJsonMatcher.java
new file mode 100644
index 0000000..5c65263
--- /dev/null
+++ b/apps/openstackvtap/app/src/test/java/org/onosproject/openstackvtap/codec/OpenstackVtapCriterionJsonMatcher.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * 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.openstackvtap.codec;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeDiagnosingMatcher;
+import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
+
+import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getProtocolStringFromType;
+
+/**
+ * Hamcrest matcher for openstack vtap criterion config.
+ */
+public final class OpenstackVtapCriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
+
+    private final OpenstackVtapCriterion criterion;
+
+    private static final String SRC_IP = "srcIp";
+    private static final String DST_IP = "dstIp";
+    private static final String IP_PROTOCOL = "ipProto";
+    private static final String SRC_PORT = "srcPort";
+    private static final String DST_PORT = "dstPort";
+
+    private OpenstackVtapCriterionJsonMatcher(OpenstackVtapCriterion criterion) {
+        this.criterion = criterion;
+    }
+
+    @Override
+    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
+
+        // check source IP address
+        JsonNode jsonSrcIp = jsonNode.get(SRC_IP);
+        String srcIp = criterion.srcIpPrefix().address().toString();
+        if (!jsonSrcIp.asText().equals(srcIp)) {
+            description.appendText("Source IP address was " + jsonSrcIp);
+            return false;
+        }
+
+        // check destination IP address
+        JsonNode jsonDstIp = jsonNode.get(DST_IP);
+        String dstIp = criterion.dstIpPrefix().address().toString();
+        if (!jsonDstIp.asText().equals(dstIp)) {
+            description.appendText("Destination IP address was " + jsonDstIp);
+            return false;
+        }
+
+        // check IP protocol
+        JsonNode jsonIpProto = jsonNode.get(IP_PROTOCOL);
+        if (jsonIpProto != null) {
+            String ipProto = getProtocolStringFromType(criterion.ipProtocol());
+            if (!jsonIpProto.asText().equals(ipProto)) {
+                description.appendText("IP protocol was " + jsonIpProto);
+                return false;
+            }
+        }
+
+        // check source port number
+        JsonNode jsonSrcPort = jsonNode.get(SRC_PORT);
+        if (jsonSrcPort != null) {
+            int srcPort = criterion.srcTpPort().toInt();
+            if (jsonSrcPort.asInt() != srcPort) {
+                description.appendText("Source port number was " + jsonSrcPort);
+                return false;
+            }
+        }
+
+        // check destination port number
+        JsonNode jsonDstPort = jsonNode.get(DST_PORT);
+        if (jsonDstPort != null) {
+            int dstPort = criterion.dstTpPort().toInt();
+            if (jsonDstPort.asInt() != dstPort) {
+                description.appendText("Destination port number was " + jsonDstPort);
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    public void describeTo(Description description) {
+        description.appendText(criterion.toString());
+    }
+
+    /**
+     * Factory to allocate openstack vtap criterion matcher.
+     *
+     * @param criterion vtap criterion object we are looking for
+     * @return matcher
+     */
+    public static OpenstackVtapCriterionJsonMatcher matchVtapCriterion(OpenstackVtapCriterion criterion) {
+        return new OpenstackVtapCriterionJsonMatcher(criterion);
+    }
+}
diff --git a/apps/openstackvtap/app/src/test/resources/org/onosproject/openstackvtap/codec/OpenstackVtapCriterion.json b/apps/openstackvtap/app/src/test/resources/org/onosproject/openstackvtap/codec/OpenstackVtapCriterion.json
new file mode 100644
index 0000000..3a5452b
--- /dev/null
+++ b/apps/openstackvtap/app/src/test/resources/org/onosproject/openstackvtap/codec/OpenstackVtapCriterion.json
@@ -0,0 +1,7 @@
+{
+  "srcIp": "10.10.10.10",
+  "dstIp": "20.20.20.20",
+  "ipProto": "tcp",
+  "srcPort": 8080,
+  "dstPort": 9090
+}
\ No newline at end of file
