diff --git a/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
index 504fa486031f13d5aa3a974ae923e4306acadbe9..27502ea6a8c1f23c7c6416c1e29fc889b7c2fa32 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
@@ -36,7 +36,7 @@ import java.util.*;
 @XmlJavaTypeAdapter( com.syncleus.dann.xml.XmlSerializableAdapter.class )
 public abstract class AbstractAdjacencyGraph<
 	  	N,
-	  	E extends Edge<N,? extends Edge.Endpoint<N>>,
+	  	E extends Edge<N,? extends Edge.Endpoint<? extends N>>,
 	  	NEP extends Graph.NodeEndpoint<N, E>,
 	  	EEP extends Graph.EdgeEndpoint<N, E>
 	  > extends AbstractEdge<Object,Graph.Endpoint<N,E,?>> implements Graph<N, E, NEP, EEP>
@@ -529,7 +529,7 @@ public abstract class AbstractAdjacencyGraph<
 	}
 */
 
-	protected abstract Set<EdgeEndpoint<N,E>> getAdjacentEdgeEndpoint(Graph.NodeEndpoint<? extends N,? extends E> nodeEndpoint);
+	protected abstract Set<EdgeEndpoint<N,E>> getAdjacentEdgeEndpoints(Graph.NodeEndpoint<? extends N, ? extends E> nodeEndpoint);
 
 	protected PathFinder<N,E> getPathFinder()
 	{
@@ -977,13 +977,35 @@ public abstract class AbstractAdjacencyGraph<
 		}
 	}
 */
-	protected abstract class AbstractNodeEndpoint extends AbstractEdge<N,Graph.NodeEndpoint<N,E>>.AbstractEndpoint implements Graph.NodeEndpoint<N,E>
+
+	protected abstract class AbstractNodeEndpoint extends AbstractEdge<? super N,Graph.Endpoint<N,E,? super N>>.AbstractEndpoint<N> implements Graph.NodeEndpoint<N,E>
 	{
+		protected AbstractNodeEndpoint()
+		{
+		}
 
 		@Override
 		public Set<Graph.EdgeEndpoint<N, E>> getAdjacentEdges()
 		{
-			return getAdjacentEdgeEndpoint(this);
+			return getAdjacentEdgeEndpoints(this);
+		}
+
+		@Override
+		public Set<? extends Graph.EdgeEndpoint<N, E>> getAdjacent()
+		{
+			return getAdjacentEdges();
+		}
+
+		@Override
+		public Set<? extends Graph.EdgeEndpoint<N, E>> getTraversableAdjacentTo()
+		{
+			return this.getTraversableAdjacentEdgesTo();
+		}
+
+		@Override
+		public Set<? extends Graph.EdgeEndpoint<N, E>> getTraversableAdjacentFrom()
+		{
+			return this.getTraversableAdjacentEdgesFrom();
 		}
 
 		@Override
@@ -1052,8 +1074,30 @@ public abstract class AbstractAdjacencyGraph<
 		}
 	};
 
-	protected abstract class AbstractEdgeEndpoint extends AbstractEdge<E,Graph.Endpoint<N,E,E>>.AbstractEndpoint implements Graph.EdgeEndpoint<N,E>
+	protected abstract class AbstractEdgeEndpoint extends AbstractEdge<? super E,Graph.Endpoint<N,E,? super E>>.AbstractEndpoint<E> implements Graph.EdgeEndpoint<N,E>
 	{
+		protected AbstractEdgeEndpoint()
+		{
+		}
+
+		@Override
+		public Set<Graph.NodeEndpoint<N, E>> getAdjacent()
+		{
+			return this.getAdjacentNodes();
+		}
+
+		@Override
+		public Set<Graph.NodeEndpoint<N, E>> getTraversableAdjacentTo()
+		{
+			return this.getTraversableAdjacentNodesTo();
+		}
+
+		@Override
+		public Set<Graph.NodeEndpoint<N, E>> getTraversableAdjacentFrom()
+		{
+			return this.getTraversableAdjacentNodesFrom();
+		}
+
 		@Override
 		public Set<Graph.NodeEndpoint<N, E>> getAdjacentNodes()
 		{
@@ -1072,7 +1116,7 @@ public abstract class AbstractAdjacencyGraph<
 
 			for(Endpoint<? extends N> sourceEndpoint : this.getTarget().getEndpoints())
 				for( NEP neighborNode : AbstractAdjacencyGraph.this.getNodeEndpoints(sourceEndpoint.getTarget()) )
-					adjacentEdges.addAll(AbstractAdjacencyGraph.this.getAdjacentEdgeEndpoint(neighborNode));
+					adjacentEdges.addAll(AbstractAdjacencyGraph.this.getAdjacentEdgeEndpoints(neighborNode));
 
 			adjacentEdges.remove(this);
 			return Collections.unmodifiableSet(adjacentEdges);
@@ -1086,7 +1130,7 @@ public abstract class AbstractAdjacencyGraph<
 			for(Endpoint<? extends N> sourceEndpoint : this.getTarget().getEndpoints())
 				if( sourceEndpoint.getTraversableNeighborsFrom().size() > 0 )
 					for( NEP adjacentNode : AbstractAdjacencyGraph.this.getNodeEndpoints(sourceEndpoint.getTarget()))
-						for( Graph.EdgeEndpoint<N, E> adjacentEdge : AbstractAdjacencyGraph.this.getAdjacentEdgeEndpoint(adjacentNode) )
+						for( Graph.EdgeEndpoint<N, E> adjacentEdge : AbstractAdjacencyGraph.this.getAdjacentEdgeEndpoints(adjacentNode) )
 						 	if( adjacentEdge.getTarget().getTraversableFrom(adjacentNode.getTarget()).size() > 0 )
 								 adjacentEdges.add(adjacentEdge);
 
@@ -1101,7 +1145,7 @@ public abstract class AbstractAdjacencyGraph<
 			for(Endpoint<? extends N> sourceEndpoint : this.getTarget().getEndpoints())
 				if( sourceEndpoint.getTraversableNeighborsTo().size() > 0 )
 					for( NEP adjacentNode : AbstractAdjacencyGraph.this.getNodeEndpoints(sourceEndpoint.getTarget()))
-						for( Graph.EdgeEndpoint<N, E> adjacentEdge : AbstractAdjacencyGraph.this.getAdjacentEdgeEndpoint(adjacentNode) )
+						for( Graph.EdgeEndpoint<N, E> adjacentEdge : AbstractAdjacencyGraph.this.getAdjacentEdgeEndpoints(adjacentNode) )
 						 	if( adjacentEdge.getTarget().getTraversableTo(adjacentNode.getTarget()).size() > 0 )
 								 adjacentEdges.add(adjacentEdge);
 
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractEdge.java b/src/main/java/com/syncleus/dann/graph/AbstractEdge.java
index 18ff8eb2b7450e5febe08a5e2ebd944530847673..364d32006c09269c9bb7b214050b6a2cbf921d97 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractEdge.java
@@ -28,9 +28,9 @@ import com.syncleus.dann.xml.XmlSerializable;
 import org.apache.log4j.Logger;
 
 public abstract class AbstractEdge<
-	  	PA,
-	  	EP extends Edge.Endpoint<? extends PA>
-	  > implements Edge<PA,EP>
+	  	T,
+	  	EP extends Edge.Endpoint<? extends T>
+	  > implements Edge<T,EP>
 {
 	private static final Logger LOGGER = Logger.getLogger(AbstractEdge.class);
 
@@ -62,9 +62,9 @@ public abstract class AbstractEdge<
 	}
 
 	@Override
-	public Set<PA> getTargets()
+	public Set<T> getTargets()
 	{
-		final Set<PA> nodes = new HashSet<PA>();
+		final Set<T> nodes = new HashSet<T>();
 		for( EP endpoint : this.getEndpoints() )
 			nodes.add(endpoint.getTarget());
 
@@ -83,33 +83,33 @@ public abstract class AbstractEdge<
 	}
 
 	@Override
-	public Set<PA> getNeighbors(final Object source)
+	public Set<T> getNeighbors(final Object source)
 	{
-		final Set<PA> nodes = new HashSet<PA>();
+		final Set<T> nodes = new HashSet<T>();
 		for( final EP sourceEndpoint : this.getEndpoints(source) )
-			for( final Edge.Endpoint<? extends PA> fromEndpoint : sourceEndpoint.getNeighbors())
+			for( final Edge.Endpoint<? extends T> fromEndpoint : sourceEndpoint.getNeighbors())
 				nodes.add(fromEndpoint.getTarget());
 
 		return Collections.unmodifiableSet(nodes);
 	}
 
 	@Override
-	public Set<PA> getTraversableFrom(Object source)
+	public Set<T> getTraversableFrom(Object source)
 	{
-		final Set<PA> nodes = new HashSet<PA>();
+		final Set<T> nodes = new HashSet<T>();
 		for( final EP sourceEndpoint : this.getEndpoints(source) )
-			for( final Edge.Endpoint<? extends PA> fromEndpoint : sourceEndpoint.getTraversableNeighborsFrom())
+			for( final Edge.Endpoint<? extends T> fromEndpoint : sourceEndpoint.getTraversableNeighborsFrom())
 				nodes.add(fromEndpoint.getTarget());
 
 		return Collections.unmodifiableSet(nodes);
 	}
 
 	@Override
-	public Set<PA> getTraversableTo(Object destination)
+	public Set<T> getTraversableTo(Object destination)
 	{
-		final Set<PA> nodes = new HashSet<PA>();
+		final Set<T> nodes = new HashSet<T>();
 		for( final EP destinationEndpoint : this.getEndpoints(destination) )
-			for( final Edge.Endpoint<? extends PA> fromEndpoint : destinationEndpoint.getTraversableNeighborsTo())
+			for( final Edge.Endpoint<? extends T> fromEndpoint : destinationEndpoint.getTraversableNeighborsTo())
 				nodes.add(fromEndpoint.getTarget());
 
 		return Collections.unmodifiableSet(nodes);
@@ -125,7 +125,7 @@ public abstract class AbstractEdge<
 	public String toString()
 	{
 		final StringBuilder outString = new StringBuilder(this.getTargets().size() * 10);
-		for(final PA node : this.getTargets())
+		for(final T node : this.getTargets())
 		{
 			outString.append(':').append(node);
 		}
@@ -133,11 +133,11 @@ public abstract class AbstractEdge<
 	}
 
 	@Override
-	protected AbstractEdge<PA,EP> clone()
+	protected AbstractEdge<T,EP> clone()
 	{
 		try
 		{
-			return (AbstractEdge<PA,EP>) super.clone();
+			return (AbstractEdge<T,EP>) super.clone();
 		}
 		catch(CloneNotSupportedException caught)
 		{
@@ -153,8 +153,8 @@ public abstract class AbstractEdge<
 		final EdgeElementXml xml = new EdgeElementXml();
 
 		xml.setNodeInstances(new EdgeElementXml.NodeInstances());
-		final Set<PA> writtenNodes = new HashSet<PA>();
-		for (PA node : this.getTargets())
+		final Set<T> writtenNodes = new HashSet<T>();
+		for (T node : this.getTargets())
 		{
 			if (writtenNodes.add(node))
 			{
@@ -205,7 +205,7 @@ public abstract class AbstractEdge<
 		{
 			jaxbObject.setConnections(new EdgeXml.Connections());
 		}
-		for (PA node : this.getTargets())
+		for (T node : this.getTargets())
 		{
 			final NameXml connection = new NameXml();
 			connection.setName(nodeNames.getNameOrCreate(node));
@@ -213,33 +213,33 @@ public abstract class AbstractEdge<
 		}
 	}
 
-	protected abstract class AbstractEndpoint implements Edge.Endpoint<PA>
+	protected abstract class AbstractEndpoint<T> implements Edge.Endpoint<T>
 	{
 		protected AbstractEndpoint()
 		{
 		}
 
 		@Override
-		public Set<Edge.Endpoint<PA>> getNeighbors()
+		public Set<Edge.Endpoint<? extends T>> getNeighbors()
 		{
 			return new NeighborSet();
 		}
 
 		@Override
-		public Set<Edge.Endpoint<PA>> getTraversableNeighborsTo()
+		public Set<Edge.Endpoint<? extends T>> getTraversableNeighborsTo()
 		{
-			final Set<Edge.Endpoint<PA>> traversables = new HashSet<Edge.Endpoint<PA>>();
-			for(Edge.Endpoint<PA> neighbor : this.getNeighbors())
+			final Set<Edge.Endpoint<? extends T>> traversables = new HashSet<Edge.Endpoint<? extends T>>();
+			for(Edge.Endpoint<? extends T> neighbor : this.getNeighbors())
 				if( AbstractEdge.this.isTraversable(this.getTarget(),neighbor.getTarget()) )
 					traversables.add(neighbor);
 			return Collections.unmodifiableSet(traversables);
 		}
 
 		@Override
-		public Set<Edge.Endpoint<PA>> getTraversableNeighborsFrom()
+		public Set<Edge.Endpoint<? extends T>> getTraversableNeighborsFrom()
 		{
-			final Set<Edge.Endpoint<PA>> traversables = new HashSet<Edge.Endpoint<PA>>();
-			for(Edge.Endpoint<PA> neighbor : this.getNeighbors())
+			final Set<Edge.Endpoint<? extends T>> traversables = new HashSet<Edge.Endpoint<? extends T>>();
+			for(Edge.Endpoint<? extends T> neighbor : this.getNeighbors())
 				if( AbstractEdge.this.isTraversable(this.getTarget(),neighbor.getTarget()) )
 					traversables.add(neighbor);
 			return Collections.unmodifiableSet(traversables);
@@ -257,13 +257,7 @@ public abstract class AbstractEdge<
 			return AbstractEdge.this.isTraversable(this.getTarget(), destination.getTarget());
 		}
 
-		@Override
-		public boolean isTraversable(Object destination)
-		{
-			return AbstractEdge.this.isTraversable(this.getTarget(), destination);
-		}
-
-		private class NeighborSet implements Set<Edge.Endpoint<PA>>
+		private class NeighborSet implements Set<Edge.Endpoint<? extends T>>
 		{
 			@Override
 			public int size()
@@ -287,7 +281,7 @@ public abstract class AbstractEdge<
 			}
 
 			@Override
-			public Iterator<Edge.Endpoint<PA>> iterator()
+			public Iterator<Edge.Endpoint<? extends T>> iterator()
 			{
 				return new NeighborIterator();
 			}
@@ -309,7 +303,7 @@ public abstract class AbstractEdge<
 			}
 
 			@Override
-			public boolean add(Edge.Endpoint<PA> nEndpoint)
+			public boolean add(Edge.Endpoint<? extends T> nEndpoint)
 			{
 				throw new UnsupportedOperationException("This set is read-only!");
 			}
@@ -329,7 +323,7 @@ public abstract class AbstractEdge<
 			}
 
 			@Override
-			public boolean addAll(Collection<? extends Edge.Endpoint<PA>> c)
+			public boolean addAll(Collection<? extends Edge.Endpoint<? extends T>> c)
 			{
 				throw new UnsupportedOperationException("This set is read-only!");
 			}
@@ -358,10 +352,10 @@ public abstract class AbstractEdge<
 				throw new UnsupportedOperationException("This set is read-only!");
 			}
 
-			private class NeighborIterator implements Iterator<Edge.Endpoint<PA>>
+			private class NeighborIterator implements Iterator<Edge.Endpoint<? extends T>>
 			{
 				private int nextLeft = (getEndpoints().size()-1);
-				final private Iterator<EP> iterator;
+				final private Iterator<? extends Endpoint<?>> iterator;
 
 				public NeighborIterator()
 				{
@@ -375,13 +369,13 @@ public abstract class AbstractEdge<
 				}
 
 				@Override
-				public Edge.Endpoint<PA> next()
+				public Edge.Endpoint<T> next()
 				{
-					Edge.Endpoint<? extends PA> nextEndpoint = this.iterator.next();
+					Edge.Endpoint<?> nextEndpoint = this.iterator.next();
 					this.nextLeft--;
 
 					if( !AbstractEndpoint.this.equals(nextEndpoint) )
-						return (Edge.Endpoint<PA>) nextEndpoint;
+						return (Edge.Endpoint<T>) nextEndpoint;
 					return next();
 				}
 
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractMutableAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractMutableAdjacencyGraph.java
index 5435f4149cef17d92052cceabb478913c4ec1007..aa446f41e775500e3c004b29add30fffecffc801 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractMutableAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractMutableAdjacencyGraph.java
@@ -23,8 +23,8 @@ import java.util.*;
 public abstract class AbstractMutableAdjacencyGraph<
 	  	N,
 	  	E extends Edge<N,? extends Edge.Endpoint<N>>,
-	  	NEP extends MutableGraph.NodeEndpoint<? extends N, ? extends E>,
-	  	EEP extends MutableGraph.EdgeEndpoint<? extends N, ? extends E>
+	  	NEP extends MutableGraph.NodeEndpoint<N, E>,
+	  	EEP extends MutableGraph.EdgeEndpoint<N, E>
 	  >
 	  extends AbstractAdjacencyGraph<N, E, NEP, EEP>
 	  implements MutableGraph<N, E, NEP, EEP>
@@ -61,11 +61,11 @@ public abstract class AbstractMutableAdjacencyGraph<
 	}
 
 	@Override
-	protected Set<Graph.EdgeEndpoint<? extends N,? extends E>> getAdjacentEdgeEndpoint(Graph.NodeEndpoint<? extends N,? extends E> nodeEndpoint)
+	protected Set<Graph.EdgeEndpoint<N,E>> getAdjacentEdgeEndpoints(Graph.NodeEndpoint<? extends N, ? extends E> nodeEndpoint)
 	{
 		if( !this.adjacency.getLeftKeys().contains(nodeEndpoint) )
 			throw new IllegalArgumentException("nodeEndpoint is not an endpoint for this graph");
-		return Collections.<EdgeEndpoint<? extends N,? extends E>>unmodifiableSet(this.adjacency.getLeftAdjacency(nodeEndpoint));
+		return Collections.<EdgeEndpoint<N,E>>unmodifiableSet(this.adjacency.getLeftAdjacency(nodeEndpoint));
 	}
 
 	protected abstract NEP createNodeEndpoint(N node) throws InvalidGraphException;
@@ -202,6 +202,13 @@ public abstract class AbstractMutableAdjacencyGraph<
 	@Override
 	public Map<?, Graph.Endpoint<N, E, ?>> reconfigure(Set<? extends N> addNodes, Set<? extends E> addEdges, Set<? extends Graph.Endpoint<?, ?, ?>> disconnectEndpoints) throws InvalidGraphException
 	{
+		for(final Graph.Endpoint<?,?,?> disconnectEndpoint : disconnectEndpoints)
+			this.adjacency.remove(disconnectEndpoint.getTarget());
+
+		Map<Object, Graph.Endpoint<N,E,?>> newEndpoints = new HashMap<Object, Graph.Endpoint<N, E, ?>>();
+		newEndpoints.putAll(this.joinNodes(addNodes));
+		newEndpoints.putAll(this.joinEdges(addEdges));
+		return newEndpoints;
 	}
 
 	@Override
@@ -305,4 +312,12 @@ public abstract class AbstractMutableAdjacencyGraph<
 			}
 		};
 */
+
+	protected abstract class AbstractNodeEndpoint extends AbstractAdjacencyGraph<N,E,NEP,EEP>.AbstractNodeEndpoint implements MutableGraph.NodeEndpoint<N, E>
+	{
+	}
+
+	protected abstract class AbstractEdgeEndpoint extends AbstractAdjacencyGraph<N,E,NEP,EEP>.AbstractEdgeEndpoint implements MutableGraph.EdgeEndpoint<N, E>
+	{
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableGraph.java b/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
index 034a0c2a9834efa1907a891dcae3db787d553708..8226c11a43e302d72b5185cbd8654f9ea5d11f4c 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
@@ -20,7 +20,7 @@ package com.syncleus.dann.graph;
 
 public interface AssignableGraph<
 	  	N,
-	  	E extends Edge<N,? extends Edge.Endpoint<N>>,
+	  	E extends Edge<N,? extends Edge.Endpoint<? extends 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,?>>
@@ -45,7 +45,7 @@ public interface AssignableGraph<
 
 	interface NodeEndpoint<
 		  ON,
-		  OE extends Edge<ON,? extends Edge.Endpoint<ON>>
+		  OE extends Edge<ON,? extends Edge.Endpoint<? extends 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<ON,? extends Edge.Endpoint<ON>>
+		  OE extends Edge<ON,? extends Edge.Endpoint<? extends 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 d14109e634675a11570d6de5bae40fa2ea2b2013..9a25dcf85e9d122ffdef96b7fef9f8e894c55cce 100644
--- a/src/main/java/com/syncleus/dann/graph/Edge.java
+++ b/src/main/java/com/syncleus/dann/graph/Edge.java
@@ -32,12 +32,11 @@ public interface Edge<
 {
 	interface Endpoint<T>
 	{
-		Set<Edge.Endpoint<T>> getNeighbors();
-		Set<Edge.Endpoint<T>> getTraversableNeighborsTo();
-		Set<Edge.Endpoint<T>> getTraversableNeighborsFrom();
+		Set<? extends Edge.Endpoint<? extends T>> getNeighbors();
+		Set<? extends Edge.Endpoint<? extends T>> getTraversableNeighborsTo();
+		Set<? extends Edge.Endpoint<? extends T>> getTraversableNeighborsFrom();
 		boolean isTraversable();
 		boolean isTraversable(Edge.Endpoint<?> destination);
-		boolean isTraversable(Object destination);
 		T getTarget();
 	};
 
diff --git a/src/main/java/com/syncleus/dann/graph/Graph.java b/src/main/java/com/syncleus/dann/graph/Graph.java
index 6edcfdd4a28a63e354d95aaaa9011dd73632cb8b..2005599d8ccd0cac438ef08a776959c66977de0a 100644
--- a/src/main/java/com/syncleus/dann/graph/Graph.java
+++ b/src/main/java/com/syncleus/dann/graph/Graph.java
@@ -37,40 +37,40 @@ import java.util.Set;
  */
 public interface Graph<
 	  	N,
-	  	E extends Edge<N,? extends Edge.Endpoint<N>>,
+	  	E extends Edge<N,? extends Edge.Endpoint<? extends 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<ON,? extends Edge.Endpoint<ON>>,
+	  	OE extends Edge<ON,? extends Edge.Endpoint<? extends ON>>,
 	  	T
 	  > extends Edge.Endpoint<T>
 	{
-		Set<Graph.Endpoint<ON,OE,T>> getAdjacent();
-		Set<Graph.Endpoint<ON,OE,T>> getTraversableAdjacentTo();
-		Set<Graph.Endpoint<ON,OE,T>> getTraversableAdjacentFrom();
+		Set<? extends Graph.Endpoint<ON,OE,?>> getAdjacent();
+		Set<? extends Graph.Endpoint<ON,OE,?>> getTraversableAdjacentTo();
+		Set<? extends Graph.Endpoint<ON,OE,?>> getTraversableAdjacentFrom();
 
-		Set<Graph.NodeEndpoint<ON, OE>> getAdjacentNodes();
-		Set<Graph.NodeEndpoint<ON, OE>> getTraversableAdjacentNodesTo();
-		Set<Graph.NodeEndpoint<ON, OE>> getTraversableAdjacentNodesFrom();
+		Set<? extends Graph.NodeEndpoint<ON, OE>> getAdjacentNodes();
+		Set<? extends Graph.NodeEndpoint<ON, OE>> getTraversableAdjacentNodesTo();
+		Set<? extends Graph.NodeEndpoint<ON, OE>> getTraversableAdjacentNodesFrom();
 
-		Set<Graph.EdgeEndpoint<ON, OE>> getAdjacentEdges();
-		Set<Graph.EdgeEndpoint<ON, OE>> getTraversableAdjacentEdgesTo();
-		Set<Graph.EdgeEndpoint<ON, OE>> getTraversableAdjacentEdgesFrom();
+		Set<? extends Graph.EdgeEndpoint<ON, OE>> getAdjacentEdges();
+		Set<? extends Graph.EdgeEndpoint<ON, OE>> getTraversableAdjacentEdgesTo();
+		Set<? extends Graph.EdgeEndpoint<ON, OE>> getTraversableAdjacentEdgesFrom();
 	};
 
 	interface NodeEndpoint<
 		  ON,
-		  OE extends Edge<ON,? extends Edge.Endpoint<ON>>
+		  OE extends Edge<ON,? extends Edge.Endpoint<? extends ON>>
 	  > extends Graph.Endpoint<ON,OE,ON>
 	{
 	};
 
 	interface EdgeEndpoint<
 		  	ON,
-		  	OE extends Edge<ON,? extends Edge.Endpoint<ON>>
+		  	OE extends Edge<ON,? extends Edge.Endpoint<? extends ON>>
 		> extends Graph.Endpoint<ON,OE,OE>
 	{
 	};
diff --git a/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
index 57cbc5943478f143802618c39a84aed66b772e13..b512b28260e9c198e61d126aca13ca25df91657f 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
@@ -21,24 +21,27 @@ package com.syncleus.dann.graph;
 import java.util.*;
 
 public final class MutableAdjacencyGraph<
+	  	N,
+	  	E extends Edge<N,Edge.Endpoint<N>>
+	  > extends AbstractMutableAdjacencyGraph<N,E,MutableGraph.NodeEndpoint<N, E>,MutableGraph.EdgeEndpoint<N, E>>
+/*
+	  <
 	  	N,
 	  	E extends Edge<N,? extends Edge.Endpoint<N>>
-	  >
-	  extends AbstractMutableAdjacencyGraph<N, E, MutableGraph.NodeEndpoint<N, E>, MutableGraph.EdgeEndpoint<N, E>>
-	  implements MutableGraph<N, E, MutableGraph.NodeEndpoint<N, E>, MutableGraph.EdgeEndpoint<N, E>>
+	  >*/
+//	  extends AbstractMutableAdjacencyGraph<N, E, MutableGraph.NodeEndpoint<N, E>//, MutableGraph.EdgeEndpoint<N, E>>
 {
 	private static final long serialVersionUID = -4613327727609060678L;
 
 	@Override
 	public boolean isContextEnabled()
 	{
-		return false;  //To change body of implemented methods use File | Settings | File Templates.
+		return false;
 	}
 
 	@Override
 	protected MutableGraph.NodeEndpoint<N, E> createNodeEndpoint(N node) throws InvalidGraphException
 	{
-		return null;  //To change body of implemented methods use File | Settings | File Templates.
 	}
 
 	@Override
@@ -46,4 +49,12 @@ public final class MutableAdjacencyGraph<
 	{
 		return null;  //To change body of implemented methods use File | Settings | File Templates.
 	}
+
+	private final class NodeEndpoint extends AbstractNodeEndpoint
+	{
+	}
+
+	private final class EdgeEndpoint extends AbstractEdgeEndpoint
+	{
+	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/MutableGraph.java b/src/main/java/com/syncleus/dann/graph/MutableGraph.java
index a6ae780780fb646e255f3c9bedcb9c602765e77e..5ce6d450b76635dbadfd869faad235f2f861249b 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableGraph.java
@@ -23,21 +23,21 @@ import java.util.Set;
 
 public interface MutableGraph<
 	  	N,
-	  	E extends Edge<N,? extends Edge.Endpoint<N>>,
+	  	E extends Edge<N,? extends Edge.Endpoint<? extends N>>,
 	  	NEP extends MutableGraph.NodeEndpoint<N, E>,
 	  	EEP extends MutableGraph.EdgeEndpoint<N, E>
 	  > extends AssignableGraph<N,E,NEP,EEP>
 {
 	interface NodeEndpoint<
 		  ON,
-		  OE extends Edge<ON,? extends Edge.Endpoint<ON>>
+		  OE extends Edge<ON,? extends Edge.Endpoint<? extends ON>>
 	  > extends AssignableGraph.NodeEndpoint<ON,OE>
 	{
 	};
 
 	interface EdgeEndpoint<
 		  ON,
-		  OE extends Edge<ON,? extends Edge.Endpoint<ON>>
+		  OE extends Edge<ON,? extends Edge.Endpoint<? extends ON>>
 	  > extends AssignableGraph.EdgeEndpoint<ON,OE>
 	{
 	};