diff --git a/core/api/src/main/java/org/onlab/onos/net/topology/DefaultGraphDescription.java b/core/api/src/main/java/org/onlab/onos/net/topology/DefaultGraphDescription.java
index ca64d1d..5e4d050 100644
--- a/core/api/src/main/java/org/onlab/onos/net/topology/DefaultGraphDescription.java
+++ b/core/api/src/main/java/org/onlab/onos/net/topology/DefaultGraphDescription.java
@@ -15,14 +15,18 @@
  */
 package org.onlab.onos.net.topology;
 
+import static org.slf4j.LoggerFactory.getLogger;
+
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
+
 import org.onlab.onos.net.AbstractDescription;
 import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.Device;
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Link;
 import org.onlab.onos.net.SparseAnnotations;
+import org.slf4j.Logger;
 
 import java.util.Map;
 
@@ -32,6 +36,8 @@
 public class DefaultGraphDescription extends AbstractDescription
         implements GraphDescription {
 
+    private static final Logger log = getLogger(DefaultGraphDescription.class);
+
     private final long nanos;
     private final ImmutableSet<TopologyVertex> vertexes;
     private final ImmutableSet<TopologyEdge> edges;
@@ -87,8 +93,12 @@
     private ImmutableSet<TopologyEdge> buildEdges(Iterable<Link> links) {
         ImmutableSet.Builder<TopologyEdge> edges = ImmutableSet.builder();
         for (Link link : links) {
-            edges.add(new DefaultTopologyEdge(vertexOf(link.src()),
-                                              vertexOf(link.dst()), link));
+            try {
+                edges.add(new DefaultTopologyEdge(vertexOf(link.src()),
+                                                  vertexOf(link.dst()), link));
+            } catch (IllegalArgumentException e) {
+                log.debug("Ignoring {}, missing vertex", link, e);
+            }
         }
         return edges.build();
     }
diff --git a/core/api/src/test/java/org/onlab/onos/net/topology/DefaultGraphDescriptionTest.java b/core/api/src/test/java/org/onlab/onos/net/topology/DefaultGraphDescriptionTest.java
index 4b229d8..5ff93671 100644
--- a/core/api/src/test/java/org/onlab/onos/net/topology/DefaultGraphDescriptionTest.java
+++ b/core/api/src/test/java/org/onlab/onos/net/topology/DefaultGraphDescriptionTest.java
@@ -16,6 +16,7 @@
 package org.onlab.onos.net.topology;
 
 import com.google.common.collect.ImmutableSet;
+
 import org.junit.Test;
 import org.onlab.onos.net.DefaultDevice;
 import org.onlab.onos.net.Device;
@@ -47,9 +48,13 @@
         assertEquals("incorrect edge count", 2, desc.edges().size());
     }
 
-    @Test(expected = IllegalArgumentException.class)
+    @Test
     public void missingVertex() {
-        new DefaultGraphDescription(4321L, ImmutableSet.of(DEV1, DEV3),
-                                    ImmutableSet.of(L1, L2));
+        GraphDescription desc = new DefaultGraphDescription(4321L,
+                                                            ImmutableSet.of(DEV1, DEV3),
+                                                            ImmutableSet.of(L1, L2));
+        assertEquals("incorrect time", 4321L, desc.timestamp());
+        assertEquals("incorrect vertex count", 2, desc.vertexes().size());
+        assertEquals("incorrect edge count", 0, desc.edges().size());
     }
 }
diff --git a/core/api/src/test/java/org/onlab/onos/net/topology/DefaultTopologyEdgeTest.java b/core/api/src/test/java/org/onlab/onos/net/topology/DefaultTopologyEdgeTest.java
index bf34e1c..9984315 100644
--- a/core/api/src/test/java/org/onlab/onos/net/topology/DefaultTopologyEdgeTest.java
+++ b/core/api/src/test/java/org/onlab/onos/net/topology/DefaultTopologyEdgeTest.java
@@ -48,7 +48,9 @@
 
     static final ProviderId PID = new ProviderId("foo", "bar");
 
+    /** D1:P1 -> D2:P1. */
     static final Link L1 = new DefaultLink(PID, CP1, CP2, Link.Type.INDIRECT);
+    /** D2:P1 -> D1:P2. */
     static final Link L2 = new DefaultLink(PID, CP3, CP4, Link.Type.INDIRECT);
 
     @Test
diff --git a/core/net/src/main/java/org/onlab/onos/net/topology/impl/DefaultTopologyProvider.java b/core/net/src/main/java/org/onlab/onos/net/topology/impl/DefaultTopologyProvider.java
index a3e0d6c..214fdff 100644
--- a/core/net/src/main/java/org/onlab/onos/net/topology/impl/DefaultTopologyProvider.java
+++ b/core/net/src/main/java/org/onlab/onos/net/topology/impl/DefaultTopologyProvider.java
@@ -203,6 +203,7 @@
                 buildTopology(reasons);
             } catch (Exception e) {
                 log.warn("Unable to compute topology due to: {}", e.getMessage());
+                log.debug("Unable to compute topology", e);
             }
         }
     }
