diff --git a/core/api/src/main/java/org/onlab/onos/net/intent/constraint/ObstacleConstraint.java b/core/api/src/main/java/org/onlab/onos/net/intent/constraint/ObstacleConstraint.java
new file mode 100644
index 0000000..3ed3fae
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/intent/constraint/ObstacleConstraint.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2014 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.onlab.onos.net.intent.constraint;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableSet;
+import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.Link;
+import org.onlab.onos.net.Path;
+import org.onlab.onos.net.resource.LinkResourceService;
+
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Constraint that evaluates elements not passed through.
+ */
+public class ObstacleConstraint extends BooleanConstraint {
+
+    private final Set<DeviceId> obstacles;
+
+    /**
+     * Creates a new constraint that the specified device are not passed through.
+     * @param obstacles devices not to be passed
+     */
+    public ObstacleConstraint(DeviceId... obstacles) {
+        this.obstacles = ImmutableSet.copyOf(obstacles);
+    }
+
+    @Override
+    public boolean isValid(Link link, LinkResourceService resourceService) {
+        DeviceId src = link.src().deviceId();
+        DeviceId dst = link.dst().deviceId();
+
+        return !(obstacles.contains(src) || obstacles.contains(dst));
+    }
+
+    @Override
+    public boolean validate(Path path, LinkResourceService resourceService) {
+        for (Link link : path.links()) {
+            if (!isValid(link, resourceService)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(obstacles);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (!(obj instanceof ObstacleConstraint)) {
+            return false;
+        }
+
+        final ObstacleConstraint that = (ObstacleConstraint) obj;
+        return Objects.equals(this.obstacles, that.obstacles);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("obstacles", obstacles)
+                .toString();
+    }
+}
diff --git a/core/api/src/test/java/org/onlab/onos/net/intent/constraint/ObstacleConstraintTest.java b/core/api/src/test/java/org/onlab/onos/net/intent/constraint/ObstacleConstraintTest.java
new file mode 100644
index 0000000..65b525b
--- /dev/null
+++ b/core/api/src/test/java/org/onlab/onos/net/intent/constraint/ObstacleConstraintTest.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2014 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.onlab.onos.net.intent.constraint;
+
+/**
+ * Test for constraint of intermediate nodes not passed.
+ */
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.onos.net.DefaultLink;
+import org.onlab.onos.net.DefaultPath;
+import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.Path;
+import org.onlab.onos.net.PortNumber;
+import org.onlab.onos.net.provider.ProviderId;
+import org.onlab.onos.net.resource.LinkResourceService;
+
+import java.util.Arrays;
+
+import static org.easymock.EasyMock.createMock;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.*;
+import static org.onlab.onos.net.DefaultLinkTest.cp;
+import static org.onlab.onos.net.DeviceId.deviceId;
+import static org.onlab.onos.net.Link.Type.DIRECT;
+
+public class ObstacleConstraintTest {
+
+    private static final DeviceId DID1 = deviceId("of:1");
+    private static final DeviceId DID2 = deviceId("of:2");
+    private static final DeviceId DID3 = deviceId("of:3");
+    private static final DeviceId DID4 = deviceId("of:4");
+    private static final PortNumber PN1 = PortNumber.portNumber(1);
+    private static final PortNumber PN2 = PortNumber.portNumber(2);
+    private static final PortNumber PN3 = PortNumber.portNumber(3);
+    private static final PortNumber PN4 = PortNumber.portNumber(4);
+    private static final ProviderId PROVIDER_ID = new ProviderId("of", "foo");
+
+    private LinkResourceService linkResourceService;
+
+    private Path path;
+    private DefaultLink link2;
+    private DefaultLink link1;
+
+    private ObstacleConstraint sut;
+
+    @Before
+    public void setUp() {
+        linkResourceService = createMock(LinkResourceService.class);
+
+        link1 = new DefaultLink(PROVIDER_ID, cp(DID1, PN1), cp(DID2, PN2), DIRECT);
+        link2 = new DefaultLink(PROVIDER_ID, cp(DID2, PN3), cp(DID3, PN4), DIRECT);
+        path = new DefaultPath(PROVIDER_ID, Arrays.asList(link1, link2), 10);
+    }
+
+    @Test
+    public void testEquality() {
+        ObstacleConstraint o1 = new ObstacleConstraint(DID1, DID2, DID3);
+        ObstacleConstraint o2 = new ObstacleConstraint(DID3, DID2, DID1);
+        ObstacleConstraint o3 = new ObstacleConstraint(DID1, DID2);
+        ObstacleConstraint o4 = new ObstacleConstraint(DID2, DID1);
+
+        new EqualsTester()
+                .addEqualityGroup(o1, o2)
+                .addEqualityGroup(o3, o4)
+                .testEquals();
+    }
+
+    /**
+     * Tests the specified path avoids the specified obstacle.
+     */
+    @Test
+    public void testPathNotThroughObstacles() {
+        sut = new ObstacleConstraint(DID4);
+
+        assertThat(sut.validate(path, linkResourceService), is(true));
+    }
+
+    /**
+     * Test the specified path does not avoid the specified obstacle.
+     */
+    @Test
+    public void testPathThroughObstacle() {
+        sut = new ObstacleConstraint(DID1);
+
+        assertThat(sut.validate(path, linkResourceService), is(false));
+    }
+}
