diff --git a/core/api/src/test/java/org/onlab/onos/net/intent/HostToHostIntentTest.java b/core/api/src/test/java/org/onlab/onos/net/intent/HostToHostIntentTest.java
index a6ce3dd..d1405b9 100644
--- a/core/api/src/test/java/org/onlab/onos/net/intent/HostToHostIntentTest.java
+++ b/core/api/src/test/java/org/onlab/onos/net/intent/HostToHostIntentTest.java
@@ -15,13 +15,17 @@
  */
 package org.onlab.onos.net.intent;
 
-import org.junit.Ignore;
 import org.junit.Test;
+import org.onlab.onos.TestApplicationId;
+import org.onlab.onos.core.ApplicationId;
 import org.onlab.onos.net.HostId;
 import org.onlab.onos.net.flow.TrafficSelector;
 
 import com.google.common.testing.EqualsTester;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 import static org.onlab.onos.net.NetTestTools.APP_ID;
 import static org.onlab.onos.net.NetTestTools.hid;
@@ -36,6 +40,28 @@
     private final HostId id2 = hid("12:34:56:78:92:ab/1");
     private final HostId id3 = hid("12:34:56:78:93:ab/1");
 
+    private static final ApplicationId APPID = new TestApplicationId("foo");
+
+    private HostToHostIntent makeHostToHost(HostId one, HostId two) {
+        return new HostToHostIntent(APPID, one, two, selector, treatment);
+    }
+
+    /**
+     * Tests the equals() method where two HostToHostIntents have references
+     * to the same hosts. These should compare equal.
+     */
+    @Test
+    public void testSameEquals() {
+
+        HostId one = hid("00:00:00:00:00:01/-1");
+        HostId two = hid("00:00:00:00:00:02/-1");
+        HostToHostIntent i1 = makeHostToHost(one, two);
+        HostToHostIntent i2 = makeHostToHost(one, two);
+
+        assertThat(i1.one(), is(equalTo(i2.one())));
+        assertThat(i1.two(), is(equalTo(i2.two())));
+    }
+
     /**
      * Checks that the HostToHostIntent class is immutable.
      */
@@ -47,18 +73,14 @@
     /**
      * Tests equals(), hashCode() and toString() methods.
      */
-    @Test @Ignore("Equality is based on ids, which will be different")
+    @Test
     public void testEquals() {
         final HostToHostIntent intent1 = new HostToHostIntent(APP_ID,
                 id1,
                 id2,
                 selector,
                 treatment);
-        final HostToHostIntent sameAsIntent1 = new HostToHostIntent(APP_ID,
-                id1,
-                id2,
-                selector,
-                treatment);
+
         final HostToHostIntent intent2 = new HostToHostIntent(APP_ID,
                 id2,
                 id3,
@@ -66,7 +88,7 @@
                 treatment);
 
         new EqualsTester()
-                .addEqualityGroup(intent1, sameAsIntent1)
+                .addEqualityGroup(intent1)
                 .addEqualityGroup(intent2)
                 .testEquals();
     }
diff --git a/core/api/src/test/java/org/onlab/onos/net/intent/IntentTest.java b/core/api/src/test/java/org/onlab/onos/net/intent/IntentTest.java
index ab805bf..2f675b7 100644
--- a/core/api/src/test/java/org/onlab/onos/net/intent/IntentTest.java
+++ b/core/api/src/test/java/org/onlab/onos/net/intent/IntentTest.java
@@ -15,15 +15,10 @@
  */
 package org.onlab.onos.net.intent;
 
-import org.junit.Ignore;
-import org.junit.Test;
-
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
 
-import static org.junit.Assert.*;
-
 /**
  * Base facilities to test various intent tests.
  */
@@ -39,24 +34,6 @@
         return new HashSet<>(Arrays.asList(items));
     }
 
-    @Test @Ignore("Equality is based on ids, which will be different")
-    public void equalsAndHashCode() {
-        Intent one = createOne();
-        Intent like = createOne();
-        Intent another = createAnother();
-
-        assertTrue("should be equal", one.equals(like));
-        assertEquals("incorrect hashCode", one.hashCode(), like.hashCode());
-        assertFalse("should not be equal", one.equals(another));
-    }
-
-    //@Test FIXME
-    public void testToString() {
-        Intent one = createOne();
-        Intent like = createOne();
-        assertEquals("incorrect toString", one.toString(), like.toString());
-    }
-
     /**
      * Creates a new intent, but always a like intent, i.e. all instances will
      * be equal, but should not be the same.
diff --git a/core/api/src/test/java/org/onlab/onos/net/intent/LinkCollectionIntentTest.java b/core/api/src/test/java/org/onlab/onos/net/intent/LinkCollectionIntentTest.java
index 4b47734..f785196 100644
--- a/core/api/src/test/java/org/onlab/onos/net/intent/LinkCollectionIntentTest.java
+++ b/core/api/src/test/java/org/onlab/onos/net/intent/LinkCollectionIntentTest.java
@@ -20,7 +20,6 @@
 import java.util.List;
 import java.util.Set;
 
-import org.junit.Ignore;
 import org.junit.Test;
 import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.Link;
@@ -61,7 +60,7 @@
     /**
      * Tests equals(), hashCode() and toString() methods.
      */
-    @Test @Ignore("Equality is based on ids, which will be different")
+    @Test
     public void testEquals() {
 
         final HashSet<Link> links1 = new HashSet<>();
@@ -72,12 +71,6 @@
                         treatment,
                         links1,
                         egress);
-        final LinkCollectionIntent sameAsCollectionIntent1 =
-        new LinkCollectionIntent(APP_ID,
-                selector,
-                treatment,
-                links1,
-                egress);
 
         final HashSet<Link> links2 = new HashSet<>();
         links2.add(link("src", 1, "dst", 3));
@@ -89,7 +82,7 @@
                         egress);
 
         new EqualsTester()
-                .addEqualityGroup(collectionIntent1, sameAsCollectionIntent1)
+                .addEqualityGroup(collectionIntent1)
                 .addEqualityGroup(collectionIntent2)
                 .testEquals();
     }
diff --git a/core/api/src/test/java/org/onlab/onos/net/intent/MultiPointToSinglePointIntentTest.java b/core/api/src/test/java/org/onlab/onos/net/intent/MultiPointToSinglePointIntentTest.java
index 4ab3699..fd751ec 100644
--- a/core/api/src/test/java/org/onlab/onos/net/intent/MultiPointToSinglePointIntentTest.java
+++ b/core/api/src/test/java/org/onlab/onos/net/intent/MultiPointToSinglePointIntentTest.java
@@ -18,12 +18,21 @@
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 /**
  * Suite of tests of the multi-to-single point intent descriptor.
  */
 public class MultiPointToSinglePointIntentTest extends ConnectivityIntentTest {
 
+    /**
+     * Checks that the MultiPointToSinglePointIntent class is immutable.
+     */
+    @Test
+    public void checkImmutability() {
+        assertThatClassIsImmutable(MultiPointToSinglePointIntent.class);
+    }
+
     @Test
     public void basics() {
         MultiPointToSinglePointIntent intent = createOne();
diff --git a/core/api/src/test/java/org/onlab/onos/net/intent/PointToPointIntentTest.java b/core/api/src/test/java/org/onlab/onos/net/intent/PointToPointIntentTest.java
index 67c728e..3fbd2b3 100644
--- a/core/api/src/test/java/org/onlab/onos/net/intent/PointToPointIntentTest.java
+++ b/core/api/src/test/java/org/onlab/onos/net/intent/PointToPointIntentTest.java
@@ -18,12 +18,21 @@
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutableBaseClass;
 
 /**
  * Suite of tests of the point-to-point intent descriptor.
  */
 public class PointToPointIntentTest extends ConnectivityIntentTest {
 
+    /**
+     * Checks that the MultiPointToSinglePointIntent class is immutable.
+     */
+    @Test
+    public void checkImmutability() {
+        assertThatClassIsImmutableBaseClass(PointToPointIntent.class);
+    }
+
     @Test
     public void basics() {
         PointToPointIntent intent = createOne();
