initial attempt of Commons-Graph modularization
diff --git a/api/pom.xml b/api/pom.xml
new file mode 100644
index 0000000..c21cf89
--- /dev/null
+++ b/api/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-graph</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>commons-graph-api</artifactId>
+
+  <name>Apache Commons Graph - APIs</name>
+  <description>The Apache Commons Graph base APIs.</description>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${basedir}/../</directory>
+        <targetPath>META-INF</targetPath>
+        <includes>
+          <include>NOTICE.txt</include>
+          <include>LICENSE.txt</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/src/main/java/org/apache/commons/graph/DirectedGraph.java b/api/src/main/java/org/apache/commons/graph/DirectedGraph.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/DirectedGraph.java
rename to api/src/main/java/org/apache/commons/graph/DirectedGraph.java
diff --git a/src/main/java/org/apache/commons/graph/Graph.java b/api/src/main/java/org/apache/commons/graph/Graph.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/Graph.java
rename to api/src/main/java/org/apache/commons/graph/Graph.java
diff --git a/src/main/java/org/apache/commons/graph/GraphException.java b/api/src/main/java/org/apache/commons/graph/GraphException.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/GraphException.java
rename to api/src/main/java/org/apache/commons/graph/GraphException.java
diff --git a/api/src/main/java/org/apache/commons/graph/Graphs.java b/api/src/main/java/org/apache/commons/graph/Graphs.java
new file mode 100644
index 0000000..a5baf37
--- /dev/null
+++ b/api/src/main/java/org/apache/commons/graph/Graphs.java
@@ -0,0 +1,175 @@
+package org.apache.commons.graph;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import static org.apache.commons.graph.utils.Assertions.checkNotNull;
+
+import org.apache.commons.graph.builder.DefaultLinkedConnectionBuilder;
+import org.apache.commons.graph.builder.LinkedConnectionBuilder;
+
+/**
+ * The Apache Commons Graph package is a toolkit for managing graphs and graph based data structures.
+ */
+public final class Graphs
+{
+
+    /**
+     * Allows populate the given {@link MutableGraph}.
+     *
+     * @param <V> the Graph vertices type
+     * @param <E> the Graph edges type
+     * @param <G> the Graph type
+     * @param graph the graph has to be populated
+     * @return the builder to configure vertices connection
+     */
+    public static <V, E, G extends MutableGraph<V, E>> LinkedConnectionBuilder<V, E, G> populate( final G graph )
+    {
+        G checkedGraph = checkNotNull( graph, "Impossible to configure null Graph." );
+        return new DefaultLinkedConnectionBuilder<V, E, G>( checkedGraph );
+    }
+
+    /**
+     * Returns a synchronized (thread-safe) {@link Graph} backed by the specified Graph.
+     *
+     * It is imperative that the user manually synchronize on the returned graph when iterating over iterable collections:
+     * <pre>
+     *     Graph syncGraph = synchronize( graph );
+     *         ...
+     *     synchronized(syncGraph) {
+     *         for ( Vertex v : g.getVertices() ) // Must be in synchronized block
+     *         {
+     *            foo( v )
+     *         }
+     *   }
+     * </pre>
+     *
+     * Failure to follow this advice may result in non-deterministic behavior.
+     *
+     * The returned {@link Graph} will be serializable if the specified {@link Graph} is serializable.
+     *
+     * @param <V> the Graph vertices type
+     * @param <E> the Graph edges type
+     * @param graph the input {@link Graph}
+     * @return the syncronyzed graph
+     */
+    public static <V, E> Graph<V, E> synchronize( final Graph<V, E> graph )
+    {
+        Graph<V, E> checkedGraph = checkNotNull( graph, "Impossible to synchronize null Graph." );
+        return new SynchronizedGraph<V, E>( checkedGraph );
+    }
+
+    /**
+     * Returns a synchronized (thread-safe) {@link DirectedGraph} backed by the specified Graph.
+     *
+     * It is imperative that the user manually synchronize on the returned graph when iterating over iterable collections:
+     * <pre>
+     *     Graph syncGraph = synchronize( graph );
+     *         ...
+     *     synchronized(syncGraph) {
+     *         for ( Vertex v : g.getVertices() ) // Must be in synchronized block
+     *         {
+     *            foo( v )
+     *         }
+     *   }
+     * </pre>
+     *
+     * Failure to follow this advice may result in non-deterministic behavior.
+     *
+     * The returned {@link Graph} will be serializable if the specified {@link Graph} is serializable.
+     *
+     * @param <V> the Graph vertices type
+     * @param <E> the Graph edges type
+     * @param graph the input {@link Graph}
+     * @return the syncronyzed graph
+     */
+    public static <V, E> DirectedGraph<V, E> synchronize( final DirectedGraph<V, E> graph )
+    {
+        return new SynchronizedDirectedGraph<V, E>( graph );
+    }
+
+    /**
+     * Returns a synchronized (thread-safe) {@link UndirectedGraph} backed by the specified Graph.
+     *
+     * It is imperative that the user manually synchronize on the returned graph when iterating over iterable collections:
+     * <pre>
+     *     Graph syncGraph = synchronize( graph );
+     *         ...
+     *     synchronized(syncGraph) {
+     *         for ( Vertex v : g.getVertices() ) // Must be in synchronized block
+     *         {
+     *            foo( v )
+     *         }
+     *   }
+     * </pre>
+     *
+     * Failure to follow this advice may result in non-deterministic behavior.
+     *
+     * The returned {@link Graph} will be serializable if the specified {@link Graph} is serializable.
+     *
+     * @param <V> the Graph vertices type
+     * @param <E> the Graph edges type
+     * @param graph the input {@link Graph}
+     * @return the syncronyzed graph
+     */
+    public static <V, E> Graph<V, E> synchronize( final UndirectedGraph<V, E> graph )
+    {
+        UndirectedGraph<V, E> checkedGraph = checkNotNull( graph, "Impossible to synchronize null Graph." );
+        return new SynchronizedUndirectedGraph<V, E>( checkedGraph );
+    }
+
+    /**
+     * Returns a synchronized (thread-safe) {@link MutableGraph} backed by the specified Graph.
+     *
+     * It is imperative that the user manually synchronize on the returned graph when iterating over iterable collections:
+     * <pre>
+     *     Graph syncGraph = synchronize( graph );
+     *         ...
+     *     synchronized(syncGraph) {
+     *         for ( Vertex v : g.getVertices() ) // Must be in synchronized block
+     *         {
+     *            foo( v )
+     *         }
+     *   }
+     * </pre>
+     *
+     * Failure to follow this advice may result in non-deterministic behavior.
+     *
+     * The returned {@link Graph} will be serializable if the specified {@link Graph} is serializable.
+     *
+     * @param <V> the Graph vertices type
+     * @param <E> the Graph edges type
+     * @param graph the input {@link Graph}
+     * @return the synchronized graph
+     */
+    public static <V, E> Graph<V, E> synchronize( final MutableGraph<V, E> graph )
+    {
+        MutableGraph<V, E> checkedGraph = checkNotNull( graph, "Impossible to synchronize null Graph." );
+        return new SynchronizedMutableGraph<V, E>( checkedGraph );
+    }
+
+    /**
+     * Hidden constructor, this class cannot be instantiated.
+     */
+    private Graphs()
+    {
+        // do nothing
+    }
+
+}
diff --git a/src/main/java/org/apache/commons/graph/Mapper.java b/api/src/main/java/org/apache/commons/graph/Mapper.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/Mapper.java
rename to api/src/main/java/org/apache/commons/graph/Mapper.java
diff --git a/src/main/java/org/apache/commons/graph/MutableGraph.java b/api/src/main/java/org/apache/commons/graph/MutableGraph.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/MutableGraph.java
rename to api/src/main/java/org/apache/commons/graph/MutableGraph.java
diff --git a/src/main/java/org/apache/commons/graph/Path.java b/api/src/main/java/org/apache/commons/graph/Path.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/Path.java
rename to api/src/main/java/org/apache/commons/graph/Path.java
diff --git a/src/main/java/org/apache/commons/graph/model/RevertedGraph.java b/api/src/main/java/org/apache/commons/graph/RevertedGraph.java
similarity index 96%
rename from src/main/java/org/apache/commons/graph/model/RevertedGraph.java
rename to api/src/main/java/org/apache/commons/graph/RevertedGraph.java
index 112d27f..e038470 100644
--- a/src/main/java/org/apache/commons/graph/model/RevertedGraph.java
+++ b/api/src/main/java/org/apache/commons/graph/RevertedGraph.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.model;
+package org.apache.commons.graph;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -21,8 +21,6 @@
 
 import static org.apache.commons.graph.utils.Assertions.checkNotNull;
 
-import org.apache.commons.graph.DirectedGraph;
-import org.apache.commons.graph.VertexPair;
 
 /**
  * An adapted class that mirrors {@link DirectedGraph} instances,
diff --git a/src/main/java/org/apache/commons/graph/SpanningTree.java b/api/src/main/java/org/apache/commons/graph/SpanningTree.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/SpanningTree.java
rename to api/src/main/java/org/apache/commons/graph/SpanningTree.java
diff --git a/src/main/java/org/apache/commons/graph/SynchronizedDirectedGraph.java b/api/src/main/java/org/apache/commons/graph/SynchronizedDirectedGraph.java
similarity index 99%
rename from src/main/java/org/apache/commons/graph/SynchronizedDirectedGraph.java
rename to api/src/main/java/org/apache/commons/graph/SynchronizedDirectedGraph.java
index 89c776a..f8ee5f0 100644
--- a/src/main/java/org/apache/commons/graph/SynchronizedDirectedGraph.java
+++ b/api/src/main/java/org/apache/commons/graph/SynchronizedDirectedGraph.java
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+
 /**
  * A synchronized (thread-safe) {@link Graph} backed by the specified Graph.
  */
diff --git a/src/main/java/org/apache/commons/graph/SynchronizedGraph.java b/api/src/main/java/org/apache/commons/graph/SynchronizedGraph.java
similarity index 99%
rename from src/main/java/org/apache/commons/graph/SynchronizedGraph.java
rename to api/src/main/java/org/apache/commons/graph/SynchronizedGraph.java
index 8811060..ccfb983 100644
--- a/src/main/java/org/apache/commons/graph/SynchronizedGraph.java
+++ b/api/src/main/java/org/apache/commons/graph/SynchronizedGraph.java
@@ -21,6 +21,7 @@
 
 import static org.apache.commons.graph.utils.Objects.eq;
 
+
 /**
  * A synchronized (thread-safe) {@link Graph} backed by the specified Graph.
  */
diff --git a/src/main/java/org/apache/commons/graph/SynchronizedMutableGraph.java b/api/src/main/java/org/apache/commons/graph/SynchronizedMutableGraph.java
similarity index 99%
rename from src/main/java/org/apache/commons/graph/SynchronizedMutableGraph.java
rename to api/src/main/java/org/apache/commons/graph/SynchronizedMutableGraph.java
index cb2a369..2e19d6e 100644
--- a/src/main/java/org/apache/commons/graph/SynchronizedMutableGraph.java
+++ b/api/src/main/java/org/apache/commons/graph/SynchronizedMutableGraph.java
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+
 /**
  * A synchronized (thread-safe) {@link Graph} backed by the specified Graph.
  */
diff --git a/src/main/java/org/apache/commons/graph/SynchronizedUndirectedGraph.java b/api/src/main/java/org/apache/commons/graph/SynchronizedUndirectedGraph.java
similarity index 99%
rename from src/main/java/org/apache/commons/graph/SynchronizedUndirectedGraph.java
rename to api/src/main/java/org/apache/commons/graph/SynchronizedUndirectedGraph.java
index 2e8c3fd..9c6ee25 100644
--- a/src/main/java/org/apache/commons/graph/SynchronizedUndirectedGraph.java
+++ b/api/src/main/java/org/apache/commons/graph/SynchronizedUndirectedGraph.java
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+
 /**
  * A synchronized (thread-safe) {@link Graph} backed by the specified Graph.
  */
diff --git a/src/main/java/org/apache/commons/graph/UndirectedGraph.java b/api/src/main/java/org/apache/commons/graph/UndirectedGraph.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/UndirectedGraph.java
rename to api/src/main/java/org/apache/commons/graph/UndirectedGraph.java
diff --git a/src/main/java/org/apache/commons/graph/VertexPair.java b/api/src/main/java/org/apache/commons/graph/VertexPair.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/VertexPair.java
rename to api/src/main/java/org/apache/commons/graph/VertexPair.java
diff --git a/src/main/java/org/apache/commons/graph/Weighted.java b/api/src/main/java/org/apache/commons/graph/Weighted.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/Weighted.java
rename to api/src/main/java/org/apache/commons/graph/Weighted.java
diff --git a/src/main/java/org/apache/commons/graph/WeightedPath.java b/api/src/main/java/org/apache/commons/graph/WeightedPath.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/WeightedPath.java
rename to api/src/main/java/org/apache/commons/graph/WeightedPath.java
diff --git a/src/main/java/org/apache/commons/graph/builder/AbstractGraphConnection.java b/api/src/main/java/org/apache/commons/graph/builder/AbstractGraphConnection.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/builder/AbstractGraphConnection.java
rename to api/src/main/java/org/apache/commons/graph/builder/AbstractGraphConnection.java
diff --git a/src/main/java/org/apache/commons/graph/builder/DefaultGrapher.java b/api/src/main/java/org/apache/commons/graph/builder/DefaultGrapher.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/builder/DefaultGrapher.java
rename to api/src/main/java/org/apache/commons/graph/builder/DefaultGrapher.java
diff --git a/src/main/java/org/apache/commons/graph/builder/DefaultHeadVertexConnector.java b/api/src/main/java/org/apache/commons/graph/builder/DefaultHeadVertexConnector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/builder/DefaultHeadVertexConnector.java
rename to api/src/main/java/org/apache/commons/graph/builder/DefaultHeadVertexConnector.java
diff --git a/src/main/java/org/apache/commons/graph/builder/DefaultLinkedConnectionBuilder.java b/api/src/main/java/org/apache/commons/graph/builder/DefaultLinkedConnectionBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/builder/DefaultLinkedConnectionBuilder.java
rename to api/src/main/java/org/apache/commons/graph/builder/DefaultLinkedConnectionBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/builder/DefaultTailVertexConnector.java b/api/src/main/java/org/apache/commons/graph/builder/DefaultTailVertexConnector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/builder/DefaultTailVertexConnector.java
rename to api/src/main/java/org/apache/commons/graph/builder/DefaultTailVertexConnector.java
diff --git a/src/main/java/org/apache/commons/graph/builder/GraphConnection.java b/api/src/main/java/org/apache/commons/graph/builder/GraphConnection.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/builder/GraphConnection.java
rename to api/src/main/java/org/apache/commons/graph/builder/GraphConnection.java
diff --git a/src/main/java/org/apache/commons/graph/builder/GraphConnector.java b/api/src/main/java/org/apache/commons/graph/builder/GraphConnector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/builder/GraphConnector.java
rename to api/src/main/java/org/apache/commons/graph/builder/GraphConnector.java
diff --git a/src/main/java/org/apache/commons/graph/builder/HeadVertexConnector.java b/api/src/main/java/org/apache/commons/graph/builder/HeadVertexConnector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/builder/HeadVertexConnector.java
rename to api/src/main/java/org/apache/commons/graph/builder/HeadVertexConnector.java
diff --git a/src/main/java/org/apache/commons/graph/builder/LinkedConnectionBuilder.java b/api/src/main/java/org/apache/commons/graph/builder/LinkedConnectionBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/builder/LinkedConnectionBuilder.java
rename to api/src/main/java/org/apache/commons/graph/builder/LinkedConnectionBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/builder/TailVertexConnector.java b/api/src/main/java/org/apache/commons/graph/builder/TailVertexConnector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/builder/TailVertexConnector.java
rename to api/src/main/java/org/apache/commons/graph/builder/TailVertexConnector.java
diff --git a/src/main/java/org/apache/commons/graph/builder/package-info.java b/api/src/main/java/org/apache/commons/graph/builder/package-info.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/builder/package-info.java
rename to api/src/main/java/org/apache/commons/graph/builder/package-info.java
diff --git a/src/main/java/org/apache/commons/graph/weight/Monoid.java b/api/src/main/java/org/apache/commons/graph/math/monoid/Monoid.java
similarity index 96%
rename from src/main/java/org/apache/commons/graph/weight/Monoid.java
rename to api/src/main/java/org/apache/commons/graph/math/monoid/Monoid.java
index 4f99408..c01d797 100644
--- a/src/main/java/org/apache/commons/graph/weight/Monoid.java
+++ b/api/src/main/java/org/apache/commons/graph/math/monoid/Monoid.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.weight;
+package org.apache.commons.graph.math.monoid;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
diff --git a/src/main/java/org/apache/commons/graph/weight/OrderedMonoid.java b/api/src/main/java/org/apache/commons/graph/math/monoid/OrderedMonoid.java
similarity index 95%
rename from src/main/java/org/apache/commons/graph/weight/OrderedMonoid.java
rename to api/src/main/java/org/apache/commons/graph/math/monoid/OrderedMonoid.java
index fc251e4..c0ed041 100644
--- a/src/main/java/org/apache/commons/graph/weight/OrderedMonoid.java
+++ b/api/src/main/java/org/apache/commons/graph/math/monoid/OrderedMonoid.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.weight;
+package org.apache.commons.graph.math.monoid;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
diff --git a/src/main/java/org/apache/commons/graph/weight/package-info.java b/api/src/main/java/org/apache/commons/graph/math/monoid/package-info.java
similarity index 94%
rename from src/main/java/org/apache/commons/graph/weight/package-info.java
rename to api/src/main/java/org/apache/commons/graph/math/monoid/package-info.java
index 88e74af..e9a8a0a 100644
--- a/src/main/java/org/apache/commons/graph/weight/package-info.java
+++ b/api/src/main/java/org/apache/commons/graph/math/monoid/package-info.java
@@ -1,7 +1,7 @@
 /**
  * Interfaces that define properties and operations on weights.
  */
-package org.apache.commons.graph.weight;
+package org.apache.commons.graph.math.monoid;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
diff --git a/src/main/java/org/apache/commons/graph/weight/primitive/BigDecimalWeightBaseOperations.java b/api/src/main/java/org/apache/commons/graph/math/monoid/primitive/BigDecimalWeightBaseOperations.java
similarity index 93%
rename from src/main/java/org/apache/commons/graph/weight/primitive/BigDecimalWeightBaseOperations.java
rename to api/src/main/java/org/apache/commons/graph/math/monoid/primitive/BigDecimalWeightBaseOperations.java
index c3ac94d..fd0d40d 100644
--- a/src/main/java/org/apache/commons/graph/weight/primitive/BigDecimalWeightBaseOperations.java
+++ b/api/src/main/java/org/apache/commons/graph/math/monoid/primitive/BigDecimalWeightBaseOperations.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.weight.primitive;
+package org.apache.commons.graph.math.monoid.primitive;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -23,7 +23,7 @@
 
 import java.math.BigDecimal;
 
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 
 /**
  * The class {@link BigDecimalWeightBaseOperations} provides operations and properties
diff --git a/src/main/java/org/apache/commons/graph/weight/primitive/BigIntegerWeightBaseOperations.java b/api/src/main/java/org/apache/commons/graph/math/monoid/primitive/BigIntegerWeightBaseOperations.java
similarity index 93%
rename from src/main/java/org/apache/commons/graph/weight/primitive/BigIntegerWeightBaseOperations.java
rename to api/src/main/java/org/apache/commons/graph/math/monoid/primitive/BigIntegerWeightBaseOperations.java
index 2dc9128..5f070c6 100644
--- a/src/main/java/org/apache/commons/graph/weight/primitive/BigIntegerWeightBaseOperations.java
+++ b/api/src/main/java/org/apache/commons/graph/math/monoid/primitive/BigIntegerWeightBaseOperations.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.weight.primitive;
+package org.apache.commons.graph.math.monoid.primitive;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -23,7 +23,7 @@
 
 import java.math.BigInteger;
 
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 
 /**
  * The class {@link BigIntegerWeightBaseOperations} provides operations and properties
diff --git a/src/main/java/org/apache/commons/graph/weight/primitive/DoubleWeightBaseOperations.java b/api/src/main/java/org/apache/commons/graph/math/monoid/primitive/DoubleWeightBaseOperations.java
similarity index 93%
rename from src/main/java/org/apache/commons/graph/weight/primitive/DoubleWeightBaseOperations.java
rename to api/src/main/java/org/apache/commons/graph/math/monoid/primitive/DoubleWeightBaseOperations.java
index 26c2744..cd68125 100644
--- a/src/main/java/org/apache/commons/graph/weight/primitive/DoubleWeightBaseOperations.java
+++ b/api/src/main/java/org/apache/commons/graph/math/monoid/primitive/DoubleWeightBaseOperations.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.weight.primitive;
+package org.apache.commons.graph.math.monoid.primitive;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,7 +19,7 @@
  * under the License.
  */
 
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 
 /**
  * The class {@link DoubleWeightBaseOperations} provides operations and properties
diff --git a/src/main/java/org/apache/commons/graph/weight/primitive/FloatWeightBaseOperations.java b/api/src/main/java/org/apache/commons/graph/math/monoid/primitive/FloatWeightBaseOperations.java
similarity index 93%
rename from src/main/java/org/apache/commons/graph/weight/primitive/FloatWeightBaseOperations.java
rename to api/src/main/java/org/apache/commons/graph/math/monoid/primitive/FloatWeightBaseOperations.java
index 3418fde..dd1507a 100644
--- a/src/main/java/org/apache/commons/graph/weight/primitive/FloatWeightBaseOperations.java
+++ b/api/src/main/java/org/apache/commons/graph/math/monoid/primitive/FloatWeightBaseOperations.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.weight.primitive;
+package org.apache.commons.graph.math.monoid.primitive;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,7 +19,7 @@
  * under the License.
  */
 
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 
 /**
  * The class {@link FloatWeightBaseOperations} provides operations and properties
diff --git a/src/main/java/org/apache/commons/graph/weight/primitive/IntegerWeightBaseOperations.java b/api/src/main/java/org/apache/commons/graph/math/monoid/primitive/IntegerWeightBaseOperations.java
similarity index 93%
rename from src/main/java/org/apache/commons/graph/weight/primitive/IntegerWeightBaseOperations.java
rename to api/src/main/java/org/apache/commons/graph/math/monoid/primitive/IntegerWeightBaseOperations.java
index b0406e8..a09c5f2 100644
--- a/src/main/java/org/apache/commons/graph/weight/primitive/IntegerWeightBaseOperations.java
+++ b/api/src/main/java/org/apache/commons/graph/math/monoid/primitive/IntegerWeightBaseOperations.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.weight.primitive;
+package org.apache.commons.graph.math.monoid.primitive;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,7 +19,7 @@
  * under the License.
  */
 
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 
 /**
  * The class {@link IntegerWeightBaseOperations} provides operations and properties
diff --git a/src/main/java/org/apache/commons/graph/weight/primitive/LongWeightBaseOperations.java b/api/src/main/java/org/apache/commons/graph/math/monoid/primitive/LongWeightBaseOperations.java
similarity index 93%
rename from src/main/java/org/apache/commons/graph/weight/primitive/LongWeightBaseOperations.java
rename to api/src/main/java/org/apache/commons/graph/math/monoid/primitive/LongWeightBaseOperations.java
index d730575..1f3df4e 100644
--- a/src/main/java/org/apache/commons/graph/weight/primitive/LongWeightBaseOperations.java
+++ b/api/src/main/java/org/apache/commons/graph/math/monoid/primitive/LongWeightBaseOperations.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.weight.primitive;
+package org.apache.commons.graph.math.monoid.primitive;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,7 +19,7 @@
  * under the License.
  */
 
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 
 /**
  * The class {@link LongWeightBaseOperations} provides operations and properties
diff --git a/src/main/java/org/apache/commons/graph/weight/primitive/package-info.java b/api/src/main/java/org/apache/commons/graph/math/monoid/primitive/package-info.java
similarity index 93%
rename from src/main/java/org/apache/commons/graph/weight/primitive/package-info.java
rename to api/src/main/java/org/apache/commons/graph/math/monoid/primitive/package-info.java
index 9a70282..a32933c 100644
--- a/src/main/java/org/apache/commons/graph/weight/primitive/package-info.java
+++ b/api/src/main/java/org/apache/commons/graph/math/monoid/primitive/package-info.java
@@ -1,7 +1,7 @@
 /**
  * Implementations of base operations on primitive types of weights.
  */
-package org.apache.commons.graph.weight.primitive;
+package org.apache.commons.graph.math.monoid.primitive;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
diff --git a/src/main/java/org/apache/commons/graph/package-info.java b/api/src/main/java/org/apache/commons/graph/package-info.java
similarity index 89%
rename from src/main/java/org/apache/commons/graph/package-info.java
rename to api/src/main/java/org/apache/commons/graph/package-info.java
index 280a069..6aa2a36 100644
--- a/src/main/java/org/apache/commons/graph/package-info.java
+++ b/api/src/main/java/org/apache/commons/graph/package-info.java
@@ -1,5 +1,5 @@
 /**
- * The Apache Commons Graph package is a toolkit for managing graphs and graph based data structures.
+ * Apache Commons Graph APIs.
  */
 package org.apache.commons.graph;
 
diff --git a/src/main/java/org/apache/commons/graph/utils/Assertions.java b/api/src/main/java/org/apache/commons/graph/utils/Assertions.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/utils/Assertions.java
rename to api/src/main/java/org/apache/commons/graph/utils/Assertions.java
diff --git a/src/main/java/org/apache/commons/graph/utils/Objects.java b/api/src/main/java/org/apache/commons/graph/utils/Objects.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/utils/Objects.java
rename to api/src/main/java/org/apache/commons/graph/utils/Objects.java
diff --git a/src/main/java/org/apache/commons/graph/utils/package-info.java b/api/src/main/java/org/apache/commons/graph/utils/package-info.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/utils/package-info.java
rename to api/src/main/java/org/apache/commons/graph/utils/package-info.java
diff --git a/base/src/main/java/org/apache/commons/graph/algorithm/dataflow/DataFlowEquations.java b/base/src/main/java/org/apache/commons/graph/algorithm/dataflow/DataFlowEquations.java
deleted file mode 100644
index b26dc80..0000000
--- a/base/src/main/java/org/apache/commons/graph/algorithm/dataflow/DataFlowEquations.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.apache.commons.graph.algorithm.dataflow;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
-import java.util.BitSet;
-
-import org.apache.commons.graph.*;
-
-public interface DataFlowEquations {
-    /**
-     * This method shows when a definition is defined.
-     */
-    public BitSet generates( Vertex vertex );
-
-    /**
-     * This method shows when a definition is killed (or overwritten.)
-     */
-    public BitSet kills( Vertex vertex );
-}
diff --git a/base/src/main/java/org/apache/commons/graph/algorithm/dataflow/DataFlowSolutions.java b/base/src/main/java/org/apache/commons/graph/algorithm/dataflow/DataFlowSolutions.java
deleted file mode 100644
index cc744aa..0000000
--- a/base/src/main/java/org/apache/commons/graph/algorithm/dataflow/DataFlowSolutions.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.apache.commons.graph.algorithm.dataflow;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
-import java.util.Map;
-import java.util.BitSet;
-import java.util.HashMap;
-import java.util.Iterator;
-
-import org.apache.commons.graph.*;
-
-public class DataFlowSolutions
-{
-    private Map inValues = new HashMap(); // VERTEX X BITSET
-    private Map outValues = new HashMap();
-
-    public DataFlowSolutions( DirectedGraph graph,
-			      DataFlowEquations eq ) {
-	calculateDataFlow( graph, eq );
-    }
-
-    private void calculateDataFlow( DirectedGraph graph,
-				    DataFlowEquations eq ) {
-	Iterator vertices = graph.getVertices().iterator();
-	while (vertices.hasNext()) {
-	    Vertex v = (Vertex) vertices.next();
-	    inValues.put( v, new BitSet() );   // Initialize everything to 
-	    outValues.put( v, new BitSet() );  // empty
-	}
-
-	boolean isOK = true;
-	while (isOK) {
-	    vertices = graph.getVertices().iterator();
-	    isOK = false;
-	    while (vertices.hasNext()) {
-		Vertex v = (Vertex) vertices.next();
-
-		BitSet out = new BitSet();
-		out.or( (BitSet) inValues.get( v ));
-		out.or( eq.generates( v ));
-		out.andNot( eq.kills( v ));
-		
-		/*
-		System.err.println("Old Out: " + v + ":" + outValues.get( v ));
-		System.err.println("New Out: " + v + ":" + out);
-		*/
-		if (!out.equals( outValues.get( v ))) {
-		    isOK = true;
-		    outValues.put( v, out );
-
-		    Iterator outbound = graph.getOutbound( v ).iterator();
-		    while (outbound.hasNext()) {
-			Vertex target = 
-			    graph.getTarget( (Edge) outbound.next() );
-			
-			BitSet in = (BitSet) inValues.get( target );
-			in.or( out );
-			inValues.put( target, in );
-			/*
-			System.err.println("Old In: " + target + ":" + 
-					   inValues.get( target ));
-			System.err.println("New In: " + target + ":" + in );
-			*/
-		    }
-		}
-	    }
-	}
-    }
-
-    public BitSet reaches( Vertex vertex ) {
-	return (BitSet) inValues.get( vertex );
-    }
-
-    public BitSet leaves( Vertex vertex ) {
-	return (BitSet) outValues.get( vertex );
-    }
-}
diff --git a/base/src/main/java/org/apache/commons/graph/contract/Acyclic.java b/base/src/main/java/org/apache/commons/graph/contract/Acyclic.java
deleted file mode 100644
index bef017c..0000000
--- a/base/src/main/java/org/apache/commons/graph/contract/Acyclic.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.apache.commons.graph.contract;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
-/**
- * Description of the Interface
- */
-public interface Acyclic
-{
-}
diff --git a/base/src/main/java/org/apache/commons/graph/contract/AcyclicContract.java b/base/src/main/java/org/apache/commons/graph/contract/AcyclicContract.java
deleted file mode 100644
index e47d3d4..0000000
--- a/base/src/main/java/org/apache/commons/graph/contract/AcyclicContract.java
+++ /dev/null
@@ -1,171 +0,0 @@
-package org.apache.commons.graph.contract;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
-import java.util.Iterator;
-
-import org.apache.commons.graph.*;
-import org.apache.commons.graph.algorithm.search.*;
-import org.apache.commons.graph.exception.*;
-import org.apache.commons.graph.decorator.*;
-
-/**
- * Description of the Class
- */
-public class AcyclicContract<V extends Vertex, E extends Edge>
-     implements Contract<V, E>
-{
-    private DecoratedDirectedGraph graph = null;
-
-    /**
-     * Description of the Class
-     */
-    public class CycleDetector
-         implements Visitor
-    {
-        private DFS dfs = null;
-        private boolean isCyclic = false;
-        private DirectedGraph<V, E> graph = null;
-
-        /**
-         * Constructor for the CycleDetector object
-         *
-         * @param graph
-         */
-        public CycleDetector(DirectedGraph<V, E> graph)
-        {
-            this.dfs = new DFS();
-            this.graph = graph;
-            Iterator<V> verts = graph.getVertices().iterator();
-
-            if (verts.hasNext())
-            {
-                dfs.visit(graph, verts.next(), this);
-            }
-        }
-
-        /**
-         * Description of the Method
-         */
-        public void discoverGraph(Graph graph) { }
-
-        /**
-         * Description of the Method
-         */
-        public void discoverVertex(Vertex v) { }
-
-        /**
-         * Description of the Method
-         */
-        public void discoverEdge(Edge e)
-        {
-            if (dfs.getColor(graph.getTarget(e)) == DFS.GRAY)
-            {
-                this.isCyclic = true;
-            }
-        }
-
-        /**
-         * Description of the Method
-         */
-        public void finishEdge(Edge e) { }
-
-        /**
-         * Description of the Method
-         */
-        public void finishVertex(Vertex v) { }
-
-        /**
-         * Description of the Method
-         */
-        public void finishGraph(Graph graph) { }
-
-        /**
-         * Description of the Method
-         */
-        public boolean hasCycle()
-        {
-            return isCyclic;
-        }
-    }
-
-    /**
-     * Constructor for the AcyclicContract object
-     */
-    public AcyclicContract() { }
-
-    /**
-     * Sets the impl attribute of the AcyclicContract object
-     */
-    public void setImpl(DirectedGraph<V, E> graph)
-    {
-        this.graph = DecoratedDirectedGraph.decorateGraph(graph);
-    }
-
-    /**
-     * Gets the interface attribute of the AcyclicContract object
-     */
-    public Class<?> getInterface()
-    {
-        return org.apache.commons.graph.contract.Acyclic.class;
-    }
-
-    /**
-     * Description of the Method
-     */
-    public void verify()
-        throws CycleException
-    {
-        CycleDetector cd = new CycleDetector(graph);
-        if (cd.hasCycle())
-        {
-            throw new CycleException("Cycle detected in Graph.");
-        }
-    }
-
-    /**
-     * Adds a feature to the Vertex attribute of the AcyclicContract object
-     */
-    public void addVertex(Vertex v) { }
-
-    /**
-     * Adds a feature to the Edge attribute of the AcyclicContract object
-     */
-    public void addEdge(Edge e,
-                        Vertex start,
-                        Vertex end)
-        throws GraphException
-    {
-        if (graph.hasConnection(end, start))
-        {
-            throw new CycleException("Introducing edge will cause a Cycle.");
-        }
-    }
-
-    /**
-     * Description of the Method
-     */
-    public void removeVertex(Vertex v) { }
-
-    /**
-     * Description of the Method
-     */
-    public void removeEdge(Edge e) { }
-}
diff --git a/base/src/main/java/org/apache/commons/graph/contract/Contract.java b/base/src/main/java/org/apache/commons/graph/contract/Contract.java
deleted file mode 100644
index d4ca3e5..0000000
--- a/base/src/main/java/org/apache/commons/graph/contract/Contract.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.apache.commons.graph.contract;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
-import org.apache.commons.graph.DirectedGraph;
-import org.apache.commons.graph.Edge;
-import org.apache.commons.graph.GraphException;
-import org.apache.commons.graph.Vertex;
-
-/**
- * Description of the Interface
- *
- * @param <V> the Graph vertices type
- * @param <E> the Graph edges type
- */
-public interface Contract<V extends Vertex, E extends Edge>
-{
-
-    /**
-     * The impl that gets passed in is read-only. This is the representation of
-     * the graph you should work off of. If an edge or vertex addition is
-     * illegal to the contract, raise a GraphException with and explanation.
-     */
-    void setImpl( DirectedGraph<V, E> impl );
-
-    /**
-     * getInterface This returns the marker interface which is associated with
-     * the Contract. For instance, AcyclicContract will return AcyclicGraph
-     * here.
-     */
-    Class getInterface();
-
-    /**
-     * verify - This verifies that the graph it is working on complies.
-     */
-    void verify()
-        throws GraphException;
-
-    /**
-     * Adds a feature to the Edge attribute of the Contract object
-     */
-    void addEdge( Edge e, Vertex start, Vertex end )
-        throws GraphException;
-
-    /**
-     * Adds a feature to the Vertex attribute of the Contract object
-     */
-    void addVertex( Vertex v )
-        throws GraphException;
-
-    /**
-     * Description of the Method
-     */
-    void removeEdge( Edge e )
-        throws GraphException;
-
-    /**
-     * Description of the Method
-     */
-    void removeVertex( Vertex v )
-        throws GraphException;
-
-}
diff --git a/base/src/test/java/org/apache/commons/graph/algorithm/dataflow/DataFlowSolutionsTest.java b/base/src/test/java/org/apache/commons/graph/algorithm/dataflow/DataFlowSolutionsTest.java
deleted file mode 100644
index 6483079..0000000
--- a/base/src/test/java/org/apache/commons/graph/algorithm/dataflow/DataFlowSolutionsTest.java
+++ /dev/null
@@ -1,307 +0,0 @@
-package org.apache.commons.graph.algorithm.dataflow;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
-import org.apache.commons.graph.*;
-
-import java.util.BitSet;
-
-public class DataFlowSolutionsTest extends GraphTest {
-    private static BitSet BS_000 = null;
-    private static BitSet BS_001 = null;
-    private static BitSet BS_010 = null;
-    private static BitSet BS_011 = null;
-    private static BitSet BS_100 = null;
-    private static BitSet BS_101 = null;
-    private static BitSet BS_110 = null;
-    private static BitSet BS_111 = null;
-    
-    static {
-	BS_000 = new BitSet();
-	BS_001 = new BitSet();
-	BS_010 = new BitSet();
-	BS_011 = new BitSet();
-	BS_100 = new BitSet();
-	BS_101 = new BitSet();
-	BS_110 = new BitSet();
-	BS_111 = new BitSet();
-     
-	BS_001.set( 3 );
-	BS_011.set( 3 );
-	BS_101.set( 3 );
-	BS_111.set( 3 );
-
-	BS_010.set( 2 );
-	BS_011.set( 2 );
-	BS_110.set( 2 );
-	BS_111.set( 2 );
-
-	BS_100.set( 1 );
-	BS_101.set( 1 );
-	BS_110.set( 1 );
-	BS_111.set( 1 );
-    }
-
-    public DataFlowSolutionsTest( String name ) {
-	super( name );
-    }
-
-    public void testBitSetEquals() throws Throwable {
-	BitSet one = new BitSet();
-	BitSet two = new BitSet();
-
-	one.set( 15 );
-	two.set( 15 );
-
-	assertTrue( one.equals( two ));
-    }
-
-    /**
-     * Test a single Vertex.
-     *
-     * @ [ gen (1) ]  --> [ leaves(1) ]
-     *
-     * @ [ gen (1) kill(1) ] --> [ ]
-     * 
-     * @ [ ] --> [ ]
-     */
-    public void testOneGraph() throws Throwable {
-	DirectedGraph graph = makeDirSingleVertex();
-
-	BitSet clear = new BitSet();
-	BitSet gen = new BitSet();
-	BitSet kill = new BitSet();
-	BitSet leaves = new BitSet();
-
-	DataFlowSolutions IUT = null;
-	MockDataFlowEq dfe = null;
-	
-	dfe = new MockDataFlowEq();
-
-	dfe.addVertex( V1, BS_100, BS_000 );
-	
-	IUT = new DataFlowSolutions( graph, dfe );
-	assertEquals( "Expected nothing to reach V1.",
-		      BS_000, IUT.reaches( V1 ));
-	assertEquals( "Expected 1 to leave V1.",
-		      BS_100, IUT.leaves( V1 ) );
-
-
-	dfe = new MockDataFlowEq();
-	dfe.addVertex( V1, BS_100, BS_100 );
-	
-	IUT = new DataFlowSolutions( graph, dfe );
-
-	assertEquals( "Expected nothing to reach V1.",
-		      BS_000, IUT.reaches( V1 ));
-	assertEquals( "Expected nothing to leave V1.",
-		      BS_000, IUT.leaves( V1 ) );	
-
-	dfe = new MockDataFlowEq();
-	dfe.addVertex( V1, BS_000, BS_100 );
-	
-	IUT = new DataFlowSolutions( graph, dfe );
-
-	assertEquals( "Expected nothing to leave V1.",
-		      BS_000, IUT.leaves( V1 ) );	
-	assertEquals( "Expected nothing to reach V1.",
-		      BS_000, IUT.reaches( V1 ) );	
-    }
-    
-    /**
-     * Test two vertices
-     *
-     *  gen(V1) = (1,2)
-     *  kill(V2) = (1,2)
-     *  leaves(V1) = (1,2)
-     *  reaches(V1) = ()
-     *  leaves(V2) = ()
-     *  reaches(V2) = (1,2)
-     */
-    public void testTwoVerts0() 
-	throws Throwable
-    {
-	DirectedGraph graph = makeDirectedEdge();
-	MockDataFlowEq dfe = new MockDataFlowEq();
-
-	BitSet genV1 = new BitSet();
-	genV1.set( 1 );
-	genV1.set( 2 );
-
-	dfe.addVertex( V1, BS_110, BS_000 );
-	dfe.addVertex( V2, BS_000, BS_110 );
-
-	DataFlowSolutions IUT = new DataFlowSolutions( graph, dfe );
-
-	assertEquals( "Expected 1 and 2 to leave V1",
-		      BS_110, IUT.leaves( V1 ));
-	assertEquals( "Expected nothing to reach V1",
-		      BS_000, IUT.reaches( V1 ));
-
-	assertEquals( "Expected 1 and 2 to reach V2",
-		      BS_110, IUT.reaches( V2 ));
-	assertEquals( "Expected nothing to leave V2",
-		      BS_000, IUT.leaves( V2 ));
-    }
-
-    /**
-     * Test two vertices
-     *
-     *  gen(V1) = (1,2)
-     *  kill(V2) = (1)
-     *  leaves(V1) = (1,2)
-     *  reaches(V1) = ()
-     *  leaves(V2) = (2)
-     *  reaches(V2) = (1,2)
-     */
-    public void testTwoVerts1() 
-	throws Throwable
-    {
-	DirectedGraph graph = makeDirectedEdge();
-	MockDataFlowEq dfe = new MockDataFlowEq();
-
-	dfe.addVertex( V1, BS_110, BS_000 );
-	dfe.addVertex( V2, BS_000, BS_100 );
-
-	DataFlowSolutions IUT = new DataFlowSolutions( graph, dfe );
-
-	assertEquals( "Expected 1 and 2 to leave V1",
-		      BS_110, IUT.leaves( V1 ));
-	assertEquals( "Expected nothing to reach V1",
-		      BS_000, IUT.reaches( V1 ));
-
-	assertEquals( "Expected 1 and 2 to reach V2",
-		      BS_110, IUT.reaches( V2 ));
-	assertEquals( "Expected 2 to leave V2",
-		      BS_010, IUT.leaves( V2 ));
-    }
-
-    /**
-     * Test two vertices
-     *
-     *  gen(V1) = (1)
-     *  kill(v1) = ()
-     *
-     *  gen(V2) = (2)
-     *  kill(V2) = (1)
-     *
-     *  leaves(V1) = (1)
-     *  reaches(V1) = ()
-     *
-     *  leaves(V2) = (2)
-     *  reaches(V2) = (1)
-     */
-    public void testTwoVerts2() 
-	throws Throwable
-    {
-	DirectedGraph graph = makeDirectedEdge();
-	MockDataFlowEq dfe = new MockDataFlowEq();
-
-	BitSet genV1 = new BitSet();
-	genV1.set( 1 );
-
-	dfe.addVertex( V1, BS_100, BS_000 );
-	dfe.addVertex( V2, BS_010, BS_100 );
-
-	DataFlowSolutions IUT = new DataFlowSolutions( graph, dfe );
-
-	assertEquals( "Expected 1 to leave V1",
-		      BS_100, IUT.leaves( V1 ));
-	assertEquals( "Expected nothing to reach V1",
-		      BS_000, IUT.reaches( V1 ));
-
-	assertEquals( "Expected 1 to reach V2",
-		      BS_100, IUT.reaches( V2 ));
-	assertEquals( "Expected 2 to leave V2",
-		      BS_010, IUT.leaves( V2 ));
-    }
-
-    /**
-     * Test with a Cycle:
-     *     
-     *        * +1
-     *       / \
-     *   +2 *---* +3
-     *
-     * 1, 2, 3 reach all and leave all.
-     */
-    public void testCycle0() 
-	throws Throwable
-    {
-	DirectedGraph graph = makeDirectedCycle();
-	MockDataFlowEq dfe = new MockDataFlowEq();
-	
-	dfe.addVertex( V1, BS_100, BS_000);
-	dfe.addVertex( V2, BS_010, BS_000);
-	dfe.addVertex( V3, BS_001, BS_000);
-
-	DataFlowSolutions IUT = new DataFlowSolutions( graph, dfe );
-
-	assertEquals("Expecting all to reach V1",
-		     BS_111, IUT.reaches( V1 ));
-	assertEquals("Expecting all to reach V2",
-		     BS_111, IUT.reaches( V2 ));
-	assertEquals("Expecting all to reach V3",
-		     BS_111, IUT.reaches( V3 ));
-
-	assertEquals("Expecting all to leave V1",
-		     BS_111, IUT.leaves( V1 ));
-	assertEquals("Expecting all to leave V2",
-		     BS_111, IUT.leaves( V2 ));
-	assertEquals("Expecting all to leave V3",
-		     BS_111, IUT.leaves( V3 ));
-    }
-    
-    /**
-     * Test with a Cycle:
-     *     
-     *           * +1 -3
-     *          / \
-     *   +2 -1 *---* +3 -2
-     *
-     */
-    public void testCycle1() 
-	throws Throwable
-    {
-	DirectedGraph graph = makeDirectedCycle();
-	MockDataFlowEq dfe = new MockDataFlowEq();
-	
-	dfe.addVertex( V1, BS_100, BS_001);
-	dfe.addVertex( V2, BS_010, BS_100);
-	dfe.addVertex( V3, BS_001, BS_010);
-
-	DataFlowSolutions IUT = new DataFlowSolutions( graph, dfe );
-
-	assertEquals("Expecting 3 to reach V1",
-		     BS_001, IUT.reaches( V1 ));
-	assertEquals("Expecting 1 to reach V2",
-		     BS_100, IUT.reaches( V2 ));
-	assertEquals("Expecting 2 to reach V3",
-		     BS_010, IUT.reaches( V3 ));
-
-	assertEquals("Expecting 1 to leave V1",
-		     BS_100, IUT.leaves( V1 ));
-	assertEquals("Expecting 2 to leave V2",
-		     BS_010, IUT.leaves( V2 ));
-	assertEquals("Expecting 3 to leave V3",
-		     BS_001, IUT.leaves( V3 ));
-    }
-    
-}
diff --git a/base/src/test/java/org/apache/commons/graph/algorithm/dataflow/MockDataFlowEq.java b/base/src/test/java/org/apache/commons/graph/algorithm/dataflow/MockDataFlowEq.java
deleted file mode 100644
index bd908c2..0000000
--- a/base/src/test/java/org/apache/commons/graph/algorithm/dataflow/MockDataFlowEq.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.apache.commons.graph.algorithm.dataflow;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
-import java.util.Map;
-import java.util.BitSet;
-import java.util.HashMap;
-
-import org.apache.commons.graph.*;
-
-public class MockDataFlowEq 
-    implements DataFlowEquations
-{
-    private Map generates = new HashMap(); // VERTEX X BITSET
-    private Map kills = new HashMap(); // VERTEX X BITSET
-
-    public MockDataFlowEq() { }
-
-    public void addVertex( Vertex v, BitSet generate, BitSet kill ) {
-	generates.put( v, generate );
-	kills.put( v, kill );
-    }
-
-    public BitSet generates( Vertex v ) {
-	return (BitSet) generates.get( v );
-    }
-
-    public BitSet kills( Vertex v ) {
-	return (BitSet) kills.get( v );
-    }
-}
diff --git a/base/src/test/java/org/apache/commons/graph/contract/AcyclicContractTest.java b/base/src/test/java/org/apache/commons/graph/contract/AcyclicContractTest.java
deleted file mode 100644
index a27a3ed..0000000
--- a/base/src/test/java/org/apache/commons/graph/contract/AcyclicContractTest.java
+++ /dev/null
@@ -1,427 +0,0 @@
-package org.apache.commons.graph.contract;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
-import org.apache.commons.graph.*;
-import org.apache.commons.graph.exception.*;
-
-/**
- * Description of the Class
- */
-public class AcyclicContractTest
-     extends GraphTest
-{
-    /**
-     * Constructor for the AcyclicContractTest object
-     *
-     * @param name
-     */
-    public AcyclicContractTest(String name)
-    {
-        super(name);
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDirNullGraph()
-        throws Throwable
-    {
-        AcyclicContract IUT =
-            new AcyclicContract();
-        IUT.setImpl(makeDirNullGraph());
-
-        IUT.verify();
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDirSingleVertex()
-        throws Throwable
-    {
-        AcyclicContract IUT =
-            new AcyclicContract();
-        IUT.setImpl(makeDirSingleVertex());
-        IUT.verify();
-
-        try
-        {
-            IUT.addEdge(V1_V1, V1, V1);
-            fail("No GraphException thrown when Self-Cycle introduced.");
-        }
-        catch (CycleException ex)
-        {}
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testSelfLoop()
-        throws Throwable
-    {
-        AcyclicContract IUT =
-            new AcyclicContract();
-        IUT.setImpl(makeSelfLoop());
-
-        try
-        {
-            IUT.verify();
-            fail("No CycleException thrown on Verification.");
-        }
-        catch (CycleException ex)
-        {}
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDirDoubleVertex()
-        throws Throwable
-    {
-        AcyclicContract IUT =
-            new AcyclicContract();
-        IUT.setImpl(makeDirDoubleVertex());
-        IUT.verify();
-
-        try
-        {
-            IUT.addEdge(V1_V1, V1, V1);
-            fail("No GraphException thrown when Self-Cycle introduced.");
-        }
-        catch (CycleException ex)
-        {}
-
-        try
-        {
-            IUT.addEdge(V1_V2, V1, V2);
-        }
-        catch (GraphException ex)
-        {
-            fail("Contract prevented adding of valid edge. V1->V2");
-        }
-    }
-
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDirectedEdge()
-        throws Throwable
-    {
-        AcyclicContract IUT =
-            new AcyclicContract();
-        IUT.setImpl(makeDirectedEdge());
-        IUT.verify();
-
-        try
-        {
-            IUT.addEdge(V1_V1, V1, V1);
-            fail("No GraphException thrown when Self-Cycle introduced.");
-        }
-        catch (CycleException ex)
-        {}
-
-        try
-        {
-            IUT.addEdge(V1_V2_, V1, V2);
-        }
-        catch (GraphException ex)
-        {
-            fail("Contract prevented adding of valid edge. V1->V2'");
-        }
-
-        try
-        {
-            IUT.addEdge(V2_V1, V2, V1);
-            fail("Contract allowed cycle to be introduced.");
-        }
-        catch (CycleException ex)
-        {}
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDirParallelEdges()
-        throws Throwable
-    {
-        AcyclicContract IUT =
-            new AcyclicContract();
-        IUT.setImpl(makeDirParallelEdges());
-        IUT.verify();
-
-        try
-        {
-            IUT.addEdge(V1_V1, V1, V1);
-            fail("No GraphException thrown when Self-Cycle introduced.");
-        }
-        catch (CycleException ex)
-        {}
-
-        try
-        {
-            IUT.addEdge(V1_V2__, V1, V2);
-        }
-        catch (GraphException ex)
-        {
-            fail("Contract prevented adding of valid edge. V1->V2'");
-        }
-
-        try
-        {
-            IUT.addEdge(V2_V1, V2, V1);
-            fail("Contract allowed cycle to be introduced.");
-        }
-        catch (CycleException ex)
-        {}
-    }
-
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testTwoCycle()
-        throws Throwable
-    {
-        AcyclicContract IUT =
-            new AcyclicContract();
-        IUT.setImpl(makeTwoCycle());
-
-        try
-        {
-            IUT.verify();
-            fail("No CycleException thrown on Verification.");
-        }
-        catch (CycleException ex)
-        {}
-    }
-
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDirectedCycle()
-        throws Throwable
-    {
-        AcyclicContract IUT =
-            new AcyclicContract();
-        IUT.setImpl(makeDirectedCycle());
-
-        try
-        {
-            IUT.verify();
-            fail("No CycleException thrown on Verification.");
-        }
-        catch (CycleException ex)
-        {}
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testPipe()
-        throws Throwable
-    {
-        AcyclicContract IUT =
-            new AcyclicContract();
-        IUT.setImpl(makePipe());
-        IUT.verify();
-
-        try
-        {
-            IUT.addEdge(V1_V1, V1, V1);
-            fail("No GraphException thrown when Self-Cycle introduced.");
-        }
-        catch (CycleException ex)
-        {}
-
-        try
-        {
-            IUT.addEdge(V1_V2_, V1, V2);
-        }
-        catch (GraphException ex)
-        {
-            fail("Contract prevented adding of valid edge. V1->V2'");
-        }
-
-        try
-        {
-            IUT.addEdge(V3_V1, V3, V1);
-            fail("Contract allowed cycle to be introduced.");
-        }
-        catch (CycleException ex)
-        {}
-
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDiamond()
-        throws Throwable
-    {
-        AcyclicContract IUT =
-            new AcyclicContract();
-        IUT.setImpl(makeDiamond());
-        IUT.verify();
-
-        try
-        {
-            IUT.addEdge(V1_V1, V1, V1);
-            fail("No GraphException thrown when Self-Cycle introduced.");
-        }
-        catch (CycleException ex)
-        {}
-
-        try
-        {
-            IUT.addEdge(V2_V3, V2, V3);
-        }
-        catch (GraphException ex)
-        {
-            fail("Contract prevented adding of valid edge. V2->V3");
-        }
-
-        try
-        {
-            IUT.addEdge(V4_V1, V4, V1);
-            fail("Contract allowed cycle to be introduced.");
-        }
-        catch (CycleException ex)
-        {}
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testPipelessCycle()
-        throws Throwable
-    {
-        AcyclicContract IUT =
-            new AcyclicContract();
-        IUT.setImpl(makePipelessCycle());
-        IUT.verify();
-
-        try
-        {
-            IUT.addEdge(V1_V1, V1, V1);
-            fail("No GraphException thrown when Self-Cycle introduced.");
-        }
-        catch (CycleException ex)
-        {}
-
-        try
-        {
-            IUT.addEdge(V2_V3, V2, V3);
-        }
-        catch (GraphException ex)
-        {
-            fail("Contract prevented adding of valid edge. V2->V3");
-        }
-
-        try
-        {
-            IUT.addEdge(V3_V4, V3, V4);
-            fail("Contract allowed cycle to be introduced.");
-        }
-        catch (CycleException ex)
-        {}
-
-    }
-
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testParentTree()
-        throws Throwable
-    {
-        System.err.println("---- PARENT TREE ----");
-        AcyclicContract IUT =
-            new AcyclicContract();
-        IUT.setImpl(makeParentTree());
-        IUT.verify();
-
-        try
-        {
-            IUT.addEdge(V1_V1, V1, V1);
-            fail("No GraphException thrown when Self-Cycle introduced.");
-        }
-        catch (CycleException ex)
-        {}
-
-        try
-        {
-            IUT.addEdge(V2_V3, V2, V3);
-        }
-        catch (GraphException ex)
-        {
-            fail("Contract prevented adding of valid edge. V2->V3");
-        }
-
-        try
-        {
-            IUT.addEdge(V1_V5, V1, V5);
-            fail("Contract allowed cycle to be introduced.");
-        }
-        catch (CycleException ex)
-        {}
-    }
-
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testChildTree()
-        throws Throwable
-    {
-        AcyclicContract IUT =
-            new AcyclicContract();
-        IUT.setImpl(makeChildTree());
-        IUT.verify();
-
-        try
-        {
-            IUT.addEdge(V1_V1, V1, V1);
-            fail("No GraphException thrown when Self-Cycle introduced.");
-        }
-        catch (CycleException ex)
-        {}
-
-        try
-        {
-            IUT.addEdge(V2_V3, V2, V3);
-        }
-        catch (GraphException ex)
-        {
-            fail("Contract prevented adding of valid edge. V2->V3");
-        }
-
-        try
-        {
-            IUT.addEdge(V5_V1, V5, V1);
-            fail("Contract allowed cycle to be introduced.");
-        }
-        catch (CycleException ex)
-        {}
-
-    }
-}
diff --git a/base/src/test/java/org/apache/commons/graph/contract/DAGTest.java b/base/src/test/java/org/apache/commons/graph/contract/DAGTest.java
deleted file mode 100644
index e6e55a9..0000000
--- a/base/src/test/java/org/apache/commons/graph/contract/DAGTest.java
+++ /dev/null
@@ -1,289 +0,0 @@
-package org.apache.commons.graph.contract;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
-import org.apache.commons.graph.*;
-import org.apache.commons.graph.contract.*;
-import org.apache.commons.graph.exception.*;
-import org.apache.commons.graph.factory.*;
-
-/**
- * Description of the Class
- */
-public class DAGTest
-     extends GraphTest
-{
-    private Contract[] dagContracts = new Contract[1];
-    private GraphFactory factory = new GraphFactory();
-    private String testName = null;
-
-    /**
-     * Constructor for the DAGTest object
-     *
-     * @param name
-     */
-    public DAGTest(String name)
-    {
-        super(name);
-        this.testName = name;
-    }
-
-    /**
-     * The JUnit setup method
-     */
-    public void setUp()
-    {
-        dagContracts[0] = new AcyclicContract();
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDAGSelfLoop()
-        throws Throwable
-    {
-        DirectedGraph dg = null;
-        try
-        {
-            try
-            {
-                dg = factory.makeDirectedGraph(dagContracts,
-                    true,
-                    makeSelfLoop());
-                fail("Should not have created DAG.");
-            }
-            catch (CycleException ex)
-            {}
-        }
-        catch (Throwable ex)
-        {
-            printGraph(ex, dg);
-            throw ex;
-        }
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDAGTwoLoop()
-        throws Throwable
-    {
-        DirectedGraph dg = null;
-        try
-        {
-            try
-            {
-                dg = factory.makeDirectedGraph(dagContracts,
-                    true,
-                    makeTwoCycle());
-                fail("Should not have created DAG.");
-            }
-            catch (CycleException ex)
-            {}
-        }
-        catch (Throwable ex)
-        {
-            printGraph(ex, dg);
-            throw ex;
-        }
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testMakeDAGDirCycle()
-        throws Throwable
-    {
-        MutableDirectedGraph mdg = null;
-        try
-        {
-            mdg = factory.makeMutableDirectedGraph(dagContracts,
-                true,
-                null);
-            mdg.addVertex(V1);
-            mdg.addVertex(V2);
-            mdg.addEdge(V1_V2, V1, V2);
-
-            mdg.addVertex(V3);
-            mdg.addEdge(V2_V3, V2, V3);
-
-            try
-            {
-                mdg.addEdge(V3_V1, V3, V1);
-                fail("No CycleException thrown on introduction of cycle.");
-            }
-            catch (CycleException ex)
-            {}
-        }
-        catch (Throwable t)
-        {
-            printGraph(t, mdg);
-        }
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDAGDirCycle()
-        throws Throwable
-    {
-        DirectedGraph dg = null;
-        try
-        {
-            try
-            {
-                dg = factory.makeDirectedGraph(dagContracts,
-                    true,
-                    makeDirectedCycle());
-                fail("Should not have created DAG.");
-            }
-            catch (CycleException ex)
-            {}
-        }
-        catch (Throwable ex)
-        {
-            printGraph(ex, dg);
-            throw ex;
-        }
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDAGAddCycleToPipe()
-        throws Throwable
-    {
-        MutableDirectedGraph mdg = null;
-        try
-        {
-            try
-            {
-                mdg = factory.makeMutableDirectedGraph(dagContracts,
-                    true,
-                    makePipe());
-                mdg.addEdge(V3_V1, V3, V1);
-                fail("No Exception thrown on adding of invalid edge.");
-            }
-            catch (CycleException e)
-            {}
-        }
-        catch (Throwable ex)
-        {
-            printGraph(ex, mdg);
-            throw ex;
-        }
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDAGAddCycleToDirEdge()
-        throws Throwable
-    {
-        MutableDirectedGraph mdg = null;
-        try
-        {
-            try
-            {
-                mdg = factory.makeMutableDirectedGraph(dagContracts,
-                    true,
-                    makeDirectedEdge());
-                mdg.addEdge(V2_V1, V2, V1);
-                fail("Failed to throw exception on introducing Cycle.");
-            }
-            catch (CycleException ex)
-            {}
-        }
-        catch (Throwable ex)
-        {
-            printGraph(ex, mdg);
-            throw ex;
-        }
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDAGAddSelfLoop()
-        throws Throwable
-    {
-        MutableDirectedGraph mdg = null;
-        try
-        {
-            try
-            {
-                mdg = factory.makeMutableDirectedGraph(dagContracts,
-                    true,
-                    makeDirSingleVertex());
-                mdg.addEdge(V1_V1, V1, V1);
-                fail("Failed to throw exception on introducing Self Loop.");
-            }
-            catch (CycleException ex)
-            {}
-        }
-        catch (Throwable ex)
-        {
-            printGraph(ex, mdg);
-            throw ex;
-        }
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDAGValidEdge()
-        throws Throwable
-    {
-        MutableDirectedGraph mdg = null;
-        try
-        {
-            mdg = factory.makeMutableDirectedGraph(dagContracts,
-                true,
-                makeParentTree());
-            mdg.addEdge(V2_V3, V2, V3);
-        }
-        catch (Throwable ex)
-        {
-            printGraph(ex, mdg);
-            throw ex;
-        }
-    }
-
-    /**
-     * A unit test for JUnit
-     */
-    public void testDAGValidEdge2()
-        throws Throwable
-    {
-        MutableDirectedGraph mdg = null;
-        try
-        {
-            mdg = factory.makeMutableDirectedGraph(dagContracts,
-                true,
-                makeDirDoubleVertex());
-            mdg.addEdge(V1_V2, V1, V2);
-        }
-        catch (Throwable ex)
-        {
-            printGraph(ex, mdg);
-            throw ex;
-        }
-    }
-}
diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml
new file mode 100644
index 0000000..8eec033
--- /dev/null
+++ b/benchmarks/pom.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-graph</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>commons-graph-benchmarks</artifactId>
+
+  <name>Apache Commons Graph - Benchmarks</name>
+  <description>Benchmarks across multiple Graph algorithms.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-api</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-model</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-scc</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-shortestpath</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-spanning</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <!-- test dependencies -->
+    <dependency>
+      <groupId>com.carrotsearch</groupId>
+      <artifactId>junit-benchmarks</artifactId>
+      <classifier>jdk15</classifier>
+      <version>0.3.0</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.6.1</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>com.h2database</groupId>
+      <artifactId>h2</artifactId>
+      <version>1.3.158</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${basedir}/../</directory>
+        <targetPath>META-INF</targetPath>
+        <includes>
+          <include>NOTICE.txt</include>
+          <include>LICENSE.txt</include>
+        </includes>
+      </resource>
+    </resources>
+
+    <plugins>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <systemPropertyVariables>
+            <jub.consumers>CONSOLE,XML,H2</jub.consumers>
+            <jub.db.file>${project.parent.build.directory}/benchmarks/database</jub.db.file>
+            <jub.xml.file>${project.parent.build.directory}/benchmarks.xml</jub.xml.file>
+            <jub.charts.dir>${project.parent.build.directory}/site/benchmarks</jub.charts.dir>
+          </systemPropertyVariables>
+          <argLine>-Xmx512m -Xms512m</argLine>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/benchmarks/java/org/apache/commons/graph/scc/SCCAlgorithmBenchmarkTestCase.java b/benchmarks/src/test/java/org/apache/commons/graph/scc/SCCAlgorithmBenchmarkTestCase.java
similarity index 92%
rename from src/benchmarks/java/org/apache/commons/graph/scc/SCCAlgorithmBenchmarkTestCase.java
rename to benchmarks/src/test/java/org/apache/commons/graph/scc/SCCAlgorithmBenchmarkTestCase.java
index d8aef0b..844031e 100644
--- a/src/benchmarks/java/org/apache/commons/graph/scc/SCCAlgorithmBenchmarkTestCase.java
+++ b/benchmarks/src/test/java/org/apache/commons/graph/scc/SCCAlgorithmBenchmarkTestCase.java
@@ -21,8 +21,8 @@
 
 import static java.lang.String.format;
 import static java.lang.String.valueOf;
-import static org.apache.commons.graph.CommonsGraph.findStronglyConnectedComponent;
-import static org.apache.commons.graph.CommonsGraph.newDirectedMutableGraph;
+import static org.apache.commons.graph.model.GraphUtils.newDirectedMutableGraph;
+import static org.apache.commons.graph.scc.SccSolver.findStronglyConnectedComponent;
 import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
@@ -32,9 +32,9 @@
 
 import org.apache.commons.graph.GraphException;
 import org.apache.commons.graph.builder.AbstractGraphConnection;
-import org.apache.commons.graph.model.BaseLabeledEdge;
-import org.apache.commons.graph.model.BaseLabeledVertex;
 import org.apache.commons.graph.model.DirectedMutableGraph;
+import org.apache.commons.graph.model.labeled.BaseLabeledEdge;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
 import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/src/benchmarks/java/org/apache/commons/graph/shortestpath/UniVsBiDijkstraBenchmarkTestCase.java b/benchmarks/src/test/java/org/apache/commons/graph/shortestpath/UniVsBiDijkstraBenchmarkTestCase.java
similarity index 92%
rename from src/benchmarks/java/org/apache/commons/graph/shortestpath/UniVsBiDijkstraBenchmarkTestCase.java
rename to benchmarks/src/test/java/org/apache/commons/graph/shortestpath/UniVsBiDijkstraBenchmarkTestCase.java
index f1f5ea1..25c2edb 100644
--- a/src/benchmarks/java/org/apache/commons/graph/shortestpath/UniVsBiDijkstraBenchmarkTestCase.java
+++ b/benchmarks/src/test/java/org/apache/commons/graph/shortestpath/UniVsBiDijkstraBenchmarkTestCase.java
@@ -21,8 +21,8 @@
 
 import static java.lang.String.format;
 import static java.lang.String.valueOf;
-import static org.apache.commons.graph.CommonsGraph.findShortestPath;
-import static org.apache.commons.graph.CommonsGraph.newDirectedMutableGraph;
+import static org.apache.commons.graph.model.GraphUtils.newDirectedMutableGraph;
+import static org.apache.commons.graph.shortestpath.ShortestPathSolver.findShortestPath;
 import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
@@ -30,17 +30,16 @@
 import java.util.List;
 import java.util.Random;
 
-import org.apache.commons.graph.builder.AbstractGraphConnection;
 import org.apache.commons.graph.GraphException;
 import org.apache.commons.graph.Mapper;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
-import org.apache.commons.graph.model.BaseWeightedEdge;
-import org.apache.commons.graph.model.DirectedMutableGraph;
 import org.apache.commons.graph.WeightedPath;
-import org.apache.commons.graph.weight.OrderedMonoid;
-import org.apache.commons.graph.weight.primitive.DoubleWeightBaseOperations;
-
+import org.apache.commons.graph.builder.AbstractGraphConnection;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.primitive.DoubleWeightBaseOperations;
+import org.apache.commons.graph.model.DirectedMutableGraph;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseWeightedEdge;
 import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/src/benchmarks/java/org/apache/commons/graph/spanning/MinimumSpanningTreeBenchmarkTestCase.java b/benchmarks/src/test/java/org/apache/commons/graph/spanning/MinimumSpanningTreeBenchmarkTestCase.java
similarity index 92%
rename from src/benchmarks/java/org/apache/commons/graph/spanning/MinimumSpanningTreeBenchmarkTestCase.java
rename to benchmarks/src/test/java/org/apache/commons/graph/spanning/MinimumSpanningTreeBenchmarkTestCase.java
index 23e824e..9484ae3 100644
--- a/src/benchmarks/java/org/apache/commons/graph/spanning/MinimumSpanningTreeBenchmarkTestCase.java
+++ b/benchmarks/src/test/java/org/apache/commons/graph/spanning/MinimumSpanningTreeBenchmarkTestCase.java
@@ -21,8 +21,8 @@
 
 import static java.lang.String.format;
 import static java.lang.String.valueOf;
-import static org.apache.commons.graph.CommonsGraph.minimumSpanningTree;
-import static org.apache.commons.graph.CommonsGraph.newUndirectedMutableGraph;
+import static org.apache.commons.graph.model.GraphUtils.newUndirectedMutableGraph;
+import static org.apache.commons.graph.spanning.SpanningTreeSolver.minimumSpanningTree;
 import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
@@ -33,10 +33,10 @@
 import org.apache.commons.graph.Mapper;
 import org.apache.commons.graph.SpanningTree;
 import org.apache.commons.graph.builder.AbstractGraphConnection;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.math.monoid.primitive.DoubleWeightBaseOperations;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
-import org.apache.commons.graph.weight.primitive.DoubleWeightBaseOperations;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
 import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/collections/disjoint-set/pom.xml b/collections/disjoint-set/pom.xml
new file mode 100644
index 0000000..ba532ca
--- /dev/null
+++ b/collections/disjoint-set/pom.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-graph</artifactId>
+    <version>0.1-SNAPSHOT</version>
+    <relativePath>../../</relativePath>
+  </parent>
+
+  <artifactId>commons-graph-disjointset</artifactId>
+
+  <name>Apache Commons Graph - Collections - Disjoint Set</name>
+  <description>Disjoint Set data structure implementation.</description>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${basedir}/../../</directory>
+        <targetPath>META-INF</targetPath>
+        <includes>
+          <include>NOTICE.txt</include>
+          <include>LICENSE.txt</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/src/main/java/org/apache/commons/graph/collections/DisjointSet.java b/collections/disjoint-set/src/main/java/org/apache/commons/graph/collections/DisjointSet.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/collections/DisjointSet.java
rename to collections/disjoint-set/src/main/java/org/apache/commons/graph/collections/DisjointSet.java
diff --git a/src/main/java/org/apache/commons/graph/collections/DisjointSetNode.java b/collections/disjoint-set/src/main/java/org/apache/commons/graph/collections/DisjointSetNode.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/collections/DisjointSetNode.java
rename to collections/disjoint-set/src/main/java/org/apache/commons/graph/collections/DisjointSetNode.java
diff --git a/src/main/java/org/apache/commons/graph/collections/package-info.java b/collections/disjoint-set/src/main/java/org/apache/commons/graph/collections/package-info.java
similarity index 88%
rename from src/main/java/org/apache/commons/graph/collections/package-info.java
rename to collections/disjoint-set/src/main/java/org/apache/commons/graph/collections/package-info.java
index ca5e262..f81f727 100644
--- a/src/main/java/org/apache/commons/graph/collections/package-info.java
+++ b/collections/disjoint-set/src/main/java/org/apache/commons/graph/collections/package-info.java
@@ -1,5 +1,5 @@
 /**
- * Commons collections not already implemented in any ASL2.0 licensed package.
+ * Simple <a href="http://en.wikipedia.org/wiki/Disjoint-set_data_structure">Disjoint-set</a> implementation.
  */
 package org.apache.commons.graph.collections;
 
diff --git a/collections/fibonacci-heap/pom.xml b/collections/fibonacci-heap/pom.xml
new file mode 100644
index 0000000..38e00c9
--- /dev/null
+++ b/collections/fibonacci-heap/pom.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-graph</artifactId>
+    <version>0.1-SNAPSHOT</version>
+    <relativePath>../../</relativePath>
+  </parent>
+
+  <artifactId>commons-graph-fibonacciheap</artifactId>
+
+  <name>Apache Commons Graph - Collections - Fibonacci Heap</name>
+  <description>Fibonacci Heap data structure implementation.</description>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${basedir}/../../</directory>
+        <targetPath>META-INF</targetPath>
+        <includes>
+          <include>NOTICE.txt</include>
+          <include>LICENSE.txt</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/src/main/java/org/apache/commons/graph/collections/FibonacciHeap.java b/collections/fibonacci-heap/src/main/java/org/apache/commons/graph/collections/FibonacciHeap.java
similarity index 98%
rename from src/main/java/org/apache/commons/graph/collections/FibonacciHeap.java
rename to collections/fibonacci-heap/src/main/java/org/apache/commons/graph/collections/FibonacciHeap.java
index 7040594..c14b6e3 100644
--- a/src/main/java/org/apache/commons/graph/collections/FibonacciHeap.java
+++ b/collections/fibonacci-heap/src/main/java/org/apache/commons/graph/collections/FibonacciHeap.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-import static org.apache.commons.graph.utils.Assertions.checkNotNull;
-
 import static java.lang.Math.floor;
 import static java.lang.Math.log;
 import static java.lang.Math.sqrt;
@@ -127,7 +125,7 @@
             // 7 concatenate the root list containing x with root list H
             node.getLeft().setRight( node.getRight() );
             node.getRight().setLeft( node.getLeft() );
-            
+
             node.setLeft( minimumNode );
             node.setRight( minimumNode.getRight() );
             minimumNode.setRight( node );
@@ -159,7 +157,10 @@
      */
     public boolean add( E e )
     {
-        checkNotNull( e, "Null elements not allowed in this FibonacciHeap implementation." );
+        if ( e == null )
+        {
+            throw new IllegalArgumentException( "Null elements not allowed in this FibonacciHeap implementation." );
+        }
 
         // 1-6 performed in the node initialization
         FibonacciHeapNode<E> node = new FibonacciHeapNode<E>( e );
diff --git a/src/main/java/org/apache/commons/graph/collections/FibonacciHeapNode.java b/collections/fibonacci-heap/src/main/java/org/apache/commons/graph/collections/FibonacciHeapNode.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/collections/FibonacciHeapNode.java
rename to collections/fibonacci-heap/src/main/java/org/apache/commons/graph/collections/FibonacciHeapNode.java
diff --git a/src/main/java/org/apache/commons/graph/collections/package-info.java b/collections/fibonacci-heap/src/main/java/org/apache/commons/graph/collections/package-info.java
similarity index 82%
copy from src/main/java/org/apache/commons/graph/collections/package-info.java
copy to collections/fibonacci-heap/src/main/java/org/apache/commons/graph/collections/package-info.java
index ca5e262..facd579 100644
--- a/src/main/java/org/apache/commons/graph/collections/package-info.java
+++ b/collections/fibonacci-heap/src/main/java/org/apache/commons/graph/collections/package-info.java
@@ -1,5 +1,7 @@
 /**
- * Commons collections not already implemented in any ASL2.0 licensed package.
+ * A Fibonacci Heap implementation based on
+ * <a href="http://staff.ustc.edu.cn/~csli/graduate/algorithms/book6/chap21.htm">University of Science and Technology of
+ * China</a> lesson.
  */
 package org.apache.commons.graph.collections;
 
diff --git a/src/test/java/org/apache/commons/graph/collections/FibonacciHeapTestCase.java b/collections/fibonacci-heap/src/test/java/org/apache/commons/graph/collections/FibonacciHeapTestCase.java
similarity index 98%
rename from src/test/java/org/apache/commons/graph/collections/FibonacciHeapTestCase.java
rename to collections/fibonacci-heap/src/test/java/org/apache/commons/graph/collections/FibonacciHeapTestCase.java
index fe75c3f..739f7f8 100644
--- a/src/test/java/org/apache/commons/graph/collections/FibonacciHeapTestCase.java
+++ b/collections/fibonacci-heap/src/test/java/org/apache/commons/graph/collections/FibonacciHeapTestCase.java
@@ -141,7 +141,7 @@
             Integer i = queue.poll();
             assertThat( i, is( integer ) );
         }
-        
+
         assertThat( queue.isEmpty(), is( true ) );
     }
 
@@ -149,17 +149,17 @@
     public void addAllAndContinsItem()
     {
         Collection<Integer> c = new ArrayList<Integer>();
-        
+
         c.add( 50 );
         c.add( 100 );
         c.add( 20 );
         c.add( 21 );
 
         queue.addAll( c );
-            
+
         assertThat( queue.isEmpty(), is( false ) );
         assertThat( queue.containsAll( c ), is( true ) );
-        
+
         assertThat( queue.contains( 100 ), is( true ) );
         assertThat( queue.contains( 21 ), is( true ) );
         assertThat( queue.contains( 50 ), is( true ) );
@@ -194,10 +194,11 @@
         assertThat( queue.element(), is( 20 ) );
         assertThat( queue.size(), is( 4 ) );
     }
-    
+
     @Test( expected = NoSuchElementException.class )
     public void elementThrowsException()
     {
         queue.element();
     }
+
 }
diff --git a/coloring/pom.xml b/coloring/pom.xml
new file mode 100644
index 0000000..a9727dc
--- /dev/null
+++ b/coloring/pom.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-graph</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>commons-graph-coloring</artifactId>
+
+  <name>Apache Commons Graph - Coloring</name>
+  <description>Graph coloring problem solver implementation.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-api</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-model</artifactId>
+      <version>${project.parent.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${basedir}/../</directory>
+        <targetPath>META-INF</targetPath>
+        <includes>
+          <include>NOTICE.txt</include>
+          <include>LICENSE.txt</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/src/main/java/org/apache/commons/graph/coloring/ColoredVertices.java b/coloring/src/main/java/org/apache/commons/graph/coloring/ColoredVertices.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/coloring/ColoredVertices.java
rename to coloring/src/main/java/org/apache/commons/graph/coloring/ColoredVertices.java
diff --git a/src/main/java/org/apache/commons/graph/coloring/ColoringAlgorithmsSelector.java b/coloring/src/main/java/org/apache/commons/graph/coloring/ColoringAlgorithmsSelector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/coloring/ColoringAlgorithmsSelector.java
rename to coloring/src/main/java/org/apache/commons/graph/coloring/ColoringAlgorithmsSelector.java
diff --git a/coloring/src/main/java/org/apache/commons/graph/coloring/ColoringSolver.java b/coloring/src/main/java/org/apache/commons/graph/coloring/ColoringSolver.java
new file mode 100644
index 0000000..eeb166f
--- /dev/null
+++ b/coloring/src/main/java/org/apache/commons/graph/coloring/ColoringSolver.java
@@ -0,0 +1,49 @@
+package org.apache.commons.graph.coloring;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import static org.apache.commons.graph.utils.Assertions.checkNotNull;
+
+import org.apache.commons.graph.UndirectedGraph;
+
+public final class ColoringSolver
+{
+
+    private ColoringSolver()
+    {
+        // do nothing
+    }
+
+    /**
+     * Create a color builder.
+     *
+     * @param <V> the Graph vertices type
+     * @param <E> the Graph edges type
+     * @param <G> the Graph type
+     * @param graph the input graph
+     * @return an instance of {@link ColorsBuilder}
+     */
+    public static <V, E, G extends UndirectedGraph<V, E>> ColorsBuilder<V, E> coloring( G graph )
+    {
+        graph = checkNotNull( graph, "Coloring can not be calculated on null graph"  );
+        return new DefaultColorsBuilder<V, E>( graph );
+    }
+
+}
diff --git a/src/main/java/org/apache/commons/graph/coloring/ColorsBuilder.java b/coloring/src/main/java/org/apache/commons/graph/coloring/ColorsBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/coloring/ColorsBuilder.java
rename to coloring/src/main/java/org/apache/commons/graph/coloring/ColorsBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/coloring/DefaultColoringAlgorithmsSelector.java b/coloring/src/main/java/org/apache/commons/graph/coloring/DefaultColoringAlgorithmsSelector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/coloring/DefaultColoringAlgorithmsSelector.java
rename to coloring/src/main/java/org/apache/commons/graph/coloring/DefaultColoringAlgorithmsSelector.java
diff --git a/src/main/java/org/apache/commons/graph/coloring/DefaultColorsBuilder.java b/coloring/src/main/java/org/apache/commons/graph/coloring/DefaultColorsBuilder.java
similarity index 97%
rename from src/main/java/org/apache/commons/graph/coloring/DefaultColorsBuilder.java
rename to coloring/src/main/java/org/apache/commons/graph/coloring/DefaultColorsBuilder.java
index 0d1a7c2..e9d0ea0 100644
--- a/src/main/java/org/apache/commons/graph/coloring/DefaultColorsBuilder.java
+++ b/coloring/src/main/java/org/apache/commons/graph/coloring/DefaultColorsBuilder.java
@@ -31,7 +31,7 @@
  * @param <V> the Graph vertices type
  * @param <E> the Graph edges type
  */
-public final class DefaultColorsBuilder<V, E>
+final class DefaultColorsBuilder<V, E>
     implements ColorsBuilder<V, E>
 {
 
diff --git a/src/main/java/org/apache/commons/graph/coloring/NotEnoughColorsException.java b/coloring/src/main/java/org/apache/commons/graph/coloring/NotEnoughColorsException.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/coloring/NotEnoughColorsException.java
rename to coloring/src/main/java/org/apache/commons/graph/coloring/NotEnoughColorsException.java
diff --git a/src/main/java/org/apache/commons/graph/coloring/UncoloredOrderedVertices.java b/coloring/src/main/java/org/apache/commons/graph/coloring/UncoloredOrderedVertices.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/coloring/UncoloredOrderedVertices.java
rename to coloring/src/main/java/org/apache/commons/graph/coloring/UncoloredOrderedVertices.java
diff --git a/src/main/java/org/apache/commons/graph/coloring/package-info.java b/coloring/src/main/java/org/apache/commons/graph/coloring/package-info.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/coloring/package-info.java
rename to coloring/src/main/java/org/apache/commons/graph/coloring/package-info.java
diff --git a/src/test/java/org/apache/commons/graph/utils/GraphUtils.java b/coloring/src/test/java/org/apache/commons/graph/coloring/AbstractColoringTest.java
similarity index 75%
rename from src/test/java/org/apache/commons/graph/utils/GraphUtils.java
rename to coloring/src/test/java/org/apache/commons/graph/coloring/AbstractColoringTest.java
index b344ea5..5396fed 100644
--- a/src/test/java/org/apache/commons/graph/utils/GraphUtils.java
+++ b/coloring/src/test/java/org/apache/commons/graph/coloring/AbstractColoringTest.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.utils;
+package org.apache.commons.graph.coloring;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -21,53 +21,78 @@
 
 import static java.lang.String.format;
 import static java.lang.String.valueOf;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
 
 import org.apache.commons.graph.GraphException;
-import org.apache.commons.graph.model.BaseLabeledEdge;
-import org.apache.commons.graph.model.BaseLabeledVertex;
+import org.apache.commons.graph.VertexPair;
 import org.apache.commons.graph.model.BaseMutableGraph;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
+import org.apache.commons.graph.model.labeled.BaseLabeledEdge;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
 
 /**
- * Utilities graph class.
+ * Abstract class used for test coloring.
  */
-public class GraphUtils
+abstract class AbstractColoringTest
 {
 
     /**
-     * Creates a complete graph with nVertices
-     *
-     * @param nVertices number of vertices
-     * @param g graph
+     * Return a random association with index and a color string in RGB.
      */
-    public static void buildCompleteGraph( int nVertices, BaseMutableGraph<BaseLabeledVertex, BaseLabeledEdge> g )
+    protected static Map<Integer, String> createColorMap( int numColor )
     {
-        // building Graph
-        for ( int i = 0; i < nVertices; i++ )
+        Map<Integer, String> colorCodes = new HashMap<Integer, String>();
+        for ( int i = 0; i < 100; i++ )
         {
-            BaseLabeledVertex v = new BaseLabeledVertex( valueOf( i ) );
-            g.addVertex( v );
+            Random rnd = new Random( i );
+            colorCodes.put( i, String.format( "\"#%2x%2x%2x\"", rnd.nextInt( 255 ), rnd.nextInt( 255 ), rnd.nextInt( 255 ) ) );
         }
+        return colorCodes;
+    }
 
-        for ( BaseLabeledVertex v1 : g.getVertices() )
+    /**
+     * Creates a list of integer colors.
+     *
+     * @param colorNumber number of colors
+     * @return the list.
+     */
+    protected static Set<Integer> createColorsList( int colorNumber )
+    {
+        Set<Integer> colors = new HashSet<Integer>();
+        for ( int j = 0; j < colorNumber; j++ )
         {
-            for ( BaseLabeledVertex v2 : g.getVertices() )
-            {
-                if ( !v1.equals( v2 ) )
-                {
-                    try
-                    {
-                        g.addEdge( v1, new BaseLabeledEdge( format( "%s -> %s", v1, v2 ) ), v2 );
-                    }
-                    catch ( GraphException e )
-                    {
-                        // ignore
-                    }
-                }
-            }
+            colors.add( j );
+        }
+        return colors;
+    }
+
+    /**
+     * This method checks if all connected vertices have different colors.
+     *
+     * @param g
+     * @param coloredVertices
+     */
+    protected static <V, E, C> void checkColoring( UndirectedMutableGraph<V, E> g,
+                                                   ColoredVertices<V, C> coloredVertices )
+    {
+        for ( E e : g.getEdges() )
+        {
+            VertexPair<V> vp = g.getVertices( e );
+            C h = coloredVertices.getColor( vp.getHead() );
+            C t = coloredVertices.getColor( vp.getTail() );
+
+            assertNotNull( h );
+            assertNotNull( t );
+            assertTrue( !h.equals( t ) );
         }
     }
 
@@ -77,7 +102,7 @@
      * @param nVertices number of vertices
      * @param g graph
      */
-    public static void buildBipartedGraph( int nVertices, UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge> g )
+    protected static void buildBipartedGraph( int nVertices, UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge> g )
     {
         // building Graph
         for ( int i = 0; i < nVertices; i++ )
@@ -128,7 +153,7 @@
         }
     }
 
-    public static void buildCrownGraph( int nVertices, UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge> g )
+    protected static void buildCrownGraph( int nVertices, UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge> g )
     {
         List<BaseLabeledVertex> tmp = new ArrayList<BaseLabeledVertex>();
 
@@ -163,7 +188,7 @@
      *
      * @return
      */
-    public static BaseLabeledVertex[][] buildSudokuGraph( UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge> sudoku )
+    protected static BaseLabeledVertex[][] buildSudokuGraph( UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge> sudoku )
     {
         BaseLabeledVertex[][] grid = new BaseLabeledVertex[9][9];
         // build sudoku grid.
@@ -271,12 +296,40 @@
         return grid;
     }
 
+
+
     /**
-     * This class can't be instantiated
+     * Creates a complete graph with nVertices
+     *
+     * @param nVertices number of vertices
+     * @param g graph
      */
-    private GraphUtils()
+    protected static void buildCompleteGraph( int nVertices, BaseMutableGraph<BaseLabeledVertex, BaseLabeledEdge> g )
     {
-        // do nothing
+        // building Graph
+        for ( int i = 0; i < nVertices; i++ )
+        {
+            BaseLabeledVertex v = new BaseLabeledVertex( valueOf( i ) );
+            g.addVertex( v );
+        }
+
+        for ( BaseLabeledVertex v1 : g.getVertices() )
+        {
+            for ( BaseLabeledVertex v2 : g.getVertices() )
+            {
+                if ( !v1.equals( v2 ) )
+                {
+                    try
+                    {
+                        g.addEdge( v1, new BaseLabeledEdge( format( "%s -> %s", v1, v2 ) ), v2 );
+                    }
+                    catch ( GraphException e )
+                    {
+                        // ignore
+                    }
+                }
+            }
+        }
     }
 
 }
diff --git a/src/test/java/org/apache/commons/graph/coloring/GraphColoringBackTrackingTestCase.java b/coloring/src/test/java/org/apache/commons/graph/coloring/GraphColoringBackTrackingTestCase.java
similarity index 81%
rename from src/test/java/org/apache/commons/graph/coloring/GraphColoringBackTrackingTestCase.java
rename to coloring/src/test/java/org/apache/commons/graph/coloring/GraphColoringBackTrackingTestCase.java
index 36b81ea..4d9d430 100644
--- a/src/test/java/org/apache/commons/graph/coloring/GraphColoringBackTrackingTestCase.java
+++ b/coloring/src/test/java/org/apache/commons/graph/coloring/GraphColoringBackTrackingTestCase.java
@@ -19,12 +19,8 @@
  * under the License.
  */
 
-import static org.apache.commons.graph.CommonsGraph.coloring;
-import static org.apache.commons.graph.CommonsGraph.newUndirectedMutableGraph;
-import static org.apache.commons.graph.utils.GraphUtils.buildBipartedGraph;
-import static org.apache.commons.graph.utils.GraphUtils.buildCompleteGraph;
-import static org.apache.commons.graph.utils.GraphUtils.buildCrownGraph;
-import static org.apache.commons.graph.utils.GraphUtils.buildSudokuGraph;
+import static org.apache.commons.graph.Graphs.populate;
+import static org.apache.commons.graph.coloring.ColoringSolver.coloring;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
@@ -34,10 +30,10 @@
 
 import org.apache.commons.graph.UndirectedGraph;
 import org.apache.commons.graph.builder.AbstractGraphConnection;
-import org.apache.commons.graph.model.BaseLabeledEdge;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
+import org.apache.commons.graph.model.labeled.BaseLabeledEdge;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
 import org.junit.Test;
 
 /**
@@ -80,22 +76,23 @@
         final BaseLabeledVertex two = new BaseLabeledVertex( "2" );
 
         UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge> g =
-            newUndirectedMutableGraph( new AbstractGraphConnection<BaseLabeledVertex, BaseLabeledEdge>()
+        populate( new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge>() )
+        .withConnections( new AbstractGraphConnection<BaseLabeledVertex, BaseLabeledEdge>()
+        {
+
+            @Override
+            public void connect()
             {
+                BaseLabeledVertex one = addVertex( new BaseLabeledVertex( "1" ) );
+                addVertex( two );
+                BaseLabeledVertex three = addVertex( new BaseLabeledVertex( "3" ) );
 
-                @Override
-                public void connect()
-                {
-                    BaseLabeledVertex one = addVertex( new BaseLabeledVertex( "1" ) );
-                    addVertex( two );
-                    BaseLabeledVertex three = addVertex( new BaseLabeledVertex( "3" ) );
+                addEdge( new BaseLabeledEdge( "1 -> 2" ) ).from( one ).to( two );
+                addEdge( new BaseLabeledEdge( "2 -> 3" ) ).from( two ).to( three );
+                addEdge( new BaseLabeledEdge( "3 -> 1" ) ).from( three ).to( one );
+                }
 
-                    addEdge( new BaseLabeledEdge( "1 -> 2" ) ).from( one ).to( two );
-                    addEdge( new BaseLabeledEdge( "2 -> 3" ) ).from( two ).to( three );
-                    addEdge( new BaseLabeledEdge( "3 -> 1" ) ).from( three ).to( one );
-                    }
-
-            } );
+        } );
         coloring( g ).withColors( createColorsList( 1 ) ).applyingBackTrackingAlgorithm();
     }
 
@@ -105,22 +102,23 @@
         final BaseLabeledVertex two = new BaseLabeledVertex( "2" );
 
         UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge> g =
-            newUndirectedMutableGraph( new AbstractGraphConnection<BaseLabeledVertex, BaseLabeledEdge>()
+        populate( new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge>() )
+        .withConnections( new AbstractGraphConnection<BaseLabeledVertex, BaseLabeledEdge>()
+        {
+
+            @Override
+            public void connect()
             {
+                BaseLabeledVertex one = addVertex( new BaseLabeledVertex( "1" ) );
+                addVertex( two );
+                BaseLabeledVertex three = addVertex( new BaseLabeledVertex( "3" ) );
 
-                @Override
-                public void connect()
-                {
-                    BaseLabeledVertex one = addVertex( new BaseLabeledVertex( "1" ) );
-                    addVertex( two );
-                    BaseLabeledVertex three = addVertex( new BaseLabeledVertex( "3" ) );
+                addEdge( new BaseLabeledEdge( "1 -> 2" ) ).from( one ).to( two );
+                addEdge( new BaseLabeledEdge( "2 -> 3" ) ).from( two ).to( three );
+                addEdge( new BaseLabeledEdge( "3 -> 1" ) ).from( three ).to( one );
+            }
 
-                    addEdge( new BaseLabeledEdge( "1 -> 2" ) ).from( one ).to( two );
-                    addEdge( new BaseLabeledEdge( "2 -> 3" ) ).from( two ).to( three );
-                    addEdge( new BaseLabeledEdge( "3 -> 1" ) ).from( three ).to( one );
-                }
-
-            } );
+        } );
 
         ColoredVertices<BaseLabeledVertex, Integer> coloredVertex = new ColoredVertices<BaseLabeledVertex, Integer>();
         coloredVertex.addColor( two, 2 );
@@ -265,7 +263,6 @@
             sb.append( "\n" );
         }
         Logger.getAnonymousLogger().fine( sb.toString() );
-
     }
 
 }
diff --git a/src/test/java/org/apache/commons/graph/coloring/GraphColoringTestCase.java b/coloring/src/test/java/org/apache/commons/graph/coloring/GraphColoringTestCase.java
similarity index 81%
rename from src/test/java/org/apache/commons/graph/coloring/GraphColoringTestCase.java
rename to coloring/src/test/java/org/apache/commons/graph/coloring/GraphColoringTestCase.java
index e1a0be6..a394b3d 100644
--- a/src/test/java/org/apache/commons/graph/coloring/GraphColoringTestCase.java
+++ b/coloring/src/test/java/org/apache/commons/graph/coloring/GraphColoringTestCase.java
@@ -19,12 +19,8 @@
  * under the License.
  */
 
-import static org.apache.commons.graph.CommonsGraph.coloring;
-import static org.apache.commons.graph.CommonsGraph.newUndirectedMutableGraph;
-import static org.apache.commons.graph.utils.GraphUtils.buildBipartedGraph;
-import static org.apache.commons.graph.utils.GraphUtils.buildCompleteGraph;
-import static org.apache.commons.graph.utils.GraphUtils.buildCrownGraph;
-import static org.apache.commons.graph.utils.GraphUtils.buildSudokuGraph;
+import static org.apache.commons.graph.Graphs.populate;
+import static org.apache.commons.graph.coloring.ColoringSolver.coloring;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
@@ -32,10 +28,10 @@
 
 import org.apache.commons.graph.UndirectedGraph;
 import org.apache.commons.graph.builder.AbstractGraphConnection;
-import org.apache.commons.graph.model.BaseLabeledEdge;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
+import org.apache.commons.graph.model.labeled.BaseLabeledEdge;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
 import org.junit.Test;
 
 /**
@@ -78,22 +74,23 @@
         final BaseLabeledVertex two = new BaseLabeledVertex( "2" );
 
         UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge> g =
-            newUndirectedMutableGraph( new AbstractGraphConnection<BaseLabeledVertex, BaseLabeledEdge>()
+        populate( new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge>() )
+        .withConnections( new AbstractGraphConnection<BaseLabeledVertex, BaseLabeledEdge>()
+        {
+
+            @Override
+            public void connect()
             {
+                BaseLabeledVertex one = addVertex( new BaseLabeledVertex( "1" ) );
+                addVertex( two );
+                BaseLabeledVertex three = addVertex( new BaseLabeledVertex( "3" ) );
 
-                @Override
-                public void connect()
-                {
-                    BaseLabeledVertex one = addVertex( new BaseLabeledVertex( "1" ) );
-                    addVertex( two );
-                    BaseLabeledVertex three = addVertex( new BaseLabeledVertex( "3" ) );
+                addEdge( new BaseLabeledEdge( "1 -> 2" ) ).from( one ).to( two );
+                addEdge( new BaseLabeledEdge( "2 -> 3" ) ).from( two ).to( three );
+                addEdge( new BaseLabeledEdge( "3 -> 1" ) ).from( three ).to( one );
+            }
 
-                    addEdge( new BaseLabeledEdge( "1 -> 2" ) ).from( one ).to( two );
-                    addEdge( new BaseLabeledEdge( "2 -> 3" ) ).from( two ).to( three );
-                    addEdge( new BaseLabeledEdge( "3 -> 1" ) ).from( three ).to( one );
-                }
-
-            } );
+        } );
         coloring( g ).withColors( createColorsList( 1 ) ).applyingGreedyAlgorithm();
     }
 
@@ -102,7 +99,8 @@
         throws Exception
     {
         UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge> g =
-        newUndirectedMutableGraph( new AbstractGraphConnection<BaseLabeledVertex, BaseLabeledEdge>()
+        populate( new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge>() )
+        .withConnections( new AbstractGraphConnection<BaseLabeledVertex, BaseLabeledEdge>()
         {
 
             @Override
diff --git a/connectivity/pom.xml b/connectivity/pom.xml
new file mode 100644
index 0000000..b305fd9
--- /dev/null
+++ b/connectivity/pom.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-graph</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>commons-graph-connectivity</artifactId>
+
+  <name>Apache Commons Graph - Connectivity</name>
+  <description>Graph connectivity problem solver implementation.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-api</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-visit</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <!-- test dependencies -->
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-model</artifactId>
+      <version>${project.parent.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${basedir}/../</directory>
+        <targetPath>META-INF</targetPath>
+        <includes>
+          <include>NOTICE.txt</include>
+          <include>LICENSE.txt</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/src/main/java/org/apache/commons/graph/connectivity/ConnectedComponentHandler.java b/connectivity/src/main/java/org/apache/commons/graph/connectivity/ConnectedComponentHandler.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/connectivity/ConnectedComponentHandler.java
rename to connectivity/src/main/java/org/apache/commons/graph/connectivity/ConnectedComponentHandler.java
diff --git a/src/main/java/org/apache/commons/graph/connectivity/ConnectivityAlgorithmsSelector.java b/connectivity/src/main/java/org/apache/commons/graph/connectivity/ConnectivityAlgorithmsSelector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/connectivity/ConnectivityAlgorithmsSelector.java
rename to connectivity/src/main/java/org/apache/commons/graph/connectivity/ConnectivityAlgorithmsSelector.java
diff --git a/src/main/java/org/apache/commons/graph/connectivity/ConnectivityBuilder.java b/connectivity/src/main/java/org/apache/commons/graph/connectivity/ConnectivityBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/connectivity/ConnectivityBuilder.java
rename to connectivity/src/main/java/org/apache/commons/graph/connectivity/ConnectivityBuilder.java
diff --git a/connectivity/src/main/java/org/apache/commons/graph/connectivity/ConnectivitySolver.java b/connectivity/src/main/java/org/apache/commons/graph/connectivity/ConnectivitySolver.java
new file mode 100644
index 0000000..c7af853
--- /dev/null
+++ b/connectivity/src/main/java/org/apache/commons/graph/connectivity/ConnectivitySolver.java
@@ -0,0 +1,49 @@
+package org.apache.commons.graph.connectivity;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import static org.apache.commons.graph.utils.Assertions.checkNotNull;
+
+import org.apache.commons.graph.Graph;
+
+public final class ConnectivitySolver
+{
+
+    /**
+     * Calculates the input graph Connected Component.
+     *
+     * @param <V> the Graph vertices type.
+     * @param <E> the Graph edges type.
+     * @param <G> the directed graph type
+     * @param graph the Graph which connected component has to be verified.
+     * @return the Connectivity algorithm builder
+     */
+    public static <V, E, G extends Graph<V, E>> ConnectivityBuilder<V, E> findConnectedComponent( G graph )
+    {
+        graph = checkNotNull( graph, "Connected Component cannot be calculated from a null graph" );
+        return new DefaultConnectivityBuilder<V, E>( graph );
+    }
+
+    private ConnectivitySolver()
+    {
+        // do nothing
+    }
+
+}
diff --git a/src/main/java/org/apache/commons/graph/connectivity/DefaultConnectivityAlgorithmsSelector.java b/connectivity/src/main/java/org/apache/commons/graph/connectivity/DefaultConnectivityAlgorithmsSelector.java
similarity index 96%
rename from src/main/java/org/apache/commons/graph/connectivity/DefaultConnectivityAlgorithmsSelector.java
rename to connectivity/src/main/java/org/apache/commons/graph/connectivity/DefaultConnectivityAlgorithmsSelector.java
index 5934f66..e918521 100644
--- a/src/main/java/org/apache/commons/graph/connectivity/DefaultConnectivityAlgorithmsSelector.java
+++ b/connectivity/src/main/java/org/apache/commons/graph/connectivity/DefaultConnectivityAlgorithmsSelector.java
@@ -19,7 +19,7 @@
  * under the License.
  */
 
-import static org.apache.commons.graph.CommonsGraph.visit;
+import static org.apache.commons.graph.visit.GraphVisitor.visit;
 import static org.apache.commons.graph.utils.Assertions.checkState;
 
 import java.util.ArrayList;
@@ -31,7 +31,7 @@
 
 /**
  * TODO Fill me!!
- * 
+ *
  * @param <V> the Graph vertices type
  * @param <E> the Graph edges type
  */
@@ -45,7 +45,7 @@
 
     /**
      * Create a new instance of {@link DefaultConnectivityAlgorithmsSelector} calculated for a set of included vertices
-     * 
+     *
      * @param graph the graph
      * @param includedVertices included vertices
      */
diff --git a/src/main/java/org/apache/commons/graph/connectivity/DefaultConnectivityBuilder.java b/connectivity/src/main/java/org/apache/commons/graph/connectivity/DefaultConnectivityBuilder.java
similarity index 97%
rename from src/main/java/org/apache/commons/graph/connectivity/DefaultConnectivityBuilder.java
rename to connectivity/src/main/java/org/apache/commons/graph/connectivity/DefaultConnectivityBuilder.java
index 5992d09..57b2687 100644
--- a/src/main/java/org/apache/commons/graph/connectivity/DefaultConnectivityBuilder.java
+++ b/connectivity/src/main/java/org/apache/commons/graph/connectivity/DefaultConnectivityBuilder.java
@@ -26,11 +26,11 @@
 
 /**
  * TODO Fill me!!
- * 
+ *
  * @param <V> the Graph vertices type
  * @param <E> the Graph edges type
  */
-public class DefaultConnectivityBuilder<V, E>
+final class DefaultConnectivityBuilder<V, E>
     implements ConnectivityBuilder<V, E>
 {
 
diff --git a/src/main/java/org/apache/commons/graph/connectivity/package-info.java b/connectivity/src/main/java/org/apache/commons/graph/connectivity/package-info.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/connectivity/package-info.java
rename to connectivity/src/main/java/org/apache/commons/graph/connectivity/package-info.java
diff --git a/src/test/java/org/apache/commons/graph/connectivity/FindConnectedComponetTestCase.java b/connectivity/src/test/java/org/apache/commons/graph/connectivity/FindConnectedComponetTestCase.java
similarity index 92%
rename from src/test/java/org/apache/commons/graph/connectivity/FindConnectedComponetTestCase.java
rename to connectivity/src/test/java/org/apache/commons/graph/connectivity/FindConnectedComponetTestCase.java
index cad923f..901af35 100644
--- a/src/test/java/org/apache/commons/graph/connectivity/FindConnectedComponetTestCase.java
+++ b/connectivity/src/test/java/org/apache/commons/graph/connectivity/FindConnectedComponetTestCase.java
@@ -19,8 +19,8 @@
  * under the License.
  */
 
-import static org.apache.commons.graph.CommonsGraph.findConnectedComponent;
-import static org.apache.commons.graph.CommonsGraph.newUndirectedMutableGraph;
+import static org.apache.commons.graph.Graphs.populate;
+import static org.apache.commons.graph.connectivity.ConnectivitySolver.findConnectedComponent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -30,10 +30,11 @@
 
 import org.apache.commons.graph.Graph;
 import org.apache.commons.graph.builder.AbstractGraphConnection;
-import org.apache.commons.graph.model.BaseLabeledEdge;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.builder.GraphConnection;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
+import org.apache.commons.graph.model.labeled.BaseLabeledEdge;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
 import org.junit.Test;
 
 /**
@@ -41,7 +42,7 @@
 public final class FindConnectedComponetTestCase
 {
 
-    @Test(expected=NullPointerException.class)
+    @Test( expected = NullPointerException.class )
     public void verifyNullGraph()
     {
         findConnectedComponent( (Graph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>>) null ).includingAllVertices().applyingMinimumSpanningTreeAlgorithm();
@@ -246,4 +247,9 @@
         assertEquals( 2, coll.size() );
     }
 
+    private UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge> newUndirectedMutableGraph( GraphConnection<BaseLabeledVertex, BaseLabeledEdge> graphConnection )
+    {
+        return populate( new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge>() ).withConnections( graphConnection );
+    }
+
 }
diff --git a/elo/pom.xml b/elo/pom.xml
new file mode 100644
index 0000000..2845b58
--- /dev/null
+++ b/elo/pom.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-graph</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>commons-graph-elo</artifactId>
+
+  <name>Apache Commons Graph - ELO</name>
+  <description>Graph ELO rating implementation.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-api</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-model</artifactId>
+      <version>${project.parent.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${basedir}/../</directory>
+        <targetPath>META-INF</targetPath>
+        <includes>
+          <include>NOTICE.txt</include>
+          <include>LICENSE.txt</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/src/main/java/org/apache/commons/graph/elo/Category.java b/elo/src/main/java/org/apache/commons/graph/elo/Category.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/elo/Category.java
rename to elo/src/main/java/org/apache/commons/graph/elo/Category.java
diff --git a/src/main/java/org/apache/commons/graph/elo/DefaultKFactorBuilder.java b/elo/src/main/java/org/apache/commons/graph/elo/DefaultKFactorBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/elo/DefaultKFactorBuilder.java
rename to elo/src/main/java/org/apache/commons/graph/elo/DefaultKFactorBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/elo/DefaultRankingSelector.java b/elo/src/main/java/org/apache/commons/graph/elo/DefaultRankingSelector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/elo/DefaultRankingSelector.java
rename to elo/src/main/java/org/apache/commons/graph/elo/DefaultRankingSelector.java
diff --git a/elo/src/main/java/org/apache/commons/graph/elo/EloSolver.java b/elo/src/main/java/org/apache/commons/graph/elo/EloSolver.java
new file mode 100644
index 0000000..fb1a67b
--- /dev/null
+++ b/elo/src/main/java/org/apache/commons/graph/elo/EloSolver.java
@@ -0,0 +1,49 @@
+package org.apache.commons.graph.elo;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import static org.apache.commons.graph.utils.Assertions.checkNotNull;
+
+import org.apache.commons.graph.DirectedGraph;
+
+public final class EloSolver
+{
+
+    /**
+     * Ranks the players (vertices) that took part in a tournament (graph) depending on the game results (edges),
+     * applying the <a href="http://en.wikipedia.org/wiki/Elo_rating_system.">Elo Rating System</a>.
+     *
+     * @param <P> the players involved in the tournament
+     * @param <TG> the Tournament Graph type
+     * @param tournamentGraph the graph representing the tournament
+     * @return the builder for the functor which returns/update the players ranking
+     */
+    public static <P, TG extends DirectedGraph<P, GameResult>> RankingSelector<P> eloRate( TG tournamentGraph )
+    {
+        tournamentGraph = checkNotNull( tournamentGraph, "ELO ranking can not be applied on null graph!" );
+        return new DefaultRankingSelector<P>( tournamentGraph );
+    }
+
+    private EloSolver()
+    {
+        // do nothing
+    }
+
+}
diff --git a/src/main/java/org/apache/commons/graph/elo/GameResult.java b/elo/src/main/java/org/apache/commons/graph/elo/GameResult.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/elo/GameResult.java
rename to elo/src/main/java/org/apache/commons/graph/elo/GameResult.java
diff --git a/src/main/java/org/apache/commons/graph/elo/KFactorBuilder.java b/elo/src/main/java/org/apache/commons/graph/elo/KFactorBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/elo/KFactorBuilder.java
rename to elo/src/main/java/org/apache/commons/graph/elo/KFactorBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/elo/PlayersRank.java b/elo/src/main/java/org/apache/commons/graph/elo/PlayersRank.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/elo/PlayersRank.java
rename to elo/src/main/java/org/apache/commons/graph/elo/PlayersRank.java
diff --git a/src/main/java/org/apache/commons/graph/elo/RankingSelector.java b/elo/src/main/java/org/apache/commons/graph/elo/RankingSelector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/elo/RankingSelector.java
rename to elo/src/main/java/org/apache/commons/graph/elo/RankingSelector.java
diff --git a/src/main/java/org/apache/commons/graph/elo/package-info.java b/elo/src/main/java/org/apache/commons/graph/elo/package-info.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/elo/package-info.java
rename to elo/src/main/java/org/apache/commons/graph/elo/package-info.java
diff --git a/src/test/java/org/apache/commons/graph/elo/EloTestCase.java b/elo/src/test/java/org/apache/commons/graph/elo/EloTestCase.java
similarity index 90%
rename from src/test/java/org/apache/commons/graph/elo/EloTestCase.java
rename to elo/src/test/java/org/apache/commons/graph/elo/EloTestCase.java
index ff8deda..3c14a1b 100644
--- a/src/test/java/org/apache/commons/graph/elo/EloTestCase.java
+++ b/elo/src/test/java/org/apache/commons/graph/elo/EloTestCase.java
@@ -21,11 +21,12 @@
 
 import static org.apache.commons.graph.elo.GameResult.WIN;
 
-import static org.apache.commons.graph.CommonsGraph.eloRate;
-import static org.apache.commons.graph.CommonsGraph.newDirectedMutableGraph;
+import static org.apache.commons.graph.elo.EloSolver.eloRate;
+import static org.apache.commons.graph.Graphs.populate;
 
 import org.apache.commons.graph.DirectedGraph;
 import org.apache.commons.graph.builder.AbstractGraphConnection;
+import org.apache.commons.graph.model.DirectedMutableGraph;
 import org.junit.Test;
 
 /**
@@ -38,7 +39,8 @@
     public void performElo()
     {
         DirectedGraph<String, GameResult> tournament =
-        newDirectedMutableGraph( new AbstractGraphConnection<String, GameResult>()
+        populate( new DirectedMutableGraph<String, GameResult>() )
+        .withConnections( new AbstractGraphConnection<String, GameResult>()
         {
 
             @Override
@@ -85,6 +87,7 @@
 
         eloRate( tournament ).wherePlayersAreRankedIn( playersRank ).withKFactor( 80 );
 
+        // TODO find a way to asser the rate worked
         System.out.println( playersRank );
     }
 
diff --git a/src/test/java/org/apache/commons/graph/elo/SimplePlayersRank.java b/elo/src/test/java/org/apache/commons/graph/elo/SimplePlayersRank.java
similarity index 100%
rename from src/test/java/org/apache/commons/graph/elo/SimplePlayersRank.java
rename to elo/src/test/java/org/apache/commons/graph/elo/SimplePlayersRank.java
diff --git a/export/pom.xml b/export/pom.xml
new file mode 100644
index 0000000..1b0406e
--- /dev/null
+++ b/export/pom.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-graph</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>commons-graph-export</artifactId>
+
+  <name>Apache Commons Graph - Export</name>
+  <description>Graph exporters to different formats implementation.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-api</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <!-- test dependencies -->
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-model</artifactId>
+      <version>${project.parent.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${basedir}/../</directory>
+        <targetPath>META-INF</targetPath>
+        <includes>
+          <include>NOTICE.txt</include>
+          <include>LICENSE.txt</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/src/main/java/org/apache/commons/graph/export/AbstractExporter.java b/export/src/main/java/org/apache/commons/graph/export/AbstractExporter.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/export/AbstractExporter.java
rename to export/src/main/java/org/apache/commons/graph/export/AbstractExporter.java
diff --git a/src/main/java/org/apache/commons/graph/export/DefaultExportSelector.java b/export/src/main/java/org/apache/commons/graph/export/DefaultExportSelector.java
similarity index 97%
rename from src/main/java/org/apache/commons/graph/export/DefaultExportSelector.java
rename to export/src/main/java/org/apache/commons/graph/export/DefaultExportSelector.java
index 0e8e3db..00a2d92 100644
--- a/src/main/java/org/apache/commons/graph/export/DefaultExportSelector.java
+++ b/export/src/main/java/org/apache/commons/graph/export/DefaultExportSelector.java
@@ -25,11 +25,11 @@
 
 /**
  * {@link NamedExportSelector} implementation
- * 
+ *
  * @param <V> the Graph vertices type.
  * @param <E> the Graph edges type.
  */
-public final class DefaultExportSelector<V, E>
+final class DefaultExportSelector<V, E>
     implements NamedExportSelector<V, E>
 {
 
diff --git a/src/main/java/org/apache/commons/graph/export/DotExporter.java b/export/src/main/java/org/apache/commons/graph/export/DotExporter.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/export/DotExporter.java
rename to export/src/main/java/org/apache/commons/graph/export/DotExporter.java
diff --git a/src/main/java/org/apache/commons/graph/export/ExportSelector.java b/export/src/main/java/org/apache/commons/graph/export/ExportSelector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/export/ExportSelector.java
rename to export/src/main/java/org/apache/commons/graph/export/ExportSelector.java
diff --git a/src/main/java/org/apache/commons/graph/export/GraphExportException.java b/export/src/main/java/org/apache/commons/graph/export/GraphExportException.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/export/GraphExportException.java
rename to export/src/main/java/org/apache/commons/graph/export/GraphExportException.java
diff --git a/export/src/main/java/org/apache/commons/graph/export/GraphExporter.java b/export/src/main/java/org/apache/commons/graph/export/GraphExporter.java
new file mode 100644
index 0000000..401d5dd
--- /dev/null
+++ b/export/src/main/java/org/apache/commons/graph/export/GraphExporter.java
@@ -0,0 +1,49 @@
+package org.apache.commons.graph.export;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import static org.apache.commons.graph.utils.Assertions.checkNotNull;
+
+import org.apache.commons.graph.Graph;
+
+public final class GraphExporter
+{
+
+    /**
+     * Export the graph in DOT or GraphML format.
+     *
+     * @param <V> the Graph vertices type
+     * @param <E> the Graph edges type
+     * @param <G> the Graph type
+     * @param graph the input graph
+     * @return an instance of {@link NamedExportSelector}
+     */
+    public static <V, E, G extends Graph<V, E>> NamedExportSelector<V, E> export( G graph )
+    {
+        graph = checkNotNull( graph, "Null graph can not be exported" );
+        return new DefaultExportSelector<V, E>( graph );
+    }
+
+    private GraphExporter()
+    {
+        // do nothing
+    }
+
+}
diff --git a/src/main/java/org/apache/commons/graph/export/GraphMLExporter.java b/export/src/main/java/org/apache/commons/graph/export/GraphMLExporter.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/export/GraphMLExporter.java
rename to export/src/main/java/org/apache/commons/graph/export/GraphMLExporter.java
diff --git a/src/main/java/org/apache/commons/graph/export/NamedExportSelector.java b/export/src/main/java/org/apache/commons/graph/export/NamedExportSelector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/export/NamedExportSelector.java
rename to export/src/main/java/org/apache/commons/graph/export/NamedExportSelector.java
diff --git a/src/main/java/org/apache/commons/graph/export/package-info.java b/export/src/main/java/org/apache/commons/graph/export/package-info.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/export/package-info.java
rename to export/src/main/java/org/apache/commons/graph/export/package-info.java
diff --git a/src/test/java/org/apache/commons/graph/export/EdgeLabelMapper.java b/export/src/test/java/org/apache/commons/graph/export/EdgeLabelMapper.java
similarity index 94%
rename from src/test/java/org/apache/commons/graph/export/EdgeLabelMapper.java
rename to export/src/test/java/org/apache/commons/graph/export/EdgeLabelMapper.java
index 8f84bf2..535ecd1 100644
--- a/src/test/java/org/apache/commons/graph/export/EdgeLabelMapper.java
+++ b/export/src/test/java/org/apache/commons/graph/export/EdgeLabelMapper.java
@@ -20,7 +20,7 @@
  */
 
 import org.apache.commons.graph.Mapper;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
 
 public final class EdgeLabelMapper
     implements Mapper<BaseLabeledWeightedEdge<Double>, String>
diff --git a/src/test/java/org/apache/commons/graph/export/EdgeWeightMapper.java b/export/src/test/java/org/apache/commons/graph/export/EdgeWeightMapper.java
similarity index 94%
rename from src/test/java/org/apache/commons/graph/export/EdgeWeightMapper.java
rename to export/src/test/java/org/apache/commons/graph/export/EdgeWeightMapper.java
index c406a14..9b966a8 100644
--- a/src/test/java/org/apache/commons/graph/export/EdgeWeightMapper.java
+++ b/export/src/test/java/org/apache/commons/graph/export/EdgeWeightMapper.java
@@ -20,7 +20,7 @@
  */
 
 import org.apache.commons.graph.Mapper;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
 
 public final class EdgeWeightMapper
     implements Mapper<BaseLabeledWeightedEdge<Double>, Double>
diff --git a/src/test/java/org/apache/commons/graph/export/ExportTestCase.java b/export/src/test/java/org/apache/commons/graph/export/ExportTestCase.java
similarity index 85%
rename from src/test/java/org/apache/commons/graph/export/ExportTestCase.java
rename to export/src/test/java/org/apache/commons/graph/export/ExportTestCase.java
index 0750467..af0540d 100644
--- a/src/test/java/org/apache/commons/graph/export/ExportTestCase.java
+++ b/export/src/test/java/org/apache/commons/graph/export/ExportTestCase.java
@@ -19,18 +19,21 @@
  * under the License.
  */
 
-import static org.apache.commons.graph.CommonsGraph.export;
-import static org.apache.commons.graph.CommonsGraph.newUndirectedMutableGraph;
+import static org.apache.commons.graph.Graphs.populate;
+import static org.apache.commons.graph.export.GraphExporter.export;
 
 import org.apache.commons.graph.builder.AbstractGraphConnection;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
 
+/**
+ * TODO find a way to assert exported graphs
+ */
 public class ExportTestCase {
 
     private UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>> actual;
@@ -39,7 +42,8 @@
     public void setUp()
     {
         actual =
-        newUndirectedMutableGraph( new AbstractGraphConnection<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>>()
+        populate( new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>>() )
+        .withConnections( new AbstractGraphConnection<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>>()
         {
 
             public void connect()
diff --git a/src/test/java/org/apache/commons/graph/export/VertexLabelMapper.java b/export/src/test/java/org/apache/commons/graph/export/VertexLabelMapper.java
similarity index 94%
rename from src/test/java/org/apache/commons/graph/export/VertexLabelMapper.java
rename to export/src/test/java/org/apache/commons/graph/export/VertexLabelMapper.java
index 804de69..988f66e 100644
--- a/src/test/java/org/apache/commons/graph/export/VertexLabelMapper.java
+++ b/export/src/test/java/org/apache/commons/graph/export/VertexLabelMapper.java
@@ -20,7 +20,7 @@
  */
 
 import org.apache.commons.graph.Mapper;
-import org.apache.commons.graph.model.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
 
 public final class VertexLabelMapper
     implements Mapper<BaseLabeledVertex, String>
diff --git a/flow/pom.xml b/flow/pom.xml
new file mode 100644
index 0000000..7cd1963
--- /dev/null
+++ b/flow/pom.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-graph</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>commons-graph-flow</artifactId>
+
+  <name>Apache Commons Graph - Flow</name>
+  <description>Graph flow problem solver implementation.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-api</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-visit</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-model</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${basedir}/../</directory>
+        <targetPath>META-INF</targetPath>
+        <includes>
+          <include>NOTICE.txt</include>
+          <include>LICENSE.txt</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/src/main/java/org/apache/commons/graph/flow/DefaultFlowWeightedEdgesBuilder.java b/flow/src/main/java/org/apache/commons/graph/flow/DefaultFlowWeightedEdgesBuilder.java
similarity index 96%
rename from src/main/java/org/apache/commons/graph/flow/DefaultFlowWeightedEdgesBuilder.java
rename to flow/src/main/java/org/apache/commons/graph/flow/DefaultFlowWeightedEdgesBuilder.java
index 4620e40..877f45d 100644
--- a/src/main/java/org/apache/commons/graph/flow/DefaultFlowWeightedEdgesBuilder.java
+++ b/flow/src/main/java/org/apache/commons/graph/flow/DefaultFlowWeightedEdgesBuilder.java
@@ -26,11 +26,11 @@
 
 /**
  * {@link FlowWeightedEdgesBuilder} implementation
- * 
+ *
  * @param <V> the Graph vertices type
  * @param <WE> the Graph edges type
  */
-public final class DefaultFlowWeightedEdgesBuilder<V, WE>
+final class DefaultFlowWeightedEdgesBuilder<V, WE>
     implements FlowWeightedEdgesBuilder<V, WE>
 {
 
diff --git a/src/main/java/org/apache/commons/graph/flow/DefaultFromHeadBuilder.java b/flow/src/main/java/org/apache/commons/graph/flow/DefaultFromHeadBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/flow/DefaultFromHeadBuilder.java
rename to flow/src/main/java/org/apache/commons/graph/flow/DefaultFromHeadBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/flow/DefaultMaxFlowAlgorithmSelector.java b/flow/src/main/java/org/apache/commons/graph/flow/DefaultMaxFlowAlgorithmSelector.java
similarity index 94%
rename from src/main/java/org/apache/commons/graph/flow/DefaultMaxFlowAlgorithmSelector.java
rename to flow/src/main/java/org/apache/commons/graph/flow/DefaultMaxFlowAlgorithmSelector.java
index 1bdd041..ac4697e 100644
--- a/src/main/java/org/apache/commons/graph/flow/DefaultMaxFlowAlgorithmSelector.java
+++ b/flow/src/main/java/org/apache/commons/graph/flow/DefaultMaxFlowAlgorithmSelector.java
@@ -19,15 +19,16 @@
  * under the License.
  */
 
-import static org.apache.commons.graph.CommonsGraph.newDirectedMutableGraph;
-import static org.apache.commons.graph.CommonsGraph.visit;
+import static org.apache.commons.graph.Graphs.populate;
 import static org.apache.commons.graph.utils.Assertions.checkNotNull;
+import static org.apache.commons.graph.visit.GraphVisitor.visit;
 
 import org.apache.commons.graph.DirectedGraph;
 import org.apache.commons.graph.Mapper;
 import org.apache.commons.graph.VertexPair;
 import org.apache.commons.graph.builder.AbstractGraphConnection;
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
+import org.apache.commons.graph.model.DirectedMutableGraph;
 
 /**
  * {@link MaxFlowAlgorithmSelector} implementation.
@@ -115,7 +116,8 @@
     private <WO extends OrderedMonoid<W>> DirectedGraph<V, EdgeWrapper<WE>> newFlowNetwok( final DirectedGraph<V, WE> graph,
                                                                                            final WO weightOperations )
     {
-        return newDirectedMutableGraph( new AbstractGraphConnection<V, EdgeWrapper<WE>>()
+        return populate( new DirectedMutableGraph<V, EdgeWrapper<WE>>() )
+               .withConnections( new AbstractGraphConnection<V, EdgeWrapper<WE>>()
         {
             @Override
             public void connect()
@@ -125,6 +127,7 @@
                 {
                     addVertex( vertex );
                 }
+
                 // edges
                 for ( WE edge : graph.getEdges() )
                 {
diff --git a/src/main/java/org/apache/commons/graph/flow/DefaultToTailBuilder.java b/flow/src/main/java/org/apache/commons/graph/flow/DefaultToTailBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/flow/DefaultToTailBuilder.java
rename to flow/src/main/java/org/apache/commons/graph/flow/DefaultToTailBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/flow/FlowNetworkHandler.java b/flow/src/main/java/org/apache/commons/graph/flow/FlowNetworkHandler.java
similarity index 97%
rename from src/main/java/org/apache/commons/graph/flow/FlowNetworkHandler.java
rename to flow/src/main/java/org/apache/commons/graph/flow/FlowNetworkHandler.java
index b101432..d57acc6 100644
--- a/src/main/java/org/apache/commons/graph/flow/FlowNetworkHandler.java
+++ b/flow/src/main/java/org/apache/commons/graph/flow/FlowNetworkHandler.java
@@ -30,10 +30,10 @@
 import org.apache.commons.graph.Mapper;
 import org.apache.commons.graph.VertexPair;
 import org.apache.commons.graph.WeightedPath;
-import org.apache.commons.graph.shortestpath.PredecessorsList;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
+import org.apache.commons.graph.model.PredecessorsList;
 import org.apache.commons.graph.visit.BaseGraphVisitHandler;
 import org.apache.commons.graph.visit.VisitState;
-import org.apache.commons.graph.weight.OrderedMonoid;
 
 /**
  * Provides standard operations for max-flow algorithms,
diff --git a/flow/src/main/java/org/apache/commons/graph/flow/FlowSolver.java b/flow/src/main/java/org/apache/commons/graph/flow/FlowSolver.java
new file mode 100644
index 0000000..012ba0b
--- /dev/null
+++ b/flow/src/main/java/org/apache/commons/graph/flow/FlowSolver.java
@@ -0,0 +1,50 @@
+package org.apache.commons.graph.flow;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import static org.apache.commons.graph.utils.Assertions.checkNotNull;
+
+import org.apache.commons.graph.DirectedGraph;
+import org.apache.commons.graph.Graph;
+
+public final class FlowSolver
+{
+
+    /**
+     * Find the maximum flow on the input {@link Graph}.
+     *
+     * @param <V> the Graph vertices type
+     * @param <WE> the Graph edges type
+     * @param <G> the Graph type
+     * @param graph the input edge-weighted graph
+     * @return an instance of {@link FlowWeightedEdgesBuilder}
+     */
+    public static <V, WE, G extends DirectedGraph<V, WE>> FlowWeightedEdgesBuilder<V, WE> findMaxFlow( G graph )
+    {
+        graph = checkNotNull( graph, "Max flow can not be calculated on null graph" );
+        return new DefaultFlowWeightedEdgesBuilder<V, WE>( graph );
+    }
+
+    private FlowSolver()
+    {
+        // do nothing
+    }
+
+}
diff --git a/src/main/java/org/apache/commons/graph/flow/FlowWeightedEdgesBuilder.java b/flow/src/main/java/org/apache/commons/graph/flow/FlowWeightedEdgesBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/flow/FlowWeightedEdgesBuilder.java
rename to flow/src/main/java/org/apache/commons/graph/flow/FlowWeightedEdgesBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/flow/FromHeadBuilder.java b/flow/src/main/java/org/apache/commons/graph/flow/FromHeadBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/flow/FromHeadBuilder.java
rename to flow/src/main/java/org/apache/commons/graph/flow/FromHeadBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/flow/MaxFlowAlgorithmSelector.java b/flow/src/main/java/org/apache/commons/graph/flow/MaxFlowAlgorithmSelector.java
similarity index 96%
rename from src/main/java/org/apache/commons/graph/flow/MaxFlowAlgorithmSelector.java
rename to flow/src/main/java/org/apache/commons/graph/flow/MaxFlowAlgorithmSelector.java
index 14e0579..2789196 100644
--- a/src/main/java/org/apache/commons/graph/flow/MaxFlowAlgorithmSelector.java
+++ b/flow/src/main/java/org/apache/commons/graph/flow/MaxFlowAlgorithmSelector.java
@@ -19,7 +19,7 @@
  * under the License.
  */
 
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 
 /**
  * Maximum Flow algorithm selector
diff --git a/src/main/java/org/apache/commons/graph/flow/ToTailBuilder.java b/flow/src/main/java/org/apache/commons/graph/flow/ToTailBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/flow/ToTailBuilder.java
rename to flow/src/main/java/org/apache/commons/graph/flow/ToTailBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/flow/package-info.java b/flow/src/main/java/org/apache/commons/graph/flow/package-info.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/flow/package-info.java
rename to flow/src/main/java/org/apache/commons/graph/flow/package-info.java
diff --git a/src/test/java/org/apache/commons/graph/flow/EdmondsKarpTestCase.java b/flow/src/test/java/org/apache/commons/graph/flow/EdmondsKarpTestCase.java
similarity index 93%
rename from src/test/java/org/apache/commons/graph/flow/EdmondsKarpTestCase.java
rename to flow/src/test/java/org/apache/commons/graph/flow/EdmondsKarpTestCase.java
index 53b6a0a..2627648 100644
--- a/src/test/java/org/apache/commons/graph/flow/EdmondsKarpTestCase.java
+++ b/flow/src/test/java/org/apache/commons/graph/flow/EdmondsKarpTestCase.java
@@ -19,16 +19,16 @@
  * under the License.
  */
 
-import static org.apache.commons.graph.CommonsGraph.findMaxFlow;
-import static org.apache.commons.graph.CommonsGraph.newDirectedMutableGraph;
+import static org.apache.commons.graph.flow.FlowSolver.findMaxFlow;
+import static org.apache.commons.graph.model.GraphUtils.newDirectedMutableGraph;
 import static org.junit.Assert.assertEquals;
 
 import org.apache.commons.graph.builder.AbstractGraphConnection;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
-import org.apache.commons.graph.model.BaseWeightedEdge;
+import org.apache.commons.graph.math.monoid.primitive.IntegerWeightBaseOperations;
 import org.apache.commons.graph.model.DirectedMutableGraph;
-import org.apache.commons.graph.weight.primitive.IntegerWeightBaseOperations;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseWeightedEdge;
 import org.junit.Test;
 
 /**
diff --git a/src/test/java/org/apache/commons/graph/flow/FordFulkersonTestCase.java b/flow/src/test/java/org/apache/commons/graph/flow/FordFulkersonTestCase.java
similarity index 93%
rename from src/test/java/org/apache/commons/graph/flow/FordFulkersonTestCase.java
rename to flow/src/test/java/org/apache/commons/graph/flow/FordFulkersonTestCase.java
index d4d2a56..5b2caa4 100644
--- a/src/test/java/org/apache/commons/graph/flow/FordFulkersonTestCase.java
+++ b/flow/src/test/java/org/apache/commons/graph/flow/FordFulkersonTestCase.java
@@ -19,16 +19,16 @@
  * under the License.
  */
 
-import static org.apache.commons.graph.CommonsGraph.findMaxFlow;
-import static org.apache.commons.graph.CommonsGraph.newDirectedMutableGraph;
+import static org.apache.commons.graph.flow.FlowSolver.findMaxFlow;
+import static org.apache.commons.graph.model.GraphUtils.newDirectedMutableGraph;
 import static org.junit.Assert.assertEquals;
 
 import org.apache.commons.graph.builder.AbstractGraphConnection;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
-import org.apache.commons.graph.model.BaseWeightedEdge;
+import org.apache.commons.graph.math.monoid.primitive.IntegerWeightBaseOperations;
 import org.apache.commons.graph.model.DirectedMutableGraph;
-import org.apache.commons.graph.weight.primitive.IntegerWeightBaseOperations;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseWeightedEdge;
 import org.junit.Test;
 
 /**
diff --git a/model/pom.xml b/model/pom.xml
new file mode 100644
index 0000000..fa09e95
--- /dev/null
+++ b/model/pom.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-graph</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>commons-graph-model</artifactId>
+
+  <name>Apache Commons Graph - Model</name>
+  <description>In memory Graph data structures implementation.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-api</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${basedir}/../</directory>
+        <targetPath>META-INF</targetPath>
+        <includes>
+          <include>NOTICE.txt</include>
+          <include>LICENSE.txt</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/src/main/java/org/apache/commons/graph/model/BaseGraph.java b/model/src/main/java/org/apache/commons/graph/model/BaseGraph.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/model/BaseGraph.java
rename to model/src/main/java/org/apache/commons/graph/model/BaseGraph.java
diff --git a/src/main/java/org/apache/commons/graph/model/BaseMutableGraph.java b/model/src/main/java/org/apache/commons/graph/model/BaseMutableGraph.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/model/BaseMutableGraph.java
rename to model/src/main/java/org/apache/commons/graph/model/BaseMutableGraph.java
diff --git a/src/main/java/org/apache/commons/graph/model/DirectedMutableGraph.java b/model/src/main/java/org/apache/commons/graph/model/DirectedMutableGraph.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/model/DirectedMutableGraph.java
rename to model/src/main/java/org/apache/commons/graph/model/DirectedMutableGraph.java
diff --git a/model/src/main/java/org/apache/commons/graph/model/GraphUtils.java b/model/src/main/java/org/apache/commons/graph/model/GraphUtils.java
new file mode 100644
index 0000000..ad7c79e
--- /dev/null
+++ b/model/src/main/java/org/apache/commons/graph/model/GraphUtils.java
@@ -0,0 +1,70 @@
+package org.apache.commons.graph.model;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import static org.apache.commons.graph.Graphs.populate;
+
+import org.apache.commons.graph.builder.GraphConnection;
+import org.apache.commons.graph.model.DirectedMutableGraph;
+import org.apache.commons.graph.model.UndirectedMutableGraph;
+
+/**
+ * Utilities graph class.
+ */
+public class GraphUtils
+{
+
+    /**
+     * Creates a new {@link DirectedMutableGraph} instance where vertices
+     * are connected as described in the input {@link GraphConnection} instance.
+     *
+     * @param <V> the Graph vertices type
+     * @param <E> the Graph edges type
+     * @param graphConnection the {@link GraphConnection} instance that describes vertices
+     * @return a new {@link DirectedMutableGraph} instance
+     */
+    public static <V, E> DirectedMutableGraph<V, E> newDirectedMutableGraph( GraphConnection<V, E> graphConnection )
+    {
+        return populate( new DirectedMutableGraph<V, E>() ).withConnections( graphConnection );
+    }
+
+    /**
+     * Creates a new {@link UndirectedMutableGraph} instance where vertices
+     * are connected as described in the input {@link GraphConnection} instance.
+     *
+     * @param <V> the Graph vertices type
+     * @param <E> the Graph edges type
+     * @param graphConnection the {@link GraphConnection} instance that describes vertices
+     * @return a new {@link UndirectedMutableGraph} instance
+     */
+    public static <V, E> UndirectedMutableGraph<V, E> newUndirectedMutableGraph( GraphConnection<V, E> graphConnection )
+    {
+        return populate( new UndirectedMutableGraph<V, E>() ).withConnections( graphConnection );
+    }
+
+    /**
+     * This class can't be instantiated
+     */
+    private GraphUtils()
+    {
+        // do nothing
+    }
+
+}
diff --git a/src/main/java/org/apache/commons/graph/model/InMemoryPath.java b/model/src/main/java/org/apache/commons/graph/model/InMemoryPath.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/model/InMemoryPath.java
rename to model/src/main/java/org/apache/commons/graph/model/InMemoryPath.java
diff --git a/src/main/java/org/apache/commons/graph/model/InMemoryWeightedPath.java b/model/src/main/java/org/apache/commons/graph/model/InMemoryWeightedPath.java
similarity index 97%
rename from src/main/java/org/apache/commons/graph/model/InMemoryWeightedPath.java
rename to model/src/main/java/org/apache/commons/graph/model/InMemoryWeightedPath.java
index fcc8539..9fa10ec 100644
--- a/src/main/java/org/apache/commons/graph/model/InMemoryWeightedPath.java
+++ b/model/src/main/java/org/apache/commons/graph/model/InMemoryWeightedPath.java
@@ -24,7 +24,7 @@
 
 import org.apache.commons.graph.Mapper;
 import org.apache.commons.graph.WeightedPath;
-import org.apache.commons.graph.weight.Monoid;
+import org.apache.commons.graph.math.monoid.Monoid;
 
 /**
  * Support {@link WeightedPath} implementation, optimized for algorithms (such Dijkstra's) that need to rebuild the path
@@ -49,10 +49,10 @@
 
     /**
      * Creates a new instance of {@link InMemoryWeightedPath}.
-     * 
+     *
      * @param start the start vertex
      * @param target the target vertex
-     * @param weightOperations 
+     * @param weightOperations
      * @param weightedEdges
      */
     public InMemoryWeightedPath( V start, V target, Monoid<W> weightOperations, Mapper<WE, W> weightedEdges )
diff --git a/src/main/java/org/apache/commons/graph/model/MutableSpanningTree.java b/model/src/main/java/org/apache/commons/graph/model/MutableSpanningTree.java
similarity index 96%
rename from src/main/java/org/apache/commons/graph/model/MutableSpanningTree.java
rename to model/src/main/java/org/apache/commons/graph/model/MutableSpanningTree.java
index 674affb..591f693 100644
--- a/src/main/java/org/apache/commons/graph/model/MutableSpanningTree.java
+++ b/model/src/main/java/org/apache/commons/graph/model/MutableSpanningTree.java
@@ -21,7 +21,7 @@
 
 import org.apache.commons.graph.Mapper;
 import org.apache.commons.graph.SpanningTree;
-import org.apache.commons.graph.weight.Monoid;
+import org.apache.commons.graph.math.monoid.Monoid;
 
 /**
  * A memory-based implementation of a mutable spanning tree.
@@ -47,8 +47,8 @@
 
     /**
      * Creates a new instance of {@link MutableSpanningTree}
-     * 
-     * @param weightOperations 
+     *
+     * @param weightOperations
      * @param weightedEdges
      */
     public MutableSpanningTree( Monoid<W> weightOperations, Mapper<WE, W> weightedEdges )
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/PathNotFoundException.java b/model/src/main/java/org/apache/commons/graph/model/PathNotFoundException.java
similarity index 95%
rename from src/main/java/org/apache/commons/graph/shortestpath/PathNotFoundException.java
rename to model/src/main/java/org/apache/commons/graph/model/PathNotFoundException.java
index 10616bc..467f710 100644
--- a/src/main/java/org/apache/commons/graph/shortestpath/PathNotFoundException.java
+++ b/model/src/main/java/org/apache/commons/graph/model/PathNotFoundException.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.shortestpath;
+package org.apache.commons.graph.model;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/PredecessorsList.java b/model/src/main/java/org/apache/commons/graph/model/PredecessorsList.java
similarity index 97%
rename from src/main/java/org/apache/commons/graph/shortestpath/PredecessorsList.java
rename to model/src/main/java/org/apache/commons/graph/model/PredecessorsList.java
index d9ddb79..980082a 100644
--- a/src/main/java/org/apache/commons/graph/shortestpath/PredecessorsList.java
+++ b/model/src/main/java/org/apache/commons/graph/model/PredecessorsList.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.shortestpath;
+package org.apache.commons.graph.model;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -25,8 +25,8 @@
 import org.apache.commons.graph.Graph;
 import org.apache.commons.graph.Mapper;
 import org.apache.commons.graph.WeightedPath;
+import org.apache.commons.graph.math.monoid.Monoid;
 import org.apache.commons.graph.model.InMemoryWeightedPath;
-import org.apache.commons.graph.weight.Monoid;
 
 /**
  * The predecessor list is a list of vertex of a {@link org.apache.commons.graph.Graph}.
diff --git a/src/main/java/org/apache/commons/graph/model/UndirectedMutableGraph.java b/model/src/main/java/org/apache/commons/graph/model/UndirectedMutableGraph.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/model/UndirectedMutableGraph.java
rename to model/src/main/java/org/apache/commons/graph/model/UndirectedMutableGraph.java
diff --git a/src/test/java/org/apache/commons/graph/model/BaseLabeledEdge.java b/model/src/main/java/org/apache/commons/graph/model/labeled/BaseLabeledEdge.java
similarity index 97%
rename from src/test/java/org/apache/commons/graph/model/BaseLabeledEdge.java
rename to model/src/main/java/org/apache/commons/graph/model/labeled/BaseLabeledEdge.java
index d2af19d..ced7d84 100644
--- a/src/test/java/org/apache/commons/graph/model/BaseLabeledEdge.java
+++ b/model/src/main/java/org/apache/commons/graph/model/labeled/BaseLabeledEdge.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.model;
+package org.apache.commons.graph.model.labeled;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
diff --git a/src/test/java/org/apache/commons/graph/model/BaseLabeledVertex.java b/model/src/main/java/org/apache/commons/graph/model/labeled/BaseLabeledVertex.java
similarity index 97%
rename from src/test/java/org/apache/commons/graph/model/BaseLabeledVertex.java
rename to model/src/main/java/org/apache/commons/graph/model/labeled/BaseLabeledVertex.java
index ded8d3a..965793b 100644
--- a/src/test/java/org/apache/commons/graph/model/BaseLabeledVertex.java
+++ b/model/src/main/java/org/apache/commons/graph/model/labeled/BaseLabeledVertex.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.model;
+package org.apache.commons.graph.model.labeled;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
diff --git a/src/test/java/org/apache/commons/graph/model/BaseLabeledWeightedEdge.java b/model/src/main/java/org/apache/commons/graph/model/labeled/BaseLabeledWeightedEdge.java
similarity index 97%
rename from src/test/java/org/apache/commons/graph/model/BaseLabeledWeightedEdge.java
rename to model/src/main/java/org/apache/commons/graph/model/labeled/BaseLabeledWeightedEdge.java
index fbe8c3e..98745cd 100644
--- a/src/test/java/org/apache/commons/graph/model/BaseLabeledWeightedEdge.java
+++ b/model/src/main/java/org/apache/commons/graph/model/labeled/BaseLabeledWeightedEdge.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.model;
+package org.apache.commons.graph.model.labeled;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
diff --git a/src/test/java/org/apache/commons/graph/model/BaseWeightedEdge.java b/model/src/main/java/org/apache/commons/graph/model/labeled/BaseWeightedEdge.java
similarity index 95%
rename from src/test/java/org/apache/commons/graph/model/BaseWeightedEdge.java
rename to model/src/main/java/org/apache/commons/graph/model/labeled/BaseWeightedEdge.java
index 4571d8f..74f7355 100644
--- a/src/test/java/org/apache/commons/graph/model/BaseWeightedEdge.java
+++ b/model/src/main/java/org/apache/commons/graph/model/labeled/BaseWeightedEdge.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.model;
+package org.apache.commons.graph.model.labeled;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
diff --git a/src/main/java/org/apache/commons/graph/model/package-info.java b/model/src/main/java/org/apache/commons/graph/model/package-info.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/model/package-info.java
rename to model/src/main/java/org/apache/commons/graph/model/package-info.java
diff --git a/src/test/java/org/apache/commons/graph/builder/GraphBuilderTestCase.java b/model/src/test/java/org/apache/commons/graph/builder/GraphBuilderTestCase.java
similarity index 94%
rename from src/test/java/org/apache/commons/graph/builder/GraphBuilderTestCase.java
rename to model/src/test/java/org/apache/commons/graph/builder/GraphBuilderTestCase.java
index cfe9cd0..f34193d 100644
--- a/src/test/java/org/apache/commons/graph/builder/GraphBuilderTestCase.java
+++ b/model/src/test/java/org/apache/commons/graph/builder/GraphBuilderTestCase.java
@@ -19,12 +19,12 @@
  * under the License.
  */
 
-import static org.apache.commons.graph.CommonsGraph.newUndirectedMutableGraph;
+import static org.apache.commons.graph.model.GraphUtils.newUndirectedMutableGraph;
 import static org.junit.Assert.assertEquals;
 
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
 import org.junit.Test;
 
 public final class GraphBuilderTestCase
diff --git a/src/test/java/org/apache/commons/graph/model/BaseMutableGraphTestCase.java b/model/src/test/java/org/apache/commons/graph/model/BaseMutableGraphTestCase.java
similarity index 90%
rename from src/test/java/org/apache/commons/graph/model/BaseMutableGraphTestCase.java
rename to model/src/test/java/org/apache/commons/graph/model/BaseMutableGraphTestCase.java
index df9eff1..c5085b0 100644
--- a/src/test/java/org/apache/commons/graph/model/BaseMutableGraphTestCase.java
+++ b/model/src/test/java/org/apache/commons/graph/model/BaseMutableGraphTestCase.java
@@ -19,8 +19,9 @@
  * under the License.
  */
 
+import static java.lang.String.format;
 import static java.lang.String.valueOf;
-import static org.apache.commons.graph.utils.GraphUtils.buildCompleteGraph;
+import static org.apache.commons.graph.Graphs.synchronize;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -30,11 +31,10 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.graph.CommonsGraph;
 import org.apache.commons.graph.GraphException;
 import org.apache.commons.graph.MutableGraph;
-import org.apache.commons.graph.utils.MultiThreadedTestRunner;
-import org.apache.commons.graph.utils.TestRunner;
+import org.apache.commons.graph.model.labeled.BaseLabeledEdge;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
 import org.junit.Test;
 
 /**
@@ -377,7 +377,7 @@
         throws Throwable
     {
         final MutableGraph<BaseLabeledVertex, BaseLabeledEdge> g =
-            (MutableGraph<BaseLabeledVertex, BaseLabeledEdge>) CommonsGraph.synchronize( (MutableGraph<BaseLabeledVertex, BaseLabeledEdge>) new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge>() );
+            (MutableGraph<BaseLabeledVertex, BaseLabeledEdge>) synchronize( (MutableGraph<BaseLabeledVertex, BaseLabeledEdge>) new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge>() );
 
         TestRunner tr1, tr2, tr3;
         tr1 = new GraphInsert( g, 0, 10 );
@@ -403,7 +403,7 @@
         throws Throwable
     {
         final MutableGraph<BaseLabeledVertex, BaseLabeledEdge> g =
-            (MutableGraph<BaseLabeledVertex, BaseLabeledEdge>) CommonsGraph.synchronize( (MutableGraph<BaseLabeledVertex, BaseLabeledEdge>) new DirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge>() );
+            (MutableGraph<BaseLabeledVertex, BaseLabeledEdge>) synchronize( (MutableGraph<BaseLabeledVertex, BaseLabeledEdge>) new DirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge>() );
 
         TestRunner tr1, tr2, tr3;
         tr1 = new GraphInsert( g, 0, 10 );
@@ -472,4 +472,39 @@
             }
         }
     }
+
+    /**
+     * Creates a complete graph with nVertices
+     *
+     * @param nVertices number of vertices
+     * @param g graph
+     */
+    private static void buildCompleteGraph( int nVertices, BaseMutableGraph<BaseLabeledVertex, BaseLabeledEdge> g )
+    {
+        // building Graph
+        for ( int i = 0; i < nVertices; i++ )
+        {
+            BaseLabeledVertex v = new BaseLabeledVertex( valueOf( i ) );
+            g.addVertex( v );
+        }
+
+        for ( BaseLabeledVertex v1 : g.getVertices() )
+        {
+            for ( BaseLabeledVertex v2 : g.getVertices() )
+            {
+                if ( !v1.equals( v2 ) )
+                {
+                    try
+                    {
+                        g.addEdge( v1, new BaseLabeledEdge( format( "%s -> %s", v1, v2 ) ), v2 );
+                    }
+                    catch ( GraphException e )
+                    {
+                        // ignore
+                    }
+                }
+            }
+        }
+    }
+
 }
diff --git a/src/test/java/org/apache/commons/graph/model/GraphSerializationTestCase.java b/model/src/test/java/org/apache/commons/graph/model/GraphSerializationTestCase.java
similarity index 82%
rename from src/test/java/org/apache/commons/graph/model/GraphSerializationTestCase.java
rename to model/src/test/java/org/apache/commons/graph/model/GraphSerializationTestCase.java
index 76e4e60..0fc6b09 100644
--- a/src/test/java/org/apache/commons/graph/model/GraphSerializationTestCase.java
+++ b/model/src/test/java/org/apache/commons/graph/model/GraphSerializationTestCase.java
@@ -20,10 +20,8 @@
  */
 
 import static junit.framework.Assert.assertEquals;
-import static org.apache.commons.graph.CommonsGraph.newDirectedMutableGraph;
-import static org.apache.commons.graph.CommonsGraph.newUndirectedMutableGraph;
-import static org.apache.commons.graph.CommonsGraph.populate;
-import static org.apache.commons.graph.CommonsGraph.synchronize;
+import static org.apache.commons.graph.Graphs.populate;
+import static org.apache.commons.graph.Graphs.synchronize;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -38,7 +36,11 @@
 import org.apache.commons.graph.MutableGraph;
 import org.apache.commons.graph.builder.AbstractGraphConnection;
 import org.apache.commons.graph.builder.GraphConnection;
-import org.apache.commons.graph.weight.primitive.DoubleWeightBaseOperations;
+import org.apache.commons.graph.math.monoid.primitive.DoubleWeightBaseOperations;
+import org.apache.commons.graph.model.labeled.BaseLabeledEdge;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseWeightedEdge;
 import org.junit.After;
 import org.junit.Test;
 
@@ -64,7 +66,9 @@
     public void serializeUndirectedGraph()
         throws Exception
     {
-        MutableGraph<BaseLabeledVertex, BaseLabeledEdge> g = newUndirectedMutableGraph( buildGraphConnections() );
+        MutableGraph<BaseLabeledVertex, BaseLabeledEdge> g =
+        populate( new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge>() )
+        .withConnections( buildGraphConnections() );
 
         checkSerialization( g );
     }
@@ -73,7 +77,9 @@
     public void serializeDirectedGraph()
         throws Exception
     {
-        MutableGraph<BaseLabeledVertex, BaseLabeledEdge> g = newDirectedMutableGraph( buildGraphConnections() );
+        MutableGraph<BaseLabeledVertex, BaseLabeledEdge> g =
+        populate( new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge>() )
+        .withConnections( buildGraphConnections() );
 
         checkSerialization( g );
     }
@@ -83,7 +89,8 @@
         throws Exception
     {
         MutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>> g =
-            newUndirectedMutableGraph( buildWeightedGraphConnections() );
+        populate( new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>>() )
+        .withConnections( buildWeightedGraphConnections() );
 
         checkSerialization( g );
     }
@@ -93,7 +100,8 @@
         throws Exception
     {
         MutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>> g =
-            newDirectedMutableGraph( buildWeightedGraphConnections() );
+        populate( new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>>() )
+        .withConnections( buildWeightedGraphConnections() );
 
         checkSerialization( g );
     }
@@ -103,8 +111,7 @@
         throws Exception
     {
         final MutableSpanningTree<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>, Double> spanningTree =
-            new MutableSpanningTree<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>, Double>(
-                                                                                                 new DoubleWeightBaseOperations(),
+            new MutableSpanningTree<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>, Double>( new DoubleWeightBaseOperations(),
                                                                                                  new BaseWeightedEdge<Double>() );
 
         populate( spanningTree ).withConnections( buildWeightedGraphConnections() );
@@ -116,10 +123,11 @@
     public void serializeSyncronyzedDirectedWeightdGraph()
         throws Exception
     {
-        Graph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>> g =
-            synchronize( (MutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>>) newDirectedMutableGraph( buildWeightedGraphConnections() ) );
+        MutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>> g =
+        populate( new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>>() )
+        .withConnections( buildWeightedGraphConnections() );
 
-        checkSerialization( g );
+        checkSerialization( synchronize( g ) );
     }
 
     @Test
diff --git a/src/test/java/org/apache/commons/graph/utils/MultiThreadedTestRunner.java b/model/src/test/java/org/apache/commons/graph/model/MultiThreadedTestRunner.java
similarity index 96%
rename from src/test/java/org/apache/commons/graph/utils/MultiThreadedTestRunner.java
rename to model/src/test/java/org/apache/commons/graph/model/MultiThreadedTestRunner.java
index 6f175d4..bb3f0c1 100644
--- a/src/test/java/org/apache/commons/graph/utils/MultiThreadedTestRunner.java
+++ b/model/src/test/java/org/apache/commons/graph/model/MultiThreadedTestRunner.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.utils;
+package org.apache.commons.graph.model;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -28,11 +28,13 @@
  */
 public class MultiThreadedTestRunner
 {
+
     final private List<Thread> th;
+
     long maxWait = 60L * 60L * 1000;
+
     final private List<Throwable> exeptions;
-    
-    
+
     public MultiThreadedTestRunner( TestRunner[] runnables )
     {
         th = new ArrayList<Thread>();
@@ -50,12 +52,12 @@
         {
             t.start();
         }
-        
+
         for ( Thread t : th )
         {
             t.join( maxWait );
         }
-        
+
         if ( this.exeptions.size() > 0 )
         {
             throw this.exeptions.get( 0 );
@@ -69,4 +71,5 @@
     {
         exeptions.add( e );
     }
+
 }
diff --git a/src/test/java/org/apache/commons/graph/utils/TestRunner.java b/model/src/test/java/org/apache/commons/graph/model/TestRunner.java
similarity index 96%
rename from src/test/java/org/apache/commons/graph/utils/TestRunner.java
rename to model/src/test/java/org/apache/commons/graph/model/TestRunner.java
index 187ffa2..9364875 100644
--- a/src/test/java/org/apache/commons/graph/utils/TestRunner.java
+++ b/model/src/test/java/org/apache/commons/graph/model/TestRunner.java
@@ -1,4 +1,4 @@
-package org.apache.commons.graph.utils;
+package org.apache.commons.graph.model;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -21,11 +21,12 @@
 
 /**
  * Abstract class. It's a generic multi-thread test case
- * 
+ *
  */
 abstract public class TestRunner
     implements Runnable
 {
+
     private MultiThreadedTestRunner runner;
 
     abstract public void runTest();
@@ -46,4 +47,5 @@
             runner.addException( e );
         }
     }
+
 }
diff --git a/pom.xml b/pom.xml
index 22ae238..300451b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,9 +27,9 @@
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-graph</artifactId>
   <version>0.1-SNAPSHOT</version>
-  <packaging>jar</packaging>
+  <packaging>pom</packaging>
 
-  <name>Apache Commons Graph</name>
+  <name>Apache Commons Graph - Parent</name>
   <description>
     The Apache Commons Graph package is a toolkit for managing graphs and graph based data structures.
   </description>
@@ -116,6 +116,28 @@
     </site>
   </distributionManagement>
 
+  <modules>
+    <!-- foundation libs -->
+    <module>api</module>
+    <module>model</module>
+    <!-- aux collections -->
+    <module>collections/disjoint-set</module>
+    <module>collections/fibonacci-heap</module>
+    <!-- algorithms -->
+    <module>coloring</module>
+    <module>connectivity</module>
+    <module>elo</module>
+    <module>flow</module>
+    <module>scc</module>
+    <module>shortestpath</module>
+    <module>spanning</module>
+    <module>visit</module>
+    <!-- graph format export -->
+    <module>export</module>
+    <!-- aux tests -->
+    <module>benchmarks</module>
+  </modules>
+
   <properties>
     <maven.compile.source>1.5</maven.compile.source>
     <maven.compile.target>1.5</maven.compile.target>
@@ -133,17 +155,6 @@
   </dependencies>
 
   <build>
-    <resources>
-      <resource>
-        <directory>${basedir}</directory>
-        <targetPath>META-INF</targetPath>
-        <includes>
-          <include>NOTICE.txt</include>
-          <include>LICENSE.txt</include>
-        </includes>
-      </resource>
-    </resources>
-
     <pluginManagement>
       <plugins>
         <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. -->
@@ -192,48 +203,13 @@
         <artifactId>maven-assembly-plugin</artifactId>
         <configuration>
           <descriptors>
-            <descriptor>src/main/assembly/bin.xml</descriptor>
-            <descriptor>src/main/assembly/src.xml</descriptor>
+            <descriptor>${basedir}/src/main/assembly/bin.xml</descriptor>
+            <descriptor>${basedir}/src/main/assembly/src.xml</descriptor>
           </descriptors>
           <tarLongFileMode>gnu</tarLongFileMode>
+          <runOnlyAtExecutionRoot>true</runOnlyAtExecutionRoot>
         </configuration>
       </plugin>
-
-      <plugin>
-        <groupId>org.sonatype.plugins</groupId>
-        <artifactId>jarjar-maven-plugin</artifactId>
-        <version>1.5</version>
-        <configuration>
-          <input>{classes}</input>
-          <output>${project.build.directory}/classes</output>
-          <overwrite>true</overwrite>
-          <skipManifest>true</skipManifest>
-          <excludes>
-            <exclude>*:*</exclude>
-          </excludes>
-          <rules>
-            <rule>
-              <pattern>org.apache.commons.graph.**.Default*</pattern>
-              <result>org.apache.commons.graph.@1.$@2</result>
-            </rule>
-            <rule>
-              <pattern>org.apache.commons.graph.utils.*</pattern>
-              <result>org.apache.commons.graph.utils.$@1</result>
-            </rule>
-            <keep>
-              <pattern>org.apache.commons.graph.**</pattern>
-            </keep>
-          </rules>
-        </configuration>
-        <executions>
-          <execution>
-            <phase>prepare-package</phase>
-            <goals>
-              <goal>jarjar</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
     </plugins>
   </build>
 
@@ -295,74 +271,5 @@
         </site>
       </distributionManagement>
     </profile>
-
-    <profile>
-      <id>benchmarks</id>
-      <activation>
-        <property>
-          <name>skipBenchmarks</name>
-          <value>!true</value>
-        </property>
-      </activation>
-
-      <dependencies>
-        <dependency>
-          <groupId>com.carrotsearch</groupId>
-          <artifactId>junit-benchmarks</artifactId>
-          <classifier>jdk15</classifier>
-          <version>0.3.0</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.slf4j</groupId>
-          <artifactId>slf4j-api</artifactId>
-          <version>1.6.1</version>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>com.h2database</groupId>
-          <artifactId>h2</artifactId>
-          <version>1.3.158</version>
-          <scope>test</scope>
-        </dependency>
-      </dependencies>
-
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.codehaus.mojo</groupId>
-            <artifactId>build-helper-maven-plugin</artifactId>
-            <version>1.7</version>
-            <executions>
-              <execution>
-                <id>add-test-source</id>
-                <phase>generate-test-sources</phase>
-                <goals>
-                  <goal>add-test-source</goal>
-                </goals>
-                <configuration>
-                  <sources>
-                    <source>${basedir}/src/benchmarks/java</source>
-                  </sources>
-                </configuration>
-              </execution>
-            </executions>
-          </plugin>
-
-          <plugin>
-            <artifactId>maven-surefire-plugin</artifactId>
-            <configuration>
-              <systemPropertyVariables>
-                <jub.consumers>CONSOLE,XML,H2</jub.consumers>
-                <jub.db.file>${project.build.directory}/benchmarks/database</jub.db.file>
-                <jub.xml.file>${project.build.directory}/benchmarks.xml</jub.xml.file>
-                <jub.charts.dir>${project.build.directory}/site</jub.charts.dir>
-              </systemPropertyVariables>
-              <argLine>-Xmx512m -Xms512m</argLine>
-            </configuration>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
   </profiles>
 </project>
diff --git a/scc/pom.xml b/scc/pom.xml
new file mode 100644
index 0000000..56a31d6
--- /dev/null
+++ b/scc/pom.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-graph</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>commons-graph-scc</artifactId>
+
+  <name>Apache Commons Graph - SCC</name>
+  <description>Graph strongly connected component problem solver implementation.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-api</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <!-- test dependencies -->
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-model</artifactId>
+      <version>${project.parent.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${basedir}/../</directory>
+        <targetPath>META-INF</targetPath>
+        <includes>
+          <include>NOTICE.txt</include>
+          <include>LICENSE.txt</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/src/main/java/org/apache/commons/graph/scc/CheriyanMehlhornGabowAlgorithm.java b/scc/src/main/java/org/apache/commons/graph/scc/CheriyanMehlhornGabowAlgorithm.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/scc/CheriyanMehlhornGabowAlgorithm.java
rename to scc/src/main/java/org/apache/commons/graph/scc/CheriyanMehlhornGabowAlgorithm.java
diff --git a/src/main/java/org/apache/commons/graph/scc/DefaultSccAlgorithmSelector.java b/scc/src/main/java/org/apache/commons/graph/scc/DefaultSccAlgorithmSelector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/scc/DefaultSccAlgorithmSelector.java
rename to scc/src/main/java/org/apache/commons/graph/scc/DefaultSccAlgorithmSelector.java
diff --git a/src/main/java/org/apache/commons/graph/scc/KosarajuSharirAlgorithm.java b/scc/src/main/java/org/apache/commons/graph/scc/KosarajuSharirAlgorithm.java
similarity index 99%
rename from src/main/java/org/apache/commons/graph/scc/KosarajuSharirAlgorithm.java
rename to scc/src/main/java/org/apache/commons/graph/scc/KosarajuSharirAlgorithm.java
index e808d4a..dfda8ac 100644
--- a/src/main/java/org/apache/commons/graph/scc/KosarajuSharirAlgorithm.java
+++ b/scc/src/main/java/org/apache/commons/graph/scc/KosarajuSharirAlgorithm.java
@@ -31,7 +31,7 @@
 import java.util.Set;
 
 import org.apache.commons.graph.DirectedGraph;
-import org.apache.commons.graph.model.RevertedGraph;
+import org.apache.commons.graph.RevertedGraph;
 
 /**
  * Implements the classical Kosaraju's algorithm to find the strongly connected components
diff --git a/src/main/java/org/apache/commons/graph/scc/SccAlgorithm.java b/scc/src/main/java/org/apache/commons/graph/scc/SccAlgorithm.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/scc/SccAlgorithm.java
rename to scc/src/main/java/org/apache/commons/graph/scc/SccAlgorithm.java
diff --git a/src/main/java/org/apache/commons/graph/scc/SccAlgorithmSelector.java b/scc/src/main/java/org/apache/commons/graph/scc/SccAlgorithmSelector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/scc/SccAlgorithmSelector.java
rename to scc/src/main/java/org/apache/commons/graph/scc/SccAlgorithmSelector.java
diff --git a/scc/src/main/java/org/apache/commons/graph/scc/SccSolver.java b/scc/src/main/java/org/apache/commons/graph/scc/SccSolver.java
new file mode 100644
index 0000000..59793c1
--- /dev/null
+++ b/scc/src/main/java/org/apache/commons/graph/scc/SccSolver.java
@@ -0,0 +1,49 @@
+package org.apache.commons.graph.scc;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import static org.apache.commons.graph.utils.Assertions.checkNotNull;
+
+import org.apache.commons.graph.DirectedGraph;
+
+public final class SccSolver
+{
+
+    /**
+     * Calculates the input graph Strongly Connected Component.
+     *
+     * @param <V> the Graph vertices type.
+     * @param <E> the Graph edges type.
+     * @param <G> the directed graph type
+     * @param graph the Graph which strongly connected component has to be verified.
+     * @return the SCC algoritm selector
+     */
+    public static <V, E, G extends DirectedGraph<V, E>> SccAlgorithmSelector<V, E> findStronglyConnectedComponent( G graph )
+    {
+        graph = checkNotNull( graph, "Strongly Connected Component cannot be calculated from a null graph" );
+        return new DefaultSccAlgorithmSelector<V, E>( graph );
+    }
+
+    private SccSolver()
+    {
+        // do nothing
+    }
+
+}
diff --git a/src/main/java/org/apache/commons/graph/scc/TarjanAlgorithm.java b/scc/src/main/java/org/apache/commons/graph/scc/TarjanAlgorithm.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/scc/TarjanAlgorithm.java
rename to scc/src/main/java/org/apache/commons/graph/scc/TarjanAlgorithm.java
diff --git a/src/main/java/org/apache/commons/graph/scc/TarjanVertexMetaInfo.java b/scc/src/main/java/org/apache/commons/graph/scc/TarjanVertexMetaInfo.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/scc/TarjanVertexMetaInfo.java
rename to scc/src/main/java/org/apache/commons/graph/scc/TarjanVertexMetaInfo.java
diff --git a/src/main/java/org/apache/commons/graph/scc/package-info.java b/scc/src/main/java/org/apache/commons/graph/scc/package-info.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/scc/package-info.java
rename to scc/src/main/java/org/apache/commons/graph/scc/package-info.java
diff --git a/src/test/java/org/apache/commons/graph/scc/CheriyanMehlhornGabowTestCase.java b/scc/src/test/java/org/apache/commons/graph/scc/CheriyanMehlhornGabowTestCase.java
similarity index 93%
rename from src/test/java/org/apache/commons/graph/scc/CheriyanMehlhornGabowTestCase.java
rename to scc/src/test/java/org/apache/commons/graph/scc/CheriyanMehlhornGabowTestCase.java
index b031645..2612ba7 100644
--- a/src/test/java/org/apache/commons/graph/scc/CheriyanMehlhornGabowTestCase.java
+++ b/scc/src/test/java/org/apache/commons/graph/scc/CheriyanMehlhornGabowTestCase.java
@@ -19,8 +19,8 @@
  * under the License.
  */
 
-import static org.apache.commons.graph.CommonsGraph.findStronglyConnectedComponent;
-import static org.apache.commons.graph.CommonsGraph.newDirectedMutableGraph;
+import static org.apache.commons.graph.model.GraphUtils.newDirectedMutableGraph;
+import static org.apache.commons.graph.scc.SccSolver.findStronglyConnectedComponent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
@@ -29,10 +29,10 @@
 import java.util.Set;
 
 import org.apache.commons.graph.builder.AbstractGraphConnection;
-import org.apache.commons.graph.model.BaseLabeledEdge;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
 import org.apache.commons.graph.model.DirectedMutableGraph;
+import org.apache.commons.graph.model.labeled.BaseLabeledEdge;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
 import org.junit.Test;
 
 /**
diff --git a/src/test/java/org/apache/commons/graph/scc/KosarajuSharirTestCase.java b/scc/src/test/java/org/apache/commons/graph/scc/KosarajuSharirTestCase.java
similarity index 95%
rename from src/test/java/org/apache/commons/graph/scc/KosarajuSharirTestCase.java
rename to scc/src/test/java/org/apache/commons/graph/scc/KosarajuSharirTestCase.java
index 08ad604..2a81cb8 100644
--- a/src/test/java/org/apache/commons/graph/scc/KosarajuSharirTestCase.java
+++ b/scc/src/test/java/org/apache/commons/graph/scc/KosarajuSharirTestCase.java
@@ -19,8 +19,8 @@
  * under the License.
  */
 
-import static org.apache.commons.graph.CommonsGraph.findStronglyConnectedComponent;
-import static org.apache.commons.graph.CommonsGraph.newDirectedMutableGraph;
+import static org.apache.commons.graph.model.GraphUtils.newDirectedMutableGraph;
+import static org.apache.commons.graph.scc.SccSolver.findStronglyConnectedComponent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
@@ -29,10 +29,10 @@
 import java.util.Set;
 
 import org.apache.commons.graph.builder.AbstractGraphConnection;
-import org.apache.commons.graph.model.BaseLabeledEdge;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
 import org.apache.commons.graph.model.DirectedMutableGraph;
+import org.apache.commons.graph.model.labeled.BaseLabeledEdge;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
 import org.junit.Test;
 
 /**
diff --git a/src/test/java/org/apache/commons/graph/scc/TarjanTestCase.java b/scc/src/test/java/org/apache/commons/graph/scc/TarjanTestCase.java
similarity index 93%
rename from src/test/java/org/apache/commons/graph/scc/TarjanTestCase.java
rename to scc/src/test/java/org/apache/commons/graph/scc/TarjanTestCase.java
index 26edc37..d9fe121 100644
--- a/src/test/java/org/apache/commons/graph/scc/TarjanTestCase.java
+++ b/scc/src/test/java/org/apache/commons/graph/scc/TarjanTestCase.java
@@ -19,8 +19,8 @@
  * under the License.
  */
 
-import static org.apache.commons.graph.CommonsGraph.findStronglyConnectedComponent;
-import static org.apache.commons.graph.CommonsGraph.newDirectedMutableGraph;
+import static org.apache.commons.graph.model.GraphUtils.newDirectedMutableGraph;
+import static org.apache.commons.graph.scc.SccSolver.findStronglyConnectedComponent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
@@ -29,10 +29,10 @@
 import java.util.Set;
 
 import org.apache.commons.graph.builder.AbstractGraphConnection;
-import org.apache.commons.graph.model.BaseLabeledEdge;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
 import org.apache.commons.graph.model.DirectedMutableGraph;
+import org.apache.commons.graph.model.labeled.BaseLabeledEdge;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
 import org.junit.Test;
 
 /**
diff --git a/shortestpath/pom.xml b/shortestpath/pom.xml
new file mode 100644
index 0000000..d275ba1
--- /dev/null
+++ b/shortestpath/pom.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-graph</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>commons-graph-shortestpath</artifactId>
+
+  <name>Apache Commons Graph - Shortest Path</name>
+  <description>Graph shortest paths problem solver implementation.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-api</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-fibonacciheap</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-model</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/AllVertexPairsShortestPath.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/AllVertexPairsShortestPath.java
similarity index 97%
rename from src/main/java/org/apache/commons/graph/shortestpath/AllVertexPairsShortestPath.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/AllVertexPairsShortestPath.java
index 82c66c8..0fa8578 100644
--- a/src/main/java/org/apache/commons/graph/shortestpath/AllVertexPairsShortestPath.java
+++ b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/AllVertexPairsShortestPath.java
@@ -26,7 +26,8 @@
 
 import org.apache.commons.graph.VertexPair;
 import org.apache.commons.graph.WeightedPath;
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
+import org.apache.commons.graph.model.PathNotFoundException;
 
 /**
  * Represents all shortest paths between all vertex pairs calculated by {@link FloydWarshall} algorithm.
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/DefaultHeuristicBuilder.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/DefaultHeuristicBuilder.java
similarity index 96%
rename from src/main/java/org/apache/commons/graph/shortestpath/DefaultHeuristicBuilder.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/DefaultHeuristicBuilder.java
index 9456d0c..611b252 100644
--- a/src/main/java/org/apache/commons/graph/shortestpath/DefaultHeuristicBuilder.java
+++ b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/DefaultHeuristicBuilder.java
@@ -30,7 +30,9 @@
 import org.apache.commons.graph.Mapper;
 import org.apache.commons.graph.WeightedPath;
 import org.apache.commons.graph.collections.FibonacciHeap;
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
+import org.apache.commons.graph.model.PathNotFoundException;
+import org.apache.commons.graph.model.PredecessorsList;
 
 final class DefaultHeuristicBuilder<V, WE, W>
     implements HeuristicBuilder<V, WE, W>
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/DefaultPathSourceSelector.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/DefaultPathSourceSelector.java
similarity index 97%
rename from src/main/java/org/apache/commons/graph/shortestpath/DefaultPathSourceSelector.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/DefaultPathSourceSelector.java
index c7acc18..986888b 100644
--- a/src/main/java/org/apache/commons/graph/shortestpath/DefaultPathSourceSelector.java
+++ b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/DefaultPathSourceSelector.java
@@ -25,11 +25,12 @@
 import java.util.Map;
 
 import org.apache.commons.graph.Graph;
+import org.apache.commons.graph.Mapper;
 import org.apache.commons.graph.UndirectedGraph;
 import org.apache.commons.graph.VertexPair;
-import org.apache.commons.graph.Mapper;
 import org.apache.commons.graph.WeightedPath;
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
+import org.apache.commons.graph.model.PredecessorsList;
 
 final class DefaultPathSourceSelector<V, WE, W>
     implements PathSourceSelector<V, WE, W>
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/DefaultShortestPathAlgorithmSelector.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/DefaultShortestPathAlgorithmSelector.java
similarity index 97%
rename from src/main/java/org/apache/commons/graph/shortestpath/DefaultShortestPathAlgorithmSelector.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/DefaultShortestPathAlgorithmSelector.java
index e21e4d9..c23ae30 100644
--- a/src/main/java/org/apache/commons/graph/shortestpath/DefaultShortestPathAlgorithmSelector.java
+++ b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/DefaultShortestPathAlgorithmSelector.java
@@ -24,13 +24,15 @@
 import java.util.HashSet;
 import java.util.Queue;
 import java.util.Set;
-import org.apache.commons.graph.DirectedGraph;
 
+import org.apache.commons.graph.DirectedGraph;
 import org.apache.commons.graph.Graph;
 import org.apache.commons.graph.Mapper;
 import org.apache.commons.graph.WeightedPath;
 import org.apache.commons.graph.collections.FibonacciHeap;
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
+import org.apache.commons.graph.model.PathNotFoundException;
+import org.apache.commons.graph.model.PredecessorsList;
 
 final class DefaultShortestPathAlgorithmSelector<V, WE, W>
     implements ShortestPathAlgorithmSelector<V, WE, W>
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/DefaultTargetSourceSelector.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/DefaultTargetSourceSelector.java
similarity index 96%
rename from src/main/java/org/apache/commons/graph/shortestpath/DefaultTargetSourceSelector.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/DefaultTargetSourceSelector.java
index 21fd8be..dd8b33c 100644
--- a/src/main/java/org/apache/commons/graph/shortestpath/DefaultTargetSourceSelector.java
+++ b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/DefaultTargetSourceSelector.java
@@ -22,10 +22,12 @@
 import static org.apache.commons.graph.utils.Assertions.checkNotNull;
 
 import org.apache.commons.graph.Graph;
-import org.apache.commons.graph.VertexPair;
 import org.apache.commons.graph.Mapper;
+import org.apache.commons.graph.VertexPair;
 import org.apache.commons.graph.WeightedPath;
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
+import org.apache.commons.graph.model.PathNotFoundException;
+import org.apache.commons.graph.model.PredecessorsList;
 
 final class DefaultTargetSourceSelector<V, WE, W>
     implements TargetSourceSelector<V, WE, W>
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/DefaultWeightedEdgesSelector.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/DefaultWeightedEdgesSelector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/shortestpath/DefaultWeightedEdgesSelector.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/DefaultWeightedEdgesSelector.java
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/Heuristic.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/Heuristic.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/shortestpath/Heuristic.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/Heuristic.java
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/HeuristicBuilder.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/HeuristicBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/shortestpath/HeuristicBuilder.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/HeuristicBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/NegativeWeightedCycleException.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/NegativeWeightedCycleException.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/shortestpath/NegativeWeightedCycleException.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/NegativeWeightedCycleException.java
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/PathSourceSelector.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/PathSourceSelector.java
similarity index 96%
rename from src/main/java/org/apache/commons/graph/shortestpath/PathSourceSelector.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/PathSourceSelector.java
index 6b89908..d6486df 100644
--- a/src/main/java/org/apache/commons/graph/shortestpath/PathSourceSelector.java
+++ b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/PathSourceSelector.java
@@ -19,7 +19,7 @@
  * under the License.
  */
 
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 
 /**
  *
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/PathWeightedEdgesBuilder.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/PathWeightedEdgesBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/shortestpath/PathWeightedEdgesBuilder.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/PathWeightedEdgesBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/ShortestDistances.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/ShortestDistances.java
similarity index 97%
rename from src/main/java/org/apache/commons/graph/shortestpath/ShortestDistances.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/ShortestDistances.java
index dfa4abb..c67df77 100644
--- a/src/main/java/org/apache/commons/graph/shortestpath/ShortestDistances.java
+++ b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/ShortestDistances.java
@@ -23,7 +23,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 
 /**
  * Stores and compares Graph Vertices weights.
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/ShortestPathAlgorithmSelector.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/ShortestPathAlgorithmSelector.java
similarity index 94%
rename from src/main/java/org/apache/commons/graph/shortestpath/ShortestPathAlgorithmSelector.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/ShortestPathAlgorithmSelector.java
index c84ab90..20b73b4 100644
--- a/src/main/java/org/apache/commons/graph/shortestpath/ShortestPathAlgorithmSelector.java
+++ b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/ShortestPathAlgorithmSelector.java
@@ -20,7 +20,8 @@
  */
 
 import org.apache.commons.graph.WeightedPath;
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
+import org.apache.commons.graph.model.PathNotFoundException;
 
 /**
  *
diff --git a/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/ShortestPathSolver.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/ShortestPathSolver.java
new file mode 100644
index 0000000..f686206
--- /dev/null
+++ b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/ShortestPathSolver.java
@@ -0,0 +1,49 @@
+package org.apache.commons.graph.shortestpath;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import static org.apache.commons.graph.utils.Assertions.checkNotNull;
+
+import org.apache.commons.graph.Graph;
+
+public final class ShortestPathSolver
+{
+
+    /**
+     * Find the sortest on the input {@link Graph}
+     *
+     * @param <V> the Graph vertices type
+     * @param <WE> the Graph edges type
+     * @param <G> the Graph type
+     * @param graph the input edge-weighted graph
+     * @return the caluculated the sortest
+     */
+    public static <V, WE, G extends Graph<V, WE>> PathWeightedEdgesBuilder<V, WE> findShortestPath( G graph )
+    {
+        graph = checkNotNull( graph, "Shortest path can not be calculated on null graph" );
+        return new DefaultWeightedEdgesSelector<V, WE>( graph );
+    }
+
+    private ShortestPathSolver()
+    {
+        // do nothing
+    }
+
+}
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/TargetSourceSelector.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/TargetSourceSelector.java
similarity index 96%
rename from src/main/java/org/apache/commons/graph/shortestpath/TargetSourceSelector.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/TargetSourceSelector.java
index 6f4509b..9292107 100644
--- a/src/main/java/org/apache/commons/graph/shortestpath/TargetSourceSelector.java
+++ b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/TargetSourceSelector.java
@@ -19,7 +19,7 @@
  * under the License.
  */
 
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 
 /**
  *
diff --git a/src/main/java/org/apache/commons/graph/shortestpath/package-info.java b/shortestpath/src/main/java/org/apache/commons/graph/shortestpath/package-info.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/shortestpath/package-info.java
rename to shortestpath/src/main/java/org/apache/commons/graph/shortestpath/package-info.java
diff --git a/src/test/java/org/apache/commons/graph/shortestpath/AStarTestCase.java b/shortestpath/src/test/java/org/apache/commons/graph/shortestpath/AStarTestCase.java
similarity index 95%
rename from src/test/java/org/apache/commons/graph/shortestpath/AStarTestCase.java
rename to shortestpath/src/test/java/org/apache/commons/graph/shortestpath/AStarTestCase.java
index ed996da..6a0fd29 100644
--- a/src/test/java/org/apache/commons/graph/shortestpath/AStarTestCase.java
+++ b/shortestpath/src/test/java/org/apache/commons/graph/shortestpath/AStarTestCase.java
@@ -19,8 +19,8 @@
  * under the License.
  */
 
+import static org.apache.commons.graph.shortestpath.ShortestPathSolver.findShortestPath;
 import static org.junit.Assert.assertEquals;
-import static org.apache.commons.graph.CommonsGraph.findShortestPath;
 import static org.junit.Assert.fail;
 
 import java.util.HashMap;
@@ -28,12 +28,13 @@
 
 import org.apache.commons.graph.Graph;
 import org.apache.commons.graph.Path;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
-import org.apache.commons.graph.model.BaseWeightedEdge;
+import org.apache.commons.graph.math.monoid.primitive.DoubleWeightBaseOperations;
 import org.apache.commons.graph.model.InMemoryWeightedPath;
+import org.apache.commons.graph.model.PathNotFoundException;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
-import org.apache.commons.graph.weight.primitive.DoubleWeightBaseOperations;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseWeightedEdge;
 import org.junit.Test;
 
 public final class AStarTestCase
diff --git a/src/test/java/org/apache/commons/graph/shortestpath/BellmannFordTestCase.java b/shortestpath/src/test/java/org/apache/commons/graph/shortestpath/BellmannFordTestCase.java
similarity index 94%
rename from src/test/java/org/apache/commons/graph/shortestpath/BellmannFordTestCase.java
rename to shortestpath/src/test/java/org/apache/commons/graph/shortestpath/BellmannFordTestCase.java
index f2d4797..db6e717 100644
--- a/src/test/java/org/apache/commons/graph/shortestpath/BellmannFordTestCase.java
+++ b/shortestpath/src/test/java/org/apache/commons/graph/shortestpath/BellmannFordTestCase.java
@@ -19,19 +19,20 @@
  * under the License.
  */
 
+import static org.apache.commons.graph.shortestpath.ShortestPathSolver.findShortestPath;
 import static org.junit.Assert.assertEquals;
-import static org.apache.commons.graph.CommonsGraph.findShortestPath;
 import static org.junit.Assert.fail;
 
 import org.apache.commons.graph.Graph;
 import org.apache.commons.graph.WeightedPath;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
-import org.apache.commons.graph.model.BaseWeightedEdge;
+import org.apache.commons.graph.math.monoid.primitive.DoubleWeightBaseOperations;
 import org.apache.commons.graph.model.DirectedMutableGraph;
 import org.apache.commons.graph.model.InMemoryWeightedPath;
+import org.apache.commons.graph.model.PathNotFoundException;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
-import org.apache.commons.graph.weight.primitive.DoubleWeightBaseOperations;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseWeightedEdge;
 import org.junit.Test;
 
 public final class BellmannFordTestCase
diff --git a/src/test/java/org/apache/commons/graph/shortestpath/BidirDijkstraTestCase.java b/shortestpath/src/test/java/org/apache/commons/graph/shortestpath/BidirDijkstraTestCase.java
similarity index 95%
rename from src/test/java/org/apache/commons/graph/shortestpath/BidirDijkstraTestCase.java
rename to shortestpath/src/test/java/org/apache/commons/graph/shortestpath/BidirDijkstraTestCase.java
index 662cef4..d122ade 100644
--- a/src/test/java/org/apache/commons/graph/shortestpath/BidirDijkstraTestCase.java
+++ b/shortestpath/src/test/java/org/apache/commons/graph/shortestpath/BidirDijkstraTestCase.java
@@ -19,40 +19,42 @@
  * under the License.
  */
 
-import static org.junit.Assert.assertEquals;
-
-import org.apache.commons.graph.Graph;
-import org.apache.commons.graph.Path;
-import org.apache.commons.graph.model.InMemoryWeightedPath;
-
 import static java.lang.String.format;
 import static java.lang.String.valueOf;
-import static org.apache.commons.graph.CommonsGraph.findShortestPath;
-import static org.apache.commons.graph.CommonsGraph.newDirectedMutableGraph;
+import static org.apache.commons.graph.model.GraphUtils.newDirectedMutableGraph;
+import static org.apache.commons.graph.shortestpath.ShortestPathSolver.findShortestPath;
+import static org.junit.Assert.assertEquals;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 
+import org.apache.commons.graph.Graph;
 import org.apache.commons.graph.GraphException;
+import org.apache.commons.graph.Path;
+import org.apache.commons.graph.WeightedPath;
 import org.apache.commons.graph.builder.AbstractGraphConnection;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.primitive.DoubleWeightBaseOperations;
+import org.apache.commons.graph.model.DirectedMutableGraph;
+import org.apache.commons.graph.model.InMemoryWeightedPath;
+import org.apache.commons.graph.model.PathNotFoundException;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
-import org.apache.commons.graph.weight.primitive.DoubleWeightBaseOperations;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseWeightedEdge;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import org.apache.commons.graph.WeightedPath;
-import org.apache.commons.graph.model.BaseWeightedEdge;
-import org.apache.commons.graph.model.DirectedMutableGraph;
-import org.apache.commons.graph.weight.OrderedMonoid;
-
 public final class BidirDijkstraTestCase
 {
+
     private static final int TIMES = 10;
+
     private static final int NODES = 5000;
+
     private static final int EDGES = 100000;
+
     private static final double EPSILON = 1.0e-6;
 
     private static DirectedMutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>> graph;
diff --git a/src/test/java/org/apache/commons/graph/shortestpath/DijkstraTestCase.java b/shortestpath/src/test/java/org/apache/commons/graph/shortestpath/DijkstraTestCase.java
similarity index 93%
rename from src/test/java/org/apache/commons/graph/shortestpath/DijkstraTestCase.java
rename to shortestpath/src/test/java/org/apache/commons/graph/shortestpath/DijkstraTestCase.java
index e0553fe..a81da66 100644
--- a/src/test/java/org/apache/commons/graph/shortestpath/DijkstraTestCase.java
+++ b/shortestpath/src/test/java/org/apache/commons/graph/shortestpath/DijkstraTestCase.java
@@ -19,18 +19,19 @@
  * under the License.
  */
 
+import static org.apache.commons.graph.shortestpath.ShortestPathSolver.findShortestPath;
 import static org.junit.Assert.assertEquals;
-import static org.apache.commons.graph.CommonsGraph.findShortestPath;
 
 import org.apache.commons.graph.Graph;
 import org.apache.commons.graph.Path;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
-import org.apache.commons.graph.model.BaseWeightedEdge;
+import org.apache.commons.graph.math.monoid.primitive.DoubleWeightBaseOperations;
 import org.apache.commons.graph.model.DirectedMutableGraph;
 import org.apache.commons.graph.model.InMemoryWeightedPath;
+import org.apache.commons.graph.model.PathNotFoundException;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
-import org.apache.commons.graph.weight.primitive.DoubleWeightBaseOperations;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseWeightedEdge;
 import org.junit.Test;
 
 public final class DijkstraTestCase
diff --git a/src/test/java/org/apache/commons/graph/shortestpath/FloydWarshallTestCase.java b/shortestpath/src/test/java/org/apache/commons/graph/shortestpath/FloydWarshallTestCase.java
similarity index 94%
rename from src/test/java/org/apache/commons/graph/shortestpath/FloydWarshallTestCase.java
rename to shortestpath/src/test/java/org/apache/commons/graph/shortestpath/FloydWarshallTestCase.java
index 5d697ef..cc8f40d 100644
--- a/src/test/java/org/apache/commons/graph/shortestpath/FloydWarshallTestCase.java
+++ b/shortestpath/src/test/java/org/apache/commons/graph/shortestpath/FloydWarshallTestCase.java
@@ -20,21 +20,22 @@
  */
 
 import static junit.framework.Assert.assertEquals;
+import static org.apache.commons.graph.shortestpath.ShortestPathSolver.findShortestPath;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.fail;
-import static org.apache.commons.graph.CommonsGraph.findShortestPath;
 
 import org.apache.commons.graph.Graph;
 import org.apache.commons.graph.MutableGraph;
 import org.apache.commons.graph.UndirectedGraph;
 import org.apache.commons.graph.WeightedPath;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
-import org.apache.commons.graph.model.BaseWeightedEdge;
+import org.apache.commons.graph.math.monoid.primitive.DoubleWeightBaseOperations;
 import org.apache.commons.graph.model.DirectedMutableGraph;
 import org.apache.commons.graph.model.InMemoryWeightedPath;
+import org.apache.commons.graph.model.PathNotFoundException;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
-import org.apache.commons.graph.weight.primitive.DoubleWeightBaseOperations;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseWeightedEdge;
 import org.junit.Test;
 
 /**
diff --git a/spanning/pom.xml b/spanning/pom.xml
new file mode 100644
index 0000000..84ded87
--- /dev/null
+++ b/spanning/pom.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-graph</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>commons-graph-spanning</artifactId>
+
+  <name>Apache Commons Graph - Spanning</name>
+  <description>Graph spanning tree problem solver implementation.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-api</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-disjointset</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-fibonacciheap</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-shortestpath</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-model</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${basedir}/../</directory>
+        <targetPath>META-INF</targetPath>
+        <includes>
+          <include>NOTICE.txt</include>
+          <include>LICENSE.txt</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeAlgorithmSelector.java b/spanning/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeAlgorithmSelector.java
similarity index 99%
rename from src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeAlgorithmSelector.java
rename to spanning/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeAlgorithmSelector.java
index cae45cb..805c7ff 100644
--- a/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeAlgorithmSelector.java
+++ b/spanning/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeAlgorithmSelector.java
@@ -36,8 +36,8 @@
 import org.apache.commons.graph.VertexPair;
 import org.apache.commons.graph.collections.DisjointSet;
 import org.apache.commons.graph.collections.FibonacciHeap;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 import org.apache.commons.graph.model.MutableSpanningTree;
-import org.apache.commons.graph.weight.OrderedMonoid;
 
 /**
  * {@link SpanningTreeAlgorithmSelector} implementation.
diff --git a/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeSourceSelector.java b/spanning/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeSourceSelector.java
similarity index 95%
rename from src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeSourceSelector.java
rename to spanning/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeSourceSelector.java
index 82078c9..912964d 100644
--- a/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeSourceSelector.java
+++ b/spanning/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeSourceSelector.java
@@ -20,7 +20,7 @@
  */
 
 import static java.util.Collections.reverseOrder;
-import static org.apache.commons.graph.CommonsGraph.findShortestPath;
+import static org.apache.commons.graph.shortestpath.ShortestPathSolver.findShortestPath;
 import static org.apache.commons.graph.utils.Assertions.checkNotNull;
 import static org.apache.commons.graph.utils.Assertions.checkState;
 
@@ -33,9 +33,9 @@
 import org.apache.commons.graph.Mapper;
 import org.apache.commons.graph.SpanningTree;
 import org.apache.commons.graph.VertexPair;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 import org.apache.commons.graph.model.MutableSpanningTree;
-import org.apache.commons.graph.shortestpath.PathNotFoundException;
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.model.PathNotFoundException;
 
 /**
  * {@link SpanningTreeSourceSelector} implementation.
@@ -82,7 +82,6 @@
      */
     public <WO extends OrderedMonoid<W>> SpanningTree<V, WE, W> applyingReverseDeleteAlgorithm( WO weightOperations )
     {
-
         checkNotNull( weightOperations, "The Reverse-Delete algorithm cannot be calulated with null weight operations" );
 
         final Queue<WE> sortedEdge = new PriorityQueue<WE>( 11, reverseOrder( new WeightedEdgesComparator<W, WE>( weightOperations, weightedEdges ) ) );
diff --git a/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningWeightedEdgeMapperBuilder.java b/spanning/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningWeightedEdgeMapperBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/spanning/DefaultSpanningWeightedEdgeMapperBuilder.java
rename to spanning/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningWeightedEdgeMapperBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/spanning/ReverseDeleteGraph.java b/spanning/src/main/java/org/apache/commons/graph/spanning/ReverseDeleteGraph.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/spanning/ReverseDeleteGraph.java
rename to spanning/src/main/java/org/apache/commons/graph/spanning/ReverseDeleteGraph.java
diff --git a/src/main/java/org/apache/commons/graph/spanning/ShortestEdges.java b/spanning/src/main/java/org/apache/commons/graph/spanning/ShortestEdges.java
similarity index 98%
rename from src/main/java/org/apache/commons/graph/spanning/ShortestEdges.java
rename to spanning/src/main/java/org/apache/commons/graph/spanning/ShortestEdges.java
index 3ef03a7..abbd4ed 100644
--- a/src/main/java/org/apache/commons/graph/spanning/ShortestEdges.java
+++ b/spanning/src/main/java/org/apache/commons/graph/spanning/ShortestEdges.java
@@ -28,8 +28,8 @@
 import org.apache.commons.graph.Mapper;
 import org.apache.commons.graph.SpanningTree;
 import org.apache.commons.graph.VertexPair;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 import org.apache.commons.graph.model.MutableSpanningTree;
-import org.apache.commons.graph.weight.OrderedMonoid;
 
 /**
  * The predecessor list is a list of vertex of a {@link org.apache.commons.graph.Graph}.
diff --git a/src/main/java/org/apache/commons/graph/spanning/SpanningTreeAlgorithmSelector.java b/spanning/src/main/java/org/apache/commons/graph/spanning/SpanningTreeAlgorithmSelector.java
similarity index 97%
rename from src/main/java/org/apache/commons/graph/spanning/SpanningTreeAlgorithmSelector.java
rename to spanning/src/main/java/org/apache/commons/graph/spanning/SpanningTreeAlgorithmSelector.java
index 3432313..3e8a8a6 100644
--- a/src/main/java/org/apache/commons/graph/spanning/SpanningTreeAlgorithmSelector.java
+++ b/spanning/src/main/java/org/apache/commons/graph/spanning/SpanningTreeAlgorithmSelector.java
@@ -20,7 +20,7 @@
  */
 
 import org.apache.commons.graph.SpanningTree;
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 
 /**
  * Spanning Tree algoritms selector.
diff --git a/spanning/src/main/java/org/apache/commons/graph/spanning/SpanningTreeSolver.java b/spanning/src/main/java/org/apache/commons/graph/spanning/SpanningTreeSolver.java
new file mode 100644
index 0000000..51338f7
--- /dev/null
+++ b/spanning/src/main/java/org/apache/commons/graph/spanning/SpanningTreeSolver.java
@@ -0,0 +1,49 @@
+package org.apache.commons.graph.spanning;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import static org.apache.commons.graph.utils.Assertions.checkNotNull;
+
+import org.apache.commons.graph.Graph;
+
+public final class SpanningTreeSolver
+{
+
+    /**
+     * Find the minimum spanning tree on the input {@link Graph}
+     *
+     * @param <V> the Graph vertices type
+     * @param <WE> the Graph edges type
+     * @param <G> the Graph type
+     * @param graph the input edge-weighted graph
+     * @return the caluculated minimun spanning tree
+     */
+    public static <V, WE, G extends Graph<V, WE>> SpanningWeightedEdgeMapperBuilder<V, WE> minimumSpanningTree( G graph )
+    {
+        graph = checkNotNull( graph, "Minimum spanning tree can not be calculated on null graph" );
+        return new DefaultSpanningWeightedEdgeMapperBuilder<V, WE>( graph );
+    }
+
+    private SpanningTreeSolver()
+    {
+        // do nothing
+    }
+
+}
diff --git a/src/main/java/org/apache/commons/graph/spanning/SpanningTreeSourceSelector.java b/spanning/src/main/java/org/apache/commons/graph/spanning/SpanningTreeSourceSelector.java
similarity index 97%
rename from src/main/java/org/apache/commons/graph/spanning/SpanningTreeSourceSelector.java
rename to spanning/src/main/java/org/apache/commons/graph/spanning/SpanningTreeSourceSelector.java
index 1cd5468..d3fe5c6 100644
--- a/src/main/java/org/apache/commons/graph/spanning/SpanningTreeSourceSelector.java
+++ b/spanning/src/main/java/org/apache/commons/graph/spanning/SpanningTreeSourceSelector.java
@@ -20,7 +20,7 @@
  */
 
 import org.apache.commons.graph.SpanningTree;
-import org.apache.commons.graph.weight.OrderedMonoid;
+import org.apache.commons.graph.math.monoid.OrderedMonoid;
 
 /**
  * Spanning Tree source selector.
diff --git a/src/main/java/org/apache/commons/graph/spanning/SpanningWeightedEdgeMapperBuilder.java b/spanning/src/main/java/org/apache/commons/graph/spanning/SpanningWeightedEdgeMapperBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/spanning/SpanningWeightedEdgeMapperBuilder.java
rename to spanning/src/main/java/org/apache/commons/graph/spanning/SpanningWeightedEdgeMapperBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/spanning/SuperVertex.java b/spanning/src/main/java/org/apache/commons/graph/spanning/SuperVertex.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/spanning/SuperVertex.java
rename to spanning/src/main/java/org/apache/commons/graph/spanning/SuperVertex.java
diff --git a/src/main/java/org/apache/commons/graph/spanning/WeightedEdgesComparator.java b/spanning/src/main/java/org/apache/commons/graph/spanning/WeightedEdgesComparator.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/spanning/WeightedEdgesComparator.java
rename to spanning/src/main/java/org/apache/commons/graph/spanning/WeightedEdgesComparator.java
diff --git a/src/main/java/org/apache/commons/graph/spanning/package-info.java b/spanning/src/main/java/org/apache/commons/graph/spanning/package-info.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/spanning/package-info.java
rename to spanning/src/main/java/org/apache/commons/graph/spanning/package-info.java
diff --git a/src/test/java/org/apache/commons/graph/spanning/BoruvkaTestCase.java b/spanning/src/test/java/org/apache/commons/graph/spanning/BoruvkaTestCase.java
similarity index 95%
rename from src/test/java/org/apache/commons/graph/spanning/BoruvkaTestCase.java
rename to spanning/src/test/java/org/apache/commons/graph/spanning/BoruvkaTestCase.java
index 433fe1f..7fc1a6b 100644
--- a/src/test/java/org/apache/commons/graph/spanning/BoruvkaTestCase.java
+++ b/spanning/src/test/java/org/apache/commons/graph/spanning/BoruvkaTestCase.java
@@ -19,18 +19,18 @@
  * under the License.
  */
 
+import static org.apache.commons.graph.spanning.SpanningTreeSolver.minimumSpanningTree;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
-import static org.apache.commons.graph.CommonsGraph.minimumSpanningTree;
 
 import org.apache.commons.graph.Graph;
 import org.apache.commons.graph.SpanningTree;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
-import org.apache.commons.graph.model.BaseWeightedEdge;
+import org.apache.commons.graph.math.monoid.primitive.DoubleWeightBaseOperations;
 import org.apache.commons.graph.model.MutableSpanningTree;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
-import org.apache.commons.graph.weight.primitive.DoubleWeightBaseOperations;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseWeightedEdge;
 import org.junit.Test;
 
 public final class BoruvkaTestCase
diff --git a/src/test/java/org/apache/commons/graph/spanning/KruskalTestCase.java b/spanning/src/test/java/org/apache/commons/graph/spanning/KruskalTestCase.java
similarity index 95%
rename from src/test/java/org/apache/commons/graph/spanning/KruskalTestCase.java
rename to spanning/src/test/java/org/apache/commons/graph/spanning/KruskalTestCase.java
index 4433c09..d716d5a 100644
--- a/src/test/java/org/apache/commons/graph/spanning/KruskalTestCase.java
+++ b/spanning/src/test/java/org/apache/commons/graph/spanning/KruskalTestCase.java
@@ -19,18 +19,18 @@
  * under the License.
  */
 
+import static org.apache.commons.graph.spanning.SpanningTreeSolver.minimumSpanningTree;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
-import static org.apache.commons.graph.CommonsGraph.minimumSpanningTree;
 
 import org.apache.commons.graph.Graph;
 import org.apache.commons.graph.SpanningTree;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
-import org.apache.commons.graph.model.BaseWeightedEdge;
+import org.apache.commons.graph.math.monoid.primitive.DoubleWeightBaseOperations;
 import org.apache.commons.graph.model.MutableSpanningTree;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
-import org.apache.commons.graph.weight.primitive.DoubleWeightBaseOperations;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseWeightedEdge;
 import org.junit.Test;
 
 public final class KruskalTestCase
diff --git a/src/test/java/org/apache/commons/graph/spanning/PrimTestCase.java b/spanning/src/test/java/org/apache/commons/graph/spanning/PrimTestCase.java
similarity index 96%
rename from src/test/java/org/apache/commons/graph/spanning/PrimTestCase.java
rename to spanning/src/test/java/org/apache/commons/graph/spanning/PrimTestCase.java
index 1cdb53f..101bf9d 100644
--- a/src/test/java/org/apache/commons/graph/spanning/PrimTestCase.java
+++ b/spanning/src/test/java/org/apache/commons/graph/spanning/PrimTestCase.java
@@ -19,18 +19,18 @@
  * under the License.
  */
 
+import static org.apache.commons.graph.spanning.SpanningTreeSolver.minimumSpanningTree;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
-import static org.apache.commons.graph.CommonsGraph.minimumSpanningTree;
 
 import org.apache.commons.graph.Graph;
 import org.apache.commons.graph.SpanningTree;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
-import org.apache.commons.graph.model.BaseWeightedEdge;
+import org.apache.commons.graph.math.monoid.primitive.DoubleWeightBaseOperations;
 import org.apache.commons.graph.model.MutableSpanningTree;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
-import org.apache.commons.graph.weight.primitive.DoubleWeightBaseOperations;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseWeightedEdge;
 import org.junit.Test;
 
 public final class PrimTestCase
diff --git a/src/test/java/org/apache/commons/graph/spanning/ReverseDeleteTestCase.java b/spanning/src/test/java/org/apache/commons/graph/spanning/ReverseDeleteTestCase.java
similarity index 96%
rename from src/test/java/org/apache/commons/graph/spanning/ReverseDeleteTestCase.java
rename to spanning/src/test/java/org/apache/commons/graph/spanning/ReverseDeleteTestCase.java
index 5f6c9b1..35a1409 100644
--- a/src/test/java/org/apache/commons/graph/spanning/ReverseDeleteTestCase.java
+++ b/spanning/src/test/java/org/apache/commons/graph/spanning/ReverseDeleteTestCase.java
@@ -19,17 +19,17 @@
  * under the License.
  */
 
+import static org.apache.commons.graph.spanning.SpanningTreeSolver.minimumSpanningTree;
 import static org.junit.Assert.assertEquals;
-import static org.apache.commons.graph.CommonsGraph.minimumSpanningTree;
 
 import org.apache.commons.graph.Graph;
 import org.apache.commons.graph.SpanningTree;
-import org.apache.commons.graph.model.BaseLabeledVertex;
-import org.apache.commons.graph.model.BaseLabeledWeightedEdge;
-import org.apache.commons.graph.model.BaseWeightedEdge;
+import org.apache.commons.graph.math.monoid.primitive.DoubleWeightBaseOperations;
 import org.apache.commons.graph.model.MutableSpanningTree;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
-import org.apache.commons.graph.weight.primitive.DoubleWeightBaseOperations;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
+import org.apache.commons.graph.model.labeled.BaseLabeledWeightedEdge;
+import org.apache.commons.graph.model.labeled.BaseWeightedEdge;
 import org.junit.Test;
 
 /**
diff --git a/src/main/java/org/apache/commons/graph/CommonsGraph.java b/src/main/java/org/apache/commons/graph/CommonsGraph.java
deleted file mode 100644
index ef460d8..0000000
--- a/src/main/java/org/apache/commons/graph/CommonsGraph.java
+++ /dev/null
@@ -1,356 +0,0 @@
-package org.apache.commons.graph;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
-import static org.apache.commons.graph.utils.Assertions.checkNotNull;
-
-import org.apache.commons.graph.builder.DefaultLinkedConnectionBuilder;
-import org.apache.commons.graph.builder.GraphConnection;
-import org.apache.commons.graph.builder.LinkedConnectionBuilder;
-import org.apache.commons.graph.coloring.ColorsBuilder;
-import org.apache.commons.graph.coloring.DefaultColorsBuilder;
-import org.apache.commons.graph.connectivity.ConnectivityBuilder;
-import org.apache.commons.graph.connectivity.DefaultConnectivityBuilder;
-import org.apache.commons.graph.elo.DefaultRankingSelector;
-import org.apache.commons.graph.elo.GameResult;
-import org.apache.commons.graph.elo.RankingSelector;
-import org.apache.commons.graph.export.DefaultExportSelector;
-import org.apache.commons.graph.export.NamedExportSelector;
-import org.apache.commons.graph.flow.DefaultFlowWeightedEdgesBuilder;
-import org.apache.commons.graph.flow.FlowWeightedEdgesBuilder;
-import org.apache.commons.graph.model.DirectedMutableGraph;
-import org.apache.commons.graph.model.UndirectedMutableGraph;
-import org.apache.commons.graph.scc.DefaultSccAlgorithmSelector;
-import org.apache.commons.graph.scc.SccAlgorithmSelector;
-import org.apache.commons.graph.shortestpath.DefaultWeightedEdgesSelector;
-import org.apache.commons.graph.shortestpath.PathWeightedEdgesBuilder;
-import org.apache.commons.graph.spanning.DefaultSpanningWeightedEdgeMapperBuilder;
-import org.apache.commons.graph.spanning.SpanningWeightedEdgeMapperBuilder;
-import org.apache.commons.graph.visit.DefaultVisitSourceSelector;
-import org.apache.commons.graph.visit.VisitSourceSelector;
-
-/**
- * The Apache Commons Graph package is a toolkit for managing graphs and graph based data structures.
- */
-public final class CommonsGraph
-{
-
-    /**
-     * Export the graph in DOT or GraphML format.
-     *
-     * @param <V> the Graph vertices type
-     * @param <E> the Graph edges type
-     * @param <G> the Graph type
-     * @param graph the input graph
-     * @return an instance of {@link NamedExportSelector}
-     */
-    public static <V, E, G extends Graph<V, E>> NamedExportSelector<V, E> export( G graph )
-    {
-        graph = checkNotNull( graph, "Null graph can not be exported" );
-        return new DefaultExportSelector<V, E>( graph );
-    }
-
-    /**
-     * Create a color builder.
-     *
-     * @param <V> the Graph vertices type
-     * @param <E> the Graph edges type
-     * @param <G> the Graph type
-     * @param graph the input graph
-     * @return an instance of {@link ColorsBuilder}
-     */
-    public static <V, E, G extends UndirectedGraph<V, E>> ColorsBuilder<V, E> coloring( G graph )
-    {
-        graph = checkNotNull( graph, "Coloring can not be calculated on null graph"  );
-        return new DefaultColorsBuilder<V, E>( graph );
-    }
-
-    /**
-     * Find the maximum flow on the input {@link Graph}.
-     *
-     * @param <V> the Graph vertices type
-     * @param <WE> the Graph edges type
-     * @param <G> the Graph type
-     * @param graph the input edge-weighted graph
-     * @return an instance of {@link FlowWeightedEdgesBuilder}
-     */
-    public static <V, WE, G extends DirectedGraph<V, WE>> FlowWeightedEdgesBuilder<V, WE> findMaxFlow( G graph )
-    {
-        graph = checkNotNull( graph, "Max flow can not be calculated on null graph" );
-        return new DefaultFlowWeightedEdgesBuilder<V, WE>( graph );
-    }
-
-    /**
-     * Find the minimum spanning tree on the input {@link Graph}
-     *
-     * @param <V> the Graph vertices type
-     * @param <WE> the Graph edges type
-     * @param <G> the Graph type
-     * @param graph the input edge-weighted graph
-     * @return the caluculated minimun spanning tree
-     */
-    public static <V, WE, G extends Graph<V, WE>> SpanningWeightedEdgeMapperBuilder<V, WE> minimumSpanningTree( G graph )
-    {
-        graph = checkNotNull( graph, "Minimum spanning tree can not be calculated on null graph" );
-        return new DefaultSpanningWeightedEdgeMapperBuilder<V, WE>( graph );
-    }
-
-    /**
-     * Find the sortest on the input {@link Graph}
-     *
-     * @param <V> the Graph vertices type
-     * @param <WE> the Graph edges type
-     * @param <G> the Graph type
-     * @param graph the input edge-weighted graph
-     * @return the caluculated the sortest
-     */
-    public static <V, WE, G extends Graph<V, WE>> PathWeightedEdgesBuilder<V, WE> findShortestPath( G graph )
-    {
-        graph = checkNotNull( graph, "Shortest path can not be calculated on null graph" );
-        return new DefaultWeightedEdgesSelector<V, WE>( graph );
-    }
-
-    /**
-     * Calculates the input graph Strongly Connected Component.
-     *
-     * @param <V> the Graph vertices type.
-     * @param <E> the Graph edges type.
-     * @param <G> the directed graph type
-     * @param graph the Graph which strongly connected component has to be verified.
-     * @return the SCC algoritm selector
-     */
-    public static <V, E, G extends DirectedGraph<V, E>> SccAlgorithmSelector<V, E> findStronglyConnectedComponent( G graph )
-    {
-        graph = checkNotNull( graph, "Strongly Connected Component cannot be calculated from a null graph" );
-        return new DefaultSccAlgorithmSelector<V, E>( graph );
-    }
-
-    /**
-     * Calculates the input graph Connected Component.
-     *
-     * @param <V> the Graph vertices type.
-     * @param <E> the Graph edges type.
-     * @param <G> the directed graph type
-     * @param graph the Graph which connected component has to be verified.
-     * @return the Connectivity algorithm builder
-     */
-    public static <V, E, G extends Graph<V, E>> ConnectivityBuilder<V, E> findConnectedComponent( G graph )
-    {
-        graph = checkNotNull( graph, "Connected Component cannot be calculated from a null graph" );
-        return new DefaultConnectivityBuilder<V, E>( graph );
-    }
-
-    /**
-     * Allows select a series of algorithms to apply on input graph.
-     *
-     * @param <V> the Graph vertices type
-     * @param <E> the Graph edges type
-     * @param <G> the Graph type
-     * @param graph the Graph instance to apply graph algorithms
-     * @return the graph algorithms selector
-     */
-    public static <V, E, G extends Graph<V, E>> VisitSourceSelector<V, E, G> visit( G graph )
-    {
-        graph = checkNotNull( graph, "No algorithm can be applied on null graph!" );
-        return new DefaultVisitSourceSelector<V, E, G>( graph );
-    }
-
-    /**
-     * Ranks the players (vertices) that took part in a tournament (graph) depending on the game results (edges),
-     * applying the <a href="http://en.wikipedia.org/wiki/Elo_rating_system.">Elo Rating System</a>.
-     *
-     * @param <P> the players involved in the tournament
-     * @param <TG> the Tournament Graph type
-     * @param tournamentGraph the graph representing the tournament
-     * @return the builder for the functor which returns/update the players ranking
-     */
-    public static <P, TG extends DirectedGraph<P, GameResult>> RankingSelector<P> eloRate( TG tournamentGraph )
-    {
-        tournamentGraph = checkNotNull( tournamentGraph, "ELO ranking can not be applied on null graph!" );
-        return new DefaultRankingSelector<P>( tournamentGraph );
-    }
-
-    /**
-     * Creates a new {@link DirectedMutableGraph} instance where vertices
-     * are connected as described in the input {@link GraphConnection} instance.
-     *
-     * @param <V> the Graph vertices type
-     * @param <E> the Graph edges type
-     * @param graphConnection the {@link GraphConnection} instance that describes vertices
-     * @return a new {@link DirectedMutableGraph} instance
-     */
-    public static <V, E> DirectedMutableGraph<V, E> newDirectedMutableGraph( GraphConnection<V, E> graphConnection )
-    {
-        return populate( new DirectedMutableGraph<V, E>() ).withConnections( graphConnection );
-    }
-
-    /**
-     * Creates a new {@link UndirectedMutableGraph} instance where vertices
-     * are connected as described in the input {@link GraphConnection} instance.
-     *
-     * @param <V> the Graph vertices type
-     * @param <E> the Graph edges type
-     * @param graphConnection the {@link GraphConnection} instance that describes vertices
-     * @return a new {@link UndirectedMutableGraph} instance
-     */
-    public static <V, E> UndirectedMutableGraph<V, E> newUndirectedMutableGraph( GraphConnection<V, E> graphConnection )
-    {
-        return populate( new UndirectedMutableGraph<V, E>() ).withConnections( graphConnection );
-    }
-
-    /**
-     * Allows populate the given {@link MutableGraph}.
-     *
-     * @param <V> the Graph vertices type
-     * @param <E> the Graph edges type
-     * @param <G> the Graph type
-     * @param graph the graph has to be populated
-     * @return the builder to configure vertices connection
-     */
-    public static <V, E, G extends MutableGraph<V, E>> LinkedConnectionBuilder<V, E, G> populate( G graph )
-    {
-        return new DefaultLinkedConnectionBuilder<V, E, G>( checkNotNull( graph, "Impossible to configure null graph!" ) );
-    }
-
-    /**
-     * Returns a synchronized (thread-safe) {@link Graph} backed by the specified Graph.
-     *
-     * It is imperative that the user manually synchronize on the returned graph when iterating over iterable collections:
-     * <pre>
-     *     Graph syncGraph = synchronize( graph );
-     *         ...
-     *     synchronized(syncGraph) {
-     *         for ( Vertex v : g.getVertices() ) // Must be in synchronized block
-     *         {
-     *            foo( v )
-     *         }
-     *   }
-     * </pre>
-     *
-     * Failure to follow this advice may result in non-deterministic behavior.
-     *
-     * The returned {@link Graph} will be serializable if the specified {@link Graph} is serializable.
-     *
-     * @param <V> the Graph vertices type
-     * @param <E> the Graph edges type
-     * @param graph the input {@link Graph}
-     * @return the syncronyzed graph
-     */
-    public static <V, E> Graph<V, E> synchronize( Graph<V, E> graph )
-    {
-        return new SynchronizedGraph<V, E>( graph );
-    }
-
-    /**
-     * Returns a synchronized (thread-safe) {@link DirectedGraph} backed by the specified Graph.
-     *
-     * It is imperative that the user manually synchronize on the returned graph when iterating over iterable collections:
-     * <pre>
-     *     Graph syncGraph = synchronize( graph );
-     *         ...
-     *     synchronized(syncGraph) {
-     *         for ( Vertex v : g.getVertices() ) // Must be in synchronized block
-     *         {
-     *            foo( v )
-     *         }
-     *   }
-     * </pre>
-     *
-     * Failure to follow this advice may result in non-deterministic behavior.
-     *
-     * The returned {@link Graph} will be serializable if the specified {@link Graph} is serializable.
-     *
-     * @param <V> the Graph vertices type
-     * @param <E> the Graph edges type
-     * @param graph the input {@link Graph}
-     * @return the syncronyzed graph
-     */
-    public static <V, E> Graph<V, E> synchronize( DirectedGraph<V, E> graph )
-    {
-        return new SynchronizedDirectedGraph<V, E>( graph );
-    }
-
-    /**
-     * Returns a synchronized (thread-safe) {@link UndirectedGraph} backed by the specified Graph.
-     *
-     * It is imperative that the user manually synchronize on the returned graph when iterating over iterable collections:
-     * <pre>
-     *     Graph syncGraph = synchronize( graph );
-     *         ...
-     *     synchronized(syncGraph) {
-     *         for ( Vertex v : g.getVertices() ) // Must be in synchronized block
-     *         {
-     *            foo( v )
-     *         }
-     *   }
-     * </pre>
-     *
-     * Failure to follow this advice may result in non-deterministic behavior.
-     *
-     * The returned {@link Graph} will be serializable if the specified {@link Graph} is serializable.
-     *
-     * @param <V> the Graph vertices type
-     * @param <E> the Graph edges type
-     * @param graph the input {@link Graph}
-     * @return the syncronyzed graph
-     */
-    public static <V, E> Graph<V, E> synchronize( UndirectedGraph<V, E> graph )
-    {
-        return new SynchronizedUndirectedGraph<V, E>( graph );
-    }
-
-    /**
-     * Returns a synchronized (thread-safe) {@link MutableGraph} backed by the specified Graph.
-     *
-     * It is imperative that the user manually synchronize on the returned graph when iterating over iterable collections:
-     * <pre>
-     *     Graph syncGraph = synchronize( graph );
-     *         ...
-     *     synchronized(syncGraph) {
-     *         for ( Vertex v : g.getVertices() ) // Must be in synchronized block
-     *         {
-     *            foo( v )
-     *         }
-     *   }
-     * </pre>
-     *
-     * Failure to follow this advice may result in non-deterministic behavior.
-     *
-     * The returned {@link Graph} will be serializable if the specified {@link Graph} is serializable.
-     *
-     * @param <V> the Graph vertices type
-     * @param <E> the Graph edges type
-     * @param graph the input {@link Graph}
-     * @return the synchronized graph
-     */
-    public static <V, E> Graph<V, E> synchronize( MutableGraph<V, E> graph )
-    {
-        return new SynchronizedMutableGraph<V, E>( graph );
-    }
-
-    /**
-     * Hidden constructor, this class cannot be instantiated.
-     */
-    private CommonsGraph()
-    {
-        // do nothing
-    }
-
-}
diff --git a/src/test/java/org/apache/commons/graph/coloring/AbstractColoringTest.java b/src/test/java/org/apache/commons/graph/coloring/AbstractColoringTest.java
deleted file mode 100644
index 7c642ae..0000000
--- a/src/test/java/org/apache/commons/graph/coloring/AbstractColoringTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package org.apache.commons.graph.coloring;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Random;
-import java.util.Set;
-
-import org.apache.commons.graph.VertexPair;
-import org.apache.commons.graph.model.UndirectedMutableGraph;
-
-/**
- * Abstract class used for test coloring.
- */
-abstract class AbstractColoringTest
-{
-
-    AbstractColoringTest()
-    {
-    }
-
-    /**
-     * Return a random association with index and a color string in RGB.
-     */
-    protected Map<Integer, String> createColorMap( int numColor )
-    {
-        Map<Integer, String> colorCodes = new HashMap<Integer, String>();
-        for ( int i = 0; i < 100; i++ )
-        {
-            Random rnd = new Random( i );
-            colorCodes.put( i, String.format( "\"#%2x%2x%2x\"", rnd.nextInt( 255 ), rnd.nextInt( 255 ), rnd.nextInt( 255 ) ) );
-        }
-        return colorCodes;
-    }
-
-    /**
-     * Creates a list of integer colors.
-     *
-     * @param colorNumber number of colors
-     * @return the list.
-     */
-    protected Set<Integer> createColorsList( int colorNumber )
-    {
-        Set<Integer> colors = new HashSet<Integer>();
-        for ( int j = 0; j < colorNumber; j++ )
-        {
-            colors.add( j );
-        }
-        return colors;
-    }
-
-    /**
-     * This method checks if all connected vertices have different colors.
-     *
-     * @param g
-     * @param coloredVertices
-     */
-    protected <V, E, C> void checkColoring( UndirectedMutableGraph<V, E> g,
-                                                                        ColoredVertices<V, C> coloredVertices )
-    {
-        for ( E e : g.getEdges() )
-        {
-            VertexPair<V> vp = g.getVertices( e );
-            C h = coloredVertices.getColor( vp.getHead() );
-            C t = coloredVertices.getColor( vp.getTail() );
-
-            assertNotNull( h );
-            assertNotNull( t );
-            assertTrue( !h.equals( t ) );
-        }
-    }
-
-}
diff --git a/visit/pom.xml b/visit/pom.xml
new file mode 100644
index 0000000..2ef7a8d
--- /dev/null
+++ b/visit/pom.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-graph</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>commons-graph-visit</artifactId>
+
+  <name>Apache Commons Graph - Visit</name>
+  <description>Graph visit problem solver implementation.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-api</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.parent.groupId}</groupId>
+      <artifactId>commons-graph-model</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${basedir}/../</directory>
+        <targetPath>META-INF</targetPath>
+        <includes>
+          <include>NOTICE.txt</include>
+          <include>LICENSE.txt</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/src/main/java/org/apache/commons/graph/visit/BaseGraphVisitHandler.java b/visit/src/main/java/org/apache/commons/graph/visit/BaseGraphVisitHandler.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/visit/BaseGraphVisitHandler.java
rename to visit/src/main/java/org/apache/commons/graph/visit/BaseGraphVisitHandler.java
diff --git a/src/main/java/org/apache/commons/graph/visit/DefaultVisitAlgorithmsSelector.java b/visit/src/main/java/org/apache/commons/graph/visit/DefaultVisitAlgorithmsSelector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/visit/DefaultVisitAlgorithmsSelector.java
rename to visit/src/main/java/org/apache/commons/graph/visit/DefaultVisitAlgorithmsSelector.java
diff --git a/src/main/java/org/apache/commons/graph/visit/DefaultVisitSourceSelector.java b/visit/src/main/java/org/apache/commons/graph/visit/DefaultVisitSourceSelector.java
similarity index 95%
rename from src/main/java/org/apache/commons/graph/visit/DefaultVisitSourceSelector.java
rename to visit/src/main/java/org/apache/commons/graph/visit/DefaultVisitSourceSelector.java
index d8a34e6..96b9f56 100644
--- a/src/main/java/org/apache/commons/graph/visit/DefaultVisitSourceSelector.java
+++ b/visit/src/main/java/org/apache/commons/graph/visit/DefaultVisitSourceSelector.java
@@ -31,7 +31,7 @@
  * @param <E> the Graph edges type
  * @param <G> the Graph type
  */
-public final class DefaultVisitSourceSelector<V, E, G extends Graph<V, E>>
+final class DefaultVisitSourceSelector<V, E, G extends Graph<V, E>>
     implements VisitSourceSelector<V, E, G>
 {
 
diff --git a/src/main/java/org/apache/commons/graph/visit/GraphVisitHandler.java b/visit/src/main/java/org/apache/commons/graph/visit/GraphVisitHandler.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/visit/GraphVisitHandler.java
rename to visit/src/main/java/org/apache/commons/graph/visit/GraphVisitHandler.java
diff --git a/visit/src/main/java/org/apache/commons/graph/visit/GraphVisitor.java b/visit/src/main/java/org/apache/commons/graph/visit/GraphVisitor.java
new file mode 100644
index 0000000..9ddc35f
--- /dev/null
+++ b/visit/src/main/java/org/apache/commons/graph/visit/GraphVisitor.java
@@ -0,0 +1,49 @@
+package org.apache.commons.graph.visit;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import static org.apache.commons.graph.utils.Assertions.checkNotNull;
+
+import org.apache.commons.graph.Graph;
+
+public final class GraphVisitor
+{
+
+    /**
+     * Allows select a series of algorithms to apply on input graph.
+     *
+     * @param <V> the Graph vertices type
+     * @param <E> the Graph edges type
+     * @param <G> the Graph type
+     * @param graph the Graph instance to apply graph algorithms
+     * @return the graph algorithms selector
+     */
+    public static <V, E, G extends Graph<V, E>> VisitSourceSelector<V, E, G> visit( G graph )
+    {
+        graph = checkNotNull( graph, "No algorithm can be applied on null graph!" );
+        return new DefaultVisitSourceSelector<V, E, G>( graph );
+    }
+
+    private GraphVisitor()
+    {
+        // do nothing
+    }
+
+}
diff --git a/src/main/java/org/apache/commons/graph/visit/VisitAlgorithmsSelector.java b/visit/src/main/java/org/apache/commons/graph/visit/VisitAlgorithmsSelector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/visit/VisitAlgorithmsSelector.java
rename to visit/src/main/java/org/apache/commons/graph/visit/VisitAlgorithmsSelector.java
diff --git a/src/main/java/org/apache/commons/graph/visit/VisitGraphBuilder.java b/visit/src/main/java/org/apache/commons/graph/visit/VisitGraphBuilder.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/visit/VisitGraphBuilder.java
rename to visit/src/main/java/org/apache/commons/graph/visit/VisitGraphBuilder.java
diff --git a/src/main/java/org/apache/commons/graph/visit/VisitSourceSelector.java b/visit/src/main/java/org/apache/commons/graph/visit/VisitSourceSelector.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/visit/VisitSourceSelector.java
rename to visit/src/main/java/org/apache/commons/graph/visit/VisitSourceSelector.java
diff --git a/src/main/java/org/apache/commons/graph/visit/VisitState.java b/visit/src/main/java/org/apache/commons/graph/visit/VisitState.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/visit/VisitState.java
rename to visit/src/main/java/org/apache/commons/graph/visit/VisitState.java
diff --git a/src/main/java/org/apache/commons/graph/visit/package-info.java b/visit/src/main/java/org/apache/commons/graph/visit/package-info.java
similarity index 100%
rename from src/main/java/org/apache/commons/graph/visit/package-info.java
rename to visit/src/main/java/org/apache/commons/graph/visit/package-info.java
diff --git a/src/test/java/org/apache/commons/graph/visit/NodeSequenceVisitor.java b/visit/src/test/java/org/apache/commons/graph/visit/NodeSequenceVisitor.java
similarity index 92%
rename from src/test/java/org/apache/commons/graph/visit/NodeSequenceVisitor.java
rename to visit/src/test/java/org/apache/commons/graph/visit/NodeSequenceVisitor.java
index 80ba030..99c0518 100644
--- a/src/test/java/org/apache/commons/graph/visit/NodeSequenceVisitor.java
+++ b/visit/src/test/java/org/apache/commons/graph/visit/NodeSequenceVisitor.java
@@ -24,9 +24,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.graph.model.BaseLabeledEdge;
-import org.apache.commons.graph.model.BaseLabeledVertex;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
+import org.apache.commons.graph.model.labeled.BaseLabeledEdge;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
 
 public final class NodeSequenceVisitor
     extends BaseGraphVisitHandler<BaseLabeledVertex, BaseLabeledEdge, UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledEdge>, List<BaseLabeledVertex>>
diff --git a/src/test/java/org/apache/commons/graph/visit/VisitTestCase.java b/visit/src/test/java/org/apache/commons/graph/visit/VisitTestCase.java
similarity index 96%
rename from src/test/java/org/apache/commons/graph/visit/VisitTestCase.java
rename to visit/src/test/java/org/apache/commons/graph/visit/VisitTestCase.java
index ddbda74..962c850 100644
--- a/src/test/java/org/apache/commons/graph/visit/VisitTestCase.java
+++ b/visit/src/test/java/org/apache/commons/graph/visit/VisitTestCase.java
@@ -19,8 +19,8 @@
  * under the License.
  */
 
-import static org.apache.commons.graph.CommonsGraph.newUndirectedMutableGraph;
-import static org.apache.commons.graph.CommonsGraph.visit;
+import static org.apache.commons.graph.model.GraphUtils.newUndirectedMutableGraph;
+import static org.apache.commons.graph.visit.GraphVisitor.visit;
 import static org.junit.Assert.assertEquals;
 
 import java.util.ArrayList;
@@ -28,9 +28,9 @@
 
 import org.apache.commons.graph.Graph;
 import org.apache.commons.graph.builder.AbstractGraphConnection;
-import org.apache.commons.graph.model.BaseLabeledEdge;
-import org.apache.commons.graph.model.BaseLabeledVertex;
 import org.apache.commons.graph.model.UndirectedMutableGraph;
+import org.apache.commons.graph.model.labeled.BaseLabeledEdge;
+import org.apache.commons.graph.model.labeled.BaseLabeledVertex;
 import org.junit.Test;
 
 public final class VisitTestCase