diff --git a/web/api/src/main/java/org/onosproject/codec/impl/CodecManager.java b/web/api/src/main/java/org/onosproject/codec/impl/CodecManager.java
index 592f6a8..10f2b57 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/CodecManager.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/CodecManager.java
@@ -15,7 +15,10 @@
  */
 package org.onosproject.codec.impl;
 
-import com.google.common.collect.ImmutableSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -36,15 +39,14 @@
 import org.onosproject.net.flow.criteria.Criterion;
 import org.onosproject.net.flow.instructions.Instruction;
 import org.onosproject.net.intent.ConnectivityIntent;
+import org.onosproject.net.intent.Constraint;
 import org.onosproject.net.intent.HostToHostIntent;
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.PointToPointIntent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
+import com.google.common.collect.ImmutableSet;
 
 /**
  * Implementation of the JSON codec brokering service.
@@ -77,6 +79,7 @@
         registerCodec(Instruction.class, new InstructionCodec());
         registerCodec(Criterion.class, new CriterionCodec());
         registerCodec(Ethernet.class, new EthernetCodec());
+        registerCodec(Constraint.class, new ConstraintCodec());
         log.info("Started");
     }
 
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/ConnectivityIntentCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/ConnectivityIntentCodec.java
index 3a7aa15..0591562 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/ConnectivityIntentCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/ConnectivityIntentCodec.java
@@ -56,9 +56,12 @@
             final ArrayNode jsonConstraints = result.putArray("constraints");
 
             if (intent.constraints() != null) {
+                final JsonCodec<Constraint> constraintCodec =
+                        context.codec(Constraint.class);
                 for (final Constraint constraint : intent.constraints()) {
-                    // TODO: constraint should have its own codec
-                    jsonConstraints.add(constraint.toString());
+                    final ObjectNode constraintNode =
+                            constraintCodec.encode(constraint, context);
+                    jsonConstraints.add(constraintNode);
                 }
             }
         }
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/ConstraintCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/ConstraintCodec.java
new file mode 100644
index 0000000..4d60ea9
--- /dev/null
+++ b/web/api/src/main/java/org/onosproject/codec/impl/ConstraintCodec.java
@@ -0,0 +1,207 @@
+/*
+ * 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.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;
+
+/**
+ * Constraint JSON codec.
+ */
+public 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;
+    }
+
+    @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();
+        }
+
+        result.put("type", constraint.getClass().getSimpleName());
+        return result;
+    }
+}
