diff --git a/impl/src/main/java/org/onosproject/segmentrouting/policy/api/DropPolicyCodec.java b/impl/src/main/java/org/onosproject/segmentrouting/policy/api/DropPolicyCodec.java
new file mode 100644
index 0000000..407bd08
--- /dev/null
+++ b/impl/src/main/java/org/onosproject/segmentrouting/policy/api/DropPolicyCodec.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2021-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.segmentrouting.policy.api;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+
+/**
+ * Codec of DropPolicy class.
+ */
+public final class DropPolicyCodec extends JsonCodec<DropPolicy> {
+
+    // JSON field names
+    public static final String POLICY_ID = "policy_id";
+    public static final String POLICY_TYPE = "policy_type";
+
+    @Override
+    public ObjectNode encode(DropPolicy policy, CodecContext context) {
+        final ObjectNode result = context.mapper().createObjectNode()
+                .put(POLICY_ID, policy.policyId().toString())
+                .put(POLICY_TYPE, policy.policyType().toString());
+
+        return result;
+    }
+
+    @Override
+    public DropPolicy decode(ObjectNode json, CodecContext context) {
+        return new DropPolicy();
+    }
+}
diff --git a/impl/src/main/java/org/onosproject/segmentrouting/policy/api/RedirectPolicyCodec.java b/impl/src/main/java/org/onosproject/segmentrouting/policy/api/RedirectPolicyCodec.java
new file mode 100644
index 0000000..efb2828
--- /dev/null
+++ b/impl/src/main/java/org/onosproject/segmentrouting/policy/api/RedirectPolicyCodec.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2021-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.segmentrouting.policy.api;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.net.DeviceId;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import static org.onlab.util.Tools.nullIsIllegal;
+
+/**
+ * Codec of RedirectPolicy class.
+ */
+public final class RedirectPolicyCodec extends JsonCodec<RedirectPolicy> {
+
+    // JSON field names
+    public static final String POLICY_ID = "policy_id";
+    public static final String POLICY_TYPE = "policy_type";
+    public static final String SPINES_TO_ENFORCES = "spinesToEnforce";
+    public static final String DEVICE_ID = "deviceId";
+    public static final String MISSING_MEMBER_MESSAGE =
+            " member is required in Redirect Policy";
+
+    @Override
+    public ObjectNode encode(RedirectPolicy policy, CodecContext context) {
+        final ObjectNode result = context.mapper().createObjectNode()
+                .put(POLICY_ID, policy.policyId().toString())
+                .put(POLICY_TYPE, policy.policyType().toString());
+
+        ArrayNode deviceIdArr = result.putObject(SPINES_TO_ENFORCES).putArray(DEVICE_ID);
+        for (DeviceId deviceId : policy.spinesToEnforce()) {
+            deviceIdArr.add(deviceId.toString());
+        }
+
+        return result;
+    }
+
+    @Override
+    public RedirectPolicy decode(ObjectNode json, CodecContext context) {
+        List<DeviceId> spinesToEnforce = new LinkedList<>();
+
+        ObjectNode spinesNode = nullIsIllegal(get(json, SPINES_TO_ENFORCES),
+                SPINES_TO_ENFORCES + MISSING_MEMBER_MESSAGE);
+        ArrayNode deviceIdArr = nullIsIllegal((ArrayNode) spinesNode.get(DEVICE_ID),
+                DEVICE_ID + MISSING_MEMBER_MESSAGE);
+        deviceIdArr.forEach(deviceId -> spinesToEnforce.add(DeviceId.deviceId(deviceId.textValue())));
+
+        return new RedirectPolicy(Set.copyOf(spinesToEnforce));
+    }
+}
diff --git a/impl/src/main/java/org/onosproject/segmentrouting/policy/api/TrafficMatchCodec.java b/impl/src/main/java/org/onosproject/segmentrouting/policy/api/TrafficMatchCodec.java
new file mode 100644
index 0000000..1f4f8be
--- /dev/null
+++ b/impl/src/main/java/org/onosproject/segmentrouting/policy/api/TrafficMatchCodec.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2021-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.segmentrouting.policy.api;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.net.flow.TrafficSelector;
+
+import static org.onlab.util.Tools.nullIsIllegal;
+
+/**
+ * Codec of TrafficMatch class.
+ */
+public final class TrafficMatchCodec extends JsonCodec<TrafficMatch> {
+
+    // JSON field names
+    public static final String TRAFFIC_MATCH_ID = "traffic_match_id";
+    public static final String TRAFFIC_SELECTOR = "selector";
+    public static final String POLICY_ID = "policy_id";
+    public static final String MISSING_MEMBER_MESSAGE =
+            " member is required in Traffic Match";
+
+    @Override
+    public ObjectNode encode(TrafficMatch trafficMatch, CodecContext context) {
+        final JsonCodec<TrafficSelector> selectorCodec =
+                context.codec(TrafficSelector.class);
+
+        final ObjectNode selector = selectorCodec.encode(trafficMatch.trafficSelector(), context);
+        final ObjectNode result = context.mapper().createObjectNode()
+                .put(TRAFFIC_MATCH_ID, trafficMatch.trafficMatchId().toString())
+                .put(POLICY_ID, trafficMatch.policyId().toString())
+                .set(TRAFFIC_SELECTOR, selector);
+
+        return result;
+    }
+
+    @Override
+    public TrafficMatch decode(ObjectNode json, CodecContext context) {
+        final JsonCodec<TrafficSelector> selectorCodec =
+                context.codec(TrafficSelector.class);
+
+        ObjectNode selectorJson = nullIsIllegal(get(json, TRAFFIC_SELECTOR),
+                TRAFFIC_SELECTOR + MISSING_MEMBER_MESSAGE);
+        TrafficSelector trafficSelector = selectorCodec.decode(selectorJson, context);
+
+        PolicyId policyId = PolicyId.of(nullIsIllegal(json.get(POLICY_ID),
+                POLICY_ID + MISSING_MEMBER_MESSAGE).asText());
+
+        return new TrafficMatch(trafficSelector, policyId);
+    }
+}
diff --git a/impl/src/main/java/org/onosproject/segmentrouting/policy/impl/PolicyManager.java b/impl/src/main/java/org/onosproject/segmentrouting/policy/impl/PolicyManager.java
index 8f7c69c..87fa61a 100644
--- a/impl/src/main/java/org/onosproject/segmentrouting/policy/impl/PolicyManager.java
+++ b/impl/src/main/java/org/onosproject/segmentrouting/policy/impl/PolicyManager.java
@@ -26,6 +26,7 @@
 import org.onlab.util.PredictableExecutor;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
+import org.onosproject.codec.CodecService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.ConnectPoint;
@@ -48,6 +49,7 @@
 import org.onosproject.segmentrouting.SegmentRoutingService;
 import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException;
 import org.onosproject.segmentrouting.policy.api.DropPolicy;
+import org.onosproject.segmentrouting.policy.api.DropPolicyCodec;
 import org.onosproject.segmentrouting.policy.api.Policy;
 import org.onosproject.segmentrouting.policy.api.Policy.PolicyType;
 import org.onosproject.segmentrouting.policy.api.PolicyData;
@@ -55,7 +57,9 @@
 import org.onosproject.segmentrouting.policy.api.PolicyService;
 import org.onosproject.segmentrouting.policy.api.PolicyState;
 import org.onosproject.segmentrouting.policy.api.RedirectPolicy;
+import org.onosproject.segmentrouting.policy.api.RedirectPolicyCodec;
 import org.onosproject.segmentrouting.policy.api.TrafficMatch;
+import org.onosproject.segmentrouting.policy.api.TrafficMatchCodec;
 import org.onosproject.segmentrouting.policy.api.TrafficMatchData;
 import org.onosproject.segmentrouting.policy.api.TrafficMatchId;
 import org.onosproject.segmentrouting.policy.api.TrafficMatchState;
@@ -153,6 +157,9 @@
     private CoreService coreService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    private CodecService codecService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private StorageService storageService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
@@ -161,7 +168,7 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private WorkPartitionService workPartitionService;
 
-    @Reference(cardinality = ReferenceCardinality.OPTIONAL)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private SegmentRoutingService srService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
@@ -174,6 +181,10 @@
     public void activate() {
         appId = coreService.registerApplication(APP_NAME);
 
+        codecService.registerCodec(DropPolicy.class, new DropPolicyCodec());
+        codecService.registerCodec(RedirectPolicy.class, new RedirectPolicyCodec());
+        codecService.registerCodec(TrafficMatch.class, new TrafficMatchCodec());
+
         policies = storageService.<PolicyId, PolicyRequest>consistentMapBuilder()
                 .withName(POLICY_STORE)
                 .withSerializer(serializer).build();
@@ -203,6 +214,9 @@
     @Deactivate
     public void deactivate() {
         // Teardown everything
+        codecService.unregisterCodec(DropPolicy.class);
+        codecService.unregisterCodec(RedirectPolicy.class);
+        codecService.unregisterCodec(TrafficMatch.class);
         policies.removeListener(mapPolListener);
         policies.destroy();
         policiesMap.clear();
diff --git a/impl/src/test/java/org/onosproject/segmentrouting/policy/api/DropPolicyCodecTest.java b/impl/src/test/java/org/onosproject/segmentrouting/policy/api/DropPolicyCodecTest.java
new file mode 100644
index 0000000..5d95625
--- /dev/null
+++ b/impl/src/test/java/org/onosproject/segmentrouting/policy/api/DropPolicyCodecTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2021-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.segmentrouting.policy.api;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import junit.framework.TestCase;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.codec.impl.MockCodecContext;
+
+import java.io.InputStream;
+
+public class DropPolicyCodecTest extends TestCase {
+    private DropPolicy dropPolicy;
+
+    private CodecContext context;
+    private JsonCodec<DropPolicy> codec;
+
+    @Before
+    public void setUp() throws Exception {
+        context = new MockCodecContext();
+        codec = new DropPolicyCodec();
+
+        dropPolicy = new DropPolicy();
+    }
+
+    @Test
+    public void testEncode() throws Exception {
+        ObjectMapper mapper = new ObjectMapper();
+
+        InputStream jsonStream1 = RedirectPolicyCodecTest.class.getResourceAsStream("/droppolicy.json");
+        JsonNode expected = mapper.readTree(jsonStream1);
+
+        JsonNode actual = codec.encode(dropPolicy, context);
+
+        assertEquals(expected.get(RedirectPolicyCodec.POLICY_ID), actual.get(RedirectPolicyCodec.POLICY_ID));
+        assertEquals(expected.get(RedirectPolicyCodec.POLICY_TYPE), actual.get(RedirectPolicyCodec.POLICY_TYPE));
+    }
+
+    @Test
+    public void testDecode() throws Exception  {
+        ObjectMapper mapper = new ObjectMapper();
+
+        InputStream jsonStream1 = RedirectPolicyCodecTest.class.getResourceAsStream("/droppolicy.json");
+        ObjectNode json = mapper.readTree(jsonStream1).deepCopy();
+
+        DropPolicy actual = codec.decode(json, context);
+
+        assertEquals(dropPolicy, actual);
+    }
+}
\ No newline at end of file
diff --git a/impl/src/test/java/org/onosproject/segmentrouting/policy/api/RedirectPolicyCodecTest.java b/impl/src/test/java/org/onosproject/segmentrouting/policy/api/RedirectPolicyCodecTest.java
new file mode 100644
index 0000000..7541436
--- /dev/null
+++ b/impl/src/test/java/org/onosproject/segmentrouting/policy/api/RedirectPolicyCodecTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2021-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.segmentrouting.policy.api;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import junit.framework.TestCase;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.codec.impl.MockCodecContext;
+import org.onosproject.net.DeviceId;
+
+import java.io.InputStream;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+public class RedirectPolicyCodecTest extends TestCase {
+    private RedirectPolicy redirectPolicy;
+
+    private CodecContext context;
+    private JsonCodec<RedirectPolicy> codec;
+
+    @Before
+    public void setUp() throws Exception {
+        context = new MockCodecContext();
+        codec = new RedirectPolicyCodec();
+
+        List<DeviceId> deviceIds = new LinkedList<>();
+        deviceIds.add(DeviceId.deviceId("of:0000000000000001"));
+        deviceIds.add(DeviceId.deviceId("of:0000000000000002"));
+        deviceIds.add(DeviceId.deviceId("of:0000000000000003"));
+        redirectPolicy = new RedirectPolicy(Set.copyOf(deviceIds));
+    }
+
+    @Test
+    public void testEncode() throws Exception {
+        ObjectMapper mapper = new ObjectMapper();
+
+        InputStream jsonStream1 = RedirectPolicyCodecTest.class.getResourceAsStream("/redirectpolicy.json");
+        JsonNode expected = mapper.readTree(jsonStream1);
+
+        JsonNode actual = codec.encode(redirectPolicy, context);
+
+        assertEquals(expected.get(RedirectPolicyCodec.POLICY_ID), actual.get(RedirectPolicyCodec.POLICY_ID));
+        assertEquals(expected.get(RedirectPolicyCodec.POLICY_TYPE), actual.get(RedirectPolicyCodec.POLICY_TYPE));
+        assertEquals(expected.get(RedirectPolicyCodec.DEVICE_ID), actual.get(RedirectPolicyCodec.DEVICE_ID));
+    }
+
+    @Test
+    public void testDecode() throws Exception {
+        ObjectMapper mapper = new ObjectMapper();
+
+        InputStream jsonStream1 = RedirectPolicyCodecTest.class.getResourceAsStream("/redirectpolicy.json");
+        ObjectNode json = mapper.readTree(jsonStream1).deepCopy();
+
+        RedirectPolicy actual = codec.decode(json, context);
+
+        assertEquals(redirectPolicy, actual);
+    }
+}
\ No newline at end of file
diff --git a/impl/src/test/java/org/onosproject/segmentrouting/policy/api/TrafficMatchCodecTest.java b/impl/src/test/java/org/onosproject/segmentrouting/policy/api/TrafficMatchCodecTest.java
new file mode 100644
index 0000000..c70eb7c
--- /dev/null
+++ b/impl/src/test/java/org/onosproject/segmentrouting/policy/api/TrafficMatchCodecTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2021-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.segmentrouting.policy.api;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import junit.framework.TestCase;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.TpPort;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.codec.impl.MockCodecContext;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.TrafficSelector;
+
+import java.io.InputStream;
+
+public class TrafficMatchCodecTest extends TestCase {
+    private TrafficMatch trafficMatch;
+    private TrafficSelector trafficSelector;
+    private PolicyId policyId;
+
+    private CodecContext context;
+    private JsonCodec<TrafficMatch> codec;
+
+    @Before
+    public void setUp() throws Exception {
+        context = new MockCodecContext();
+        codec = new TrafficMatchCodec();
+
+        trafficSelector = DefaultTrafficSelector.builder()
+                .matchIPProtocol((byte) 0x06)
+                .matchIPSrc(Ip4Address.valueOf("10.0.0.1").toIpPrefix())
+                .matchIPDst(Ip4Address.valueOf("10.0.0.2").toIpPrefix())
+                .matchTcpSrc(TpPort.tpPort(80))
+                .matchTcpDst(TpPort.tpPort(81))
+                .build();
+        policyId = PolicyId.of("DROP");
+
+        trafficMatch = new TrafficMatch(trafficSelector, policyId);
+    }
+
+    @Test
+    public void testEncode() throws Exception {
+        ObjectMapper mapper = new ObjectMapper();
+
+        InputStream jsonStream1 = RedirectPolicyCodecTest.class.getResourceAsStream("/trafficmatch.json");
+        JsonNode expected = mapper.readTree(jsonStream1);
+
+        JsonNode actual = codec.encode(trafficMatch, context);
+
+        assertEquals(expected.get(TrafficMatchCodec.TRAFFIC_MATCH_ID), actual.get(TrafficMatchCodec.TRAFFIC_MATCH_ID));
+        assertEquals(expected.get(TrafficMatchCodec.POLICY_ID), actual.get(TrafficMatchCodec.POLICY_ID));
+        for (int i = 0; i < trafficMatch.trafficSelector().criteria().size(); i++) {
+            assertEquals(expected.get(TrafficMatchCodec.TRAFFIC_SELECTOR).get(i),
+                    actual.get(TrafficMatchCodec.TRAFFIC_SELECTOR).get(i));
+        }
+    }
+
+    @Test
+    public void testDecode() throws Exception {
+        ObjectMapper mapper = new ObjectMapper();
+
+        InputStream jsonStream1 = RedirectPolicyCodecTest.class.getResourceAsStream("/trafficmatch.json");
+        ObjectNode json = mapper.readTree(jsonStream1).deepCopy();
+
+        TrafficMatch actual = codec.decode(json, context);
+
+        assertEquals(trafficMatch, actual);
+    }
+}
\ No newline at end of file
diff --git a/impl/src/test/resources/droppolicy.json b/impl/src/test/resources/droppolicy.json
new file mode 100644
index 0000000..9a0e0ee
--- /dev/null
+++ b/impl/src/test/resources/droppolicy.json
@@ -0,0 +1,4 @@
+{
+  "policy_id": "DROP",
+  "policy_type": "DROP"
+}
\ No newline at end of file
diff --git a/impl/src/test/resources/redirectpolicy.json b/impl/src/test/resources/redirectpolicy.json
new file mode 100644
index 0000000..928788d
--- /dev/null
+++ b/impl/src/test/resources/redirectpolicy.json
@@ -0,0 +1,11 @@
+{
+  "policy_id": "REDIRECT[of:0000000000000001, of:0000000000000002, of:0000000000000003]",
+  "policy_type": "REDIRECT",
+  "spinesToEnforce": {
+    "deviceId": [
+      "of:0000000000000001",
+      "of:0000000000000002",
+      "of:0000000000000003"
+    ]
+  }
+}
\ No newline at end of file
diff --git a/impl/src/test/resources/trafficmatch.json b/impl/src/test/resources/trafficmatch.json
new file mode 100644
index 0000000..aea9585
--- /dev/null
+++ b/impl/src/test/resources/trafficmatch.json
@@ -0,0 +1,28 @@
+{
+  "traffic_match_id": "-1756753738",
+  "policy_id": "DROP",
+  "selector": {
+    "criteria": [
+      {
+        "type": "IP_PROTO",
+        "protocol": 6
+      },
+      {
+        "type": "IPV4_SRC",
+        "ip": "10.0.0.1/32"
+      },
+      {
+        "type": "IPV4_DST",
+        "ip": "10.0.0.2/32"
+      },
+      {
+        "type": "TCP_SRC",
+        "tcpPort": 80
+      },
+      {
+        "type": "TCP_DST",
+        "tcpPort": 81
+      }
+    ]
+  }
+}
\ No newline at end of file
