diff --git a/core/api/src/main/java/org/onosproject/net/AnnotationKeys.java b/core/api/src/main/java/org/onosproject/net/AnnotationKeys.java
index 8c5fb79..4f81e92 100644
--- a/core/api/src/main/java/org/onosproject/net/AnnotationKeys.java
+++ b/core/api/src/main/java/org/onosproject/net/AnnotationKeys.java
@@ -25,7 +25,6 @@
  */
 public final class AnnotationKeys {
 
-
     // Prohibit instantiation
     private AnnotationKeys() {
     }
@@ -81,6 +80,12 @@
     public static final String DURABLE = "durable";
 
     /**
+     * Annotation key for link metric; used by
+     * {@link org.onosproject.net.topology.MetricLinkWeight} function.
+     */
+    public static final String METRIC = "metric";
+
+    /**
      * Annotation key for latency.
      *
      * @deprecated since Cardinal
@@ -112,8 +117,14 @@
      */
     public static final String ROUTER_ID = "routerId";
 
+    /**
+     * Annotation key for the static lambda.
+     */
     public static final String STATIC_LAMBDA = "staticLambda";
 
+    /**
+     * Annotation key for the static port.
+     */
     public static final String STATIC_PORT = "staticPort";
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/net/config/basics/BasicLinkConfig.java b/core/api/src/main/java/org/onosproject/net/config/basics/BasicLinkConfig.java
index e962110..ed807b8 100644
--- a/core/api/src/main/java/org/onosproject/net/config/basics/BasicLinkConfig.java
+++ b/core/api/src/main/java/org/onosproject/net/config/basics/BasicLinkConfig.java
@@ -15,22 +15,32 @@
  */
 package org.onosproject.net.config.basics;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import org.onosproject.net.Link;
 import org.onosproject.net.LinkKey;
-import com.fasterxml.jackson.databind.JsonNode;
 
 import java.time.Duration;
 
+import static org.onosproject.net.config.Config.FieldPresence.OPTIONAL;
+
 /**
  * Basic configuration for network infrastructure link.
  */
 public class BasicLinkConfig extends AllowedEntityConfig<LinkKey> {
 
     public static final String TYPE = "type";
+    public static final String METRIC = "metric";
     public static final String LATENCY = "latency";
     public static final String BANDWIDTH = "bandwidth";
     public static final String IS_DURABLE = "durable";
 
+    @Override
+    public boolean isValid() {
+        return hasOnlyFields(TYPE, METRIC, LATENCY, BANDWIDTH, IS_DURABLE) &&
+                isNumber(METRIC, OPTIONAL) && isNumber(LATENCY, OPTIONAL) &&
+                isNumber(BANDWIDTH, OPTIONAL);
+    }
+
     /**
      * Returns the link type.
      *
@@ -51,6 +61,27 @@
     }
 
     /**
+     * Returns link metric value for use by
+     * {@link org.onosproject.net.topology.MetricLinkWeight} function.
+     *
+     * @return link metric; -1 if not set
+     */
+    public double metric() {
+        return get(METRIC, -1);
+    }
+
+    /**
+     * Sets the link metric for use by
+     * {@link org.onosproject.net.topology.MetricLinkWeight} function.
+     *
+     * @param metric new metric; null to clear
+     * @return self
+     */
+    public BasicLinkConfig metric(Double metric) {
+        return (BasicLinkConfig) setOrClear(METRIC, metric);
+    }
+
+    /**
      * Returns link latency in terms of nanos.
      *
      * @return link latency; -1 if not set
diff --git a/core/api/src/main/java/org/onosproject/net/topology/GeoDistanceLinkWeight.java b/core/api/src/main/java/org/onosproject/net/topology/GeoDistanceLinkWeight.java
new file mode 100644
index 0000000..c966902
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/topology/GeoDistanceLinkWeight.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2014-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.topology;
+
+import org.onlab.util.GeoLocation;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.Annotations;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.device.DeviceService;
+
+import static java.lang.Double.MAX_VALUE;
+
+/**
+ * Link weight for measuring link cost using the geo distance between link
+ * vertices as determined by the element longitude/latitude annotation.
+ */
+public class GeoDistanceLinkWeight implements LinkWeight {
+
+    private static final double MAX_KM = 40_075 / 2.0;
+
+    private final DeviceService deviceService;
+
+    /**
+     * Creates a new link-weight with access to the specified device service.
+     *
+     * @param deviceService device service reference
+     */
+    public GeoDistanceLinkWeight(DeviceService deviceService) {
+        this.deviceService = deviceService;
+    }
+
+    @Override
+    public double weight(TopologyEdge edge) {
+        GeoLocation src = getLocation(edge.link().src().deviceId());
+        GeoLocation dst = getLocation(edge.link().dst().deviceId());
+        return src != null && dst != null ? src.kilometersTo(dst) : MAX_KM;
+    }
+
+    private GeoLocation getLocation(DeviceId deviceId) {
+        Device d = deviceService.getDevice(deviceId);
+        Annotations a = d != null ? d.annotations() : null;
+        double latitude = getDouble(a, AnnotationKeys.LATITUDE);
+        double longitude = getDouble(a, AnnotationKeys.LONGITUDE);
+        return latitude == MAX_VALUE || longitude == MAX_VALUE ? null :
+                new GeoLocation(latitude, longitude);
+    }
+
+    private double getDouble(Annotations a, String key) {
+        String value = a != null ? a.value(key) : null;
+        try {
+            return value != null ? Double.parseDouble(value) : MAX_VALUE;
+        } catch (NumberFormatException e) {
+            return MAX_VALUE;
+        }
+    }
+}
+
diff --git a/core/api/src/main/java/org/onosproject/net/topology/HopCountLinkWeight.java b/core/api/src/main/java/org/onosproject/net/topology/HopCountLinkWeight.java
new file mode 100644
index 0000000..c557016
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/topology/HopCountLinkWeight.java
@@ -0,0 +1,36 @@
+package org.onosproject.net.topology;
+
+import static org.onosproject.net.Link.State.ACTIVE;
+import static org.onosproject.net.Link.Type.INDIRECT;
+
+/**
+ * Link weight for measuring link cost as hop count with indirect links
+ * being as expensive as traversing the entire graph to assume the worst.
+ */
+public class HopCountLinkWeight implements LinkWeight {
+    private final int indirectLinkCost;
+
+    /**
+     * Creates a new hop-count weight.
+     */
+    public HopCountLinkWeight() {
+        this.indirectLinkCost = Short.MAX_VALUE;
+    }
+
+    /**
+     * Creates a new hop-count weight with the specified cost of indirect links.
+     */
+    public HopCountLinkWeight(int indirectLinkCost) {
+        this.indirectLinkCost = indirectLinkCost;
+    }
+
+    @Override
+    public double weight(TopologyEdge edge) {
+        // To force preference to use direct paths first, make indirect
+        // links as expensive as the linear vertex traversal.
+        return edge.link().state() ==
+                ACTIVE ? (edge.link().type() ==
+                INDIRECT ? indirectLinkCost : 1) : -1;
+    }
+}
+
diff --git a/core/api/src/main/java/org/onosproject/net/topology/MetricLinkWeight.java b/core/api/src/main/java/org/onosproject/net/topology/MetricLinkWeight.java
new file mode 100644
index 0000000..8463e08
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/topology/MetricLinkWeight.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2014-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.topology;
+
+import org.onosproject.net.AnnotationKeys;
+
+/**
+ * Link weight for measuring link cost using the link metric annotation.
+ */
+public class MetricLinkWeight implements LinkWeight {
+
+    @Override
+    public double weight(TopologyEdge edge) {
+        String v = edge.link().annotations().value(AnnotationKeys.METRIC);
+        try {
+            return v != null ? Double.parseDouble(v) : 1;
+        } catch (NumberFormatException e) {
+            return 1;
+        }
+    }
+}
+
diff --git a/core/api/src/main/java/org/onosproject/net/topology/PathAdminService.java b/core/api/src/main/java/org/onosproject/net/topology/PathAdminService.java
new file mode 100644
index 0000000..9d077e1
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/topology/PathAdminService.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2014-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.topology;
+
+import org.onlab.graph.GraphPathSearch;
+
+/**
+ * Provides administrative abilities to tailor the path service behaviours.
+ */
+public interface PathAdminService {
+
+    /**
+     * Sets the specified link-weight function to be used as a default.
+     * If null is specified, the builtin default hop-count link-weight will be
+     * used.
+     *
+     * @param linkWeight default link-weight function
+     */
+    void setDefaultLinkWeight(LinkWeight linkWeight);
+
+    /**
+     * Sets the specified graph path search algorightm to be used as a default.
+     * If null is specified, the builtin default all-shortest-paths Dijkstra
+     * algorithm will be used.
+     *
+     * @param graphPathSearch default graph path search algorithm
+     */
+    void setDefaultGraphPathSearch(GraphPathSearch<TopologyVertex, TopologyEdge> graphPathSearch);
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/topology/PathService.java b/core/api/src/main/java/org/onosproject/net/topology/PathService.java
index 0bd4d75..3895407 100644
--- a/core/api/src/main/java/org/onosproject/net/topology/PathService.java
+++ b/core/api/src/main/java/org/onosproject/net/topology/PathService.java
@@ -30,8 +30,9 @@
 public interface PathService {
 
     /**
-     * Returns the set of all shortest paths, precomputed in terms of hop-count,
-     * between the specified source and destination elements.
+     * Returns the set of all shortest paths between the specified source and
+     * destination elements. The path is computed using the default edge-weight
+     * function, which by default is hop-count.
      *
      * @param src source element
      * @param dst destination element
@@ -40,9 +41,9 @@
     Set<Path> getPaths(ElementId src, ElementId dst);
 
     /**
-     * Returns the set of all shortest paths, computed using the supplied
-     * edge-weight entity, between the specified source and destination
-     * network elements.
+     * Returns the set of all shortest paths between the specified source and
+     * destination network elements.  The path is computed using the supplied
+     * edge-weight function.
      *
      * @param src    source element
      * @param dst    destination element
@@ -52,8 +53,9 @@
     Set<Path> getPaths(ElementId src, ElementId dst, LinkWeight weight);
 
     /**
-     * Returns the set of all disjoint shortest path pairs, precomputed in terms of hop-count,
-     * between the specified source and destination devices.
+     * Returns the set of all disjoint shortest path pairs between the
+     * specified source and destination elements. The path is computed using
+     * the default edge-weight function, which by default is hop-count.
      *
      * @param src source device
      * @param dst destination device
@@ -62,8 +64,9 @@
     Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst);
 
     /**
-     * Returns the set of all disjoint shortest path pairs, computed using the supplied
-     * edge-weight entity, between the specified source and destination devices.
+     * Returns the set of all disjoint shortest path pairs between the
+     * specified source and destination elements. The path is computed using
+     * the supplied edge-weight function.
      *
      * @param src    source device
      * @param dst    destination device
@@ -74,8 +77,10 @@
                                        LinkWeight weight);
 
     /**
-     * Returns the set of all disjoint shortest path pairs, precomputed in terms of hop-count,
-     * between the specified source and destination devices.
+     * Returns the set of all disjoint shortest path pairs between the
+     * specified source and destination elements and taking into consideration
+     * the provided risk profile. The path is computed using the default
+     * edge-weight function, which by default is hop-count.
      *
      * @param src         source device
      * @param dst         destination device
@@ -86,8 +91,10 @@
                                        Map<Link, Object> riskProfile);
 
     /**
-     * Returns the set of all disjoint shortest path pairs, precomputed in terms of hop-count,
-     * between the specified source and destination devices.
+     * Returns the set of all disjoint shortest path pairs between the
+     * specified source and destination elements and taking into consideration
+     * the provided risk profile. The path is computed using the supplied
+     * edge-weight function.
      *
      * @param src         source device
      * @param dst         destination device
@@ -96,6 +103,7 @@
      * @return set of all shortest paths between the two devices
      */
     Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst,
-                                       LinkWeight weight, Map<Link, Object> riskProfile);
+                                       LinkWeight weight,
+                                       Map<Link, Object> riskProfile);
 
 }
