diff --git a/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
index fb0958111da7417f7cfd9d15bbfcabf39985ab3a..504fa486031f13d5aa3a974ae923e4306acadbe9 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
@@ -36,10 +36,10 @@ import java.util.*;
 @XmlJavaTypeAdapter( com.syncleus.dann.xml.XmlSerializableAdapter.class )
 public abstract class AbstractAdjacencyGraph<
 	  	N,
-	  	E extends Edge<? extends N,? extends Edge.Endpoint<? extends N>>,
+	  	E extends Edge<N,? extends Edge.Endpoint<N>>,
 	  	NEP extends Graph.NodeEndpoint<N, E>,
 	  	EEP extends Graph.EdgeEndpoint<N, E>
-	  > extends AbstractEdge<Object,Graph.Endpoint<? extends N,? extends E,?>> implements Graph<N, E, NEP, EEP>
+	  > extends AbstractEdge<Object,Graph.Endpoint<N,E,?>> implements Graph<N, E, NEP, EEP>
 {
 	private static final Logger LOGGER = Logger.getLogger(AbstractAdjacencyGraph.class);
 //	private Set<E> edges;
@@ -606,12 +606,12 @@ public abstract class AbstractAdjacencyGraph<
 	}
 
 	@Override
-	public Set<Graph.Endpoint<? extends N, ? extends E, ?>> getEndpoints()
+	public Set<Graph.Endpoint<N, E, ?>> getEndpoints()
 	{
-		final Set<Graph.Endpoint<? extends N,? extends E,?>> endpoints = new HashSet<Graph.Endpoint<? extends N,? extends E,?>>();
+		final Set<Graph.Endpoint<N,E,?>> endpoints = new HashSet<Graph.Endpoint<N,E,?>>();
 		endpoints.addAll(this.getNodeEndpoints());
 		endpoints.addAll(this.getEdgeEndpoints());
-		return Collections.unmodifiableSet(endpoints);
+		return Collections.<Graph.Endpoint<N, E, ?>>unmodifiableSet(endpoints);
 	}
 
 	@Override
@@ -1052,7 +1052,7 @@ public abstract class AbstractAdjacencyGraph<
 		}
 	};
 
-	protected abstract class AbstractEdgeEndpoint extends AbstractEdge<E,Graph.Endpoint<N,E,? extends E>>.AbstractEndpoint implements Graph.EdgeEndpoint<N,E>
+	protected abstract class AbstractEdgeEndpoint extends AbstractEdge<E,Graph.Endpoint<N,E,E>>.AbstractEndpoint implements Graph.EdgeEndpoint<N,E>
 	{
 		@Override
 		public Set<Graph.NodeEndpoint<N, E>> getAdjacentNodes()
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableGraph.java b/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
index cfdc242325e92d21fe4a6816f8b8ee9ce331689d..034a0c2a9834efa1907a891dcae3db787d553708 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
@@ -20,10 +20,10 @@ package com.syncleus.dann.graph;
 
 public interface AssignableGraph<
 	  	N,
-	  	E extends Edge<? extends N,? extends Edge.Endpoint<? extends N>>,
-	  	NEP extends AssignableGraph.NodeEndpoint<? extends N, ? extends E>,
-	  	EEP extends AssignableGraph.EdgeEndpoint<? extends N, ? extends E>
-	  >  extends Graph<N,E,NEP,EEP>, MutableEdge<Object,Graph.Endpoint<? extends N,? extends E,?>>
+	  	E extends Edge<N,? extends Edge.Endpoint<N>>,
+	  	NEP extends AssignableGraph.NodeEndpoint<N, E>,
+	  	EEP extends AssignableGraph.EdgeEndpoint<N, E>
+	  >  extends Graph<N,E,NEP,EEP>, MutableEdge<Object,Graph.Endpoint<N,E,?>>
 //public interface AssignableGraph<P extends Edge<N>, N extends P, E extends P> extends Graph<N,E>, Edge<P>, MutableEdge<P>
 //public interface AssignableGraph<P extends AssignableGraph.Foo, N extends P, E extends Edge<N> & AssignableGraph.Foo> extends Graph<N,E>, Edge<P>, MutableEdge<P>
 {
@@ -45,7 +45,7 @@ public interface AssignableGraph<
 
 	interface NodeEndpoint<
 		  ON,
-		  OE extends Edge<? extends ON,? extends Edge.Endpoint<? extends ON>>
+		  OE extends Edge<ON,? extends Edge.Endpoint<ON>>
 	  > extends Graph.NodeEndpoint<ON,OE>, MutableEdge.Endpoint<ON>
 	{
 		void setTarget(ON newTarget) throws InvalidGraphException;
@@ -53,7 +53,7 @@ public interface AssignableGraph<
 
 	interface EdgeEndpoint<
 		  ON,
-		  OE extends Edge<? extends ON,? extends Edge.Endpoint<? extends ON>>
+		  OE extends Edge<ON,? extends Edge.Endpoint<ON>>
 	  > extends Graph.EdgeEndpoint<ON,OE>, MutableEdge.Endpoint<OE>
 	{
 		void setTarget(OE newTarget) throws InvalidGraphException;
diff --git a/src/main/java/com/syncleus/dann/graph/Edge.java b/src/main/java/com/syncleus/dann/graph/Edge.java
index ac8081546e24a8f1fd74d5286a04631681d2c90f..d14109e634675a11570d6de5bae40fa2ea2b2013 100644
--- a/src/main/java/com/syncleus/dann/graph/Edge.java
+++ b/src/main/java/com/syncleus/dann/graph/Edge.java
@@ -30,9 +30,7 @@ public interface Edge<
 	  	EP extends Edge.Endpoint<? extends T>
 	  > extends Serializable, Cloneable, XmlSerializable<EdgeXml, Object>, ContextReporter
 {
-	interface Endpoint<
-		  	T
-		  >
+	interface Endpoint<T>
 	{
 		Set<Edge.Endpoint<T>> getNeighbors();
 		Set<Edge.Endpoint<T>> getTraversableNeighborsTo();
diff --git a/src/main/java/com/syncleus/dann/graph/Graph.java b/src/main/java/com/syncleus/dann/graph/Graph.java
index c06d5843a7915b15e32a8b3daf5a78aa2b0bebce..6edcfdd4a28a63e354d95aaaa9011dd73632cb8b 100644
--- a/src/main/java/com/syncleus/dann/graph/Graph.java
+++ b/src/main/java/com/syncleus/dann/graph/Graph.java
@@ -37,14 +37,14 @@ import java.util.Set;
  */
 public interface Graph<
 	  	N,
-	  	E extends Edge<? extends N,? extends Edge.Endpoint<? extends N>>,
-	  	NEP extends Graph.NodeEndpoint<? extends N, ? extends E>,
-	  	EEP extends Graph.EdgeEndpoint<? extends N, ? extends E>
-	  > extends Edge<Object,Graph.Endpoint<? extends N,? extends E,?>>, Serializable, Cloneable, ContextReporter
+	  	E extends Edge<N,? extends Edge.Endpoint<N>>,
+	  	NEP extends Graph.NodeEndpoint<N, E>,
+	  	EEP extends Graph.EdgeEndpoint<N, E>
+	  > extends Edge<Object,Graph.Endpoint<N,E,?>>, Serializable, Cloneable, ContextReporter
 {
 	interface Endpoint<
 		ON,
-	  	OE extends Edge<? extends ON,? extends Edge.Endpoint<? extends ON>>,
+	  	OE extends Edge<ON,? extends Edge.Endpoint<ON>>,
 	  	T
 	  > extends Edge.Endpoint<T>
 	{
@@ -63,14 +63,14 @@ public interface Graph<
 
 	interface NodeEndpoint<
 		  ON,
-		  OE extends Edge<? extends ON,? extends Edge.Endpoint<? extends ON>>
+		  OE extends Edge<ON,? extends Edge.Endpoint<ON>>
 	  > extends Graph.Endpoint<ON,OE,ON>
 	{
 	};
 
 	interface EdgeEndpoint<
 		  	ON,
-		  	OE extends Edge<? extends ON,? extends Edge.Endpoint<? extends ON>>
+		  	OE extends Edge<ON,? extends Edge.Endpoint<ON>>
 		> extends Graph.Endpoint<ON,OE,OE>
 	{
 	};
diff --git a/src/main/java/com/syncleus/dann/graph/MutableGraph.java b/src/main/java/com/syncleus/dann/graph/MutableGraph.java
index 7ba0b7a7120f40dd7038a7da4137bea998e35188..a6ae780780fb646e255f3c9bedcb9c602765e77e 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableGraph.java
@@ -23,9 +23,9 @@ import java.util.Set;
 
 public interface MutableGraph<
 	  	N,
-	  	E extends Edge<? extends N,? extends Edge.Endpoint<? extends N>>,
-	  	NEP extends MutableGraph.NodeEndpoint<? extends N, ? extends E>,
-	  	EEP extends MutableGraph.EdgeEndpoint<? extends N, ? extends E>
+	  	E extends Edge<N,? extends Edge.Endpoint<N>>,
+	  	NEP extends MutableGraph.NodeEndpoint<N, E>,
+	  	EEP extends MutableGraph.EdgeEndpoint<N, E>
 	  > extends AssignableGraph<N,E,NEP,EEP>
 {
 	interface NodeEndpoint<