diff --git a/utils/misc/src/test/java/org/onlab/graph/SRLGGraphSearchTest.java b/utils/misc/src/test/java/org/onlab/graph/SrlgGraphSearchTest.java
similarity index 93%
rename from utils/misc/src/test/java/org/onlab/graph/SRLGGraphSearchTest.java
rename to utils/misc/src/test/java/org/onlab/graph/SrlgGraphSearchTest.java
index 8bfd270..26d5036 100644
--- a/utils/misc/src/test/java/org/onlab/graph/SRLGGraphSearchTest.java
+++ b/utils/misc/src/test/java/org/onlab/graph/SrlgGraphSearchTest.java
@@ -31,11 +31,11 @@
 /**
  * Test of the Suurballe backup path algorithm.
  */
-public class SRLGGraphSearchTest extends BreadthFirstSearchTest {
+public class SrlgGraphSearchTest extends BreadthFirstSearchTest {
 
     @Override
     protected AbstractGraphPathSearch<TestVertex, TestEdge> graphSearch() {
-        return new SRLGGraphSearch<>(null);
+        return new SrlgGraphSearch<>(null);
     }
 
     public void setDefaultWeights() {
@@ -64,7 +64,7 @@
         riskProfile.put(bC, 0);
         riskProfile.put(aD, 1);
         riskProfile.put(dC, 1);
-        SRLGGraphSearch<TestVertex, TestEdge> search = new SRLGGraphSearch<>(2, riskProfile);
+        SrlgGraphSearch<TestVertex, TestEdge> search = new SrlgGraphSearch<>(2, riskProfile);
         Set<Path<TestVertex, TestEdge>> paths = search.search(graph, A, C, weight, ALL_PATHS).paths();
         System.out.println("\n\n\n" + paths + "\n\n\n");
         assertEquals("one disjoint path pair found", 1, paths.size());
@@ -105,7 +105,7 @@
         riskProfile.put(dC, 1);
         riskProfile.put(cE, 2);
         riskProfile.put(bE, 3);
-        SRLGGraphSearch<TestVertex, TestEdge> search = new SRLGGraphSearch<>(4, riskProfile);
+        SrlgGraphSearch<TestVertex, TestEdge> search = new SrlgGraphSearch<>(4, riskProfile);
         search.search(graph, A, E, weight, ALL_PATHS).paths();
     }
 
@@ -127,7 +127,7 @@
         riskProfile.put(dE, 3);
         riskProfile.put(aC, 4);
         riskProfile.put(cE, 5);
-        SRLGGraphSearch<TestVertex, TestEdge> search = new SRLGGraphSearch<>(6, riskProfile);
+        SrlgGraphSearch<TestVertex, TestEdge> search = new SrlgGraphSearch<>(6, riskProfile);
         Set<Path<TestVertex, TestEdge>> paths = search.search(graph, A, E, weight, ALL_PATHS).paths();
         assertTrue("> one disjoint path pair found", paths.size() >= 1);
         checkIsDisjoint(paths.iterator().next(), riskProfile);
@@ -147,7 +147,7 @@
         riskProfile.put(bC, 0);
         riskProfile.put(aD, 1);
         riskProfile.put(dC, 0);
-        SRLGGraphSearch<TestVertex, TestEdge> search = new SRLGGraphSearch<>(2, riskProfile);
+        SrlgGraphSearch<TestVertex, TestEdge> search = new SrlgGraphSearch<>(2, riskProfile);
         Set<Path<TestVertex, TestEdge>> paths = search.search(graph, A, C, weight, ALL_PATHS).paths();
         System.out.println(paths);
         assertTrue("no disjoint path pairs found", paths.size() == 0);
@@ -167,7 +167,7 @@
         riskProfile.put(bC, 0);
         riskProfile.put(aD, 1);
         riskProfile.put(dC, 0);
-        SRLGGraphSearch<TestVertex, TestEdge> search = new SRLGGraphSearch<>(2, riskProfile);
+        SrlgGraphSearch<TestVertex, TestEdge> search = new SrlgGraphSearch<>(2, riskProfile);
         Set<Path<TestVertex, TestEdge>> paths = search.search(graph, A, E, weight, ALL_PATHS).paths();
         assertTrue("no disjoint path pairs found", paths.size() == 0);
     }
diff --git a/utils/misc/src/test/java/org/onlab/graph/TarjanGraphSearchTest.java b/utils/misc/src/test/java/org/onlab/graph/TarjanGraphSearchTest.java
index 624c578..40f9051 100644
--- a/utils/misc/src/test/java/org/onlab/graph/TarjanGraphSearchTest.java
+++ b/utils/misc/src/test/java/org/onlab/graph/TarjanGraphSearchTest.java
@@ -19,20 +19,20 @@
 
 import static com.google.common.collect.ImmutableSet.of;
 import static org.junit.Assert.assertEquals;
-import static org.onlab.graph.TarjanGraphSearch.SCCResult;
+import static org.onlab.graph.TarjanGraphSearch.SccResult;
 
 /**
  * Tarjan graph search tests.
  */
 public class TarjanGraphSearchTest extends GraphTest {
 
-    private void validate(SCCResult<TestVertex, TestEdge> result, int cc) {
+    private void validate(SccResult<TestVertex, TestEdge> result, int cc) {
         System.out.println("Cluster count: " + result.clusterVertexes().size());
         System.out.println("Clusters: " + result.clusterVertexes());
         assertEquals("incorrect cluster count", cc, result.clusterCount());
     }
 
-    private void validate(SCCResult<TestVertex, TestEdge> result,
+    private void validate(SccResult<TestVertex, TestEdge> result,
                           int i, int vc, int ec) {
         assertEquals("incorrect cluster count", vc, result.clusterVertexes().get(i).size());
         assertEquals("incorrect edge count", ec, result.clusterEdges().get(i).size());
@@ -42,7 +42,7 @@
     public void basic() {
         graph = new AdjacencyListsGraph<>(vertexes(), edges());
         TarjanGraphSearch<TestVertex, TestEdge> gs = new TarjanGraphSearch<>();
-        SCCResult<TestVertex, TestEdge> result = gs.search(graph, null);
+        SccResult<TestVertex, TestEdge> result = gs.search(graph, null);
         validate(result, 6);
     }
 
@@ -59,7 +59,7 @@
                                              new TestEdge(H, A, 1)));
 
         TarjanGraphSearch<TestVertex, TestEdge> gs = new TarjanGraphSearch<>();
-        SCCResult<TestVertex, TestEdge> result = gs.search(graph, null);
+        SccResult<TestVertex, TestEdge> result = gs.search(graph, null);
         validate(result, 1);
         validate(result, 0, 8, 8);
     }
@@ -76,7 +76,7 @@
                                              new TestEdge(G, H, 1),
                                              new TestEdge(H, E, 1)));
         TarjanGraphSearch<TestVertex, TestEdge> gs = new TarjanGraphSearch<>();
-        SCCResult<TestVertex, TestEdge> result = gs.search(graph, null);
+        SccResult<TestVertex, TestEdge> result = gs.search(graph, null);
         validate(result, 2);
         validate(result, 0, 4, 4);
         validate(result, 1, 4, 4);
@@ -95,7 +95,7 @@
                                              new TestEdge(H, E, 1),
                                              new TestEdge(B, E, 1)));
         TarjanGraphSearch<TestVertex, TestEdge> gs = new TarjanGraphSearch<>();
-        SCCResult<TestVertex, TestEdge> result = gs.search(graph, null);
+        SccResult<TestVertex, TestEdge> result = gs.search(graph, null);
         validate(result, 2);
         validate(result, 0, 4, 4);
         validate(result, 1, 4, 4);
@@ -116,7 +116,7 @@
                                              new TestEdge(E, B, -1)));
 
         TarjanGraphSearch<TestVertex, TestEdge> gs = new TarjanGraphSearch<>();
-        SCCResult<TestVertex, TestEdge> result = gs.search(graph, weight);
+        SccResult<TestVertex, TestEdge> result = gs.search(graph, weight);
         validate(result, 2);
         validate(result, 0, 4, 4);
         validate(result, 1, 4, 4);
diff --git a/utils/misc/src/test/java/org/onlab/util/HexStringTest.java b/utils/misc/src/test/java/org/onlab/util/HexStringTest.java
index e04e29a..f4aadd1 100644
--- a/utils/misc/src/test/java/org/onlab/util/HexStringTest.java
+++ b/utils/misc/src/test/java/org/onlab/util/HexStringTest.java
@@ -47,7 +47,7 @@
     }
 
     @Test
-    public void testToLongMSB() {
+    public void testToLongMsb() {
         String dpidStr = "ca:7c:5e:d1:64:7a:95:9b";
         long valid = -3856102927509056101L;
         long testLong = HexString.toLong(dpidStr);
