diff --git a/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
index 0835c179d8dfa26d6501469e6e5cb98a7b9055c0..83bd6ab7275244e88b9bb86e7654c1bfb80eb3a0 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
@@ -42,493 +42,6 @@ public abstract class AbstractAdjacencyGraph<
 	  > extends AbstractCloud<Object,Graph.Endpoint<?, N,E>> implements Graph<N, E, NE, EE>
 {
 	private static final Logger LOGGER = Logger.getLogger(AbstractAdjacencyGraph.class);
-//	private Set<E> edges;
-//	private Map<N, Set<E>> adjacentEdges = new HashMap<N, Set<E>>();
-//	private Map<N, List<N>> adjacentNodes = new HashMap<N, List<N>>();
-/*
-	private Set<? extends EdgeEndpoint<? extends Object, N, E, E>> edges;
-	private Map<? extends NodeEndpoint<? extends Object, E, N, N>, Set<E>> adjacentEdges = new HashMap<NodeEndpoint<? extends Object, E, N, N>, Set<E>>();
-	private Map<? extends NodeEndpoint<? extends Object, E, N, N>, List<N>> adjacentNodes = new HashMap<NodeEndpoint<? extends Object, E, N, N>, List<N>>();
-*/
-//	private final boolean contextEnabled;
-
-
-/*
-	/**
-	 * Creates a new AbstractAdjacencyGraph with no edges and no adjacencies.
-	 * nodeContext and edgeContext is enabled.
-	 *
-	protected AbstractAdjacencyGraph()
-	{
-		this(true);
-	}
-
-	/**
-	 * Creates a new AbstractAdjacencyGraph with no edges and no adjacencies.
-	 *
-	protected AbstractAdjacencyGraph(final boolean contextEnabled)
-	{
-//		this.edges = new HashSet<E>();
-		this.edges = new HashSet<EdgeEndpoint<? extends Object, N, E, E>>();
-//		this.contextEnabled = contextEnabled;
-	}
-
-	/**
-	 * Creates a new AbstractAdjacencyGraph as a copy of the current Graph.
-	 * nodeContext is enabled.
-	 * @param copyGraph The Graph to copy
-	 *
-	protected AbstractAdjacencyGraph(final Graph<N, E> copyGraph)
-	{
-		this(copyGraph.getTargets(), copyGraph.getEdges(), true);
-	}
-
-	/**
-	 * Creates a new AbstractAdjacencyGraph as a copy of the current Graph.
-	 * @param copyGraph The Graph to copy
-	 *
-	protected AbstractAdjacencyGraph(final Graph<N, E> copyGraph, final boolean contextEnabled)
-	{
-		this(copyGraph.getTargets(), copyGraph.getEdges(), contextEnabled);
-	}
-
-	/**
-	 * Creates a new AbstractAdjacencyGraph from the given list of nodes, and
-	 * the given list of ourEdges.
-	 * The adjacency lists are created from this structure. nodeContext is
-	 * enabled.
-	 *
-	 * @param nodes The set of all nodes
-	 * @param edges The set of all ourEdges
-	 *
-	protected AbstractAdjacencyGraph(final Set<N> nodes, final Set<E> edges)
-	{
-		this(nodes, edges, true);
-	}
-
-	/**
-	 * Creates a new AbstractAdjacencyGraph from the given list of nodes, and
-	 * the given list of ourEdges.
-	 * The adjacency lists are created from this structure.
-	 *
-	 * @param attemptNodes The set of all nodes
-	 * @param attemptEdges The set of all ourEdges
-	 *
-	protected AbstractAdjacencyGraph(final Set<N> attemptNodes, final Set<E> attemptEdges, final boolean contextEnabled)
-	{
-		if(attemptNodes == null)
-			throw new IllegalArgumentException("attemptNodes can not be null");
-		if(attemptEdges == null)
-			throw new IllegalArgumentException("attemptEdges can not be null");
-		//make sure all the edges only join to contained nodes
-		for( E attemptEdge : attemptEdges )
-			if( !attemptNodes.containsAll(attemptEdge.getTargets()) )
-			    throw new IllegalArgumentException("A node that is an end point in one of the attemptEdges was not in the nodes list");
-
-		this.contextEnabled = contextEnabled;
-		//add all the nodes before we worry about edges. check for NodeContext
-		for(final N attemptNode : attemptNodes)
-		{
-
-			// lets see if this ContextEdge will allow itself to join the graph
-			if(this.contextEnabled
-					&& (attemptNode instanceof ContextGraphNode)
-					&& !((ContextGraphNode)attemptNode).joiningGraph(this) )
-				continue;
-
-			this.adjacentNodes.put(attemptNode, new ArrayList<N>());
-			this.adjacentEdges.put(attemptNode, new HashSet<E>());
-		}
-
-		//Add the edges checking for Cloud Context.
-		if( this.contextEnabled )
-		{
-			this.edges = new HashSet<E>(attemptEdges.size());
-			for(E attemptEdge : attemptEdges)
-			{
-				// lets see if this ContextEdge will allow itself to join the graph
-				if(this.contextEnabled
-						&& (attemptEdge instanceof ContextGraphNode)
-						&& !((ContextGraphNode)attemptEdge).joiningGraph(this) )
-					continue;
-
-
-				this.edges.add(attemptEdge);
-				//populate adjacency maps
-				for(N currentNode : attemptEdge.getTargets())
-				{
-					boolean passedCurrent = false;
-					for(N neighborNode : attemptEdge.getTargets())
-					{
-						if( !passedCurrent && (neighborNode == currentNode))
-						{
-							passedCurrent = true;
-							continue;
-						}
-
-						//this is a neighbor node
-						if( !this.adjacentNodes.containsKey(currentNode) )
-							throw new IllegalStateException("After edges and nodes have applied their context restrictions an edge remained connected to a node not in this graph");
-
-						this.adjacentNodes.get(currentNode).add(neighborNode);
-					}
-
-					//this is a neighbor edge
-					if( !this.adjacentEdges.containsKey(currentNode) )
-						throw new IllegalStateException("After edges and nodes have applied their context restrictions an edge remained connected to a node not in this graph");
-					this.adjacentEdges.get(currentNode).add(attemptEdge);
-				}
-			}
-		}
-		else
-		{
-			this.edges = new HashSet<E>(attemptEdges);
-		}
-	}
-
-	/**
-	 * Gets the internal edges of the list.
-	 * @return The set of internal edges
-	 *
-	protected Set<E> getInternalEdges()
-	{
-		return this.edges;
-	}
-
-	/**
-	 * Gets the map of nodes to their associated set of edges.
-	 * @return The internal adjacency edges to nodes
-	 *
-	protected Map<N, Set<E>> getInternalAdjacencyEdges()
-	{
-		return this.adjacentEdges;
-	}
-
-	/**
-	 * Gets each node's list of adjacent nodes.
-	 * @return The map of nodes to adjacent nodes
-	 *
-	protected Map<N, List<N>> getInternalAdjacencyNodes()
-	{
-		return this.adjacentNodes;
-	}
-
-	@Override
-	public boolean isContextEnabled()
-	{
-		return this.contextEnabled;
-	}
-
-	/**
-	 * Gets all nodes in the map.
-	 * @return The unmodifiable set of nodes
-	 *
-	@Override
-	public Set<N> getTargets()
-	{
-		return Collections.unmodifiableSet(this.adjacentEdges.keySet());
-	}
-
-	/**
-	 * Gets all edges in the map.
-	 * @return The unmodifiable set of edges
-	 *
-	@Override
-	public Set<E> getEdges()
-	{
-		return Collections.unmodifiableSet(this.edges);
-	}
-
-	/**
-	 * Gets all edges adjacent to a given node.
-	 * @param node the end point for all edges to retrieve.
-	 * @return The edges adjacent to that node.
-	 *
-	@Override
-	public Set<E> getAdjacentEdges(final N node)
-	{
-		if( this.adjacentEdges.containsKey(node) )
-			return Collections.unmodifiableSet(this.adjacentEdges.get(node));
-		else
-			return Collections.<E>emptySet();
-	}
-
-	/**
-	 * Gets all nodes adjacent to the given node.
-	 * @param node The whose neighbors are to be returned.
-	 * @return All adjacent nodes to the given node
-	 *
-	@Override
-	public List<N> getAdjacentNodes(final N node)
-	{
-		return Collections.unmodifiableList(new ArrayList<N>(this.adjacentNodes.get(node)));
-	}
-
-	/**
-	 * Gets the traversable nodes adjacent to the given node.
-	 * @param node The whose traversable neighbors are to be returned.
-	 * @return The traversable nodes adjacent to the given node
-	 * @see com.syncleus.dann.graph.Cloud#getTraversableNodes(Object)
-	 *
-	@Override
-	public List<N> getTraversableAdjacentNodes(final N node)
-	{
-		final List<N> traversableNodes = new ArrayList<N>();
-		for(final E adjacentEdge : this.getAdjacentEdges(node))
-			traversableNodes.addAll(adjacentEdge.getTraversableNodes(node));
-		return Collections.unmodifiableList(traversableNodes);
-	}
-
-	/**
-	 * Gets the traversable edges from this node.
-	 * @param node edges returned will be traversable from this node.
-	 * @return The traversable edges from the given node
-	 * @see com.syncleus.dann.graph.Cloud#isTraversable(Object)
-	 *
-	@Override
-	public Set<E> getTraversableAdjacentEdges(final N node)
-	{
-		final Set<E> traversableEdges = new HashSet<E>();
-		for(final E adjacentEdge : this.getAdjacentEdges(node))
-			if( adjacentEdge.isTraversable(node) )
-				traversableEdges.add(adjacentEdge);
-		return Collections.unmodifiableSet(traversableEdges);
-	}
-
-	protected boolean add(final E newEdge)
-	{
-		if( newEdge == null )
-			throw new IllegalArgumentException("newEdge can not be null");
-		if( !this.getTargets().containsAll(newEdge.getTargets()) )
-			throw new IllegalArgumentException("newEdge has a node as an end point that is not part of the graph");
-
-		// if context is enabled lets check if it can join
-		if( this.isContextEnabled() && (newEdge instanceof ContextGraphNode)
-				&& !((ContextGraphNode)newEdge).joiningGraph(this) )
-			return false;
-
-		if( this.getInternalEdges().add(newEdge) )
-		{
-			for(final N currentNode : newEdge.getTargets())
-			{
-				this.getInternalAdjacencyEdges().get(currentNode).add(newEdge);
-
-				final List<N> newAdjacentNodes = new ArrayList<N>(newEdge.getTargets());
-				newAdjacentNodes.remove(currentNode);
-				for(final N newAdjacentNode : newAdjacentNodes)
-					this.getInternalAdjacencyNodes().get(currentNode).add(newAdjacentNode);
-			}
-			return true;
-		}
-
-		return false;
-	}
-
-	public boolean add(final N newNode)
-	{
-		if( newNode == null )
-			throw new IllegalArgumentException("newNode can not be null");
-
-		if( this.getInternalAdjacencyEdges().containsKey(newNode) )
-			return false;
-
-		// if context is enabled lets check if it can join
-		if( this.isContextEnabled() && (newNode instanceof ContextGraphNode)
-				&& !((ContextGraphNode)newNode).joiningGraph(this) )
-			return false;
-
-		this.getInternalAdjacencyEdges().put(newNode, new HashSet<E>());
-		this.getInternalAdjacencyNodes().put(newNode, new ArrayList<N>());
-		return true;
-	}
-
-	protected boolean remove(final E edgeToRemove)
-	{
-		if( edgeToRemove == null )
-			throw new IllegalArgumentException("removeSynapse can not be null");
-
-		if( !this.getInternalEdges().contains(edgeToRemove) )
-			return false;
-
-		// if context is enabled lets check if it can join
-		if( this.isContextEnabled()
-				&& (edgeToRemove instanceof ContextGraphNode)
-				&& !((ContextGraphNode)edgeToRemove).leavingGraph(this) )
-			return false;
-
-		if( !this.getInternalEdges().remove(edgeToRemove) )
-			throw new IllegalStateException("could not remove edge even though it is present");
-
-		for(final N removeNode : edgeToRemove.getTargets())
-		{
-			this.getInternalAdjacencyEdges().get(removeNode).remove(edgeToRemove);
-
-			final List<N> removeAdjacentNodes = new ArrayList<N>(edgeToRemove.getTargets());
-			removeAdjacentNodes.remove(removeNode);
-			for(final N removeAdjacentNode : removeAdjacentNodes)
-				this.getInternalAdjacencyNodes().get(removeNode).remove(removeAdjacentNode);
-		}
-		return true;
-	}
-
-	protected boolean remove(final N nodeToRemove)
-	{
-		if( nodeToRemove == null )
-			throw new IllegalArgumentException("node can not be null");
-
-		if( !this.getInternalAdjacencyEdges().containsKey(nodeToRemove) )
-			return false;
-
-		// if context is enabled lets check if it can join
-		if( this.isContextEnabled()
-				&& (nodeToRemove instanceof ContextGraphNode)
-				&& !((ContextGraphNode)nodeToRemove).leavingGraph(this) )
-			return false;
-
-		final Set<E> removeEdges = this.getInternalAdjacencyEdges().get(nodeToRemove);
-
-		//remove all the edges
-		for(final E removeEdge : removeEdges)
-			this.remove(removeEdge);
-
-		//modify edges by removing the node to remove
-		final Set<E> newEdges = new HashSet<E>();
-		for(final E removeEdge : removeEdges)
-		{
-			E newEdge = (E) removeEdge.disconnect(nodeToRemove);
-			while( (newEdge != null) && (newEdge.getTargets().contains(nodeToRemove)) )
-				newEdge = (E) removeEdge.disconnect(nodeToRemove);
-			if( newEdge != null )
-				newEdges.add(newEdge);
-		}
-
-		//add the modified edges
-		for(final E newEdge : newEdges)
-			this.add(newEdge);
-
-		//remove the node itself
-		this.getInternalAdjacencyEdges().remove(nodeToRemove);
-		this.getInternalAdjacencyNodes().remove(nodeToRemove);
-
-		return true;
-	}
-
-	protected boolean clear()
-	{
-		boolean removedSomething = false;
-
-		//first lets remove all the edges
-		for(E edge : this.getEdges())
-		{
-			//lets just make sure we arent some how getting an we dont actually own, this shouldnt be possible so its
-			//an assert. This ensures that if remove() comes back false it must be because the context didnt allow it.
-			assert this.getInternalEdges().contains(edge);
-
-			if( !this.remove(edge) )
-				throw new IllegalStateException("one of the edges will not allow itself to leave this graph");
-
-			removedSomething = true;
-		}
-
-		//now lets remove all the nodes
-		for(N node : this.getTargets())
-		{
-			//lets just make sure we arent some how getting an we dont actually own, this shouldnt be possible so its
-			//an assert. This ensures that if remove() comes back false it must be because the context didnt allow it.
-			assert ( !this.getInternalAdjacencyEdges().containsKey(node) );
-
-			if( !this.remove(node) )
-				throw new IllegalStateException("one of the nodes will not allow itself to leave this graph");
-
-			removedSomething = true;
-		}
-
-		return removedSomething;
-	}
-
-
-	/**
-	 * Clones the current object.
-	 * @return A clone of the current object, with no changes
-	 *
-	@Override
-	protected AbstractAdjacencyGraph<N, E> clone()
-	{
-		try
-		{
-			final AbstractAdjacencyGraph<N, E> cloneGraph = (AbstractAdjacencyGraph<N, E>) super.clone();
-
-			//lets instantiate some new datastructurs for our clone
-			cloneGraph.adjacentEdges = new HashMap<N, Set<E>>();
-			cloneGraph.adjacentNodes = new HashMap<N, List<N>>();
-
-			//add all the nodes before we worry about edges. check for NodeContext
-			for(N attemptNode : this.getTargets())
-			{
-				// lets see if this ContextEdge will allow itself to join the graph
-				if(this.contextEnabled
-						&& (attemptNode instanceof ContextGraphNode)
-						&& !((ContextGraphNode)attemptNode).joiningGraph(cloneGraph) )
-					continue;
-
-				cloneGraph.adjacentNodes.put(attemptNode, new ArrayList<N>());
-				cloneGraph.adjacentEdges.put(attemptNode, new HashSet<E>());
-			}
-
-			//Add the edges checking for Cloud Context.
-			if( this.contextEnabled )
-			{
-				cloneGraph.edges = new HashSet<E>(this.getEdges().size());
-				for(E attemptEdge : this.getEdges())
-				{
-					// lets see if this ContextEdge will allow itself to join the graph
-					if(this.contextEnabled
-							&& (attemptEdge instanceof ContextGraphNode)
-							&& !((ContextGraphNode)attemptEdge).joiningGraph(cloneGraph) )
-						continue;
-
-					cloneGraph.edges.add(attemptEdge);
-					//populate adjacency maps
-					for(N currentNode : attemptEdge.getTargets())
-					{
-						boolean passedCurrent = false;
-						for(N neighborNode : attemptEdge.getTargets())
-						{
-							if( !passedCurrent && (neighborNode == currentNode))
-							{
-								passedCurrent = true;
-								continue;
-							}
-
-							//this is a neighbor node
-							if( !cloneGraph.adjacentNodes.containsKey(currentNode) )
-								throw new IllegalStateException("After edges and nodes have applied their context restrictions an edge remained connected to a node not in this graph");
-
-							cloneGraph.adjacentNodes.get(currentNode).add(neighborNode);
-						}
-
-						//this is a neighbor edge
-						if( !cloneGraph.adjacentEdges.containsKey(currentNode) )
-							throw new IllegalStateException("After edges and nodes have applied their context restrictions an edge remained connected to a node not in this graph");
-						cloneGraph.adjacentEdges.get(currentNode).add(attemptEdge);
-					}
-				}
-			}
-			else
-			{
-				cloneGraph.edges = new HashSet<E>(this.getEdges());
-			}
-
-			return cloneGraph;
-		}
-		catch(CloneNotSupportedException caught)
-		{
-			LOGGER.error("Unexpectedly could not clone Graph.", caught);
-			throw new UnexpectedDannError("Unexpectedly could not clone graph", caught);
-		}
-	}
-*/
-
 	protected abstract Set<EdgeEndpoint<N,E>> getAdjacentEdgeEndpoints(Graph.NodeEndpoint<?, ?> nodeEndpoint);
 
 	protected PathFinder<N,E> getPathFinder()
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractMutableAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractMutableAdjacencyGraph.java
index a42d832d37141b816b6ca02daec7a1d9d981d16c..c0fe3ff47535fc1c83683a173fbea250b031f4b3 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractMutableAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractMutableAdjacencyGraph.java
@@ -36,8 +36,6 @@ public abstract class AbstractMutableAdjacencyGraph<
 	{
 	}
 
-
-
 	protected void internalJoinNode(final MutableGraph.NodeEndpoint<N, E> endpoint) throws InvalidGraphException
 	{
 		if(endpoint == null)
@@ -203,95 +201,6 @@ public abstract class AbstractMutableAdjacencyGraph<
 		return false;
 	}
 
-/*
-		private class NodeTargetSet extends AbstractTargetSet<N>
-		{
-			@Override
-			public int size()
-			{
-				return nodeAdjacency.size();
-			}
-
-			@Override
-			public boolean isEmpty()
-			{
-				return nodeAdjacency.isEmpty();
-			}
-
-			@Override
-			public boolean contains(N o)
-			{
-				return nodeAdjacency.containsKey(o);
-			}
-
-			@Override
-			public Iterator<N> iterator()
-			{
-				return Collections.unmodifiableSet(nodeAdjacency.keySet()).iterator();
-			}
-
-			@Override
-			public Object[] toArray()
-			{
-				Object[] array = new Object[this.size()];
-				int arrayIndex = 0;
-				for(NEP nodeEndpoint : nodeAdjacency.keySet())
-				{
-					array[arrayIndex] = nodeEndpoint.getTarget();
-					arrayIndex++;
-				}
-				return array;
-			}
-
-			@Override
-			public <T> T[] toArray(T[] a)
-			{
-				return nodeAdjacency.keySet().toArray(a);
-			}
-
-			@Override
-			public boolean add(N n)
-			{
-				throw new UnsupportedOperationException("This set is read-only!");
-			}
-
-			@Override
-			public boolean remove(Object o)
-			{
-				throw new UnsupportedOperationException("This set is read-only!");
-			}
-
-			@Override
-			public boolean containsAll(Collection<?> c)
-			{
-				return nodeAdjacency.keySet()
-			}
-
-			@Override
-			public boolean addAll(Collection<? extends N> c)
-			{
-				return false;  //To change body of implemented methods use File | Settings | File Templates.
-			}
-
-			@Override
-			public boolean retainAll(Collection<?> c)
-			{
-				return false;  //To change body of implemented methods use File | Settings | File Templates.
-			}
-
-			@Override
-			public boolean removeAll(Collection<?> c)
-			{
-				return false;  //To change body of implemented methods use File | Settings | File Templates.
-			}
-
-			@Override
-			public void clear()
-			{
-				//To change body of implemented methods use File | Settings | File Templates.
-			}
-		};
-*/
 
 	protected abstract class AbstractNodeEndpoint extends AbstractAdjacencyGraph<N,E,NE,EE>.AbstractNodeEndpoint implements MutableGraph.NodeEndpoint<N, E>
 	{
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableGraph.java b/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
index 02d28d21964db6724c2664eb967151bcf41a2129..9be50dc7c6e4db61e4166d77f173f5ddf913d5a2 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
@@ -23,30 +23,13 @@ public interface AssignableGraph<
 	  	E extends Cloud<N,? extends Cloud.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>>
-//public interface AssignableGraph<P extends Cloud<N>, N extends P, E extends P> extends Graph<N,E>, Cloud<P>, MutableEdge<P>
-//public interface AssignableGraph<P extends AssignableGraph.Foo, N extends P, E extends Cloud<N> & AssignableGraph.Foo> extends Graph<N,E>, Cloud<P>, MutableEdge<P>
+	  >  extends Graph<N,E,NEP,EEP>
 {
-/*
-	@Override
-	Set<? extends Graph.EdgeEndpoint<? extends Foo, N, E, E>> getEdgeEndpoints();
-
-	void test()
-	{
-		Graph.EdgeEndpoint<? extends Object, N, E, E> test = ((Graph<N,E>)this).getEdgeEndpoints().iterator().next();
-		Graph.EdgeEndpoint<? extends Foo, N, E, E> test2 = this.getEdgeEndpoints().iterator().next();
-	}
-
-	interface Foo
-	{
-	}
-*/
-
 
 	interface NodeEndpoint<
 		  ON,
 		  OE extends Cloud<ON,? extends Cloud.Endpoint<? extends ON>>
-	  > extends Graph.NodeEndpoint<ON,OE>, MutableEdge.Endpoint<ON>
+	  > extends Graph.NodeEndpoint<ON,OE>, Cloud.AssignableEndpoint<ON>
 	{
 		void setTarget(ON newTarget) throws InvalidGraphException;
 	};
@@ -54,14 +37,8 @@ public interface AssignableGraph<
 	interface EdgeEndpoint<
 		  ON,
 		  OE extends Cloud<ON,? extends Cloud.Endpoint<? extends ON>>
-	  > extends Graph.EdgeEndpoint<ON,OE>, MutableEdge.Endpoint<OE>
+	  > extends Graph.EdgeEndpoint<ON,OE>, Cloud.AssignableEndpoint<OE>
 	{
 		void setTarget(OE newTarget) throws InvalidGraphException;
 	};
-
-/*
-	interface Endpoint<PN, EN extends PN, NN extends PN, MN extends PN> extends Graph.Endpoint<MN,EN,NN,PN>, MutableEdge.Endpoint<PN, MN>
-	{
-	};
-*/
 }
diff --git a/src/main/java/com/syncleus/dann/graph/Cloud.java b/src/main/java/com/syncleus/dann/graph/Cloud.java
index 053fb050f4fdeb199d1c7c2c13f4c41dee28f512..094c4cac65fa3d7a075847823726d28eb61971e1 100644
--- a/src/main/java/com/syncleus/dann/graph/Cloud.java
+++ b/src/main/java/com/syncleus/dann/graph/Cloud.java
@@ -40,6 +40,11 @@ public interface Cloud<
 		T getTarget();
 	};
 
+	interface AssignableEndpoint<T> extends Cloud.Endpoint<T>
+	{
+		void setTarget(T newTarget) throws InvalidEdgeException;
+	};
+
 	Set<EP> getEndpoints();
 	Set<EP> getEndpoints(Object target);
 	Set<T> getTargets();
diff --git a/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
index 4971ff0a02ab6f2695d5246e8df964577cc19dee..747fca123ef073074041c8e859eba5ee2b466c28 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
@@ -18,9 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import java.util.Set;
-import com.syncleus.dann.xml.Namer;
-
 public final class MutableAdjacencyGraph<
 	  	N,
 	  	E extends Cloud<N,? extends Cloud.Endpoint<N>>
diff --git a/src/main/java/com/syncleus/dann/graph/MutableEdge.java b/src/main/java/com/syncleus/dann/graph/MutableEdge.java
index 021d4c6251bc848bc5e976d03e21a366cd6adfc5..9559255572bac270b033af6feb084ef7be06af20 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableEdge.java
@@ -20,11 +20,10 @@ package com.syncleus.dann.graph;
 
 public interface MutableEdge<
 	  	T,
-	  	EP extends Edge.Endpoint<? extends T>
-	  > extends Edge<T, EP>
+	  	EP extends MutableEdge.Endpoint<? extends T>
+	  > extends Edge<T, EP>, AssignableCloud<T,EP>
 {
-	interface Endpoint<T> extends Cloud.Endpoint<T>
+	interface Endpoint<T> extends Edge.Endpoint<T>, AssignableCloud.Endpoint<T>
 	{
-		void setTarget(T newTarget) throws InvalidEdgeException;
 	};
 }