diff --git a/utils/misc/src/main/java/org/onlab/graph/SRLGGraphSearch.java b/utils/misc/src/main/java/org/onlab/graph/SrlgGraphSearch.java
similarity index 97%
rename from utils/misc/src/main/java/org/onlab/graph/SRLGGraphSearch.java
rename to utils/misc/src/main/java/org/onlab/graph/SrlgGraphSearch.java
index 21f687a..fa3d0dd 100644
--- a/utils/misc/src/main/java/org/onlab/graph/SRLGGraphSearch.java
+++ b/utils/misc/src/main/java/org/onlab/graph/SrlgGraphSearch.java
@@ -31,7 +31,7 @@
  * if one path goes through an edge in risk group 1, the other path will go
  * through no edges in risk group 1.
  */
-public class SRLGGraphSearch<V extends Vertex, E extends Edge<V>>
+public class SrlgGraphSearch<V extends Vertex, E extends Edge<V>>
         extends AbstractGraphPathSearch<V, E> {
 
     static final int ITERATIONS = 100;
@@ -55,7 +55,7 @@
      * @param   groups      the number of disjoint risk groups
      * @param   grouping    map linking edges to integral group assignments
      */
-    public SRLGGraphSearch(int groups, Map<E, Integer> grouping) {
+    public SrlgGraphSearch(int groups, Map<E, Integer> grouping) {
         numGroups = groups;
         riskGrouping = grouping;
     }
@@ -67,7 +67,7 @@
      * @param   grouping    map linking edges to object group assignments,
      *                      with same-group status linked to equality
      */
-    public SRLGGraphSearch(Map<E, Object> grouping) {
+    public SrlgGraphSearch(Map<E, Object> grouping) {
         if (grouping == null) {
             useSuurballe = true;
             return;
diff --git a/utils/misc/src/main/java/org/onlab/graph/TarjanGraphSearch.java b/utils/misc/src/main/java/org/onlab/graph/TarjanGraphSearch.java
index 5bf305e..1c436d9 100644
--- a/utils/misc/src/main/java/org/onlab/graph/TarjanGraphSearch.java
+++ b/utils/misc/src/main/java/org/onlab/graph/TarjanGraphSearch.java
@@ -42,8 +42,8 @@
      * </p>
      */
     @Override
-    public SCCResult<V, E> search(Graph<V, E> graph, EdgeWeight<V, E> weight) {
-        SCCResult<V, E> result = new SCCResult<>(graph);
+    public SccResult<V, E> search(Graph<V, E> graph, EdgeWeight<V, E> weight) {
+        SccResult<V, E> result = new SccResult<>(graph);
         for (V vertex : graph.getVertexes()) {
             VertexData data = result.data(vertex);
             if (data == null) {
@@ -64,7 +64,7 @@
      */
     private VertexData<V> connect(Graph<V, E> graph, V vertex,
                                   EdgeWeight<V, E> weight,
-                                  SCCResult<V, E> result) {
+                                  SccResult<V, E> result) {
         VertexData<V> data = result.addData(vertex);
 
         // Scan through all egress edges of the current vertex.
@@ -99,7 +99,7 @@
     /**
      * Graph search result augmented with SCC vertexData.
      */
-    public static final class SCCResult<V extends Vertex, E extends Edge<V>>
+    public static final class SccResult<V extends Vertex, E extends Edge<V>>
             implements Result {
 
         private final Graph<V, E> graph;
@@ -110,7 +110,7 @@
         private final Map<V, VertexData<V>> vertexData = new HashMap<>();
         private final List<VertexData<V>> visited = new ArrayList<>();
 
-        private SCCResult(Graph<V, E> graph) {
+        private SccResult(Graph<V, E> graph) {
             this.graph = graph;
         }
 
@@ -189,7 +189,7 @@
             return Collections.unmodifiableSet(edges);
         }
 
-        public SCCResult<V, E> build() {
+        public SccResult<V, E> build() {
             clusterVertexes = Collections.unmodifiableList(clusterVertexes);
             clusterEdges = Collections.unmodifiableList(clusterEdges);
             return this;
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);
