diff --git a/core/api/src/main/java/org/onosproject/net/intent/ConnectivityIntent.java b/core/api/src/main/java/org/onosproject/net/intent/ConnectivityIntent.java
index 038e96a..9d0a228 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/ConnectivityIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/ConnectivityIntent.java
@@ -15,10 +15,13 @@
  */
 package org.onosproject.net.intent;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.Link;
 import org.onosproject.net.NetworkResource;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
 
@@ -112,6 +115,65 @@
     }
 
     /**
+     * Abstract builder for connectivity intents.
+     */
+    public abstract static class Builder extends Intent.Builder {
+        protected TrafficSelector selector = DefaultTrafficSelector.emptySelector();
+        protected TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment();
+        protected List<Constraint> constraints = ImmutableList.of();
+
+        @Override
+        public Builder appId(ApplicationId appId) {
+            return (Builder) super.appId(appId);
+        }
+
+        @Override
+        public Builder key(Key key) {
+            return (Builder) super.key(key);
+        }
+
+        @Override
+        public Builder priority(int priority) {
+            return (Builder) super.priority(priority);
+        }
+
+
+        /**
+         * Sets the traffic selector for the intent that will be built.
+         *
+         * @param selector selector to use for built intent
+         * @return this builder
+         */
+        public Builder selector(TrafficSelector selector) {
+            this.selector = selector;
+            return this;
+        }
+
+        /**
+         * Sets the traffic treatment for the intent that will be built.
+         *
+         * @param treatment treatment to use for built intent
+         * @return this builder
+         */
+        public Builder treatment(TrafficTreatment treatment) {
+            this.treatment = treatment;
+            return this;
+        }
+
+        /**
+         * Sets the constraints for the intent that will be built.
+         *
+         * @param constraints constraints to use for built intent
+         * @return this builder
+         */
+        public Builder constraints(List<Constraint> constraints) {
+            this.constraints = ImmutableList.copyOf(constraints);
+            return this;
+        }
+    }
+
+
+    /**
      * Returns the match specifying the type of traffic.
      *
      * @return traffic match
diff --git a/core/api/src/main/java/org/onosproject/net/intent/Intent.java b/core/api/src/main/java/org/onosproject/net/intent/Intent.java
index 7959929..725fac4 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/Intent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/Intent.java
@@ -15,13 +15,13 @@
  */
 package org.onosproject.net.intent;
 
+import java.util.Collection;
+import java.util.Objects;
+
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.IdGenerator;
 import org.onosproject.net.NetworkResource;
 
-import java.util.Collection;
-import java.util.Objects;
-
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
@@ -92,6 +92,49 @@
     }
 
     /**
+     * Abstract builder for intents.
+     */
+    public abstract static class Builder {
+        protected ApplicationId appId;
+        protected Key key;
+        protected int priority = Intent.DEFAULT_INTENT_PRIORITY;
+
+        /**
+         * Sets the application id for the intent that will be built.
+         *
+         * @param appId application id to use for built intent
+         * @return this builder
+         */
+        public Builder appId(ApplicationId appId) {
+            this.appId = appId;
+            return this;
+        }
+
+        /**
+         * Sets the key for the intent that will be built.
+         *
+         * @param key key to use for built intent
+         * @return this builder
+         */
+        public Builder key(Key key) {
+            this.key = key;
+            return this;
+        }
+
+        /**
+         * Sets the priority for the intent that will be built.
+         *
+         * @param priority priority to use for built intent
+         * @return this builder
+         */
+        public Builder priority(int priority) {
+            this.priority = priority;
+            return this;
+        }
+
+    }
+
+    /**
      * Returns the intent identifier.
      *
      * @return intent fingerprint
diff --git a/core/api/src/main/java/org/onosproject/net/intent/PointToPointIntent.java b/core/api/src/main/java/org/onosproject/net/intent/PointToPointIntent.java
index 2df7b8b..5f80d9a 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/PointToPointIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/PointToPointIntent.java
@@ -15,18 +15,16 @@
  */
 package org.onosproject.net.intent;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableList;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Link;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.intent.constraint.LinkTypeConstraint;
-
 import java.util.Collections;
 import java.util.List;
 
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
+
+import com.google.common.base.MoreObjects;
+
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
@@ -39,6 +37,103 @@
     private final ConnectPoint egressPoint;
 
     /**
+     * Returns a new point to point intent builder. The application id,
+     * ingress point and egress point are required fields.  If they are
+     * not set by calls to the appropriate methods, an exception will
+     * be thrown.
+     *
+     * @return point to point builder
+     */
+    public static PointToPointIntent.Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * Builder of a point to point intent.
+     */
+    public static final class Builder extends ConnectivityIntent.Builder {
+        ConnectPoint ingressPoint;
+        ConnectPoint egressPoint;
+
+        private Builder() {
+            // Hide constructor
+        }
+
+        @Override
+        public Builder appId(ApplicationId appId) {
+            return (Builder) super.appId(appId);
+        }
+
+        @Override
+        public Builder key(Key key) {
+            return (Builder) super.key(key);
+        }
+
+        @Override
+        public Builder selector(TrafficSelector selector) {
+            return (Builder) super.selector(selector);
+        }
+
+        @Override
+        public Builder treatment(TrafficTreatment treatment) {
+            return (Builder) super.treatment(treatment);
+        }
+
+        @Override
+        public Builder constraints(List<Constraint> constraints) {
+            return (Builder) super.constraints(constraints);
+        }
+
+        @Override
+        public Builder priority(int priority) {
+            return (Builder) super.priority(priority);
+        }
+
+        /**
+         * Sets the ingress point of the point to point intent that will be built.
+         *
+         * @param ingressPoint ingress connect point
+         * @return this builder
+         */
+        public Builder ingressPoint(ConnectPoint ingressPoint) {
+            this.ingressPoint = ingressPoint;
+            return this;
+        }
+
+        /**
+         * Sets the egress point of the point to point intent that will be built.
+         *
+         * @param egressPoint egress connect point
+         * @return this builder
+         */
+        public Builder egressPoint(ConnectPoint egressPoint) {
+            this.egressPoint = egressPoint;
+            return this;
+        }
+
+        /**
+         * Builds a point to point intent from the accumulated parameters.
+         *
+         * @return point to point intent
+         */
+        public PointToPointIntent build() {
+
+            return new PointToPointIntent(
+                    appId,
+                    key,
+                    selector,
+                    treatment,
+                    ingressPoint,
+                    egressPoint,
+                    constraints,
+                    priority
+            );
+        }
+    }
+
+
+
+    /**
      * Creates a new point-to-point intent with the supplied ingress/egress
      * ports and constraints.
      *
@@ -50,9 +145,10 @@
      * @param egressPoint  egress port
      * @param constraints  optional list of constraints
      * @param priority     priority to use for flows generated by this intent
-     * @throws NullPointerException if {@code ingressPoint} or {@code egressPoints} is null.
+     * @throws NullPointerException if {@code ingressPoint} or
+     *        {@code egressPoints} or {@code appId} is null.
      */
-    public PointToPointIntent(ApplicationId appId,
+    private PointToPointIntent(ApplicationId appId,
                               Key key,
                               TrafficSelector selector,
                               TrafficTreatment treatment,
@@ -73,57 +169,6 @@
     }
 
     /**
-     * Creates a new point-to-point intent with the supplied ingress/egress
-     * ports and with built-in link type constraint to avoid optical links.
-     *
-     * @param appId        application identifier
-     * @param selector     traffic selector
-     * @param treatment    treatment
-     * @param ingressPoint ingress port
-     * @param egressPoint  egress port
-     * @throws NullPointerException if {@code ingressPoint} or {@code egressPoints} is null.
-     */
-    public PointToPointIntent(ApplicationId appId, TrafficSelector selector,
-                              TrafficTreatment treatment,
-                              ConnectPoint ingressPoint,
-                              ConnectPoint egressPoint) {
-        this(appId, null, selector, treatment, ingressPoint, egressPoint,
-             ImmutableList.of(new LinkTypeConstraint(false, Link.Type.OPTICAL)),
-                DEFAULT_INTENT_PRIORITY);
-    }
-
-    /**
-     * Creates a new point-to-point intent with the supplied ingress/egress
-     * ports and constraints.
-     *
-     * @param appId        application identifier
-     * @param selector     traffic selector
-     * @param treatment    treatment
-     * @param ingressPoint ingress port
-     * @param egressPoint  egress port
-     * @param constraints  optional list of constraints
-     * @param priority     priority to use for flows generated by this intent
-     * @throws NullPointerException if {@code ingressPoint} or {@code egressPoints} is null.
-     */
-    public PointToPointIntent(ApplicationId appId, TrafficSelector selector,
-                              TrafficTreatment treatment,
-                              ConnectPoint ingressPoint,
-                              ConnectPoint egressPoint,
-                              List<Constraint> constraints,
-                              int priority) {
-        super(appId, null, Collections.emptyList(), selector, treatment,
-                constraints, priority);
-
-        checkNotNull(ingressPoint);
-        checkNotNull(egressPoint);
-        checkArgument(!ingressPoint.equals(egressPoint),
-                "ingress and egress should be different (ingress: %s, egress: %s)", ingressPoint, egressPoint);
-
-        this.ingressPoint = ingressPoint;
-        this.egressPoint = egressPoint;
-    }
-
-    /**
      * Constructor for serializer.
      */
     protected PointToPointIntent() {
diff --git a/core/api/src/test/java/org/onosproject/net/intent/PointToPointIntentTest.java b/core/api/src/test/java/org/onosproject/net/intent/PointToPointIntentTest.java
index fc18242..7171e7a 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/PointToPointIntentTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/PointToPointIntentTest.java
@@ -44,11 +44,23 @@
 
     @Override
     protected PointToPointIntent createOne() {
-        return new PointToPointIntent(APPID, MATCH, NOP, P1, P2);
+        return PointToPointIntent.builder()
+                .appId(APPID)
+                .selector(MATCH)
+                .treatment(NOP)
+                .ingressPoint(P1)
+                .egressPoint(P2)
+                .build();
     }
 
     @Override
     protected PointToPointIntent createAnother() {
-        return new PointToPointIntent(APPID, MATCH, NOP, P2, P1);
+        return PointToPointIntent.builder()
+                .appId(APPID)
+                .selector(MATCH)
+                .treatment(NOP)
+                .ingressPoint(P2)
+                .egressPoint(P1)
+                .build();
     }
 }
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java
index a879236..63f8ebb 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java
@@ -48,14 +48,25 @@
     public List<Intent> compile(TwoWayP2PIntent intent, List<Intent> installable,
                                 Set<LinkResourceAllocations> resources) {
         return Lists.newArrayList(
-                new PointToPointIntent(intent.appId(), intent.key(),
-                                       intent.selector(), intent.treatment(),
-                                       intent.one(), intent.two(),
-                                       intent.constraints(), intent.priority()),
-                new PointToPointIntent(intent.appId(), intent.key(),
-                                       intent.selector(), intent.treatment(),
-                                       intent.two(), intent.one(),
-                                       intent.constraints(), intent.priority()));
-
+                PointToPointIntent.builder()
+                        .appId(intent.appId())
+                        .key(intent.key())
+                        .selector(intent.selector())
+                        .treatment(intent.treatment())
+                        .ingressPoint(intent.one())
+                        .egressPoint(intent.two())
+                        .constraints(intent.constraints())
+                        .priority(intent.priority())
+                        .build(),
+                PointToPointIntent.builder()
+                        .appId(intent.appId())
+                        .key(intent.key())
+                        .selector(intent.selector())
+                        .treatment(intent.treatment())
+                        .ingressPoint(intent.two())
+                        .egressPoint(intent.one())
+                        .constraints(intent.constraints())
+                        .priority(intent.priority())
+                        .build());
     }
 }
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompilerTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompilerTest.java
index aedc124..b0a5df8 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompilerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompilerTest.java
@@ -72,9 +72,13 @@
      */
     private PointToPointIntent makeIntent(String ingressIdString,
                                           String egressIdString) {
-        return new PointToPointIntent(APPID, selector, treatment,
-                                      connectPoint(ingressIdString, 1),
-                                      connectPoint(egressIdString, 1));
+        return PointToPointIntent.builder()
+                .appId(APPID)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(connectPoint(ingressIdString, 1))
+                .egressPoint(connectPoint(egressIdString, 1))
+                .build();
     }
 
     /**
@@ -87,10 +91,14 @@
      */
     private PointToPointIntent makeIntent(String ingressIdString,
                                           String egressIdString, List<Constraint> constraints) {
-        return new PointToPointIntent(APPID, selector, treatment,
-                connectPoint(ingressIdString, 1),
-                connectPoint(egressIdString, 1),
-                constraints, Intent.DEFAULT_INTENT_PRIORITY);
+        return PointToPointIntent.builder()
+                .appId(APPID)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(connectPoint(ingressIdString, 1))
+                .egressPoint(connectPoint(egressIdString, 1))
+                .constraints(constraints)
+                .build();
     }
 
     /**
@@ -187,7 +195,13 @@
     public void testSameSwitchDifferentPortsIntentCompilation() {
         ConnectPoint src = new ConnectPoint(deviceId("1"), portNumber(1));
         ConnectPoint dst = new ConnectPoint(deviceId("1"), portNumber(2));
-        PointToPointIntent intent = new PointToPointIntent(APP_ID, selector, treatment, src, dst);
+        PointToPointIntent intent = PointToPointIntent.builder()
+                .appId(APP_ID)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(src)
+                .egressPoint(dst)
+                .build();
 
         String[] hops = {"1"};
         PointToPointIntentCompiler sut = makeCompiler(hops);
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/CompilingTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/CompilingTest.java
index 11a6e6e..d450812 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/CompilingTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/CompilingTest.java
@@ -90,7 +90,13 @@
         Intent.bindIdGenerator(idGenerator);
 
         // Intent creation should be placed after binding an ID generator
-        input = new PointToPointIntent(appId, selector, treatment, cp1, cp3);
+        input = PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(cp1)
+                .egressPoint(cp3)
+                .build();
         compiled = new PathIntent(appId, selector, treatment, path);
     }
 
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallCoordinatingTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallCoordinatingTest.java
index cad6768..678bd2d 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallCoordinatingTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallCoordinatingTest.java
@@ -91,7 +91,13 @@
         Intent.bindIdGenerator(idGenerator);
 
         // Intent creation should be placed after binding an ID generator
-        input = new PointToPointIntent(appId, selector, treatment, cp1, cp3);
+        input = PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(cp1)
+                .egressPoint(cp3)
+                .build();
         compiled = new PathIntent(appId, selector, treatment, path);
     }
 
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallingTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallingTest.java
index 89c797c..b7d063f 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallingTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/InstallingTest.java
@@ -91,7 +91,13 @@
         Intent.bindIdGenerator(idGenerator);
 
         // Intent creation should be placed after binding an ID generator
-        input = new PointToPointIntent(appId, selector, treatment, cp1, cp3);
+        input = PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(cp1)
+                .egressPoint(cp3)
+                .build();
         compiled = new PathIntent(appId, selector, treatment, path);
     }
 
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawCoordinatingTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawCoordinatingTest.java
index f5dbf58..19c3f6f 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawCoordinatingTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawCoordinatingTest.java
@@ -92,7 +92,13 @@
         Intent.bindIdGenerator(idGenerator);
 
         // Intent creation should be placed after binding an ID generator
-        input = new PointToPointIntent(appId, selector, treatment, cp1, cp3);
+        input = PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(cp1)
+                .egressPoint(cp3)
+                .build();
         compiled = new PathIntent(appId, selector, treatment, path);
     }
 
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawingTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawingTest.java
index 1861ae5..a1f08ec 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawingTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/phase/WithdrawingTest.java
@@ -90,7 +90,13 @@
         Intent.bindIdGenerator(idGenerator);
 
         // Intent creation should be placed after binding an ID generator
-        input = new PointToPointIntent(appId, selector, treatment, cp1, cp3);
+        input = PointToPointIntent.builder()
+                .appId(appId)
+                .selector(selector)
+                .treatment(treatment)
+                .ingressPoint(cp1)
+                .egressPoint(cp3)
+                .build();
         compiled = new PathIntent(appId, selector, treatment, path);
     }
 
