diff --git a/core/api/src/main/java/org/onosproject/net/DefaultDisjointPath.java b/core/api/src/main/java/org/onosproject/net/DefaultDisjointPath.java
new file mode 100644
index 0000000..4895964
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/DefaultDisjointPath.java
@@ -0,0 +1,100 @@
+/*
+ * 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.net;
+
+import org.onosproject.net.provider.ProviderId;
+
+import java.util.List;
+import java.util.Objects;
+import static com.google.common.collect.ImmutableSet.of;
+
+/**
+ * Default implementation of a network disjoint path pair.
+ */
+public class DefaultDisjointPath extends DefaultPath implements DisjointPath {
+
+    private final DefaultPath path1;
+    private final DefaultPath path2;
+
+    boolean usingPath1 = true;
+
+    /**
+     * Creates a disjoint path pair from two default paths.
+     *
+     * @param providerId provider identity
+     * @param path1      primary path
+     * @param path2      backup path
+     */
+    public DefaultDisjointPath(ProviderId providerId, DefaultPath path1, DefaultPath path2) {
+        super(providerId, path1.links(), path1.cost() + path2.cost());
+        this.path1 = path1;
+        this.path2 = path2;
+    }
+
+    @Override
+    public List<Link> links() {
+        if (usingPath1) {
+            return path1.links();
+        } else {
+            return path2.links();
+        }
+    }
+
+    @Override
+    public double cost() {
+        if (usingPath1) {
+            return path1.cost();
+        }
+        return path2.cost();
+    }
+
+    @Override
+    public Path primary() {
+        return path1;
+    }
+
+    @Override
+    public Path backup() {
+        return path2;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(of(path1, path2), src(), dst());
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultDisjointPath) {
+            final DefaultDisjointPath other = (DefaultDisjointPath) obj;
+            return Objects.equals(this.path1, other.path1) && Objects.equals(this.path2, other.path2);
+        }
+        return false;
+    }
+
+    @Override
+    public boolean useBackup() {
+        if (path2 == null || path2.links() == null) {
+            return false;
+        }
+        usingPath1 = !usingPath1;
+        return true;
+    }
+}
