diff --git a/core/common/src/main/java/org/onosproject/codec/impl/AnnotatedCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/AnnotatedCodec.java
index 7e145b4..8c71462 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/AnnotatedCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/AnnotatedCodec.java
@@ -55,7 +55,7 @@
 
         JsonCodec<Annotations> codec = context.codec(Annotations.class);
         if (objNode.has("annotations") && objNode.isObject()) {
-            return codec.decode((ObjectNode) objNode.get("annotations"), context);
+            return codec.decode(get(objNode, "annotations"), context);
         } else {
             return DefaultAnnotations.EMPTY;
         }
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/ConnectivityIntentCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/ConnectivityIntentCodec.java
index dbd824c..9e8cd86 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/ConnectivityIntentCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/ConnectivityIntentCodec.java
@@ -15,6 +15,9 @@
  */
 package org.onosproject.codec.impl;
 
+import java.util.ArrayList;
+import java.util.stream.IntStream;
+
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
 import org.onosproject.net.flow.TrafficSelector;
@@ -23,6 +26,7 @@
 import org.onosproject.net.intent.Constraint;
 import org.onosproject.net.intent.Intent;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
@@ -33,6 +37,10 @@
  */
 public final class ConnectivityIntentCodec extends JsonCodec<ConnectivityIntent> {
 
+    private static final String CONSTRAINTS = "constraints";
+    private static final String SELECTOR = "selector";
+    private static final String TREATMENT = "treatment";
+
     @Override
     public ObjectNode encode(ConnectivityIntent intent, CodecContext context) {
         checkNotNull(intent, "Connectivity intent cannot be null");
@@ -43,19 +51,19 @@
         if (intent.selector() != null) {
             final JsonCodec<TrafficSelector> selectorCodec =
                     context.codec(TrafficSelector.class);
-            result.set("selector", selectorCodec.encode(intent.selector(), context));
+            result.set(SELECTOR, selectorCodec.encode(intent.selector(), context));
         }
 
         if (intent.treatment() != null) {
             final JsonCodec<TrafficTreatment> treatmentCodec =
                     context.codec(TrafficTreatment.class);
-            result.set("treatment", treatmentCodec.encode(intent.treatment(), context));
+            result.set(TREATMENT, treatmentCodec.encode(intent.treatment(), context));
         }
 
-        result.put("priority", intent.priority());
+        result.put(IntentCodec.PRIORITY, intent.priority());
 
         if (intent.constraints() != null) {
-            final ArrayNode jsonConstraints = result.putArray("constraints");
+            final ArrayNode jsonConstraints = result.putArray(CONSTRAINTS);
 
             if (intent.constraints() != null) {
                 final JsonCodec<Constraint> constraintCodec =
@@ -70,4 +78,41 @@
 
         return result;
     }
+
+    /**
+     * Extracts connectivity intent specific attributes from a JSON object
+     * and adds them to a builder.
+     *
+     * @param json root JSON object
+     * @param context code context
+     * @param builder builder to use for storing the attributes. Constraints,
+     *                selector and treatment are modified by this call.
+     */
+    public static void intentAttributes(ObjectNode json, CodecContext context,
+                                        ConnectivityIntent.Builder builder) {
+        JsonNode constraintsJson = json.get(CONSTRAINTS);
+        if (constraintsJson != null) {
+            JsonCodec<Constraint> constraintsCodec = context.codec(Constraint.class);
+            ArrayList<Constraint> constraints = new ArrayList<>(constraintsJson.size());
+            IntStream.range(0, constraintsJson.size())
+                    .forEach(i -> constraints.add(
+                            constraintsCodec.decode(get(constraintsJson, i),
+                                    context)));
+            builder.constraints(constraints);
+        }
+
+        ObjectNode selectorJson = get(json, SELECTOR);
+        if (selectorJson != null) {
+            JsonCodec<TrafficSelector> selectorCodec = context.codec(TrafficSelector.class);
+            TrafficSelector selector = selectorCodec.decode(selectorJson, context);
+            builder.selector(selector);
+        }
+
+        ObjectNode treatmentJson = get(json, TREATMENT);
+        if (treatmentJson != null) {
+            JsonCodec<TrafficTreatment> treatmentCodec = context.codec(TrafficTreatment.class);
+            TrafficTreatment treatment = treatmentCodec.decode(treatmentJson, context);
+            builder.treatment(treatment);
+        }
+    }
 }
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/ConstraintCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/ConstraintCodec.java
index dd9563c..45728c5 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/ConstraintCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/ConstraintCodec.java
@@ -17,18 +17,8 @@
 
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Link;
 import org.onosproject.net.intent.Constraint;
-import org.onosproject.net.intent.constraint.AnnotationConstraint;
-import org.onosproject.net.intent.constraint.BandwidthConstraint;
-import org.onosproject.net.intent.constraint.LambdaConstraint;
-import org.onosproject.net.intent.constraint.LatencyConstraint;
-import org.onosproject.net.intent.constraint.LinkTypeConstraint;
-import org.onosproject.net.intent.constraint.ObstacleConstraint;
-import org.onosproject.net.intent.constraint.WaypointConstraint;
 
-import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -38,170 +28,36 @@
  */
 public final class ConstraintCodec extends JsonCodec<Constraint> {
 
-    /**
-     * Encodes a latency constraint.
-     *
-     * @param constraint latency constraint to encode
-     * @param context code context
-     * @return JSON ObjectNode representing the constraint
-     */
-    private ObjectNode encodeLatencyConstraint(Constraint constraint,
-                                                CodecContext context) {
-        checkNotNull(constraint, "Duration constraint cannot be null");
-        final LatencyConstraint latencyConstraint =
-                (LatencyConstraint) constraint;
-        return context.mapper().createObjectNode()
-                .put("latencyMillis", latencyConstraint.latency().toMillis());
-    }
-
-    /**
-     * Encodes an obstacle constraint.
-     *
-     * @param constraint obstacle constraint to encode
-     * @param context code context
-     * @return JSON ObjectNode representing the constraint
-     */
-    private ObjectNode encodeObstacleConstraint(Constraint constraint,
-                                                CodecContext context) {
-        checkNotNull(constraint, "Obstacle constraint cannot be null");
-        final ObstacleConstraint obstacleConstraint =
-                (ObstacleConstraint) constraint;
-
-        final ObjectNode result = context.mapper().createObjectNode();
-        final ArrayNode jsonObstacles = result.putArray("obstacles");
-
-        for (DeviceId did : obstacleConstraint.obstacles()) {
-            jsonObstacles.add(did.toString());
-        }
-
-        return result;
-    }
-
-    /**
-     * Encodes a waypoint constraint.
-     *
-     * @param constraint waypoint constraint to encode
-     * @param context code context
-     * @return JSON ObjectNode representing the constraint
-     */
-    private ObjectNode encodeWaypointConstraint(Constraint constraint,
-                                                CodecContext context) {
-        checkNotNull(constraint, "Waypoint constraint cannot be null");
-        final WaypointConstraint waypointConstraint =
-                (WaypointConstraint) constraint;
-
-        final ObjectNode result = context.mapper().createObjectNode();
-        final ArrayNode jsonWaypoints = result.putArray("waypoints");
-
-        for (DeviceId did : waypointConstraint.waypoints()) {
-            jsonWaypoints.add(did.toString());
-        }
-
-        return result;
-    }
-
-    /**
-     * Encodes a annotation constraint.
-     *
-     * @param constraint annotation constraint to encode
-     * @param context code context
-     * @return JSON ObjectNode representing the constraint
-     */
-    private ObjectNode encodeAnnotationConstraint(Constraint constraint,
-                                                  CodecContext context) {
-        checkNotNull(constraint, "Annotation constraint cannot be null");
-        final AnnotationConstraint annotationConstraint =
-                (AnnotationConstraint) constraint;
-        return context.mapper().createObjectNode()
-                .put("key", annotationConstraint.key())
-                .put("threshold", annotationConstraint.threshold());
-    }
-
-    /**
-     * Encodes a bandwidth constraint.
-     *
-     * @param constraint bandwidth constraint to encode
-     * @param context code context
-     * @return JSON ObjectNode representing the constraint
-     */
-    private ObjectNode encodeBandwidthConstraint(Constraint constraint,
-                                                 CodecContext context) {
-        checkNotNull(constraint, "Bandwidth constraint cannot be null");
-        final BandwidthConstraint bandwidthConstraint =
-                (BandwidthConstraint) constraint;
-        return context.mapper().createObjectNode()
-                .put("bandwidth", bandwidthConstraint.bandwidth().toDouble());
-    }
-
-    /**
-     * Encodes a lambda constraint.
-     *
-     * @param constraint lambda constraint to encode
-     * @param context code context
-     * @return JSON ObjectNode representing the constraint
-     */
-    private ObjectNode encodeLambdaConstraint(Constraint constraint,
-                                              CodecContext context) {
-        checkNotNull(constraint, "Lambda constraint cannot be null");
-        final LambdaConstraint lambdaConstraint =
-                (LambdaConstraint) constraint;
-
-        return context.mapper().createObjectNode()
-                .put("lambda", lambdaConstraint.lambda().toInt());
-    }
-
-    /**
-     * Encodes a link type constraint.
-     *
-     * @param constraint link type constraint to encode
-     * @param context code context
-     * @return JSON ObjectNode representing the constraint
-     */
-    private ObjectNode encodeLinkTypeConstraint(Constraint constraint,
-                                                        CodecContext context) {
-        checkNotNull(constraint, "Link type constraint cannot be null");
-
-        final LinkTypeConstraint linkTypeConstraint =
-                (LinkTypeConstraint) constraint;
-
-        final ObjectNode result = context.mapper().createObjectNode()
-                .put("inclusive", linkTypeConstraint.isInclusive());
-
-        final ArrayNode jsonTypes = result.putArray("types");
-
-        if (linkTypeConstraint.types() != null) {
-            for (Link.Type type : linkTypeConstraint.types()) {
-                jsonTypes.add(type.name());
-            }
-        }
-
-        return result;
-    }
+    protected static final String MISSING_MEMBER_MESSAGE =
+            " member is required in Constraint";
+    protected static final String TYPE = "type";
+    protected static final String TYPES = "types";
+    protected static final String INCLUSIVE = "inclusive";
+    protected static final String KEY = "key";
+    protected static final String THRESHOLD = "threshold";
+    protected static final String BANDWIDTH = "bandwidth";
+    protected static final String LAMBDA = "lambda";
+    protected static final String LATENCY_MILLIS = "latencyMillis";
+    protected static final String OBSTACLES = "obstacles";
+    protected static final String WAYPOINTS = "waypoints";
 
     @Override
     public ObjectNode encode(Constraint constraint, CodecContext context) {
         checkNotNull(constraint, "Constraint cannot be null");
 
-        final ObjectNode result;
-        if (constraint instanceof BandwidthConstraint) {
-            result = encodeBandwidthConstraint(constraint, context);
-        } else if (constraint instanceof LambdaConstraint) {
-            result = encodeLambdaConstraint(constraint, context);
-        } else if (constraint instanceof LinkTypeConstraint) {
-            result = encodeLinkTypeConstraint(constraint, context);
-        } else if (constraint instanceof AnnotationConstraint) {
-            result = encodeAnnotationConstraint(constraint, context);
-        } else if (constraint instanceof LatencyConstraint) {
-            result = encodeLatencyConstraint(constraint, context);
-        } else if (constraint instanceof ObstacleConstraint) {
-            result = encodeObstacleConstraint(constraint, context);
-        } else if (constraint instanceof WaypointConstraint) {
-            result = encodeWaypointConstraint(constraint, context);
-        } else {
-            result = context.mapper().createObjectNode();
-        }
+        final EncodeConstraintCodec encodeCodec =
+                new EncodeConstraintCodec(constraint, context);
 
-        result.put("type", constraint.getClass().getSimpleName());
-        return result;
+        return encodeCodec.encode();
+    }
+
+    @Override
+    public Constraint decode(ObjectNode json, CodecContext context) {
+        checkNotNull(json, "JSON cannot be null");
+
+        final DecodeConstraintCodec decodeCodec =
+                new DecodeConstraintCodec(json);
+
+        return decodeCodec.decode();
     }
 }
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/DecodeConstraintCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/DecodeConstraintCodec.java
new file mode 100644
index 0000000..3d63090
--- /dev/null
+++ b/core/common/src/main/java/org/onosproject/codec/impl/DecodeConstraintCodec.java
@@ -0,0 +1,225 @@
+/*
+ * 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.codec.impl;
+
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.stream.IntStream;
+
+import org.onlab.util.Bandwidth;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.IndexedLambda;
+import org.onosproject.net.Link;
+import org.onosproject.net.intent.Constraint;
+import org.onosproject.net.intent.constraint.AnnotationConstraint;
+import org.onosproject.net.intent.constraint.AsymmetricPathConstraint;
+import org.onosproject.net.intent.constraint.BandwidthConstraint;
+import org.onosproject.net.intent.constraint.LambdaConstraint;
+import org.onosproject.net.intent.constraint.LatencyConstraint;
+import org.onosproject.net.intent.constraint.LinkTypeConstraint;
+import org.onosproject.net.intent.constraint.ObstacleConstraint;
+import org.onosproject.net.intent.constraint.WaypointConstraint;
+import org.onosproject.net.resource.link.BandwidthResource;
+import org.onosproject.net.resource.link.LambdaResource;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import static org.onlab.util.Tools.nullIsIllegal;
+
+/**
+ * Constraint JSON decoder.
+ */
+public final class DecodeConstraintCodec {
+    private final ObjectNode json;
+
+    /**
+     * Constructs a constraint decoder.
+     *
+     * @param json object node to decode
+     */
+    public DecodeConstraintCodec(ObjectNode json) {
+        this.json = json;
+    }
+
+    /**
+     * Decodes a link type constraint.
+     *
+     * @return link type constraint object.
+     */
+    private Constraint decodeLinkTypeConstraint() {
+        boolean inclusive = nullIsIllegal(json.get(ConstraintCodec.INCLUSIVE),
+                ConstraintCodec.INCLUSIVE + ConstraintCodec.MISSING_MEMBER_MESSAGE).asBoolean();
+
+        JsonNode types = nullIsIllegal(json.get(ConstraintCodec.TYPES),
+                ConstraintCodec.TYPES + ConstraintCodec.MISSING_MEMBER_MESSAGE);
+        if (types.size() < 1) {
+            throw new IllegalArgumentException(
+                    "types array in link constraint must have at least one value");
+        }
+
+        ArrayList<Link.Type> typesEntries = new ArrayList<>(types.size());
+        IntStream.range(0, types.size())
+                .forEach(index ->
+                        typesEntries.add(Link.Type.valueOf(types.get(index).asText())));
+
+        return new LinkTypeConstraint(inclusive,
+                typesEntries.toArray(new Link.Type[types.size()]));
+    }
+
+    /**
+     * Decodes an annotation constraint.
+     *
+     * @return annotation constraint object.
+     */
+    private Constraint decodeAnnotationConstraint() {
+        String key = nullIsIllegal(json.get(ConstraintCodec.KEY),
+                ConstraintCodec.KEY + ConstraintCodec.MISSING_MEMBER_MESSAGE)
+                .asText();
+        double threshold = nullIsIllegal(json.get(ConstraintCodec.THRESHOLD),
+                ConstraintCodec.THRESHOLD + ConstraintCodec.MISSING_MEMBER_MESSAGE)
+                .asDouble();
+
+        return new AnnotationConstraint(key, threshold);
+    }
+
+    /**
+     * Decodes a lambda constraint.
+     *
+     * @return lambda constraint object.
+     */
+    private Constraint decodeLambdaConstraint() {
+        long lambda = nullIsIllegal(json.get(ConstraintCodec.LAMBDA),
+                ConstraintCodec.LAMBDA + ConstraintCodec.MISSING_MEMBER_MESSAGE)
+                .asLong();
+
+        return new LambdaConstraint(LambdaResource.valueOf(new IndexedLambda(lambda)));
+    }
+
+    /**
+     * Decodes a latency constraint.
+     *
+     * @return latency constraint object.
+     */
+    private Constraint decodeLatencyConstraint() {
+        long latencyMillis = nullIsIllegal(json.get(ConstraintCodec.LATENCY_MILLIS),
+                ConstraintCodec.LATENCY_MILLIS + ConstraintCodec.MISSING_MEMBER_MESSAGE)
+                .asLong();
+
+        return new LatencyConstraint(Duration.ofMillis(latencyMillis));
+    }
+
+    /**
+     * Decodes an obstacle constraint.
+     *
+     * @return obstacle constraint object.
+     */
+    private Constraint decodeObstacleConstraint() {
+        JsonNode obstacles = nullIsIllegal(json.get(ConstraintCodec.OBSTACLES),
+                ConstraintCodec.OBSTACLES + ConstraintCodec.MISSING_MEMBER_MESSAGE);
+        if (obstacles.size() < 1) {
+            throw new IllegalArgumentException(
+                    "obstacles array in obstacles constraint must have at least one value");
+        }
+
+        ArrayList<DeviceId> obstacleEntries = new ArrayList<>(obstacles.size());
+        IntStream.range(0, obstacles.size())
+                .forEach(index ->
+                        obstacleEntries.add(DeviceId.deviceId(obstacles.get(index).asText())));
+
+        return new ObstacleConstraint(
+                obstacleEntries.toArray(new DeviceId[obstacles.size()]));
+    }
+
+    /**
+     * Decodes a waypoint constraint.
+     *
+     * @return waypoint constraint object.
+     */
+    private Constraint decodeWaypointConstraint() {
+        JsonNode waypoints = nullIsIllegal(json.get(ConstraintCodec.WAYPOINTS),
+                ConstraintCodec.WAYPOINTS + ConstraintCodec.MISSING_MEMBER_MESSAGE);
+        if (waypoints.size() < 1) {
+            throw new IllegalArgumentException(
+                    "obstacles array in obstacles constraint must have at least one value");
+        }
+
+        ArrayList<DeviceId> waypointEntries = new ArrayList<>(waypoints.size());
+        IntStream.range(0, waypoints.size())
+                .forEach(index ->
+                        waypointEntries.add(DeviceId.deviceId(waypoints.get(index).asText())));
+
+        return new WaypointConstraint(
+                waypointEntries.toArray(new DeviceId[waypoints.size()]));
+    }
+
+    /**
+     * Decodes an asymmetric path constraint.
+     *
+     * @return asymmetric path constraint object.
+     */
+    private Constraint decodeAsymmetricPathConstraint() {
+        return new AsymmetricPathConstraint();
+    }
+
+    /**
+     * Decodes a bandwidth constraint.
+     *
+     * @return bandwidth constraint object.
+     */
+    private Constraint decodeBandwidthConstraint() {
+        double bandwidth = nullIsIllegal(json.get(ConstraintCodec.BANDWIDTH),
+                ConstraintCodec.BANDWIDTH + ConstraintCodec.MISSING_MEMBER_MESSAGE)
+                .asDouble();
+
+        return new BandwidthConstraint(new BandwidthResource(Bandwidth.bps(bandwidth)));
+    }
+
+    /**
+     * Decodes the given constraint.
+     *
+     * @return constraint object.
+     */
+    public Constraint decode() {
+        final String type = nullIsIllegal(json.get(ConstraintCodec.TYPE),
+                ConstraintCodec.TYPE + ConstraintCodec.MISSING_MEMBER_MESSAGE)
+                .asText();
+
+        if (type.equals(BandwidthConstraint.class.getSimpleName())) {
+            return decodeBandwidthConstraint();
+        } else if (type.equals(LambdaConstraint.class.getSimpleName())) {
+            return decodeLambdaConstraint();
+        } else if (type.equals(LinkTypeConstraint.class.getSimpleName())) {
+            return decodeLinkTypeConstraint();
+        } else if (type.equals(AnnotationConstraint.class.getSimpleName())) {
+            return decodeAnnotationConstraint();
+        } else if (type.equals(LatencyConstraint.class.getSimpleName())) {
+            return decodeLatencyConstraint();
+        } else if (type.equals(ObstacleConstraint.class.getSimpleName())) {
+            return decodeObstacleConstraint();
+        } else if (type.equals(WaypointConstraint.class.getSimpleName())) {
+            return decodeWaypointConstraint();
+        } else if (type.equals(AsymmetricPathConstraint.class.getSimpleName())) {
+            return decodeAsymmetricPathConstraint();
+        } else if (type.equals(LinkTypeConstraint.class.getSimpleName())) {
+            return decodeLinkTypeConstraint();
+        } else if (type.equals(AnnotationConstraint.class.getSimpleName())) {
+            return decodeAnnotationConstraint();
+        }
+        throw new IllegalArgumentException("Instruction type "
+                + type + " is not supported");
+    }
+}
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/EncodeConstraintCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/EncodeConstraintCodec.java
new file mode 100644
index 0000000..7e18cac
--- /dev/null
+++ b/core/common/src/main/java/org/onosproject/codec/impl/EncodeConstraintCodec.java
@@ -0,0 +1,201 @@
+/*
+ * 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.codec.impl;
+
+import org.onosproject.codec.CodecContext;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Link;
+import org.onosproject.net.intent.Constraint;
+import org.onosproject.net.intent.constraint.AnnotationConstraint;
+import org.onosproject.net.intent.constraint.BandwidthConstraint;
+import org.onosproject.net.intent.constraint.LambdaConstraint;
+import org.onosproject.net.intent.constraint.LatencyConstraint;
+import org.onosproject.net.intent.constraint.LinkTypeConstraint;
+import org.onosproject.net.intent.constraint.ObstacleConstraint;
+import org.onosproject.net.intent.constraint.WaypointConstraint;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Implementation of encoder for constraint JSON codec.
+ */
+public final class EncodeConstraintCodec {
+
+    private final Constraint constraint;
+    private final CodecContext context;
+
+    /**
+     * Constructs a constraint encoder.
+     *
+     * @param constraint constraint to encode
+     * @param context to use for look ups
+     */
+    public EncodeConstraintCodec(Constraint constraint, CodecContext context) {
+        this.constraint = constraint;
+        this.context = context;
+    }
+
+    /**
+     * Encodes a latency constraint.
+     *
+     * @return JSON ObjectNode representing the constraint
+     */
+    private ObjectNode encodeLatencyConstraint() {
+        checkNotNull(constraint, "Duration constraint cannot be null");
+        final LatencyConstraint latencyConstraint =
+                (LatencyConstraint) constraint;
+        return context.mapper().createObjectNode()
+                .put("latencyMillis", latencyConstraint.latency().toMillis());
+    }
+
+    /**
+     * Encodes an obstacle constraint.
+     *
+     * @return JSON ObjectNode representing the constraint
+     */
+    private ObjectNode encodeObstacleConstraint() {
+        checkNotNull(constraint, "Obstacle constraint cannot be null");
+        final ObstacleConstraint obstacleConstraint =
+                (ObstacleConstraint) constraint;
+
+        final ObjectNode result = context.mapper().createObjectNode();
+        final ArrayNode jsonObstacles = result.putArray("obstacles");
+
+        for (DeviceId did : obstacleConstraint.obstacles()) {
+            jsonObstacles.add(did.toString());
+        }
+
+        return result;
+    }
+
+    /**
+     * Encodes a waypoint constraint.
+     *
+     * @return JSON ObjectNode representing the constraint
+     */
+    private ObjectNode encodeWaypointConstraint() {
+        checkNotNull(constraint, "Waypoint constraint cannot be null");
+        final WaypointConstraint waypointConstraint =
+                (WaypointConstraint) constraint;
+
+        final ObjectNode result = context.mapper().createObjectNode();
+        final ArrayNode jsonWaypoints = result.putArray("waypoints");
+
+        for (DeviceId did : waypointConstraint.waypoints()) {
+            jsonWaypoints.add(did.toString());
+        }
+
+        return result;
+    }
+
+    /**
+     * Encodes a annotation constraint.
+     *
+     * @return JSON ObjectNode representing the constraint
+     */
+    private ObjectNode encodeAnnotationConstraint() {
+        checkNotNull(constraint, "Annotation constraint cannot be null");
+        final AnnotationConstraint annotationConstraint =
+                (AnnotationConstraint) constraint;
+        return context.mapper().createObjectNode()
+                .put("key", annotationConstraint.key())
+                .put("threshold", annotationConstraint.threshold());
+    }
+
+    /**
+     * Encodes a bandwidth constraint.
+     *
+     * @return JSON ObjectNode representing the constraint
+     */
+    private ObjectNode encodeBandwidthConstraint() {
+        checkNotNull(constraint, "Bandwidth constraint cannot be null");
+        final BandwidthConstraint bandwidthConstraint =
+                (BandwidthConstraint) constraint;
+        return context.mapper().createObjectNode()
+                .put("bandwidth", bandwidthConstraint.bandwidth().toDouble());
+    }
+
+    /**
+     * Encodes a lambda constraint.
+     *
+     * @return JSON ObjectNode representing the constraint
+     */
+    private ObjectNode encodeLambdaConstraint() {
+        checkNotNull(constraint, "Lambda constraint cannot be null");
+        final LambdaConstraint lambdaConstraint =
+                (LambdaConstraint) constraint;
+
+        return context.mapper().createObjectNode()
+                .put("lambda", lambdaConstraint.lambda().toInt());
+    }
+
+    /**
+     * Encodes a link type constraint.
+     *
+     * @return JSON ObjectNode representing the constraint
+     */
+    private ObjectNode encodeLinkTypeConstraint() {
+        checkNotNull(constraint, "Link type constraint cannot be null");
+
+        final LinkTypeConstraint linkTypeConstraint =
+                (LinkTypeConstraint) constraint;
+
+        final ObjectNode result = context.mapper().createObjectNode()
+                .put(ConstraintCodec.INCLUSIVE, linkTypeConstraint.isInclusive());
+
+        final ArrayNode jsonTypes = result.putArray(ConstraintCodec.TYPES);
+
+        if (linkTypeConstraint.types() != null) {
+            for (Link.Type type : linkTypeConstraint.types()) {
+                jsonTypes.add(type.name());
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * Encodes the constraint in JSON.
+     *
+     * @return JSON node
+     */
+    public ObjectNode encode() {
+        final ObjectNode result;
+        if (constraint instanceof BandwidthConstraint) {
+            result = encodeBandwidthConstraint();
+        } else if (constraint instanceof LambdaConstraint) {
+            result = encodeLambdaConstraint();
+        } else if (constraint instanceof LinkTypeConstraint) {
+            result = encodeLinkTypeConstraint();
+        } else if (constraint instanceof AnnotationConstraint) {
+            result = encodeAnnotationConstraint();
+        } else if (constraint instanceof LatencyConstraint) {
+            result = encodeLatencyConstraint();
+        } else if (constraint instanceof ObstacleConstraint) {
+            result = encodeObstacleConstraint();
+        } else if (constraint instanceof WaypointConstraint) {
+            result = encodeWaypointConstraint();
+        } else {
+            result = context.mapper().createObjectNode();
+        }
+
+        result.put(ConstraintCodec.TYPE, constraint.getClass().getSimpleName());
+        return result;
+    }
+}
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/FlowRuleCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/FlowRuleCodec.java
index bd81ee0..6c02841 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/FlowRuleCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/FlowRuleCodec.java
@@ -75,14 +75,14 @@
                 DEVICE_ID + MISSING_MEMBER_MESSAGE).asText());
         resultBuilder.forDevice(deviceId);
 
-        ObjectNode treatmentJson = (ObjectNode) json.get(TREATMENT);
+        ObjectNode treatmentJson = get(json, TREATMENT);
         if (treatmentJson != null) {
             JsonCodec<TrafficTreatment> treatmentCodec =
                     context.codec(TrafficTreatment.class);
             resultBuilder.withTreatment(treatmentCodec.decode(treatmentJson, context));
         }
 
-        ObjectNode selectorJson = (ObjectNode) json.get(SELECTOR);
+        ObjectNode selectorJson = get(json, SELECTOR);
         if (selectorJson != null) {
             JsonCodec<TrafficSelector> selectorCodec =
                     context.codec(TrafficSelector.class);
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/HostToHostIntentCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/HostToHostIntentCodec.java
index 59ceb2b..597ab55 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/HostToHostIntentCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/HostToHostIntentCodec.java
@@ -17,18 +17,23 @@
 
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
+import org.onosproject.net.HostId;
 import org.onosproject.net.intent.ConnectivityIntent;
 import org.onosproject.net.intent.HostToHostIntent;
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsIllegal;
 
 /**
  * Host to host intent codec.
  */
 public final class HostToHostIntentCodec extends JsonCodec<HostToHostIntent> {
 
+    private static final String ONE = "one";
+    private static final String TWO = "two";
+
     @Override
     public ObjectNode encode(HostToHostIntent intent, CodecContext context) {
         checkNotNull(intent, "Host to host intent cannot be null");
@@ -39,9 +44,27 @@
 
         final String one = intent.one().toString();
         final String two = intent.two().toString();
-        result.put("one", one);
-        result.put("two", two);
+        result.put(ONE, one);
+        result.put(TWO, two);
 
         return result;
     }
+
+    @Override
+    public HostToHostIntent decode(ObjectNode json, CodecContext context) {
+        HostToHostIntent.Builder builder = HostToHostIntent.builder();
+
+        IntentCodec.intentAttributes(json, context, builder);
+        ConnectivityIntentCodec.intentAttributes(json, context, builder);
+
+        String one = nullIsIllegal(json.get(ONE),
+                ONE + IntentCodec.MISSING_MEMBER_MESSAGE).asText();
+        builder.one(HostId.hostId(one));
+
+        String two = nullIsIllegal(json.get(TWO),
+                TWO + IntentCodec.MISSING_MEMBER_MESSAGE).asText();
+        builder.two(HostId.hostId(two));
+
+        return builder.build();
+    }
 }
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/IntentCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/IntentCodec.java
index a45ae87..36ff8fa 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/IntentCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/IntentCodec.java
@@ -17,31 +17,46 @@
 
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
+import org.onosproject.core.CoreService;
 import org.onosproject.net.NetworkResource;
+import org.onosproject.net.intent.HostToHostIntent;
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.IntentService;
 import org.onosproject.net.intent.IntentState;
+import org.onosproject.net.intent.PointToPointIntent;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsIllegal;
 
 /**
  * Intent JSON codec.
  */
 public final class IntentCodec extends JsonCodec<Intent> {
 
+    protected static final String TYPE = "type";
+    protected static final String ID = "id";
+    protected static final String APP_ID = "appId";
+    protected static final String DETAILS = "details";
+    protected static final String STATE = "state";
+    protected static final String PRIORITY = "priority";
+    protected static final String RESOURCES = "resources";
+    protected static final String MISSING_MEMBER_MESSAGE =
+            " member is required in Intent";
+
     @Override
     public ObjectNode encode(Intent intent, CodecContext context) {
         checkNotNull(intent, "Intent cannot be null");
         final ObjectNode result = context.mapper().createObjectNode()
-                .put("type", intent.getClass().getSimpleName())
-                .put("id", intent.id().toString())
-                .put("appId", intent.appId().toString())
-                .put("details", intent.toString());
+                .put(TYPE, intent.getClass().getSimpleName())
+                .put(ID, intent.id().toString())
+                .put(APP_ID, intent.appId().toString())
+                .put(DETAILS, intent.toString());
 
-        final ArrayNode jsonResources = result.putArray("resources");
+        final ArrayNode jsonResources = result.putArray(RESOURCES);
 
         for (final NetworkResource resource : intent.resources()) {
             jsonResources.add(resource.toString());
@@ -50,9 +65,47 @@
         IntentService service = context.getService(IntentService.class);
         IntentState state = service.getIntentState(intent.key());
         if (state != null) {
-            result.put("state", state.toString());
+            result.put(STATE, state.toString());
         }
 
         return result;
     }
+
+    @Override
+    public Intent decode(ObjectNode json, CodecContext context) {
+        checkNotNull(json, "JSON cannot be null");
+
+        String type = nullIsIllegal(json.get(TYPE),
+                TYPE + MISSING_MEMBER_MESSAGE).asText();
+
+        if (type.equals(PointToPointIntent.class.getSimpleName())) {
+            return context.codec(PointToPointIntent.class).decode(json, context);
+        } else if (type.equals(HostToHostIntent.class.getSimpleName())) {
+            return context.codec(HostToHostIntent.class).decode(json, context);
+        }
+
+        throw new IllegalArgumentException("Intent type "
+                + type + " is not supported");
+    }
+
+    /**
+     * Extracts base intent specific attributes from a JSON object
+     * and adds them to a builder.
+     *
+     * @param json root JSON object
+     * @param context code context
+     * @param builder builder to use for storing the attributes
+     */
+    public static void intentAttributes(ObjectNode json, CodecContext context,
+                                    Intent.Builder builder) {
+        short appId = (short) nullIsIllegal(json.get(IntentCodec.APP_ID),
+                IntentCodec.TYPE + IntentCodec.MISSING_MEMBER_MESSAGE).asInt();
+        CoreService service = context.getService(CoreService.class);
+        builder.appId(service.getAppId(appId));
+
+        JsonNode priorityJson = json.get(IntentCodec.PRIORITY);
+        if (priorityJson != null) {
+            builder.priority(priorityJson.asInt());
+        }
+    }
 }
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/LinkCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/LinkCodec.java
index 491d751..14ee9b7 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/LinkCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/LinkCodec.java
@@ -70,8 +70,8 @@
         // TODO: add providerId to JSON if we need to recover them.
         ProviderId pid = new ProviderId("json", "LinkCodec");
 
-        ConnectPoint src = codec.decode((ObjectNode) json.get(SRC), context);
-        ConnectPoint dst = codec.decode((ObjectNode) json.get(DST), context);
+        ConnectPoint src = codec.decode(get(json, SRC), context);
+        ConnectPoint dst = codec.decode(get(json, DST), context);
         Type type = Type.valueOf(json.get(TYPE).asText());
         Annotations annotations = extractAnnotations(json, context);
 
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PointToPointIntentCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PointToPointIntentCodec.java
index 45f2f3d..20df489 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/PointToPointIntentCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/PointToPointIntentCodec.java
@@ -24,12 +24,16 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsIllegal;
 
 /**
  * Point to point intent codec.
  */
 public final class PointToPointIntentCodec extends JsonCodec<PointToPointIntent> {
 
+    private static final String INGRESS_POINT = "ingressPoint";
+    private static final String EGRESS_POINT = "egressPoint";
+
     @Override
     public ObjectNode encode(PointToPointIntent intent, CodecContext context) {
         checkNotNull(intent, "Point to point intent cannot be null");
@@ -45,9 +49,32 @@
         final ObjectNode egress =
                 connectPointCodec.encode(intent.egressPoint(), context);
 
-        result.set("ingressPoint", ingress);
-        result.set("egressPoint", egress);
+        result.set(INGRESS_POINT, ingress);
+        result.set(EGRESS_POINT, egress);
 
         return result;
     }
+
+
+    @Override
+    public PointToPointIntent decode(ObjectNode json, CodecContext context) {
+        PointToPointIntent.Builder builder = PointToPointIntent.builder();
+
+        IntentCodec.intentAttributes(json, context, builder);
+        ConnectivityIntentCodec.intentAttributes(json, context, builder);
+
+        ObjectNode ingressJson = nullIsIllegal(get(json, INGRESS_POINT),
+                INGRESS_POINT + IntentCodec.MISSING_MEMBER_MESSAGE);
+        ConnectPoint ingress = context.codec(ConnectPoint.class)
+                .decode(ingressJson, context);
+        builder.ingressPoint(ingress);
+
+        ObjectNode egressJson = nullIsIllegal(get(json, EGRESS_POINT),
+                EGRESS_POINT + IntentCodec.MISSING_MEMBER_MESSAGE);
+        ConnectPoint egress = context.codec(ConnectPoint.class)
+                .decode(egressJson, context);
+        builder.egressPoint(egress);
+
+        return builder.build();
+    }
 }
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/TrafficSelectorCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/TrafficSelectorCodec.java
index eea9fae..24ebef1 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/TrafficSelectorCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/TrafficSelectorCodec.java
@@ -63,7 +63,7 @@
         if (criteriaJson != null) {
             IntStream.range(0, criteriaJson.size())
                     .forEach(i -> builder.add(
-                            criterionCodec.decode((ObjectNode) criteriaJson.get(i),
+                            criterionCodec.decode(get(criteriaJson, i),
                                     context)));
         }
         return builder.build();
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/TrafficTreatmentCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/TrafficTreatmentCodec.java
index edfe10c..0d7fb42 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/TrafficTreatmentCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/TrafficTreatmentCodec.java
@@ -68,7 +68,7 @@
         if (instructionsJson != null) {
             IntStream.range(0, instructionsJson.size())
                     .forEach(i -> builder.add(
-                            instructionsCodec.decode((ObjectNode) instructionsJson.get(i),
+                            instructionsCodec.decode(get(instructionsJson, i),
                                     context)));
         }
         return builder.build();
