diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/Compiling.java b/core/net/src/main/java/org/onosproject/net/intent/impl/Compiling.java
index 11f9a28..0673ee4 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/Compiling.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/Compiling.java
@@ -47,14 +47,9 @@
             List<Intent> installables = (current != null) ? current.installables() : null;
             pending.setInstallables(intentManager.compileIntent(pending.intent(), installables));
             return Optional.of(new InstallCoordinating(intentManager, pending, current));
-        } catch (PathNotFoundException e) {
-            log.debug("Path not found for intent {}", pending.intent());
-            // TODO: revisit to implement failure handling
-            return Optional.of(new CompilingFailed(pending)); //FIXME failed state transition
         } catch (IntentException e) {
-            log.warn("Unable to compile intent {} due to:", pending.intent().id(), e);
-            // TODO: revisit to implement failure handling
-            return Optional.of(new CompilingFailed(pending)); //FIXME failed state transition
+            log.debug("Unable to compile intent {} due to: {}", pending.intent(), e);
+            return Optional.of(new CompilingFailed(pending));
         }
     }
 }
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/ConnectivityIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/ConnectivityIntentCompiler.java
index e029c78..c6c3698 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/ConnectivityIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/ConnectivityIntentCompiler.java
@@ -105,7 +105,7 @@
                     }
                 }).toList();
         if (filtered.isEmpty()) {
-            throw new PathNotFoundException("No packet path from " + one + " to " + two);
+            throw new PathNotFoundException(one, two);
         }
         // TODO: let's be more intelligent about this eventually
         return filtered.iterator().next();
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/MultiPointToSinglePointIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/MultiPointToSinglePointIntentCompiler.java
index 6fb94c9..cfb804b 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/MultiPointToSinglePointIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/MultiPointToSinglePointIntentCompiler.java
@@ -101,7 +101,7 @@
     private Path getPath(ConnectPoint one, ConnectPoint two) {
         Set<Path> paths = pathService.getPaths(one.deviceId(), two.deviceId());
         if (paths.isEmpty()) {
-            throw new PathNotFoundException("No path from " + one + " to " + two);
+            throw new PathNotFoundException(one.elementId(), two.elementId());
         }
         // TODO: let's be more intelligent about this eventually
         return paths.iterator().next();
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/OpticalConnectivityIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/OpticalConnectivityIntentCompiler.java
index 4eb78a0..50ae43d 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/OpticalConnectivityIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/OpticalConnectivityIntentCompiler.java
@@ -89,8 +89,7 @@
         Set<Path> paths = topologyService.getPaths(topology, start.deviceId(),
                                                    end.deviceId(), weight);
         if (paths.isEmpty()) {
-            throw new PathNotFoundException("No Optical path found from " +
-                                                    start + " to " + end);
+            throw new PathNotFoundException(start.elementId(), end.elementId());
         }
 
         // TODO: let's be more intelligent about this eventually
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/PathNotFoundException.java b/core/net/src/main/java/org/onosproject/net/intent/impl/PathNotFoundException.java
index 32f1e35..41b1c8f 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/PathNotFoundException.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/PathNotFoundException.java
@@ -15,23 +15,32 @@
  */
 package org.onosproject.net.intent.impl;
 
+import com.google.common.base.MoreObjects;
+import org.onosproject.net.ElementId;
 import org.onosproject.net.intent.IntentException;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * An exception thrown when a path is not found.
  */
 public class PathNotFoundException extends IntentException {
     private static final long serialVersionUID = -2087045731049914733L;
 
-    public PathNotFoundException() {
-        super();
+    private final ElementId source;
+    private final ElementId destination;
+
+    public PathNotFoundException(ElementId source, ElementId destination) {
+        super(String.format("No path from %s to %s", source, destination));
+        this.source = checkNotNull(source);
+        this.destination = checkNotNull(destination);
     }
 
-    public PathNotFoundException(String message) {
-        super(message);
-    }
-
-    public PathNotFoundException(String message, Throwable cause) {
-        super(message, cause);
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("source", source)
+                .add("destination", destination)
+                .toString();
     }
 }
