diff --git a/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
index c6fac7c4a986e18f9278b7a25c62ef6fac08f827..3640518229eb62922d8c606655c7b7268c9fa0fa 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
@@ -35,13 +35,6 @@ import java.util.*;
  */
 @XmlJavaTypeAdapter( com.syncleus.dann.xml.XmlSerializableAdapter.class )
 public abstract class AbstractAdjacencyGraph<
-/*
-	  	PA,
-	  	N extends PA,
-	  	E extends Edge<? extends N,? extends Edge.Endpoint<? extends N, ? extends N>>,
-	  	NEP extends Graph.NodeEndpoint<? extends N,? extends N,? extends E>,
-	  	EEP extends Graph.EdgeEndpoint<? extends N,? extends E,? extends E>
-*/
 	  	PA,
 	  	N extends PA,
 	  	E extends Edge<N,? extends Edge.Endpoint<N>>,
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableGraph.java b/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
index 962709385203eb4bd6d285a589469d0ff11a5204..98e7dad30ada9ebfdc719627a5197cb83dea9a08 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
@@ -18,7 +18,13 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-public interface AssignableGraph<N, E extends Edge<N>> extends Graph<N,E>, MutableEdge<Object>
+public interface AssignableGraph<
+	  	PA,
+	  	N extends PA,
+	  	E extends Edge<N,? extends Edge.Endpoint<N>>,
+	  	NEP extends AssignableGraph.NodeEndpoint<N, E>,
+	  	EEP extends AssignableGraph.EdgeEndpoint<N, E>
+	  >  extends Graph<PA,N,E,NEP,EEP>, MutableEdge<PA,Graph.Endpoint<N,E,PA>>
 //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>
 {
@@ -38,12 +44,20 @@ public interface AssignableGraph<N, E extends Edge<N>> extends Graph<N,E>, Mutab
 */
 
 
-	interface NodeEndpoint<ON, MN extends ON, OE extends Edge<? extends ON>> extends Graph.NodeEndpoint<MN,OE>, MutableEdge.Endpoint<Object, MN>
+	interface NodeEndpoint<
+		  ON,
+		  OE extends Edge<ON,? extends Edge.Endpoint<ON>>
+	  > extends Graph.NodeEndpoint<ON,OE>, MutableEdge.Endpoint<ON>
 	{
+		void setTarget(ON newTarget) throws InvalidGraphException;
 	};
 
-	interface EdgeEndpoint<ON, OE extends Edge<? extends ON>, ME extends OE> extends Graph.EdgeEndpoint<OE, ME>, MutableEdge.Endpoint<Object, ME>
+	interface EdgeEndpoint<
+		  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/HyperEdge.java b/src/main/java/com/syncleus/dann/graph/HyperEdge.java
index 419d72b691b9e17378592f34b5cbac1266044814..9bf419301f2c0f25411834bce881b383ce32e068 100644
--- a/src/main/java/com/syncleus/dann/graph/HyperEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/HyperEdge.java
@@ -18,7 +18,10 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-public interface HyperEdge<N> extends Edge<N>
+public interface HyperEdge<
+	  	N,
+	  	EP extends Edge.Endpoint<N>
+	  > extends Edge<N, EP>
 {
 	interface Endpoint<NN, EN extends NN> extends Edge.Endpoint<NN, EN>
 	{
diff --git a/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
index 134e2113a4ed9764023da1ed3892037b9ea7583b..2a5b4df55d6ac0c63d33e858c5f93b000f78d784 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
@@ -20,114 +20,96 @@ package com.syncleus.dann.graph;
 
 import java.util.*;
 
-public class MutableAdjacencyGraph<N, E extends Edge<N>> extends AbstractAdjacencyGraph<N, E> implements MutableGraph<N, E>
+public class MutableAdjacencyGraph<
+	  	PA,
+	  	N extends PA,
+	  	E extends Edge<N,? extends Edge.Endpoint<N>>,
+	  	NEP extends MutableGraph.NodeEndpoint<N, E>,
+	  	EEP extends MutableGraph.EdgeEndpoint<N, E>
+	  > extends AbstractAdjacencyGraph<PA, N, E, NEP, EEP> implements MutableGraph<PA, N, E, NEP, EEP>
 {
 	private static final long serialVersionUID = -4613327727609060678L;
 
-/*
-	public MutableAdjacencyGraph()
-	{
-		super();
-	}
-
-	public MutableAdjacencyGraph(final Graph<N, E> copyGraph)
-	{
-		super(copyGraph);
-	}
-
-	public MutableAdjacencyGraph(final Set<N> nodes, final Set<E> edges)
-	{
-		super(nodes, edges);
-	}
-
 	@Override
-	public boolean add(final E newEdge)
+	protected Set<EdgeEndpoint<N, E>> getAdjacentEdgeEndPoint(Graph.NodeEndpoint<N, E> nodeEndPoint)
 	{
-		return super.add(newEdge);
-	}
-
-	@Override
-	public boolean add(final N newNode)
-	{
-		return super.add(newNode);
+		return null;  //To change body of implemented methods use File | Settings | File Templates.
 	}
 
 	@Override
-	public boolean remove(final E edgeToRemove)
+	public NEP joinNode(N node) throws InvalidGraphException
 	{
-		return super.remove(edgeToRemove);
+		return null;  //To change body of implemented methods use File | Settings | File Templates.
 	}
 
 	@Override
-	public boolean remove(final N nodeToRemove)
+	public Map<N, NEP> joinNodes(Set<? extends N> nodes) throws InvalidGraphException
 	{
-		return super.remove(nodeToRemove);
+		return null;  //To change body of implemented methods use File | Settings | File Templates.
 	}
 
 	@Override
-	public boolean clear()
+	public void leaveNode(NEP endPoint) throws InvalidGraphException
 	{
-		return super.clear();
+		//To change body of implemented methods use File | Settings | File Templates.
 	}
 
 	@Override
-	protected MutableAdjacencyGraph<N, E> clone()
+	public void leaveNodes(Set<NEP> endPoint) throws InvalidGraphException
 	{
-		return (MutableAdjacencyGraph<N, E>) super.clone();
+		//To change body of implemented methods use File | Settings | File Templates.
 	}
-*/
-	final private Map<NodeEndpoint<N,E>,EdgeEndpoint<E, ? extends E>> nodeAdjacency = new HashMap<NodeEndpoint<N, E>, EdgeEndpoint<E, ? extends E>>();
 
 	@Override
-	protected Set<EdgeEndpoint<E, ? extends E>> getAdjacentEdgeEndPoint(Graph.NodeEndpoint<? extends N, E> nodeEndPoint)
+	public EEP joinEdge(E edge) throws InvalidGraphException
 	{
 		return null;  //To change body of implemented methods use File | Settings | File Templates.
 	}
 
 	@Override
-	public Set<? extends EdgeEndpoint<E, ? extends E>> getEdgeEndpoints()
+	public Map<N, EEP> joinEdges(Set<? extends E> edges) throws InvalidGraphException
 	{
 		return null;  //To change body of implemented methods use File | Settings | File Templates.
 	}
 
 	@Override
-	public Set<? extends NodeEndpoint<? extends N, E>> getNodeEndpoints()
+	public void leaveEdge(EEP endPoint) throws InvalidGraphException
 	{
-		return null;  //To change body of implemented methods use File | Settings | File Templates.
+		//To change body of implemented methods use File | Settings | File Templates.
 	}
 
 	@Override
-	public MutableHyperEdge.Endpoint<Object, Object> join(Object node) throws InvalidEdgeException
+	public void leaveEdges(Set<EEP> endPoint) throws InvalidGraphException
 	{
-		return null;  //To change body of implemented methods use File | Settings | File Templates.
+		//To change body of implemented methods use File | Settings | File Templates.
 	}
 
 	@Override
-	public Map<Object, MutableHyperEdge.Endpoint<Object, Object>> join(Set<Object> nodes) throws InvalidEdgeException
+	public void clear() throws InvalidGraphException
 	{
-		return null;  //To change body of implemented methods use File | Settings | File Templates.
+		//To change body of implemented methods use File | Settings | File Templates.
 	}
 
 	@Override
-	public void leave(MutableHyperEdge.Endpoint<Object, Object> endPoint) throws InvalidEdgeException
+	public void clearEdges() throws InvalidGraphException
 	{
 		//To change body of implemented methods use File | Settings | File Templates.
 	}
 
 	@Override
-	public void leave(Set<MutableHyperEdge.Endpoint<Object, Object>> endPoint) throws InvalidEdgeException
+	public Map<PA, ? extends Graph.Endpoint<N, E, PA>> reconfigure(Set<? extends N> addNodes, Set<? extends E> addEdges, Set<? extends Graph.Endpoint<N, E, ? extends PA>> disconnectEndPoints) throws InvalidGraphException
 	{
-		//To change body of implemented methods use File | Settings | File Templates.
+		return null;  //To change body of implemented methods use File | Settings | File Templates.
 	}
 
 	@Override
-	public void clear() throws InvalidEdgeException
+	public Set<EEP> getEdgeEndpoints()
 	{
-		//To change body of implemented methods use File | Settings | File Templates.
+		return null;  //To change body of implemented methods use File | Settings | File Templates.
 	}
 
 	@Override
-	public Map<Object, MutableHyperEdge.Endpoint<Object, Object>> reconfigure(Set<Object> connectNodes, Set<MutableHyperEdge.Endpoint<Object, Object>> disconnectEndPoints) throws InvalidEdgeException
+	public Set<NEP> getNodeEndpoints()
 	{
 		return null;  //To change body of implemented methods use File | Settings | File Templates.
 	}
diff --git a/src/main/java/com/syncleus/dann/graph/MutableEdge.java b/src/main/java/com/syncleus/dann/graph/MutableEdge.java
index e8ba19ef2e50795999927e68443f6cb4514eaa95..628d3db3064f6be6dad3566e8403888b0f97c0c6 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableEdge.java
@@ -18,10 +18,13 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-public interface MutableEdge<N> extends Edge<N>
+public interface MutableEdge<
+	  	T,
+	  	EP extends Edge.Endpoint<T>
+	  > extends Edge<T, EP>
 {
-	interface Endpoint<NN, EN extends NN> extends Edge.Endpoint<NN, EN>
+	interface Endpoint<T> extends Edge.Endpoint<T>
 	{
-		void setTarget(EN newTarget) throws InvalidEdgeException;
+		void setTarget(T newTarget) throws InvalidEdgeException;
 	};
 }
diff --git a/src/main/java/com/syncleus/dann/graph/MutableGraph.java b/src/main/java/com/syncleus/dann/graph/MutableGraph.java
index f8a166bc901976e798cbffefd824e9dc30f3a5b5..8041c8333913bafbb73bb351d021dcf6abc7ac05 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableGraph.java
@@ -21,27 +21,40 @@ package com.syncleus.dann.graph;
 import java.util.Map;
 import java.util.Set;
 
-public interface MutableGraph<N, E extends Edge<N>> extends AssignableGraph<N,E>
+public interface MutableGraph<
+	  	PA,
+	  	N extends PA,
+	  	E extends Edge<N,? extends Edge.Endpoint<N>>,
+	  	NEP extends MutableGraph.NodeEndpoint<N, E>,
+	  	EEP extends MutableGraph.EdgeEndpoint<N, E>
+	  > extends AssignableGraph<PA,N,E,NEP,EEP>
 {
-	interface NodeEndpoint<ON, MN extends ON, OE extends Edge<? extends ON>> extends AssignableGraph.NodeEndpoint<ON,MN,OE>, MutableHyperEdge.Endpoint<Object, MN>
+	interface NodeEndpoint<
+		  ON,
+		  OE extends Edge<ON,? extends Edge.Endpoint<ON>>
+	  > extends AssignableGraph.NodeEndpoint<ON,OE>
 	{
 	};
 
-	interface EdgeEndpoint<ON, OE extends Edge<? extends ON>, ME extends OE> extends AssignableGraph.EdgeEndpoint<ON,OE,ME>, MutableHyperEdge.Endpoint<Object, ME>
+	interface EdgeEndpoint<
+		  ON,
+		  OE extends Edge<ON,? extends Edge.Endpoint<ON>>
+	  > extends AssignableGraph.EdgeEndpoint<ON,OE>
 	{
 	};
 
-	NodeEndpoint<N,? extends N,E> join(final N node) throws InvalidEdgeException;
-	Map<N, ? extends NodeEndpoint<N, ? extends N,E>> joinNodes(final Set<? extends N> nodes) throws InvalidEdgeException;
-	void leave(final NodeEndpoint<? extends N, ? extends N,? extends E> endPoint) throws InvalidEdgeException;
-	void leaveNodes(final Set<? extends NodeEndpoint<? extends N, ? extends N,? extends E>> endPoint) throws InvalidEdgeException;
+	NEP joinNode(N node) throws InvalidGraphException;
+	Map<N, NEP> joinNodes(Set<? extends N> nodes) throws InvalidGraphException;
+	void leaveNode(NEP endPoint) throws InvalidGraphException;
+	void leaveNodes(Set<NEP> endPoint) throws InvalidGraphException;
 
-	EdgeEndpoint<N, E, ? extends E> join(final E edge) throws InvalidEdgeException;
-	Map<N, ? extends EdgeEndpoint<N, E, ? extends E>> joinEdges(final Set<? extends E> edges) throws InvalidEdgeException;
-	void leave(final EdgeEndpoint<? extends N, ? extends E, ? extends E> endPoint) throws InvalidEdgeException;
-	void leaveEdges(final Set<? extends EdgeEndpoint<? extends N, ? extends E, ? extends E>> endPoint) throws InvalidEdgeException;
+	EEP joinEdge(E edge) throws InvalidGraphException;
+	Map<N, EEP> joinEdges(Set<? extends E> edges) throws InvalidGraphException;
+	void leaveEdge(EEP endPoint) throws InvalidGraphException;
+	void leaveEdges(Set<EEP> endPoint) throws InvalidGraphException;
 
-	void clear() throws InvalidEdgeException;
+	void clear() throws InvalidGraphException;
+	void clearEdges() throws InvalidGraphException;
 
-	Map<? extends Object, ? extends Graph.Endpoint<? extends N, ? extends N>> reconfigure(final Set<? extends N> addNodes, final Set<? extends E> addEdges, final Set<? extends Graph.Endpoint<? extends N, ? extends N>> disconnectEndPoints) throws InvalidEdgeException;
+	Map<PA, ? extends Graph.Endpoint<N,E,PA>> reconfigure(Set<? extends N> addNodes, Set<? extends E> addEdges, final Set<? extends Graph.Endpoint<N,E,? extends PA>> disconnectEndPoints) throws InvalidGraphException;
 }
diff --git a/src/main/java/com/syncleus/dann/graph/MutableHyperEdge.java b/src/main/java/com/syncleus/dann/graph/MutableHyperEdge.java
index 620f81bfa3db8ab50d90b4584eadb8d921f7f7ee..3ba41f83f6d79d4e8bd9311568cee253e3fc826d 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableHyperEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableHyperEdge.java
@@ -20,16 +20,19 @@ package com.syncleus.dann.graph;
 
 import java.util.*;
 
-public interface MutableHyperEdge<N> extends HyperEdge<N>, MutableEdge<N>
+public interface MutableHyperEdge<
+	  	T,
+	  	EP extends Edge.Endpoint<T>
+	  > extends HyperEdge<T,EP>, MutableEdge<T,EP>
 {
 	interface Endpoint<NN, EN extends NN> extends HyperEdge.Endpoint<NN, EN>, MutableEdge.Endpoint<NN, EN>
 	{
 	};
 
-	Endpoint<N, N> join(final N node) throws InvalidEdgeException;
-	Map<N,Endpoint<N, N>> join(final Set<N> nodes) throws InvalidEdgeException;
-	void leave(final Endpoint<N, N> endPoint) throws InvalidEdgeException;
-	void leave(final Set<Endpoint<N, N>> endPoint) throws InvalidEdgeException;
+	Endpoint<T, T> join(final T node) throws InvalidEdgeException;
+	Map<T,Endpoint<T, T>> join(final Set<T> nodes) throws InvalidEdgeException;
+	void leave(final Endpoint<T, T> endPoint) throws InvalidEdgeException;
+	void leave(final Set<Endpoint<T, T>> endPoint) throws InvalidEdgeException;
 	void clear() throws InvalidEdgeException;
-	Map<N,Endpoint<N, N>> reconfigure(final Set<N> connectNodes, final Set<Endpoint<N, N>> disconnectEndPoints) throws InvalidEdgeException;
+	Map<T,Endpoint<T, T>> reconfigure(final Set<T> connectNodes, final Set<Endpoint<T, T>> disconnectEndPoints) throws InvalidEdgeException;
 }