From a97ee33a8b298fdfa743a465b668c7c16a698f6e Mon Sep 17 00:00:00 2001
From: Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com>
Date: Wed, 28 Sep 2011 13:11:43 -0400
Subject: [PATCH] Refactored the graph package so generics are minimized with a
 focus on gneerifying the endpoints, major milestone in the design.

---
 .../dann/graph/AssignableBidirectedCloud.java |   9 +-
 .../dann/graph/AssignableBidirectedEdge.java  |   7 +-
 .../syncleus/dann/graph/AssignableCloud.java  |   9 +-
 .../dann/graph/AssignableCloudGraph.java      |  29 ++--
 .../dann/graph/AssignableDirectedEdge.java    |   7 +-
 .../syncleus/dann/graph/AssignableEdge.java   |   7 +-
 .../AssignableMixableBidirectedEdge.java      |  14 +-
 .../graph/AssignableMixableDirectedEdge.java  |  15 +-
 .../dann/graph/AssignableMixableEdge.java     |  17 +--
 .../syncleus/dann/graph/BidirectedCloud.java  |   7 +-
 .../syncleus/dann/graph/BidirectedEdge.java   |   7 +-
 .../syncleus/dann/graph/BidirectedGraph.java  |  38 ++---
 .../java/com/syncleus/dann/graph/Cloud.java   |  26 ++--
 .../com/syncleus/dann/graph/CloudGraph.java   | 143 +++---------------
 .../com/syncleus/dann/graph/DirectedEdge.java |   7 +-
 .../syncleus/dann/graph/DirectedGraph.java    |  25 ++-
 .../dann/graph/DynamicBidirectedCloud.java    |   6 +-
 .../dann/graph/DynamicBidirectedGraph.java    |  25 ++-
 .../com/syncleus/dann/graph/DynamicCloud.java |   6 +-
 .../dann/graph/DynamicCloudGraph.java         |  29 ++--
 .../dann/graph/DynamicDirectedGraph.java      |  25 ++-
 .../com/syncleus/dann/graph/DynamicGraph.java |  25 ++-
 .../java/com/syncleus/dann/graph/Edge.java    |   7 +-
 ...eRootedTreeGraph.java => EndpointSet.java} |  10 +-
 .../java/com/syncleus/dann/graph/Graph.java   |  25 ++-
 ...bleTreeGraph.java => HashEndpointSet.java} |   2 +-
 .../com/syncleus/dann/graph/HyperEdge.java    |   9 +-
 .../com/syncleus/dann/graph/HyperGraph.java   |  27 ++--
 .../syncleus/dann/graph/JoinableCloud.java    |  12 +-
 .../dann/graph/JoinableCloudGraph.java        |  40 ++---
 .../dann/graph/MixableBidirectedEdge.java     |  13 +-
 .../dann/graph/MixableDirectedEdge.java       |  13 +-
 .../com/syncleus/dann/graph/MixableEdge.java  |  14 +-
 .../com/syncleus/dann/graph/MutableCloud.java |   6 +-
 .../dann/graph/MutableCloudGraph.java         |  32 ++--
 .../com/syncleus/dann/graph/MutableGraph.java |  25 ++-
 .../dann/graph/MutableHyperGraph.java         |  25 ++-
 .../syncleus/dann/graph/PartibleCloud.java    |  11 +-
 .../dann/graph/PartibleCloudGraph.java        |  43 ++----
 .../syncleus/dann/graph/TraversableCloud.java |  19 ++-
 .../dann/graph/TraversableCloudGraph.java     |  61 +++++---
 .../syncleus/dann/graph/TraversableGraph.java |  25 ++-
 42 files changed, 336 insertions(+), 566 deletions(-)
 rename src/main/java/com/syncleus/dann/graph/{MutableRootedTreeGraph.java => EndpointSet.java} (87%)
 rename src/main/java/com/syncleus/dann/graph/{MutableTreeGraph.java => HashEndpointSet.java} (92%)

diff --git a/src/main/java/com/syncleus/dann/graph/AssignableBidirectedCloud.java b/src/main/java/com/syncleus/dann/graph/AssignableBidirectedCloud.java
index 617dc7d5..cbceb207 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableBidirectedCloud.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableBidirectedCloud.java
@@ -21,11 +21,10 @@ package com.syncleus.dann.graph;
 import java.util.Map;
 
 public interface AssignableBidirectedCloud<
-	  	T,
-	  	E extends AssignableBidirectedCloud.Endpoint<T, ? extends T>
-	  > extends AssignableCloud<T,E>, BidirectedCloud<T,E>
+	  	E extends AssignableBidirectedCloud.Endpoint<?>
+	  > extends AssignableCloud<E>, BidirectedCloud<E>
 {
-	interface Endpoint<P, T extends P> extends AssignableCloud.Endpoint<P, T>, BidirectedCloud.Endpoint<P, T>
+	interface Endpoint<T> extends AssignableCloud.Endpoint<T>, BidirectedCloud.Endpoint<T>
 	{
 	}
 
@@ -35,5 +34,5 @@ public interface AssignableBidirectedCloud<
 		Endpoint.Direction getDirection();
 	}
 
-	void reassignDirection(Map<? extends E, ReassignmentPair<? extends T>> reassignments) throws InvalidGraphException;
+	<T, TE extends AssignableBidirectedCloud.Endpoint<? super T>> void reassignDirection(Map<TE,? extends ReassignmentPair<? extends T>> reassignments) throws InvalidGraphException;
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableBidirectedEdge.java b/src/main/java/com/syncleus/dann/graph/AssignableBidirectedEdge.java
index d9d8025b..1ecd6c84 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableBidirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableBidirectedEdge.java
@@ -19,11 +19,10 @@
 package com.syncleus.dann.graph;
 
 public interface AssignableBidirectedEdge<
-	  	T,
-	  	E extends AssignableBidirectedEdge.Endpoint<T>
-	  > extends AssignableMixableBidirectedEdge<T,T,T,E,E,E>, AssignableEdge<T,E>
+	  	E extends AssignableBidirectedEdge.Endpoint<?>
+	  > extends AssignableMixableBidirectedEdge<E,E,E>, AssignableEdge<E>
 {
-	interface Endpoint<T> extends AssignableMixableBidirectedEdge.Endpoint<T, T, T>, AssignableEdge.Endpoint<T>
+	interface Endpoint<T> extends AssignableMixableBidirectedEdge.Endpoint<T>, AssignableEdge.Endpoint<T>
 	{
 	};
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableCloud.java b/src/main/java/com/syncleus/dann/graph/AssignableCloud.java
index 7aeaeb99..47b7b1d9 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableCloud.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableCloud.java
@@ -21,14 +21,13 @@ package com.syncleus.dann.graph;
 import java.util.Map;
 
 public interface AssignableCloud<
-	  	T,
-	  	E extends AssignableCloud.Endpoint<T, ? extends T>
-	  > extends Cloud<T,E>
+	  	E extends AssignableCloud.Endpoint<?>
+	  > extends Cloud<E>
 {
-	interface Endpoint<P, T> extends Cloud.Endpoint<P, T>
+	interface Endpoint<T> extends Cloud.Endpoint<T>
 	{
 		void setTarget(T newTarget) throws InvalidEdgeException;
 	}
 
-	void reassign(Map<? extends E,? extends T> reassignments) throws InvalidGraphException;
+	<T, TE extends AssignableCloud.Endpoint<? super T>> void reassign(Map<TE,? extends T> reassignments) throws InvalidGraphException;
 }
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableCloudGraph.java b/src/main/java/com/syncleus/dann/graph/AssignableCloudGraph.java
index e69d0bfb..50c721c8 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableCloudGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableCloudGraph.java
@@ -19,37 +19,26 @@
 package com.syncleus.dann.graph;
 
 public interface AssignableCloudGraph<
-	  	A,
-	  	N,
-	  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>,
-	  	AE extends AssignableCloudGraph.Endpoint<A, A, N, E>,
-	  	NE extends AssignableCloudGraph.NodeEndpoint<A, N, E>,
-	  	EE extends AssignableCloudGraph.EdgeEndpoint<A, N, E>
-	  >  extends CloudGraph<A,N,E,AE,NE,EE>, AssignableCloud<A, AE>
+	  	NE extends AssignableCloudGraph.NodeEndpoint<?>,
+	  	EE extends AssignableCloudGraph.EdgeEndpoint<? extends Cloud<?>>
+	  >  extends CloudGraph<NE,EE>, AssignableCloud<NE>
 {
 	interface Endpoint<
-		  	P,
-		  	T,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
+		  	T
 		  >
-		  extends CloudGraph.Endpoint<P,T,N,E>, AssignableCloud.Endpoint<P,T>
+		  extends CloudGraph.Endpoint<T>, AssignableCloud.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	P,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
-	  > extends CloudGraph.NodeEndpoint<P,N,E>, AssignableCloud.Endpoint<P,N>, Endpoint<P,N,N,E>
+		  	T
+	  > extends CloudGraph.NodeEndpoint<T>, AssignableCloud.Endpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	P,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
-		> extends CloudGraph.EdgeEndpoint<P,N,E>, AssignableCloud.Endpoint<P,E>, Endpoint<P,E,N,E>
+		  	T extends Cloud<?>
+		> extends CloudGraph.EdgeEndpoint<T>, AssignableCloud.Endpoint<T>, Endpoint<T>
 	{
 	};
 }
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableDirectedEdge.java b/src/main/java/com/syncleus/dann/graph/AssignableDirectedEdge.java
index 1f199721..5556cddd 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableDirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableDirectedEdge.java
@@ -19,11 +19,10 @@
 package com.syncleus.dann.graph;
 
 public interface AssignableDirectedEdge<
-	  	T,
-	  	E extends AssignableDirectedEdge.Endpoint<T>
-	  > extends AssignableMixableDirectedEdge<T,T,T,E,E,E>, AssignableBidirectedEdge<T,E>
+	  	E extends AssignableDirectedEdge.Endpoint<?>
+	  > extends AssignableMixableDirectedEdge<E,E,E>, AssignableBidirectedEdge<E>
 {
-	interface Endpoint<T> extends AssignableMixableDirectedEdge.Endpoint<T, T, T>, AssignableBidirectedEdge.Endpoint<T>
+	interface Endpoint<T> extends AssignableMixableDirectedEdge.Endpoint<T>, AssignableBidirectedEdge.Endpoint<T>
 	{
 	};
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableEdge.java b/src/main/java/com/syncleus/dann/graph/AssignableEdge.java
index 590d9564..a7ce62e5 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableEdge.java
@@ -19,11 +19,10 @@
 package com.syncleus.dann.graph;
 
 public interface AssignableEdge<
-	  	T,
-	  	E extends AssignableEdge.Endpoint<T>
-	  > extends AssignableMixableEdge<T,T,T,E,E,E>
+	  	E extends AssignableEdge.Endpoint<?>
+	  > extends AssignableMixableEdge<E,E,E>
 {
-	interface Endpoint<T> extends AssignableMixableEdge.Endpoint<T, T, T>
+	interface Endpoint<T> extends AssignableMixableEdge.Endpoint<T>
 	{
 	};
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableMixableBidirectedEdge.java b/src/main/java/com/syncleus/dann/graph/AssignableMixableBidirectedEdge.java
index 78290fc2..11606f4e 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableMixableBidirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableMixableBidirectedEdge.java
@@ -19,18 +19,14 @@
 package com.syncleus.dann.graph;
 
 public interface AssignableMixableBidirectedEdge<
-	  	T,
-	  	LT extends T,
-	  	RT extends T,
-	  	E extends AssignableMixableBidirectedEdge.Endpoint<T, ? extends T, ? extends T>,
-	  	LE extends AssignableMixableBidirectedEdge.Endpoint<T, LT, RT>,
-	  	RE extends AssignableMixableBidirectedEdge.Endpoint<T, RT, LT>
-	  > extends MixableEdge<T, LT, RT, E, LE, RE>, AssignableCloud<T, E>
+	  	E extends AssignableMixableBidirectedEdge.Endpoint<?>,
+	  	LE extends E,
+	  	RE extends E
+	  > extends AssignableMixableEdge<E, LE, RE>, MixableBidirectedEdge<E, LE, RE>, AssignableBidirectedCloud<E>
 {
-	interface Endpoint<P, T extends P, N extends P> extends MixableBidirectedEdge.Endpoint<P, T, N>, AssignableMixableEdge.Endpoint<P, T, N>
+	interface Endpoint<T> extends AssignableMixableEdge.Endpoint<T>, MixableBidirectedEdge.Endpoint<T>, AssignableBidirectedCloud.Endpoint<T>
 	{
 	};
 
 	void invertDirection() throws InvalidEdgeDirectionException;
-	void reassign(LT newLeftNode, Endpoint.Direction newLeftDirection, RT newRightNode, Endpoint.Direction newRightDirection) throws InvalidEdgeException;
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableMixableDirectedEdge.java b/src/main/java/com/syncleus/dann/graph/AssignableMixableDirectedEdge.java
index 1d964a30..19d8b0cf 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableMixableDirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableMixableDirectedEdge.java
@@ -19,17 +19,12 @@
 package com.syncleus.dann.graph;
 
 public interface AssignableMixableDirectedEdge<
-	  	T,
-	  	ST extends T,
-	  	DT extends T,
-	  	E extends AssignableMixableDirectedEdge.Endpoint<T, ? extends T, ? extends T>,
-	  	SE extends AssignableMixableDirectedEdge.Endpoint<T, ST, DT>,
-	  	DE extends AssignableMixableDirectedEdge.Endpoint<T, DT, ST>
-	  > extends AssignableMixableBidirectedEdge<T, ST, DT, E, SE, DE>, MixableDirectedEdge<T, ST, DT, E, SE, DE>
+	  	E extends AssignableMixableDirectedEdge.Endpoint<?>,
+	  	SE extends E,
+	  	DE extends E
+	  > extends AssignableMixableBidirectedEdge<E, SE, DE>, MixableDirectedEdge<E, SE, DE>
 {
-	interface Endpoint<P, T extends P, N extends P> extends AssignableMixableBidirectedEdge.Endpoint<P, T, N>, MixableDirectedEdge.Endpoint<P, T, N>
+	interface Endpoint<T> extends AssignableMixableBidirectedEdge.Endpoint<T>, MixableDirectedEdge.Endpoint<T>
 	{
 	};
-
-	void reassign(ST newSourceNode, DT newDestinationNode) throws InvalidEdgeException;
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableMixableEdge.java b/src/main/java/com/syncleus/dann/graph/AssignableMixableEdge.java
index 64e376a9..b35bfac8 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableMixableEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableMixableEdge.java
@@ -18,18 +18,15 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
+import java.util.Map;
+
 public interface AssignableMixableEdge<
-	  	T,
-	  	LT extends T,
-	  	RT extends T,
-	  	E extends AssignableMixableEdge.Endpoint<T, ? extends T, ? extends T>,
-	  	LE extends AssignableMixableEdge.Endpoint<T, LT, RT>,
-	  	RE extends AssignableMixableEdge.Endpoint<T, RT, LT>
-	  > extends MixableEdge<T, LT, RT, E, LE, RE>, AssignableCloud<T, E>
+	  	E extends AssignableMixableEdge.Endpoint<?>,
+	  	LE extends E,
+	  	RE extends E
+	  > extends MixableEdge<E, LE, RE>, AssignableCloud<E>
 {
-	interface Endpoint<P, T extends P, N extends P> extends MixableEdge.Endpoint<P, T, N>, AssignableCloud.Endpoint<P, T>
+	interface Endpoint<T> extends MixableEdge.Endpoint<T>, AssignableCloud.Endpoint<T>
 	{
 	};
-
-	void reassign(LT newLeftNode, RT newRightNode) throws InvalidEdgeException;
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/BidirectedCloud.java b/src/main/java/com/syncleus/dann/graph/BidirectedCloud.java
index 1029c8e3..6d93baba 100644
--- a/src/main/java/com/syncleus/dann/graph/BidirectedCloud.java
+++ b/src/main/java/com/syncleus/dann/graph/BidirectedCloud.java
@@ -18,11 +18,10 @@
 package com.syncleus.dann.graph;
 
 public interface BidirectedCloud<
-	  T,
-	  EP extends BidirectedCloud.Endpoint<T, ? extends T>
-	  > extends TraversableCloud<T, EP>
+	  E extends BidirectedCloud.Endpoint<?>
+	  > extends TraversableCloud<E>
 {
-	interface Endpoint<P, T> extends TraversableCloud.Endpoint<P, T>
+	interface Endpoint<T> extends TraversableCloud.Endpoint<T>
 	{
 		enum Direction
 		{
diff --git a/src/main/java/com/syncleus/dann/graph/BidirectedEdge.java b/src/main/java/com/syncleus/dann/graph/BidirectedEdge.java
index 51d14528..8de0bb2c 100644
--- a/src/main/java/com/syncleus/dann/graph/BidirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/BidirectedEdge.java
@@ -19,11 +19,10 @@
 package com.syncleus.dann.graph;
 
 public interface BidirectedEdge<
-	  	T,
-	  	EP extends BidirectedEdge.Endpoint<T>
-	  > extends MixableBidirectedEdge<T,T,T,EP,EP,EP>, Edge<T,EP>
+	  	E extends BidirectedEdge.Endpoint<?>
+	  > extends MixableBidirectedEdge<E,E,E>, Edge<E>
 {
-	interface Endpoint<T> extends MixableBidirectedEdge.Endpoint<T, T, T>, Edge.Endpoint<T>
+	interface Endpoint<T> extends MixableBidirectedEdge.Endpoint<T>, Edge.Endpoint<T>
 	{
 	};
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/BidirectedGraph.java b/src/main/java/com/syncleus/dann/graph/BidirectedGraph.java
index a1be79bf..e7365cbd 100644
--- a/src/main/java/com/syncleus/dann/graph/BidirectedGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/BidirectedGraph.java
@@ -34,46 +34,26 @@ import java.util.Set;
  * @since 2.0
  */
 public interface BidirectedGraph<
-	  	N,
-	  	E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>>,
-	  	AE extends BidirectedGraph.Endpoint<Object, N, E>,
-	  	NE extends BidirectedGraph.NodeEndpoint<N, E>,
-	  	EE extends BidirectedGraph.EdgeEndpoint<N, E>
-	  > extends TraversableGraph<N, E, AE, NE, EE>
+	  	NE extends BidirectedGraph.NodeEndpoint<?>,
+	  	EE extends BidirectedGraph.EdgeEndpoint<?>
+	  > extends TraversableGraph<NE, EE>, BidirectedCloud<NE>
 {
 	interface Endpoint<
-		  	T,
-		  	N,
-		  	E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>>
+		  	T
 		  >
-		  extends TraversableGraph.Endpoint<T,N,E>
+		  extends TraversableGraph.Endpoint<T>, BidirectedCloud.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	N,
-		  	E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>>
-	  > extends TraversableGraph.NodeEndpoint<N,E>, Endpoint<N,N,E>
+		  	T
+	  > extends TraversableGraph.NodeEndpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	N,
-		  	E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>>
-		> extends TraversableGraph.EdgeEndpoint<N,E>, Endpoint<E,N,E>
+		  	T extends BidirectedEdge<?>
+		> extends TraversableGraph.EdgeEndpoint<T>, Endpoint<T>
 	{
 	};
-
-	/**
-	 * Get all edges which traverse to the specified node. While the combination of
-	 * out edges and in edges will usually result in all the adjacent edges for a
-	 * node this is not strictly required.
-	 *
-	 * @param node The destination node the returned edges will traverse to.
-	 * @return an unmodifiable set of all edges which traverse to the specified
-	 *         node.
-	 * @throws IllegalArgumentException if node does not exist in the graph.
-	 * @since 2.0
-	 */
-	Set<E> getInEdges(N node);
 }
diff --git a/src/main/java/com/syncleus/dann/graph/Cloud.java b/src/main/java/com/syncleus/dann/graph/Cloud.java
index d1ed73f4..db47339b 100644
--- a/src/main/java/com/syncleus/dann/graph/Cloud.java
+++ b/src/main/java/com/syncleus/dann/graph/Cloud.java
@@ -19,32 +19,28 @@
 package com.syncleus.dann.graph;
 
 import java.io.Serializable;
-import java.util.Collection;
-import java.util.Set;
+import java.util.*;
 import com.syncleus.dann.graph.event.context.ContextReporter;
 import com.syncleus.dann.graph.xml.EdgeXml;
 import com.syncleus.dann.xml.XmlSerializable;
 
 public interface Cloud<
-	  	T,
-	  	EP extends Cloud.Endpoint<T, ? extends T>
+	  	E extends Cloud.Endpoint<?>
 	  > extends Serializable, Cloneable, XmlSerializable<EdgeXml, Object>, ContextReporter
 {
-	interface Endpoint<P, T>
+	interface Endpoint<T>
 	{
-		Set<? extends Endpoint<P,P>> getNeighbors();
 		T getTarget();
 	};
 
-	Set<EP> getEndpoints();
-	Set<EP> getEndpoints(Object target);
-	Set<T> getTargets();
-	Set<T> getNeighbors(Object target);
-	boolean contains( Object endpoint);
-	boolean containsAny(Collection<? extends Endpoint<?,?>> endpoint);
-	boolean containsAll(Collection<? extends Endpoint<?,?>> endpoint);
+	Set<E> getEndpoints();
+	Set<E> getEndpoints(Object target);
+	Set<E> getNeighbors(Cloud.Endpoint<?> endpoint);
+	boolean contains( Endpoint<?> endpoint);
+	boolean containsAny(Collection<? extends Endpoint<?>> endpoint);
+	boolean containsAll(Collection<? extends Endpoint<?>> endpoint);
 	boolean containsTarget(Object target);
-	boolean containsAnyTargets(Collection<?> target);
-	boolean containsAllTargets(Collection<?> target);
+	boolean containsAnyTargets(Collection<?> targets);
+	boolean containsAllTargets(Collection<?> targets);
 	int getDegree();
 }
diff --git a/src/main/java/com/syncleus/dann/graph/CloudGraph.java b/src/main/java/com/syncleus/dann/graph/CloudGraph.java
index b1902ba1..cbb19a55 100644
--- a/src/main/java/com/syncleus/dann/graph/CloudGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/CloudGraph.java
@@ -18,6 +18,7 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
+import java.util.Collection;
 import java.util.Set;
 
 /**
@@ -34,139 +35,45 @@ import java.util.Set;
  * @param <E> The type of edge for the given node type
  */
 public interface CloudGraph<
-	  	A,
-	  	N,
-	  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>,
-	  	AE extends CloudGraph.Endpoint<A, A, N, E>,
-	  	NE extends CloudGraph.NodeEndpoint<A, N, E>,
-	  	EE extends CloudGraph.EdgeEndpoint<A, N, E>
-	  > extends Cloud<A,AE>
+	  	NE extends CloudGraph.NodeEndpoint<?>,
+	  	EE extends CloudGraph.EdgeEndpoint<? extends Cloud<?>>
+	  > extends Cloud<NE>
 {
 	interface Endpoint<
-		  	P,
-		  	T,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
+		  	T
 		  >
-		  extends Cloud.Endpoint<P,T>
+		  extends Cloud.Endpoint<T>
 	{
-		Set<? extends CloudGraph.Endpoint<P,T,N,E>> getAdjacent();
-		Set<? extends CloudGraph.Endpoint<P,T,N,E>> getTraversableAdjacentTo();
-		Set<? extends CloudGraph.Endpoint<P,T,N,E>> getTraversableAdjacentFrom();
-
-		Set<? extends CloudGraph.NodeEndpoint<P, N, E>> getAdjacentNodes();
-		Set<? extends CloudGraph.NodeEndpoint<P, N, E>> getTraversableAdjacentNodesTo();
-		Set<? extends CloudGraph.NodeEndpoint<P, N, E>> getTraversableAdjacentNodesFrom();
-
-		Set<? extends CloudGraph.EdgeEndpoint<P, N, E>> getAdjacentEdges();
-		Set<? extends CloudGraph.EdgeEndpoint<P, N, E>> getTraversableAdjacentEdgesTo();
-		Set<? extends CloudGraph.EdgeEndpoint<P, N, E>> getTraversableAdjacentEdgesFrom();
 	};
 
 	interface NodeEndpoint<
-		  	P,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
-	  > extends CloudGraph.Endpoint<P, N, N, E>
+		  	T
+	  > extends Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	P,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
-		> extends CloudGraph.Endpoint<P, E, N, E>
+		  	T extends Cloud<?>
+		> extends Endpoint<T>
 	{
 	};
 
-	Set<EE> getEdgeEndpoints();
-	Set<EE> getEdgeEndpoints(Cloud<?,? extends Cloud.Endpoint<?,?>> cloud);
-
-	Set<NE> getNodeEndpoints();
-	Set<NE> getNodeEndpoints(Object node);
-
-	/**
-	 * Get a set of all nodes in the graph.
-	 *
-	 * @return An unmodifiable set of all nodes in the graph.
-	 * @since 2.0
-	 */
-	Set<N> getNodes();
-	/**
-	 * Get a set of all edges in the graph. Two edges in the set, and in the graph,
-	 * may have the same end points unless equals in the edges used by this graph
-	 * restrict that possiblity.
-	 *
-	 * @return An unmodifiable set of a all edges in the graph.
-	 * @since 2.0
-	 */
-	Set<E> getEdges();
-	/**
-	 * Get a list of all nodes adjacent to the specified node. All edges connected
-	 * to this node has its other end points added to the list returned. The
-	 * specified node itself will appear in the list once for every loop. If there
-	 * are multiple edges connecting node with a particular end point it will
-	 * appear multiple times in the list, once for each hop to the end point.
-	 *
-	 * @param node The whose neighbors are to be returned.
-	 * @return A list of all nodes adjacent to the specified node, empty set if the
-	 *         node has no edges.
-	 * @since 2.0
-	 */
-	Set<N> getAdjacentNodes(Object node);
-	/**
-	 * Get a set of all edges which is connected to node (adjacent). You may not be
-	 * able to traverse from the specified node to all of these edges returned. If
-	 * you only want edges you can traverse then see getTraversableAdjacentEdges.
-	 *
-	 * @param node the end point for all edges to retrieve.
-	 * @return An unmodifiable set of all edges that has node as an end point.
-	 * @throws IllegalArgumentException if specified node is not in the graph.
-	 * @since 2.0
-	 */
-	Set<E> getAdjacentEdges(Object node);
-
-	Set<E> getTraversableEdgesFrom(Object source);
-	Set<E> getTraversableEdgesFrom(Cloud<?,? extends Cloud.Endpoint<?,?>> source);
-	Set<E> getTraversableEdgesTo(Object destination);
-	Set<E> getTraversableEdgesTo(Cloud<?,? extends Cloud.Endpoint<?,?>> destination);
-
-	Set<N> getTraversableNodesFrom(Object source);
-	Set<N> getTraversableNodesFrom(Cloud<?,? extends Cloud.Endpoint<?,?>> source);
-	Set<N> getTraversableNodesTo(Object destination);
-	Set<N> getTraversableNodesTo(Cloud<?,? extends Cloud.Endpoint<?,?>> destination);
-
-	Set<E> getTraversableAdjacentEdgesFrom(Object source);
-	Set<E> getTraversableAdjacentEdgesFrom(Cloud<?,? extends Cloud.Endpoint<?,?>> source);
-	Set<E> getTraversableAdjacentEdgesTo(Object destination);
-	Set<E> getTraversableAdjacentEdgesTo(Cloud<?,? extends Cloud.Endpoint<?,?>> destination);
+	interface EndpointSets<NE extends NodeEndpoint<?>,EE extends EdgeEndpoint<?>> extends Set<Endpoint<?>>
+	{
+		Set<NE> getNodeEndpoints();
+		Set<EE> getEdgeEndpoints();
+	};
 
-	Set<N> getTraversableAdjacentNodesFrom(Object source);
-	Set<N> getTraversableAdjacentNodesFrom(Cloud<?,? extends Cloud.Endpoint<?,?>> source);
+	EndpointSets<NE,EE> getAdjacent(Endpoint<?> endpoint);
 
-	/**
-	 * Get a list of all reachable nodes adjacent to node. All edges connected to
-	 * node and is traversable from node will have its destination node(s) added to
-	 * the returned list. node itself will appear in the list once for every loop.
-	 * If there are multiple edges connecting node with a particular end point then
-	 * the end point will appear multiple times in the list, once for each hop to
-	 * the end point.
-	 *
-	 * @param destination The whose traversable neighbors are to be returned.
-	 * @return A list of all nodes adjacent to the specified node and traversable
-	 *         from the spevified node, empty set if the node has no edges.
-	 * @since 2.0
-	 */
-	Set<N> getTraversableAdjacentNodesTo(Object destination);
+	Set<EE> getEdgeEndpoints();
+	Set<EE> getEdgeEndpoints(Cloud<?> cloud);
+	Set<EE> getEdgeNeighbors(Endpoint<?> endpoint);
 
-	/**
-	 * Get a set of all edges which you can traverse from node. Of course node will
-	 * always be an end point for each edge returned. Throws an
-	 * IllegalArgumentException if node is not in the graph.
-	 *
-	 * @param destination edges returned will be traversable from this node.
-	 * @return An unmodifiable set of all edges that can be traversed from node.
-	 * @since 2.0
-	 */
-	Set<N> getTraversableAdjacentNodesTo(Cloud<?,? extends Cloud.Endpoint<?,?>> destination);
+	boolean containsEdge( EdgeEndpoint<?> endpoint);
+	boolean containsAnyEdge(Collection<? extends EdgeEndpoint<?>> endpoint);
+	boolean containsAllEdge(Collection<? extends EdgeEndpoint<?>> endpoint);
+	boolean containsEdgeTarget(Cloud<?> target);
+	boolean containsAnyEdgeTargets(Collection<? extends Cloud<?>> targets);
+	boolean containsAllEdgeTargets(Collection<? extends Cloud<?>> targets);
 }
diff --git a/src/main/java/com/syncleus/dann/graph/DirectedEdge.java b/src/main/java/com/syncleus/dann/graph/DirectedEdge.java
index b43d3899..cd77653c 100644
--- a/src/main/java/com/syncleus/dann/graph/DirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/DirectedEdge.java
@@ -19,11 +19,10 @@
 package com.syncleus.dann.graph;
 
 public interface DirectedEdge<
-	  	T,
-	  	EP extends DirectedEdge.Endpoint<T>
-	  > extends MixableDirectedEdge<T,T,T,EP,EP,EP>, BidirectedEdge<T,EP>
+	  	E extends DirectedEdge.Endpoint<?>
+	  > extends MixableDirectedEdge<E,E,E>, BidirectedEdge<E>
 {
-	interface Endpoint<T> extends MixableDirectedEdge.Endpoint<T, T, T>, BidirectedEdge.Endpoint<T>
+	interface Endpoint<T> extends MixableDirectedEdge.Endpoint<T>, BidirectedEdge.Endpoint<T>
 	{
 	};
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/DirectedGraph.java b/src/main/java/com/syncleus/dann/graph/DirectedGraph.java
index f57e0b2f..c2638e10 100644
--- a/src/main/java/com/syncleus/dann/graph/DirectedGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/DirectedGraph.java
@@ -19,33 +19,26 @@
 package com.syncleus.dann.graph;
 
 public interface DirectedGraph<
-	  	N,
-	  	E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>>,
-	  	AE extends DirectedGraph.Endpoint<Object, N, E>,
-	  	NE extends DirectedGraph.NodeEndpoint<N, E>,
-	  	EE extends DirectedGraph.EdgeEndpoint<N, E>
-	  > extends BidirectedGraph<N, E, AE, NE, EE>
+	  	NE extends DirectedGraph.NodeEndpoint<?>,
+	  	EE extends DirectedGraph.EdgeEndpoint<?>
+	  > extends BidirectedGraph<NE, EE>
 {
 	interface Endpoint<
-		  	T,
-		  	N,
-		  	E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>>
+		  	T
 		  >
-		  extends BidirectedGraph.Endpoint<T,N,E>
+		  extends BidirectedGraph.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	N,
-		  	E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>>
-	  > extends BidirectedGraph.NodeEndpoint<N,E>, Endpoint<N,N,E>
+		  	T
+	  > extends BidirectedGraph.NodeEndpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	N,
-		  	E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>>
-		> extends BidirectedGraph.EdgeEndpoint<N,E>, Endpoint<E,N,E>
+		  	T extends DirectedEdge<?>
+		> extends BidirectedGraph.EdgeEndpoint<T>, Endpoint<T>
 	{
 	};
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/DynamicBidirectedCloud.java b/src/main/java/com/syncleus/dann/graph/DynamicBidirectedCloud.java
index 7dbcb980..5531191f 100644
--- a/src/main/java/com/syncleus/dann/graph/DynamicBidirectedCloud.java
+++ b/src/main/java/com/syncleus/dann/graph/DynamicBidirectedCloud.java
@@ -20,10 +20,10 @@ package com.syncleus.dann.graph;
 
 public interface DynamicBidirectedCloud<
 	  	T,
-	  	E extends DynamicBidirectedCloud.Endpoint<T, ? extends T>
-	  > extends DynamicCloud<T,E>, AssignableBidirectedCloud<T,E>
+	  	E extends DynamicBidirectedCloud.Endpoint<T>
+	  > extends DynamicCloud<T,E>, AssignableBidirectedCloud<E>
 {
-	interface Endpoint<P, T extends P> extends DynamicCloud.Endpoint<P, T>, AssignableBidirectedCloud.Endpoint<P, T>
+	interface Endpoint<T> extends DynamicCloud.Endpoint<T>, AssignableBidirectedCloud.Endpoint<T>
 	{
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/DynamicBidirectedGraph.java b/src/main/java/com/syncleus/dann/graph/DynamicBidirectedGraph.java
index 2563e3aa..4019a239 100644
--- a/src/main/java/com/syncleus/dann/graph/DynamicBidirectedGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/DynamicBidirectedGraph.java
@@ -20,32 +20,27 @@ package com.syncleus.dann.graph;
 
 public interface DynamicBidirectedGraph<
 	  	N,
-	  	E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>,
-	  	AE extends DynamicBidirectedGraph.Endpoint<Object, N, E>,
-	  	NE extends DynamicBidirectedGraph.NodeEndpoint<N, E>,
-	  	EE extends DynamicBidirectedGraph.EdgeEndpoint<N, E>
-	  > extends BidirectedGraph<N, E, AE, NE, EE>, DynamicGraph<N, E, AE, NE, EE>
+	  	NE extends DynamicBidirectedGraph.NodeEndpoint<N>,
+	  	E extends BidirectedEdge<? extends BidirectedEdge.Endpoint<N>>,
+	  	EE extends DynamicBidirectedGraph.EdgeEndpoint<E>
+	  > extends BidirectedGraph<NE, EE>, DynamicGraph<N, NE, E, EE>, DynamicBidirectedCloud<N,NE>
 {
 	interface Endpoint<
-		  	T,
-		  	N,
-		  	E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>
+		  	T
 		  >
-		  extends BidirectedGraph.Endpoint<T,N,E>, DynamicGraph.Endpoint<T,N,E>
+		  extends BidirectedGraph.Endpoint<T>, DynamicGraph.Endpoint<T>, DynamicBidirectedCloud.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	N,
-		  	E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>
-	  > extends BidirectedGraph.NodeEndpoint<N,E>, DynamicGraph.NodeEndpoint<N,E>, Endpoint<N,N,E>
+		  	T
+	  > extends BidirectedGraph.NodeEndpoint<T>, DynamicGraph.NodeEndpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	N,
-		  	E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>
-		> extends BidirectedGraph.EdgeEndpoint<N,E>, DynamicGraph.EdgeEndpoint<N,E>, Endpoint<E,N,E>
+		  	T extends BidirectedEdge<?>
+		> extends BidirectedGraph.EdgeEndpoint<T>, DynamicGraph.EdgeEndpoint<T>, Endpoint<T>
 	{
 	};
 }
diff --git a/src/main/java/com/syncleus/dann/graph/DynamicCloud.java b/src/main/java/com/syncleus/dann/graph/DynamicCloud.java
index 602ebe1b..abf1143b 100644
--- a/src/main/java/com/syncleus/dann/graph/DynamicCloud.java
+++ b/src/main/java/com/syncleus/dann/graph/DynamicCloud.java
@@ -19,10 +19,10 @@ package com.syncleus.dann.graph;
 
 public interface DynamicCloud<
 	  	T,
-	  	E extends DynamicCloud.Endpoint<T, ? extends T>
-	  > extends MutableCloud<T,E>, TraversableCloud<T,E>
+	  	E extends DynamicCloud.Endpoint<T>
+	  > extends MutableCloud<T,E>, TraversableCloud<E>
 {
-	interface Endpoint<P, T> extends MutableCloud.Endpoint<P, T>, TraversableCloud.Endpoint<P, T>
+	interface Endpoint<T> extends MutableCloud.Endpoint<T>, TraversableCloud.Endpoint<T>
 	{
 	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/DynamicCloudGraph.java b/src/main/java/com/syncleus/dann/graph/DynamicCloudGraph.java
index ec1eb2cb..e870a536 100644
--- a/src/main/java/com/syncleus/dann/graph/DynamicCloudGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/DynamicCloudGraph.java
@@ -19,37 +19,28 @@
 package com.syncleus.dann.graph;
 
 public interface DynamicCloudGraph<
-	  	A,
 	  	N,
-	  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>,
-	  	AE extends DynamicCloudGraph.Endpoint<A, A, N, E>,
-	  	NE extends DynamicCloudGraph.NodeEndpoint<A, N, E>,
-	  	EE extends DynamicCloudGraph.EdgeEndpoint<A, N, E>
-	  >  extends TraversableCloudGraph<A,N,E,AE,NE,EE>, DynamicCloud<A, AE>
+	  	NE extends DynamicCloudGraph.NodeEndpoint<N>,
+	  	E extends TraversableCloud<? extends TraversableCloud.Endpoint<? extends N>>,
+	  	EE extends DynamicCloudGraph.EdgeEndpoint<E>
+	  >  extends MutableCloudGraph<N,NE,E,EE>, TraversableCloudGraph<NE,EE>, DynamicCloud<N,NE>
 {
 	interface Endpoint<
-		  	P,
-		  	T,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
+		  	T
 		  >
-		  extends TraversableCloudGraph.Endpoint<P,T,N,E>, DynamicCloud.Endpoint<P,T>
+		  extends MutableCloudGraph.Endpoint<T>, TraversableCloudGraph.Endpoint<T>, DynamicCloud.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	P,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
-	  > extends TraversableCloudGraph.NodeEndpoint<P,N,E>, DynamicCloud.Endpoint<P,N>, Endpoint<P,N,N,E>
+		  	T
+	  > extends MutableCloudGraph.NodeEndpoint<T>, TraversableCloudGraph.NodeEndpoint<T>, DynamicCloud.Endpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	P,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
-		> extends TraversableCloudGraph.EdgeEndpoint<P,N,E>, DynamicCloud.Endpoint<P,E>, Endpoint<P,E,N,E>
+		  	T extends TraversableCloud<?>
+		> extends MutableCloudGraph.EdgeEndpoint<T>, TraversableCloudGraph.EdgeEndpoint<T>, DynamicCloud.Endpoint<T>, Endpoint<T>
 	{
 	};
 }
diff --git a/src/main/java/com/syncleus/dann/graph/DynamicDirectedGraph.java b/src/main/java/com/syncleus/dann/graph/DynamicDirectedGraph.java
index d421e037..96fac2fd 100644
--- a/src/main/java/com/syncleus/dann/graph/DynamicDirectedGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/DynamicDirectedGraph.java
@@ -20,32 +20,27 @@ package com.syncleus.dann.graph;
 
 public interface DynamicDirectedGraph<
 	  	N,
-	  	E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>,
-	  	AE extends DynamicDirectedGraph.Endpoint<Object, N, E>,
-	  	NE extends DynamicDirectedGraph.NodeEndpoint<N, E>,
-	  	EE extends DynamicDirectedGraph.EdgeEndpoint<N, E>
-	  > extends DirectedGraph<N, E, AE, NE, EE>, DynamicBidirectedGraph<N, E, AE, NE, EE>
+	  	NE extends DynamicDirectedGraph.NodeEndpoint<N>,
+	  	E extends DirectedEdge<? extends DirectedEdge.Endpoint<N>>,
+	  	EE extends DynamicDirectedGraph.EdgeEndpoint<E>
+	  > extends DirectedGraph<NE, EE>, DynamicBidirectedGraph<N, NE, E, EE>
 {
 	interface Endpoint<
-		  	T,
-		  	N,
-		  	E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>
+		  	T
 		  >
-		  extends DirectedGraph.Endpoint<T,N,E>, DynamicBidirectedGraph.Endpoint<T,N,E>
+		  extends DirectedGraph.Endpoint<T>, DynamicBidirectedGraph.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	N,
-		  	E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>
-	  > extends DirectedGraph.NodeEndpoint<N,E>, DynamicBidirectedGraph.NodeEndpoint<N,E>, Endpoint<N,N,E>
+		  	T
+	  > extends DirectedGraph.NodeEndpoint<T>, DynamicBidirectedGraph.NodeEndpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	N,
-		  	E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>
-		> extends DirectedGraph.EdgeEndpoint<N,E>, DynamicBidirectedGraph.EdgeEndpoint<N,E>, Endpoint<E,N,E>
+		  	T extends DirectedEdge<?>
+		> extends DirectedGraph.EdgeEndpoint<T>, DynamicBidirectedGraph.EdgeEndpoint<T>, Endpoint<T>
 	{
 	};
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/DynamicGraph.java b/src/main/java/com/syncleus/dann/graph/DynamicGraph.java
index 59f975d9..b7051d09 100644
--- a/src/main/java/com/syncleus/dann/graph/DynamicGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/DynamicGraph.java
@@ -20,32 +20,27 @@ package com.syncleus.dann.graph;
 
 public interface DynamicGraph<
 	  	N,
-	  	E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>,
-	  	AE extends DynamicGraph.Endpoint<Object, N, E>,
-	  	NE extends DynamicGraph.NodeEndpoint<N, E>,
-	  	EE extends DynamicGraph.EdgeEndpoint<N, E>
-	  > extends DynamicCloudGraph<Object, N, E, AE, NE, EE>, TraversableGraph<N,E,AE,NE,EE>, MutableGraph<N,E,AE,NE,EE>
+	  	NE extends DynamicGraph.NodeEndpoint<N>,
+		E extends Edge<? extends Edge.Endpoint<N>> & TraversableCloud<? extends TraversableCloud.Endpoint<N>>,
+	  	EE extends DynamicGraph.EdgeEndpoint<E>
+	  > extends DynamicCloudGraph<N, NE, E, EE>, TraversableGraph<NE,EE>, MutableGraph<N,NE,E,EE>
 {
 	interface Endpoint<
-		  	T,
-		  	N,
-		  	E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>
+		  	T
 		  >
-		  extends DynamicCloudGraph.Endpoint<Object,T,N,E>, TraversableGraph.Endpoint<T,N,E>, MutableGraph.Endpoint<T,N,E>
+		  extends DynamicCloudGraph.Endpoint<T>, TraversableGraph.Endpoint<T>, MutableGraph.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	N,
-		  	E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>
-	  > extends DynamicCloudGraph.NodeEndpoint<Object,N,E>, TraversableGraph.NodeEndpoint<N,E>, MutableGraph.NodeEndpoint<N,E>, Endpoint<N,N,E>
+		  	T
+	  > extends DynamicCloudGraph.NodeEndpoint<T>, TraversableGraph.NodeEndpoint<T>, MutableGraph.NodeEndpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	N,
-		  	E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>
-		> extends DynamicCloudGraph.EdgeEndpoint<Object,N,E>, TraversableGraph.EdgeEndpoint<N,E>, MutableGraph.EdgeEndpoint<N,E>, Endpoint<E,N,E>
+		  	T extends Edge<?> & TraversableCloud<?>
+		> extends DynamicCloudGraph.EdgeEndpoint<T>, TraversableGraph.EdgeEndpoint<T>, MutableGraph.EdgeEndpoint<T>, Endpoint<T>
 	{
 	};
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/Edge.java b/src/main/java/com/syncleus/dann/graph/Edge.java
index 64606313..5acd8954 100644
--- a/src/main/java/com/syncleus/dann/graph/Edge.java
+++ b/src/main/java/com/syncleus/dann/graph/Edge.java
@@ -19,11 +19,10 @@
 package com.syncleus.dann.graph;
 
 public interface Edge<
-	  	T,
-	  	E extends Edge.Endpoint<T>
-	  > extends MixableEdge<T,T,T,E,E,E>
+	  	E extends Edge.Endpoint<?>
+	  > extends MixableEdge<E,E,E>
 {
-	interface Endpoint<T> extends MixableEdge.Endpoint<T, T, T>
+	interface Endpoint<T> extends MixableEdge.Endpoint<T>
 	{
 	};
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/MutableRootedTreeGraph.java b/src/main/java/com/syncleus/dann/graph/EndpointSet.java
similarity index 87%
rename from src/main/java/com/syncleus/dann/graph/MutableRootedTreeGraph.java
rename to src/main/java/com/syncleus/dann/graph/EndpointSet.java
index e40cb9de..587a87c0 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableRootedTreeGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/EndpointSet.java
@@ -18,6 +18,12 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-public interface MutableRootedTreeGraph<N, E extends DirectedEdge<N>> extends RootedTreeGraph<N, E>, MutableTreeGraph<N, E>
+import java.util.Map;
+import java.util.Set;
+
+interface EndpointSet<T, E extends Cloud.Endpoint<? extends T>> extends Set<E>
 {
-}
+	Map<T, EndpointSet<T,E>> getTargets();
+	Set<T> getTargetSet();
+	int targetCount(Object target);
+}
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/Graph.java b/src/main/java/com/syncleus/dann/graph/Graph.java
index 44f1fb0e..1b7abbec 100644
--- a/src/main/java/com/syncleus/dann/graph/Graph.java
+++ b/src/main/java/com/syncleus/dann/graph/Graph.java
@@ -19,33 +19,26 @@
 package com.syncleus.dann.graph;
 
 public interface Graph<
-	  	N,
-	  	E extends Edge<N,? extends Edge.Endpoint<? extends N>>,
-	  	AE extends Graph.Endpoint<Object, N, E>,
-	  	NE extends Graph.NodeEndpoint<N, E>,
-	  	EE extends Graph.EdgeEndpoint<N, E>
-	  > extends Hypergraph<N, E, AE, NE, EE>
+	  	NE extends Graph.NodeEndpoint<?>,
+	  	EE extends Graph.EdgeEndpoint<? extends Edge<?>>
+	  > extends Hypergraph<NE, EE>
 {
 	interface Endpoint<
-		  	T,
-		  	N,
-		  	E extends Edge<N,? extends Edge.Endpoint<? extends N>>
+		  	T
 		  >
-		  extends Hypergraph.Endpoint<T,N,E>
+		  extends Hypergraph.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	N,
-		  	E extends Edge<N,? extends Edge.Endpoint<? extends N>>
-	  > extends Hypergraph.NodeEndpoint<N,E>, Endpoint<N,N,E>
+		  	T
+	  > extends Hypergraph.NodeEndpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	N,
-		  	E extends Edge<N,? extends Edge.Endpoint<? extends N>>
-		> extends Hypergraph.EdgeEndpoint<N,E>, Endpoint<E,N,E>
+		  	T extends Edge<?>
+		> extends Hypergraph.EdgeEndpoint<T>, Endpoint<T>
 	{
 	};
 }
diff --git a/src/main/java/com/syncleus/dann/graph/MutableTreeGraph.java b/src/main/java/com/syncleus/dann/graph/HashEndpointSet.java
similarity index 92%
rename from src/main/java/com/syncleus/dann/graph/MutableTreeGraph.java
rename to src/main/java/com/syncleus/dann/graph/HashEndpointSet.java
index ed245961..9ad36909 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableTreeGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/HashEndpointSet.java
@@ -18,6 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-public interface MutableTreeGraph<N, E extends BidirectedEdge<N>> extends TreeGraph<N, E>, DynamicBidirectedGraph<N, E>
+final class HashEndpointSet<T, E extends Cloud.Endpoint<? extends T>> extends EndpointSet<T,E>
 {
 }
diff --git a/src/main/java/com/syncleus/dann/graph/HyperEdge.java b/src/main/java/com/syncleus/dann/graph/HyperEdge.java
index 7336e2bf..4694239e 100644
--- a/src/main/java/com/syncleus/dann/graph/HyperEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/HyperEdge.java
@@ -19,13 +19,12 @@
 package com.syncleus.dann.graph;
 
 public interface Hyperedge<
-	  	T,
-	  	EP extends Hyperedge.Endpoint<T, ? extends T>
-	  > extends Cloud<T, EP>
+	  	E extends Hyperedge.Endpoint<?>
+	  > extends Cloud<E>
 {
-	interface Endpoint<P, T> extends Cloud.Endpoint<P, T>
+	interface Endpoint<T> extends Cloud.Endpoint<T>
 	{
 	};
 
-	boolean isSymmetric(Hyperedge<T,EP> symmetricEdge);
+	boolean isSymmetric(Hyperedge<? extends E> symmetricEdge);
 }
diff --git a/src/main/java/com/syncleus/dann/graph/HyperGraph.java b/src/main/java/com/syncleus/dann/graph/HyperGraph.java
index 36bf3adc..1255e926 100644
--- a/src/main/java/com/syncleus/dann/graph/HyperGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/HyperGraph.java
@@ -26,36 +26,31 @@ package com.syncleus.dann.graph;
  * @since 2.0
  */
 public interface Hypergraph<
-	  	N,
-	  	E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>>,
-	  	AE extends Hypergraph.Endpoint<Object, N, E>,
-	  	NE extends Hypergraph.NodeEndpoint<N, E>,
-	  	EE extends Hypergraph.EdgeEndpoint<N, E>
-	  > extends CloudGraph<Object, N, E, AE, NE, EE>
+	  	NE extends Hypergraph.NodeEndpoint<?>,
+	  	EE extends Hypergraph.EdgeEndpoint<?>
+	  > extends CloudGraph<NE, EE>
 {
 	interface Endpoint<
-		  	T,
-		  	N,
-		  	E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>>
+		  	T
 		  >
-		  extends CloudGraph.Endpoint<Object,T,N,E>
+		  extends CloudGraph.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	N,
-		  	E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>>
-	  > extends CloudGraph.NodeEndpoint<Object,N,E>, Endpoint<N,N,E>
+		  	T
+	  > extends CloudGraph.NodeEndpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	N,
-		  	E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>>
-		> extends CloudGraph.EdgeEndpoint<Object,N,E>, Endpoint<E,N,E>
+		  	T extends Hyperedge<?>
+		> extends CloudGraph.EdgeEndpoint<T>, Endpoint<T>
 	{
 	};
 
+	boolean isUniform();
+
 	/**
 	 * True if this graph enforces its edges to have a maximum rank.
 	 *
diff --git a/src/main/java/com/syncleus/dann/graph/JoinableCloud.java b/src/main/java/com/syncleus/dann/graph/JoinableCloud.java
index 3b34002f..3b4113b2 100644
--- a/src/main/java/com/syncleus/dann/graph/JoinableCloud.java
+++ b/src/main/java/com/syncleus/dann/graph/JoinableCloud.java
@@ -23,14 +23,14 @@ import java.util.Set;
 
 public interface JoinableCloud<
 	  	T,
-	  	EP extends JoinableCloud.Endpoint<T, ? extends T>
-	  > extends Cloud<T,EP>
+	  	E extends JoinableCloud.Endpoint<T>
+	  > extends Cloud<E>
 {
-	interface Endpoint<P, T> extends Cloud.Endpoint<P, T>
+	interface Endpoint<T> extends Cloud.Endpoint<T>
 	{
 	}
 
-	EP join(T edge) throws InvalidGraphException;
-	Map<T, EP> joins(Set<? extends T> edges) throws InvalidGraphException;
-	Map<T, Set<EP>> joins(Map<? extends T,? extends Integer> edges) throws InvalidGraphException;
+	E join(T target) throws InvalidGraphException;
+	Set<E> joins(Set<? extends T> targets) throws InvalidGraphException;
+	Set<E> joins(Map<? extends T,? extends Integer> targets) throws InvalidGraphException;
 }
diff --git a/src/main/java/com/syncleus/dann/graph/JoinableCloudGraph.java b/src/main/java/com/syncleus/dann/graph/JoinableCloudGraph.java
index 3fe396b1..25f97f60 100644
--- a/src/main/java/com/syncleus/dann/graph/JoinableCloudGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/JoinableCloudGraph.java
@@ -22,47 +22,35 @@ import java.util.Map;
 import java.util.Set;
 
 public interface JoinableCloudGraph<
-	  	A,
 	  	N,
-	  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>,
-	  	AE extends JoinableCloudGraph.Endpoint<A, A, N, E>,
-	  	NE extends JoinableCloudGraph.NodeEndpoint<A, N, E>,
-	  	EE extends JoinableCloudGraph.EdgeEndpoint<A, N, E>
-	  >  extends CloudGraph<A,N,E,AE,NE,EE>, JoinableCloud<A, AE>
+	  	NE extends JoinableCloudGraph.NodeEndpoint<N>,
+	  	E extends Cloud<? extends Cloud.Endpoint<? extends N>>,
+	  	EE extends JoinableCloudGraph.EdgeEndpoint<E>
+	  >  extends CloudGraph<NE,EE>, JoinableCloud<N,NE>
 {
 	interface Endpoint<
-		  	P,
-		  	T,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
+		  	T
 		  >
-		  extends CloudGraph.Endpoint<P,T,N,E>, JoinableCloud.Endpoint<P,T>
+		  extends CloudGraph.Endpoint<T>, JoinableCloud.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	P,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
-	  > extends CloudGraph.NodeEndpoint<P,N,E>, JoinableCloud.Endpoint<P,N>, Endpoint<P,N,N,E>
+		  	T
+	  > extends CloudGraph.NodeEndpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	P,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
-		> extends CloudGraph.EdgeEndpoint<P,N,E>, JoinableCloud.Endpoint<P,E>, Endpoint<P,E,N,E>
+		  	T extends Cloud<?>
+		> extends CloudGraph.EdgeEndpoint<T>, Endpoint<T>
 	{
 	};
 
-	NE joinNode(N node) throws InvalidGraphException;
-	Map<N, NE> joinNodes(Set<? extends N> nodes) throws InvalidGraphException;
-	Map<N, Set<NE>> joinNodes(Map<? extends N,? extends Integer> nodes) throws InvalidGraphException;
-
 	EE joinEdge(E edge) throws InvalidGraphException;
-	Map<E, EE> joinEdges(Set<? extends E> edges) throws InvalidGraphException;
-	Map<E, Set<EE>> joinEdges(Map<? extends E,? extends Integer> edges) throws InvalidGraphException;
+	Set<EE> joinEdges(Set<? extends E> edges) throws InvalidGraphException;
+	Set<EE> joinEdges(Map<? extends E,? extends Integer> edges) throws InvalidGraphException;
 
-	Map<?, CloudGraph.Endpoint<?, ?, N,E>> joinAll(Set<? extends N> addNodes, Set<? extends E> addEdges) throws InvalidGraphException;
+	EndpointSets<NE,EE> joinAll(Set<? extends N> addNodes, Set<? extends E> addEdges) throws InvalidGraphException;
+	EndpointSets<NE,EE> joinAll(Map<? extends N,? extends Integer> addNodes, Map<? extends E,? extends Integer> addEdges) throws InvalidGraphException;
 }
diff --git a/src/main/java/com/syncleus/dann/graph/MixableBidirectedEdge.java b/src/main/java/com/syncleus/dann/graph/MixableBidirectedEdge.java
index bc6eb9d5..26a53f92 100644
--- a/src/main/java/com/syncleus/dann/graph/MixableBidirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/MixableBidirectedEdge.java
@@ -19,15 +19,12 @@
 package com.syncleus.dann.graph;
 
 public interface MixableBidirectedEdge<
-	  	T,
-	  	LT extends T,
-	  	RT extends T,
-	  	E extends MixableBidirectedEdge.Endpoint<T, ? extends T, ? extends T>,
-	  	LE extends MixableBidirectedEdge.Endpoint<T, LT, RT>,
-	  	RE extends MixableBidirectedEdge.Endpoint<T, RT, LT>
-	  > extends MixableEdge<T, LT, RT, E, LE, RE>, BidirectedCloud<T, E>
+	  	E extends MixableBidirectedEdge.Endpoint<?>,
+	  	LE extends E,
+	  	RE extends E
+	  > extends MixableEdge<E, LE, RE>, BidirectedCloud<E>
 {
-	interface Endpoint<P, T extends P, N extends P> extends MixableEdge.Endpoint<P, T, N>, BidirectedCloud.Endpoint<P, T>
+	interface Endpoint<T> extends MixableEdge.Endpoint<T>, BidirectedCloud.Endpoint<T>
 	{
 	};
 
diff --git a/src/main/java/com/syncleus/dann/graph/MixableDirectedEdge.java b/src/main/java/com/syncleus/dann/graph/MixableDirectedEdge.java
index 7cd69aff..993be099 100644
--- a/src/main/java/com/syncleus/dann/graph/MixableDirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/MixableDirectedEdge.java
@@ -19,15 +19,12 @@
 package com.syncleus.dann.graph;
 
 public interface MixableDirectedEdge<
-	  	T,
-	  	ST extends T,
-	  	DT extends T,
-	  	E extends MixableBidirectedEdge.Endpoint<T, ? extends T, ? extends T>,
-	  	SE extends MixableBidirectedEdge.Endpoint<T, ST, DT>,
-	  	DE extends MixableBidirectedEdge.Endpoint<T, DT, ST>
-	  > extends MixableBidirectedEdge<T, ST, DT, E, SE, DE>
+	  	E extends MixableBidirectedEdge.Endpoint<?>,
+	  	SE extends E,
+	  	DE extends E
+	  > extends MixableBidirectedEdge<E, SE, DE>
 {
-	interface Endpoint<P, T extends P, N extends P> extends MixableBidirectedEdge.Endpoint<P, T, N>
+	interface Endpoint<T> extends MixableBidirectedEdge.Endpoint<T>
 	{
 	};
 
diff --git a/src/main/java/com/syncleus/dann/graph/MixableEdge.java b/src/main/java/com/syncleus/dann/graph/MixableEdge.java
index b684f1d7..f8cd12bc 100644
--- a/src/main/java/com/syncleus/dann/graph/MixableEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/MixableEdge.java
@@ -19,17 +19,13 @@
 package com.syncleus.dann.graph;
 
 public interface MixableEdge<
-	  	T,
-	  	LT extends T,
-	  	RT extends T,
-	  	E extends MixableEdge.Endpoint<T, ? extends T, ? extends T>,
-	  	LE extends MixableEdge.Endpoint<T, LT, RT>,
-	  	RE extends MixableEdge.Endpoint<T, RT, LT>
-	  > extends Hyperedge<T, E>
+	  	E extends MixableEdge.Endpoint<?>,
+	  	LE extends E,
+	  	RE extends E
+	  > extends Hyperedge<E>
 {
-	interface Endpoint<P, T extends P, N extends P> extends Hyperedge.Endpoint<P, T>
+	interface Endpoint<T> extends Hyperedge.Endpoint<T>
 	{
-		Endpoint<P,N,T> getNeighbor();
 	};
 
 	LE getLeftEndpoint();
diff --git a/src/main/java/com/syncleus/dann/graph/MutableCloud.java b/src/main/java/com/syncleus/dann/graph/MutableCloud.java
index 0c3ee7c3..7943aafb 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableCloud.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableCloud.java
@@ -20,10 +20,10 @@ package com.syncleus.dann.graph;
 
 public interface MutableCloud<
 	  	T,
-	  	EP extends MutableCloud.Endpoint<T, ? extends T>
-	  > extends AssignableCloud<T,EP>, JoinableCloud<T,EP>, PartibleCloud<T, EP>
+	  	E extends MutableCloud.Endpoint<T>
+	  > extends AssignableCloud<E>, JoinableCloud<T,E>, PartibleCloud<E>
 {
-	interface Endpoint<P, T> extends AssignableCloud.Endpoint<P, T>, JoinableCloud.Endpoint<P, T>, PartibleCloud.Endpoint<P, T>
+	interface Endpoint<T> extends AssignableCloud.Endpoint<T>, JoinableCloud.Endpoint<T>, PartibleCloud.Endpoint<T>
 	{
 	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/MutableCloudGraph.java b/src/main/java/com/syncleus/dann/graph/MutableCloudGraph.java
index 61f93fed..af675a30 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableCloudGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableCloudGraph.java
@@ -22,39 +22,31 @@ import java.util.Map;
 import java.util.Set;
 
 public interface MutableCloudGraph<
-	  	A,
 	  	N,
-	  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>,
-	  	AE extends MutableCloudGraph.Endpoint<A, A, N, E>,
-	  	NE extends MutableCloudGraph.NodeEndpoint<A, N, E>,
-	  	EE extends MutableCloudGraph.EdgeEndpoint<A, N, E>
-	  >  extends JoinableCloudGraph<A,N,E,AE,NE,EE>, PartibleCloudGraph<A,N,E,AE,NE,EE>, AssignableCloudGraph<A,N,E,AE,NE,EE>, MutableCloud<A,AE>
+	  	NE extends MutableCloudGraph.NodeEndpoint<N>,
+	  	E extends Cloud<? extends Cloud.Endpoint<? extends N>>,
+	  	EE extends MutableCloudGraph.EdgeEndpoint<E>
+	  >  extends JoinableCloudGraph<N,NE,E,EE>, PartibleCloudGraph<NE,EE>, AssignableCloudGraph<NE,EE>, MutableCloud<N,NE>
 {
 	interface Endpoint<
-		  	P,
-		  	T,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
+		  	T
 		  >
-		  extends JoinableCloudGraph.Endpoint<P,T,N,E>, PartibleCloudGraph.Endpoint<P,T,N,E>, AssignableCloudGraph.Endpoint<P,T,N,E>, MutableCloud.Endpoint<P,T>
+		  extends JoinableCloudGraph.Endpoint<T>, PartibleCloudGraph.Endpoint<T>, AssignableCloudGraph.Endpoint<T>, MutableCloud.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	P,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
-	  > extends JoinableCloudGraph.NodeEndpoint<P,N,E>, PartibleCloudGraph.NodeEndpoint<P,N,E>, AssignableCloudGraph.NodeEndpoint<P,N,E>, Endpoint<P,N,N,E>
+		  	T
+	  > extends JoinableCloudGraph.NodeEndpoint<T>, PartibleCloudGraph.NodeEndpoint<T>, AssignableCloudGraph.NodeEndpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	P,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
-		> extends JoinableCloudGraph.EdgeEndpoint<P,N,E>, PartibleCloudGraph.EdgeEndpoint<P,N,E>, AssignableCloudGraph.EdgeEndpoint<P,N,E>, Endpoint<P,E,N,E>
+		  	T extends Cloud<?>
+		> extends JoinableCloudGraph.EdgeEndpoint<T>, PartibleCloudGraph.EdgeEndpoint<T>, AssignableCloudGraph.EdgeEndpoint<T>, Endpoint<T>
 	{
 	};
 
-	Map<?, CloudGraph.Endpoint<?, ?, N,E>> reconfigure(Set<? extends N> addNodes, Set<? extends E> addEdges, final Set<? extends CloudGraph.Endpoint<?,?,?,?>> disconnectEndpoints) throws InvalidGraphException;
+	EndpointSets<NE,EE> reconfigure(Set<? extends N> addNodes, Set<? extends E> addEdges, Set<? extends Endpoint<?>> disconnectEndpoints) throws InvalidGraphException;
+	EndpointSets<NE,EE> reconfigure(Map<? extends N,? extends Integer> addNodes, Map<? extends E,? extends Integer> addEdges, Set<? extends Endpoint<?>> disconnectEndpoints) throws InvalidGraphException;
 }
diff --git a/src/main/java/com/syncleus/dann/graph/MutableGraph.java b/src/main/java/com/syncleus/dann/graph/MutableGraph.java
index abf11138..4d34551f 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableGraph.java
@@ -20,32 +20,27 @@ package com.syncleus.dann.graph;
 
 public interface MutableGraph<
 	  	N,
-	  	E extends Edge<N,? extends Edge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>,
-	  	AE extends MutableGraph.Endpoint<Object, N, E>,
-	  	NE extends MutableGraph.NodeEndpoint<N, E>,
-	  	EE extends MutableGraph.EdgeEndpoint<N, E>
-	  > extends MutableCloudGraph<Object, N, E, AE, NE, EE>, Graph<N,E,AE,NE,EE>
+	  	NE extends MutableGraph.NodeEndpoint<N>,
+	  	E extends Edge<? extends Edge.Endpoint<N>>,
+	  	EE extends MutableGraph.EdgeEndpoint<E>
+	  > extends MutableCloudGraph<N, NE, E, EE>, Graph<NE,EE>
 {
 	interface Endpoint<
-		  	T,
-		  	N,
-		  	E extends Edge<N,? extends Edge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>
+		  	T
 		  >
-		  extends MutableCloudGraph.Endpoint<Object,T,N,E>, Graph.Endpoint<T,N,E>
+		  extends MutableCloudGraph.Endpoint<T>, Graph.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	N,
-		  	E extends Edge<N,? extends Edge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>
-	  > extends MutableCloudGraph.NodeEndpoint<Object,N,E>, Graph.NodeEndpoint<N,E>, Endpoint<N,N,E>
+		  	T
+	  > extends MutableCloudGraph.NodeEndpoint<T>, Graph.NodeEndpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	N,
-		  	E extends Edge<N,? extends Edge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>
-		> extends MutableCloudGraph.EdgeEndpoint<Object,N,E>, Graph.EdgeEndpoint<N,E>, Endpoint<E,N,E>
+		  	T extends Edge<?>
+		> extends MutableCloudGraph.EdgeEndpoint<T>, Graph.EdgeEndpoint<T>, Endpoint<T>
 	{
 	};
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/MutableHyperGraph.java b/src/main/java/com/syncleus/dann/graph/MutableHyperGraph.java
index 227346f9..bd7c052f 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableHyperGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableHyperGraph.java
@@ -20,32 +20,27 @@ package com.syncleus.dann.graph;
 
 public interface MutableHypergraph<
 	  	N,
-	  	E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>> & MutableCloud<? extends N, ? extends MutableCloud.Endpoint<? extends N, ? extends N>>,
-	  	AE extends MutableHypergraph.Endpoint<Object, N, E>,
-	  	NE extends MutableHypergraph.NodeEndpoint<N, E>,
-	  	EE extends MutableHypergraph.EdgeEndpoint<N, E>
-	  > extends MutableCloudGraph<Object, N, E, AE, NE, EE>, Hypergraph<N,E,AE,NE,EE>
+	  	NE extends MutableHypergraph.NodeEndpoint<N>,
+	  	E extends Hyperedge<? extends Hyperedge.Endpoint<N>>,
+	  	EE extends MutableHypergraph.EdgeEndpoint<E>
+	  > extends MutableCloudGraph<N, NE, E, EE>, Hypergraph<NE,EE>
 {
 	interface Endpoint<
-		  	T,
-		  	N,
-		  	E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>> & MutableCloud<? extends N, ? extends MutableCloud.Endpoint<? extends N, ? extends N>>
+		  	T
 		  >
-		  extends MutableCloudGraph.Endpoint<Object,T,N,E>, Hypergraph.Endpoint<T,N,E>
+		  extends MutableCloudGraph.Endpoint<T>, Hypergraph.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	N,
-		  	E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>> & MutableCloud<? extends N, ? extends MutableCloud.Endpoint<? extends N, ? extends N>>
-	  > extends MutableCloudGraph.NodeEndpoint<Object,N,E>, Hypergraph.NodeEndpoint<N,E>, Endpoint<N,N,E>
+		  	T
+	  > extends MutableCloudGraph.NodeEndpoint<T>, Hypergraph.NodeEndpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	N,
-		  	E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>> & MutableCloud<? extends N, ? extends MutableCloud.Endpoint<? extends N, ? extends N>>
-		> extends MutableCloudGraph.EdgeEndpoint<Object,N,E>, Hypergraph.EdgeEndpoint<N,E>, Endpoint<E,N,E>
+		  	T extends Hyperedge<?>
+		> extends MutableCloudGraph.EdgeEndpoint<T>, Hypergraph.EdgeEndpoint<T>, Endpoint<T>
 	{
 	};
 }
diff --git a/src/main/java/com/syncleus/dann/graph/PartibleCloud.java b/src/main/java/com/syncleus/dann/graph/PartibleCloud.java
index 7df21ea8..8d9b0d58 100644
--- a/src/main/java/com/syncleus/dann/graph/PartibleCloud.java
+++ b/src/main/java/com/syncleus/dann/graph/PartibleCloud.java
@@ -21,16 +21,15 @@ package com.syncleus.dann.graph;
 import java.util.Set;
 
 public interface PartibleCloud<
-	  	T,
-	  	EP extends PartibleCloud.Endpoint<T, ? extends T>
-	  > extends Cloud<T,EP>
+	  	E extends PartibleCloud.Endpoint<?>
+	  > extends Cloud<E>
 {
-	interface Endpoint<P, T> extends Cloud.Endpoint<P, T>
+	interface Endpoint<T> extends Cloud.Endpoint<T>
 	{
 		void part() throws InvalidEdgeException;
 	}
 
-	void leave(PartibleCloud.Endpoint<?, ?> endpoint) throws InvalidGraphException;
-	void leave(Set<? extends PartibleCloud.Endpoint<?, ?>> endpoints) throws InvalidGraphException;
+	void leave(PartibleCloud.Endpoint<?> endpoint) throws InvalidGraphException;
+	void leave(Set<? extends PartibleCloud.Endpoint<?>> endpoints) throws InvalidGraphException;
 	void clear() throws InvalidGraphException;
 }
diff --git a/src/main/java/com/syncleus/dann/graph/PartibleCloudGraph.java b/src/main/java/com/syncleus/dann/graph/PartibleCloudGraph.java
index 14981ae9..87387b5b 100644
--- a/src/main/java/com/syncleus/dann/graph/PartibleCloudGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/PartibleCloudGraph.java
@@ -18,52 +18,37 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import java.util.Map;
 import java.util.Set;
 
 public interface PartibleCloudGraph<
-	  	A,
-	  	N,
-	  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>,
-	  	AE extends PartibleCloudGraph.Endpoint<A, A, N, E>,
-	  	NE extends PartibleCloudGraph.NodeEndpoint<A, N, E>,
-	  	EE extends PartibleCloudGraph.EdgeEndpoint<A, N, E>
-	  >  extends CloudGraph<A,N,E,AE,NE,EE>, PartibleCloud<A, AE>
+	  	NE extends PartibleCloudGraph.NodeEndpoint<?>,
+	  	EE extends PartibleCloudGraph.EdgeEndpoint<? extends Cloud<?>>
+	  >  extends CloudGraph<NE,EE>, PartibleCloud<NE>
 {
 	interface Endpoint<
-		  	P,
-		  	T,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
+		  	T
 		  >
-		  extends CloudGraph.Endpoint<P,T,N,E>, PartibleCloud.Endpoint<P,T>
+		  extends CloudGraph.Endpoint<T>, PartibleCloud.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	P,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
-	  > extends CloudGraph.NodeEndpoint<P,N,E>, PartibleCloud.Endpoint<P,N>, Endpoint<P,N,N,E>
+		  	T
+	  > extends CloudGraph.NodeEndpoint<T>, PartibleCloud.Endpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	P,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
-		> extends CloudGraph.EdgeEndpoint<P,N,E>, PartibleCloud.Endpoint<P,E>, Endpoint<P,E,N,E>
+		  	T extends Cloud<?>
+		> extends CloudGraph.EdgeEndpoint<T>, PartibleCloud.Endpoint<T>, Endpoint<T>
 	{
 	};
 
-	void leaveNode(MutableCloudGraph.NodeEndpoint<?,?,?> endpoint) throws InvalidGraphException;
-	void leaveNodes(Set<? extends MutableCloudGraph.NodeEndpoint<?,?,?>> endpoint) throws InvalidGraphException;
-
-	void leaveEdge(MutableCloudGraph.EdgeEndpoint<?, ?, ?> endpoint) throws InvalidGraphException;
-	void leaveEdges(Set<? extends MutableCloudGraph.EdgeEndpoint<?, ?, ?>> endpoints) throws InvalidGraphException;
-
-	void clear() throws InvalidGraphException;
+	void leaveEdge(EdgeEndpoint<?> endpoint) throws InvalidGraphException;
+	void leaveEdges(Set<? extends EdgeEndpoint<?>> endpoints) throws InvalidGraphException;
 	void clearEdges() throws InvalidGraphException;
 
-	Map<?, CloudGraph.Endpoint<?, ?, N,E>> leaveAll(final Set<? extends CloudGraph.Endpoint<?,?,?,?>> disconnectEndpoints) throws InvalidGraphException;
+	void leaveAll(final Set<? extends Endpoint<?>> disconnectEndpoints) throws InvalidGraphException;
+	Set<EE> recursiveLeaveAll(final Set<? extends Endpoint<?>> disconnectEndpoints) throws InvalidGraphException;
+	void clearAll() throws InvalidGraphException;
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/TraversableCloud.java b/src/main/java/com/syncleus/dann/graph/TraversableCloud.java
index 7a4a0049..9c8bca6d 100644
--- a/src/main/java/com/syncleus/dann/graph/TraversableCloud.java
+++ b/src/main/java/com/syncleus/dann/graph/TraversableCloud.java
@@ -21,18 +21,17 @@ package com.syncleus.dann.graph;
 import java.util.Set;
 
 public interface TraversableCloud<
-	  	T,
-	  	EP extends TraversableCloud.Endpoint<T, ? extends T>
-	  > extends Cloud<T,EP>
+	  	E extends TraversableCloud.Endpoint<?>
+	  > extends Cloud<E>
 {
-	interface Endpoint<P, T> extends Cloud.Endpoint<P, T>
+	interface Endpoint<T> extends Cloud.Endpoint<T>
 	{
-		Set<Endpoint<P,P>> getTraversableNeighborsTo();
-		Set<Endpoint<P,P>> getTraversableNeighborsFrom();
-		boolean isTraversable(Cloud.Endpoint<?,?> destination);
 	}
 
-	Set<T> getTraversableFrom(Object target);
-	Set<T> getTraversableTo(Object target);
-	boolean isTraversable(Object sourceTarget, Object destinationTarget);
+	Set<E> getTraversableFrom(Endpoint<?> target);
+	Set<E> getTraversableTo(Endpoint<?> target);
+	boolean isTraversable(Endpoint<?> sourceTarget, Endpoint<?> destinationTarget);
+
+	Set<E> getTraversableNeighborsTo(Endpoint<?> fromEndpoint);
+	Set<E> getTraversableNeighborsFrom(Endpoint<?> toEndpoint);
 }
diff --git a/src/main/java/com/syncleus/dann/graph/TraversableCloudGraph.java b/src/main/java/com/syncleus/dann/graph/TraversableCloudGraph.java
index 29125980..d0c66f56 100644
--- a/src/main/java/com/syncleus/dann/graph/TraversableCloudGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/TraversableCloudGraph.java
@@ -18,38 +18,59 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
+import java.util.Set;
+
 public interface TraversableCloudGraph<
-	  	A,
-	  	N,
-	  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>,
-	  	AE extends TraversableCloudGraph.Endpoint<A, A, N, E>,
-	  	NE extends TraversableCloudGraph.NodeEndpoint<A, N, E>,
-	  	EE extends TraversableCloudGraph.EdgeEndpoint<A, N, E>
-	  >  extends CloudGraph<A,N,E,AE,NE,EE>, TraversableCloud<A, AE>
+	  	NE extends TraversableCloudGraph.NodeEndpoint<?>,
+	  	EE extends TraversableCloudGraph.EdgeEndpoint<? extends TraversableCloud<?>>
+	  >  extends CloudGraph<NE,EE>, TraversableCloud<NE>
 {
 	interface Endpoint<
-		  	P,
-		  	T,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
+		  	T
 		  >
-		  extends CloudGraph.Endpoint<P,T,N,E>, TraversableCloud.Endpoint<P,T>
+		  extends CloudGraph.Endpoint<T>, TraversableCloud.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	P,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
-	  > extends CloudGraph.NodeEndpoint<P,N,E>, TraversableCloud.Endpoint<P,N>, Endpoint<P,N,N,E>
+		  	T
+	  > extends CloudGraph.NodeEndpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	P,
-		  	N,
-		  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>
-		> extends CloudGraph.EdgeEndpoint<P,N,E>, TraversableCloud.Endpoint<P,E>, Endpoint<P,E,N,E>
+		  	T extends TraversableCloud<?>
+		> extends CloudGraph.EdgeEndpoint<T>, Endpoint<T>
 	{
 	};
+
+
+	Set<EE> getTraversableEdgesFrom(Endpoint<?> source);
+	Set<EE> getTraversableEdgesTo(Endpoint<?> destination);
+
+	/**
+	 * Get a list of all reachable nodes adjacent to node. All edges connected to
+	 * node and is traversable from node will have its destination node(s) added to
+	 * the returned list. node itself will appear in the list once for every loop.
+	 * If there are multiple edges connecting node with a particular end point then
+	 * the end point will appear multiple times in the list, once for each hop to
+	 * the end point.
+	 *
+	 * @param destination The whose traversable neighbors are to be returned.
+	 * @return A list of all nodes adjacent to the specified node and traversable
+	 *         from the spevified node, empty set if the node has no edges.
+	 * @since 2.0
+	 */
+	EndpointSets<NE,EE> getTraversableAdjacentTo(Endpoint<?> destination);
+
+	/**
+	 * Get a set of all edges which you can traverse from node. Of course node will
+	 * always be an end point for each edge returned. Throws an
+	 * IllegalArgumentException if node is not in the graph.
+	 *
+	 * @param destination edges returned will be traversable from this node.
+	 * @return An unmodifiable set of all edges that can be traversed from node.
+	 * @since 2.0
+	 */
+	EndpointSets<NE,EE> getTraversableAdjacentFrom(Endpoint<?> destination);
 }
diff --git a/src/main/java/com/syncleus/dann/graph/TraversableGraph.java b/src/main/java/com/syncleus/dann/graph/TraversableGraph.java
index ca08065b..1f9211a2 100644
--- a/src/main/java/com/syncleus/dann/graph/TraversableGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/TraversableGraph.java
@@ -19,33 +19,26 @@
 package com.syncleus.dann.graph;
 
 public interface TraversableGraph<
-	  	N,
-	  	E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>>,
-	  	AE extends TraversableGraph.Endpoint<Object, N, E>,
-	  	NE extends TraversableGraph.NodeEndpoint<N, E>,
-	  	EE extends TraversableGraph.EdgeEndpoint<N, E>
-	  > extends TraversableCloudGraph<Object, N, E, AE, NE, EE>, Graph<N,E,AE,NE,EE>
+	  	NE extends TraversableGraph.NodeEndpoint<?>,
+	  	EE extends TraversableGraph.EdgeEndpoint<?>
+	  > extends TraversableCloudGraph<NE, EE>, Graph<NE,EE>
 {
 	interface Endpoint<
-		  	T,
-		  	N,
-		  	E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>>
+		  	T
 		  >
-		  extends TraversableCloudGraph.Endpoint<Object,T,N,E>, Graph.Endpoint<T,N,E>
+		  extends TraversableCloudGraph.Endpoint<T>, Graph.Endpoint<T>
 	{
 	};
 
 	interface NodeEndpoint<
-		  	N,
-		  	E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>>
-	  > extends TraversableCloudGraph.NodeEndpoint<Object,N,E>, Graph.NodeEndpoint<N,E>, Endpoint<N,N,E>
+		  	T
+	  > extends TraversableCloudGraph.NodeEndpoint<T>, Graph.NodeEndpoint<T>, Endpoint<T>
 	{
 	};
 
 	interface EdgeEndpoint<
-		  	N,
-		  	E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>>
-		> extends TraversableCloudGraph.EdgeEndpoint<Object,N,E>, Graph.EdgeEndpoint<N,E>, Endpoint<E,N,E>
+		  	T extends Edge<?> & TraversableCloud<?>
+		> extends TraversableCloudGraph.EdgeEndpoint<T>, Graph.EdgeEndpoint<T>, Endpoint<T>
 	{
 	};
 }
-- 
GitLab