diff --git a/src/main/java/com/syncleus/dann/attributes/hat/MutableAttributeTreeAdjacencyGraph.java b/src/main/java/com/syncleus/dann/attributes/hat/MutableAttributeTreeAdjacencyGraph.java
index f324ec86081bb45e38c5653f75cd90b8d5df8171..c006ecb95df3ec90ccfaec2aee3d04fe95dc6d37 100644
--- a/src/main/java/com/syncleus/dann/attributes/hat/MutableAttributeTreeAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/attributes/hat/MutableAttributeTreeAdjacencyGraph.java
@@ -20,6 +20,7 @@ package com.syncleus.dann.attributes.hat;
 
 import java.util.Set;
 import com.syncleus.dann.graph.DirectedEdge;
+import com.syncleus.dann.graph.Graph;
 import com.syncleus.dann.graph.MutableTreeAdjacencyGraph;
 
 // TODO we need to handle clone and cloneAdd and similar methods differently since the nodes here must know which graph it belongs to
@@ -59,49 +60,49 @@ public class MutableAttributeTreeAdjacencyGraph<N extends AbstractHierarchicalAt
 	}
 
 	@Override
-	public MutableAttributeTreeAdjacencyGraph<N, E, T> cloneAdd(final E newEdge)
+	public Graph<N, E> cloneAdd(final E newEdge)
 	{
 		// TODO Fix this!
 		throw new IllegalStateException("Operation not yet supported");
 	}
 
 	@Override
-	public MutableAttributeTreeAdjacencyGraph<N, E, T> cloneAdd(final N newNode)
+	public Graph<N, E> cloneAdd(final N newNode)
 	{
 		// TODO Fix this!
 		throw new IllegalStateException("Operation not yet supported");
 	}
 
 	@Override
-	public MutableAttributeTreeAdjacencyGraph<N, E, T> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
+	public Graph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
 	{
 		// TODO Fix this!
 		throw new IllegalStateException("Operation not yet supported");
 	}
 
 	@Override
-	public MutableAttributeTreeAdjacencyGraph<N, E, T> cloneRemove(final E edgeToRemove)
+	public Graph<N, E> cloneRemove(final E edgeToRemove)
 	{
 		// TODO Fix this!
 		throw new IllegalStateException("Operation not yet supported");
 	}
 
 	@Override
-	public MutableAttributeTreeAdjacencyGraph<N, E, T> cloneRemove(final N nodeToRemove)
+	public Graph<N, E> cloneRemove(final N nodeToRemove)
 	{
 		// TODO Fix this!
 		throw new IllegalStateException("Operation not yet supported");
 	}
 
 	@Override
-	public MutableAttributeTreeAdjacencyGraph<N, E, T> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
+	public Graph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
 	{
 		// TODO Fix this!
 		throw new IllegalStateException("Operation not yet supported");
 	}
 
 	@Override
-	public MutableAttributeTreeAdjacencyGraph<N, E, T> clone()
+	public Object clone()
 	{
 		// TODO Fix this!
 		throw new IllegalStateException("Operation not yet supported");
diff --git a/src/main/java/com/syncleus/dann/genetics/AbstractValueGene.java b/src/main/java/com/syncleus/dann/genetics/AbstractValueGene.java
index 00f350ff3ec4fd6fd3d9826c6c28e743621093e8..ddf00c1da0b3d7eea60db5e069218cbd9a85713d 100644
--- a/src/main/java/com/syncleus/dann/genetics/AbstractValueGene.java
+++ b/src/main/java/com/syncleus/dann/genetics/AbstractValueGene.java
@@ -107,7 +107,7 @@ public abstract class AbstractValueGene<N extends MutableNumber> implements Valu
 	 */
 	@SuppressWarnings("unchecked")
 	@Override
-	public AbstractValueGene clone()
+	public Object clone()
 	{
 		try
 		{
diff --git a/src/main/java/com/syncleus/dann/genetics/ByteValueGene.java b/src/main/java/com/syncleus/dann/genetics/ByteValueGene.java
index 2520ea5ec8a4279d48f23033273edfa6b0d4f9a3..c9c6d3400438c0b9456a4e9e567aba6f4c44058d 100644
--- a/src/main/java/com/syncleus/dann/genetics/ByteValueGene.java
+++ b/src/main/java/com/syncleus/dann/genetics/ByteValueGene.java
@@ -83,18 +83,6 @@ public class ByteValueGene extends AbstractValueGene<MutableByte>
 		super(copyGene);
 	}
 
-	/**
-	 * Creates a new instance of this object that is an exact copy.
-	 *
-	 * @return an exact copy of this object.
-	 * @since 2.0
-	 */
-	@Override
-	public ByteValueGene clone()
-	{
-		return (ByteValueGene) super.clone();
-	}
-
 	/**
 	 * This will make a copy of the object and mutate it. The mutation has a normal
 	 * distribution multiplied by the deviation.
@@ -107,7 +95,7 @@ public class ByteValueGene extends AbstractValueGene<MutableByte>
 	 */
 	public ByteValueGene mutate(final double deviation)
 	{
-		final ByteValueGene copy = this.clone();
+		final ByteValueGene copy = (ByteValueGene) this.clone();
 		copy.internalMutate(deviation);
 
 		return copy;
diff --git a/src/main/java/com/syncleus/dann/genetics/Chromatid.java b/src/main/java/com/syncleus/dann/genetics/Chromatid.java
index 50b9e78426568fb2e2517d1c459ca15586a79805..bf1e627c64103c21cbb2a0e2d70a88413a3858e9 100644
--- a/src/main/java/com/syncleus/dann/genetics/Chromatid.java
+++ b/src/main/java/com/syncleus/dann/genetics/Chromatid.java
@@ -59,13 +59,4 @@ public interface Chromatid<G extends Gene> extends Cloneable
 	 * @since 2.0
 	 */
 	void crossover(List<G> geneticSegment, int point);
-	/**
-	 * All children of this class should override this method and return their own
-	 * class type even if it is abstract. It should return a copy without any
-	 * mutation.
-	 *
-	 * @return an exact copy of this object.
-	 * @since 2.0
-	 */
-	Chromatid<G> clone();
 }
diff --git a/src/main/java/com/syncleus/dann/genetics/DoubleValueGene.java b/src/main/java/com/syncleus/dann/genetics/DoubleValueGene.java
index 78137ea9b93852667c2e72c5784e4de539efe7d2..548a1f9a3d4ee77b2ddaba436521cd9a21771f65 100644
--- a/src/main/java/com/syncleus/dann/genetics/DoubleValueGene.java
+++ b/src/main/java/com/syncleus/dann/genetics/DoubleValueGene.java
@@ -83,18 +83,6 @@ public class DoubleValueGene extends AbstractValueGene<MutableDouble>
 		super(copyGene);
 	}
 
-	/**
-	 * Creates a new instance of this object that is an exact copy.
-	 *
-	 * @return an exact copy of this object.
-	 * @since 2.0
-	 */
-	@Override
-	public DoubleValueGene clone()
-	{
-		return (DoubleValueGene) super.clone();
-	}
-
 	/**
 	 * This will make a copy of the object and mutate it. The mutation has a normal
 	 * distribution multiplied by the deviation.
@@ -107,7 +95,7 @@ public class DoubleValueGene extends AbstractValueGene<MutableDouble>
 	 */
 	public DoubleValueGene mutate(final double deviation)
 	{
-		final DoubleValueGene copy = this.clone();
+		final DoubleValueGene copy = (DoubleValueGene) this.clone();
 		copy.internalMutate(deviation);
 
 		return copy;
diff --git a/src/main/java/com/syncleus/dann/genetics/FloatValueGene.java b/src/main/java/com/syncleus/dann/genetics/FloatValueGene.java
index 0d90c280f3d1d86031f0f58ed116d6c6c350f845..b6c26af442d485028576171147d0878955361363 100644
--- a/src/main/java/com/syncleus/dann/genetics/FloatValueGene.java
+++ b/src/main/java/com/syncleus/dann/genetics/FloatValueGene.java
@@ -83,18 +83,6 @@ public class FloatValueGene extends AbstractValueGene<MutableFloat>
 		super(copyGene);
 	}
 
-	/**
-	 * Creates a new instance of this object that is an exact copy.
-	 *
-	 * @return an exact copy of this object.
-	 * @since 2.0
-	 */
-	@Override
-	public FloatValueGene clone()
-	{
-		return (FloatValueGene) super.clone();
-	}
-
 	/**
 	 * This will make a copy of the object and mutate it. The mutation has a normal
 	 * distribution multiplied by the deviation.
@@ -107,7 +95,7 @@ public class FloatValueGene extends AbstractValueGene<MutableFloat>
 	 */
 	public FloatValueGene mutate(final double deviation)
 	{
-		final FloatValueGene copy = this.clone();
+		final FloatValueGene copy = (FloatValueGene) this.clone();
 		copy.internalMutate(deviation);
 
 		return copy;
diff --git a/src/main/java/com/syncleus/dann/genetics/Gene.java b/src/main/java/com/syncleus/dann/genetics/Gene.java
index 9f11fa44b2e0aa61d0ca6464f4210b3f2481307d..ee074caedb894ce7325505ea771267dfa4f16a38 100644
--- a/src/main/java/com/syncleus/dann/genetics/Gene.java
+++ b/src/main/java/com/syncleus/dann/genetics/Gene.java
@@ -27,15 +27,6 @@ package com.syncleus.dann.genetics;
  */
 public interface Gene extends Cloneable
 {
-	/**
-	 * All children of this class should override this method and return their own
-	 * class type even if it is abstract. It should return a copy without any
-	 * mutation.
-	 *
-	 * @return an exact copy of this object.
-	 * @since 2.0
-	 */
-	Gene clone();
 	/**
 	 * The current expression activity. The meaning of this value depends on the
 	 * type of gene and the genetic system being used.
diff --git a/src/main/java/com/syncleus/dann/genetics/GeneticAlgorithmChromosome.java b/src/main/java/com/syncleus/dann/genetics/GeneticAlgorithmChromosome.java
index c31bc49820f9c460a2b08dca5a84706c3533dfee..af9628e3e3344e22477acea2f210f0a3af21cbfa 100644
--- a/src/main/java/com/syncleus/dann/genetics/GeneticAlgorithmChromosome.java
+++ b/src/main/java/com/syncleus/dann/genetics/GeneticAlgorithmChromosome.java
@@ -153,7 +153,7 @@ public class GeneticAlgorithmChromosome implements Chromatid<AbstractValueGene>,
 	 * @since 2.0
 	 */
 	@Override
-	public GeneticAlgorithmChromosome clone()
+	public Object clone()
 	{
 		try
 		{
@@ -181,7 +181,7 @@ public class GeneticAlgorithmChromosome implements Chromatid<AbstractValueGene>,
 	 */
 	public GeneticAlgorithmChromosome mutate(final double deviation)
 	{
-		final GeneticAlgorithmChromosome mutated = this.clone();
+		final GeneticAlgorithmChromosome mutated = (GeneticAlgorithmChromosome) this.clone();
 		mutated.alleles.clear();
 		for(final AbstractValueGene allele : this.alleles)
 			mutated.alleles.add(allele.mutate(deviation));
diff --git a/src/main/java/com/syncleus/dann/genetics/IntegerValueGene.java b/src/main/java/com/syncleus/dann/genetics/IntegerValueGene.java
index 7b0c7216e55c0399116c30fafca57ef37cafc699..aa25e1806f07d351db22de05fe17b8a69af734bd 100644
--- a/src/main/java/com/syncleus/dann/genetics/IntegerValueGene.java
+++ b/src/main/java/com/syncleus/dann/genetics/IntegerValueGene.java
@@ -83,18 +83,6 @@ public class IntegerValueGene extends AbstractValueGene<MutableInteger>
 		super(copyGene);
 	}
 
-	/**
-	 * Creates a new instance of this object that is an exact copy.
-	 *
-	 * @return an exact copy of this object.
-	 * @since 2.0
-	 */
-	@Override
-	public IntegerValueGene clone()
-	{
-		return (IntegerValueGene) super.clone();
-	}
-
 	/**
 	 * This will make a copy of the object and mutate it. The mutation has a normal
 	 * distribution multiplied by the deviation.
@@ -107,7 +95,7 @@ public class IntegerValueGene extends AbstractValueGene<MutableInteger>
 	 */
 	public IntegerValueGene mutate(final double deviation)
 	{
-		final IntegerValueGene copy = this.clone();
+		final IntegerValueGene copy = (IntegerValueGene) this.clone();
 		copy.internalMutate(deviation);
 
 		return copy;
diff --git a/src/main/java/com/syncleus/dann/genetics/LongValueGene.java b/src/main/java/com/syncleus/dann/genetics/LongValueGene.java
index d9fb2fc65e3375af21dc878507f2b391111df41a..4fb87927261d5a8814e2245b53388e1cd7d507cd 100644
--- a/src/main/java/com/syncleus/dann/genetics/LongValueGene.java
+++ b/src/main/java/com/syncleus/dann/genetics/LongValueGene.java
@@ -83,18 +83,6 @@ public class LongValueGene extends AbstractValueGene<MutableLong>
 		super(copyGene);
 	}
 
-	/**
-	 * Creates a new instance of this object that is an exact copy.
-	 *
-	 * @return an exact copy of this object.
-	 * @since 2.0
-	 */
-	@Override
-	public LongValueGene clone()
-	{
-		return (LongValueGene) super.clone();
-	}
-
 	/**
 	 * This will make a copy of the object and mutate it. The mutation has a normal
 	 * distribution multiplied by the deviation.
@@ -107,7 +95,7 @@ public class LongValueGene extends AbstractValueGene<MutableLong>
 	 */
 	public LongValueGene mutate(final double deviation)
 	{
-		final LongValueGene copy = this.clone();
+		final LongValueGene copy = (LongValueGene) this.clone();
 		copy.internalMutate(deviation);
 
 		return copy;
diff --git a/src/main/java/com/syncleus/dann/genetics/MutableByte.java b/src/main/java/com/syncleus/dann/genetics/MutableByte.java
index b031eddcae3a8dbe2f14f9513ae502a92e4dea33..6cc08b758921e58a9a16bcb85bc9de720afbf0da 100644
--- a/src/main/java/com/syncleus/dann/genetics/MutableByte.java
+++ b/src/main/java/com/syncleus/dann/genetics/MutableByte.java
@@ -64,18 +64,6 @@ public class MutableByte extends MutableNumber<Byte> implements Comparable<Mutab
 		super(value);
 	}
 
-	/**
-	 * An new exact copy of this object with the same value.
-	 *
-	 * @return a new exact copy of this object with the same value.
-	 * @since 2.0
-	 */
-	@Override
-	public MutableByte clone()
-	{
-		return (MutableByte) super.clone();
-	}
-
 	/**
 	 * This will make a copy of the object and mutate it. The mutation has a
 	 * normal distribution multiplied by the deviation. If the Number is mutated
diff --git a/src/main/java/com/syncleus/dann/genetics/MutableDouble.java b/src/main/java/com/syncleus/dann/genetics/MutableDouble.java
index a45d41fb05329d5b16257c32430cec2fbb1d3706..8725647a3667c8d8fefcd339617d2dad1acba2aa 100644
--- a/src/main/java/com/syncleus/dann/genetics/MutableDouble.java
+++ b/src/main/java/com/syncleus/dann/genetics/MutableDouble.java
@@ -64,18 +64,6 @@ public class MutableDouble extends MutableNumber<Double> implements Comparable<M
 		super(value);
 	}
 
-	/**
-	 * An new exact copy of this object with the same value.
-	 *
-	 * @return a new exact copy of this object with the same value.
-	 * @since 2.0
-	 */
-	@Override
-	public MutableDouble clone()
-	{
-		return (MutableDouble) super.clone();
-	}
-
 	/**
 	 * This will make a copy of the object and mutate it. The mutation has a
 	 * normal distribution multiplied by the deviation. If the Number is mutated
diff --git a/src/main/java/com/syncleus/dann/genetics/MutableFloat.java b/src/main/java/com/syncleus/dann/genetics/MutableFloat.java
index 43d4aad1157be80287630f1a2c9c7c6900411cfd..a3c0dfea9f79a2efae676476c86d2d8b540471eb 100644
--- a/src/main/java/com/syncleus/dann/genetics/MutableFloat.java
+++ b/src/main/java/com/syncleus/dann/genetics/MutableFloat.java
@@ -64,18 +64,6 @@ public class MutableFloat extends MutableNumber<Float> implements Comparable<Mut
 		super(value);
 	}
 
-	/**
-	 * An new exact copy of this object with the same value.
-	 *
-	 * @return a new exact copy of this object with the same value.
-	 * @since 2.0
-	 */
-	@Override
-	public MutableFloat clone()
-	{
-		return (MutableFloat) super.clone();
-	}
-
 	/**
 	 * This will make a copy of the object and mutate it. The mutation has a
 	 * normal distribution multiplied by the deviation. If the Number is mutated
diff --git a/src/main/java/com/syncleus/dann/genetics/MutableInteger.java b/src/main/java/com/syncleus/dann/genetics/MutableInteger.java
index 718c9f85d876c406da585c034036d24e0761e7ca..c110f3fedd756afbe53e7ed45d824a478a3768da 100644
--- a/src/main/java/com/syncleus/dann/genetics/MutableInteger.java
+++ b/src/main/java/com/syncleus/dann/genetics/MutableInteger.java
@@ -64,18 +64,6 @@ public class MutableInteger extends MutableNumber<Integer> implements Comparable
 		super(value);
 	}
 
-	/**
-	 * An new exact copy of this object with the same value.
-	 *
-	 * @return a new exact copy of this object with the same value.
-	 * @since 2.0
-	 */
-	@Override
-	public MutableInteger clone()
-	{
-		return (MutableInteger) super.clone();
-	}
-
 	/**
 	 * This will make a copy of the object and mutate it. The mutation has a
 	 * normal distribution multiplied by the deviation. If the Number is mutated
diff --git a/src/main/java/com/syncleus/dann/genetics/MutableLong.java b/src/main/java/com/syncleus/dann/genetics/MutableLong.java
index e104256674a1875c3ab86c3fc4bd76ba684b5bb1..9d12b498c2f0907583821eadba89981bfed334c3 100644
--- a/src/main/java/com/syncleus/dann/genetics/MutableLong.java
+++ b/src/main/java/com/syncleus/dann/genetics/MutableLong.java
@@ -64,18 +64,6 @@ public class MutableLong extends MutableNumber<Long> implements Comparable<Mutab
 		super(value);
 	}
 
-	/**
-	 * An new exact copy of this object with the same value.
-	 *
-	 * @return a new exact copy of this object with the same value.
-	 * @since 2.0
-	 */
-	@Override
-	public MutableLong clone()
-	{
-		return (MutableLong) super.clone();
-	}
-
 	/**
 	 * This will make a copy of the object and mutate it. The mutation has a
 	 * normal distribution multiplied by the deviation. If the Number is mutated
diff --git a/src/main/java/com/syncleus/dann/genetics/MutableNumber.java b/src/main/java/com/syncleus/dann/genetics/MutableNumber.java
index 89b525f30a6faa9f665499dc74c92cc0d525e861..5dd13b6997405f16515bf2778572fc5333562db6 100644
--- a/src/main/java/com/syncleus/dann/genetics/MutableNumber.java
+++ b/src/main/java/com/syncleus/dann/genetics/MutableNumber.java
@@ -202,7 +202,7 @@ public abstract class MutableNumber<N extends Number> extends Number implements
 	 */
 	@SuppressWarnings("unchecked")
 	@Override
-	public MutableNumber<N> clone()
+	public Object clone()
 	{
 		try
 		{
diff --git a/src/main/java/com/syncleus/dann/genetics/MutableShort.java b/src/main/java/com/syncleus/dann/genetics/MutableShort.java
index e21c0b1e9693af0feedc707fe5bb112484ea4d82..6be7776acb268f2cbc01c72994d1b5576961401d 100644
--- a/src/main/java/com/syncleus/dann/genetics/MutableShort.java
+++ b/src/main/java/com/syncleus/dann/genetics/MutableShort.java
@@ -64,18 +64,6 @@ public class MutableShort extends MutableNumber<Short> implements Comparable<Mut
 		super(value);
 	}
 
-	/**
-	 * An new exact copy of this object with the same value.
-	 *
-	 * @return a new exact copy of this object with the same value.
-	 * @since 2.0
-	 */
-	@Override
-	public MutableShort clone()
-	{
-		return (MutableShort) super.clone();
-	}
-
 	/**
 	 * This will make a copy of the object and mutate it. The mutation has a
 	 * normal distribution multiplied by the deviation. If the Number is mutated
diff --git a/src/main/java/com/syncleus/dann/genetics/ShortValueGene.java b/src/main/java/com/syncleus/dann/genetics/ShortValueGene.java
index cb1f2e2cbf92f5b1455976f6163faa4d533cd5e3..70cc803430b049ed5835fa87377ace0c71a021ee 100644
--- a/src/main/java/com/syncleus/dann/genetics/ShortValueGene.java
+++ b/src/main/java/com/syncleus/dann/genetics/ShortValueGene.java
@@ -83,18 +83,6 @@ public class ShortValueGene extends AbstractValueGene<MutableShort>
 		super(copyGene);
 	}
 
-	/**
-	 * Creates a new instance of this object that is an exact copy.
-	 *
-	 * @return an exact copy of this object.
-	 * @since 2.0
-	 */
-	@Override
-	public ShortValueGene clone()
-	{
-		return (ShortValueGene) super.clone();
-	}
-
 	/**
 	 * This will make a copy of the object and mutate it. The mutation has a normal
 	 * distribution multiplied by the deviation.
@@ -107,7 +95,7 @@ public class ShortValueGene extends AbstractValueGene<MutableShort>
 	 */
 	public ShortValueGene mutate(final double deviation)
 	{
-		final ShortValueGene copy = this.clone();
+		final ShortValueGene copy = (ShortValueGene) this.clone();
 		copy.internalMutate(deviation);
 
 		return copy;
diff --git a/src/main/java/com/syncleus/dann/genetics/wavelets/AbstractKey.java b/src/main/java/com/syncleus/dann/genetics/wavelets/AbstractKey.java
index 3e9c9eed09774889e295e74cb76db65e33a2d577..d0fdf75f52a3ba89c87b81ef728de88ebaf004e2 100644
--- a/src/main/java/com/syncleus/dann/genetics/wavelets/AbstractKey.java
+++ b/src/main/java/com/syncleus/dann/genetics/wavelets/AbstractKey.java
@@ -128,7 +128,7 @@ public abstract class AbstractKey implements Cloneable
 	}
 
 	@Override
-	public AbstractKey clone()
+	public Object clone()
 	{
 		try
 		{
@@ -155,7 +155,7 @@ public abstract class AbstractKey implements Cloneable
 		else
 			newPoints.remove(point.getNumber());
 
-		final AbstractKey copy = this.clone();
+		final AbstractKey copy = (AbstractKey) this.clone();
 		copy.points = Collections.unmodifiableMap(newPoints);
 		return copy;
 	}
diff --git a/src/main/java/com/syncleus/dann/genetics/wavelets/AbstractWaveletGene.java b/src/main/java/com/syncleus/dann/genetics/wavelets/AbstractWaveletGene.java
index 19da90727861510c12e6a8e45400f03814919c99..ea7e98accfdf906150a403e21ac90fd3e671a9dc 100644
--- a/src/main/java/com/syncleus/dann/genetics/wavelets/AbstractWaveletGene.java
+++ b/src/main/java/com/syncleus/dann/genetics/wavelets/AbstractWaveletGene.java
@@ -136,7 +136,7 @@ public abstract class AbstractWaveletGene implements Gene
 	}
 
 	@Override
-	public AbstractWaveletGene clone()
+	public Object clone()
 	{
 		try
 		{
@@ -144,7 +144,7 @@ public abstract class AbstractWaveletGene implements Gene
 
 			copy.currentActivity = this.currentActivity;
 			copy.pendingActivity = this.pendingActivity;
-			copy.expressionFunction = this.expressionFunction.clone();
+			copy.expressionFunction = (ExpressionFunction) this.expressionFunction.clone();
 			copy.mutability = this.mutability;
 			copy.receivingConcentrations = new HashSet<SignalKeyConcentration>(this.receivingConcentrations);
 
diff --git a/src/main/java/com/syncleus/dann/genetics/wavelets/Chromosome.java b/src/main/java/com/syncleus/dann/genetics/wavelets/Chromosome.java
index e48a3d8185cbaa985d272062e25ceaa9cf3fcdf2..4ffee246424dc1cbb2f4e91c0a8eeb8246b97ab4 100644
--- a/src/main/java/com/syncleus/dann/genetics/wavelets/Chromosome.java
+++ b/src/main/java/com/syncleus/dann/genetics/wavelets/Chromosome.java
@@ -230,13 +230,13 @@ public class Chromosome implements Cloneable
 	 * @return A clone of a chromosome.
 	 */
 	@Override
-	public Chromosome clone()
+	public Object clone()
 	{
 		try
 		{
 			final Chromosome copy = (Chromosome) super.clone();
-			copy.leftChromatid = this.leftChromatid.clone();
-			copy.rightChromatid = this.rightChromatid.clone();
+			copy.leftChromatid = (WaveletChromatid) this.leftChromatid.clone();
+			copy.rightChromatid = (WaveletChromatid) this.rightChromatid.clone();
 			copy.mutability = this.mutability;
 			return copy;
 		}
diff --git a/src/main/java/com/syncleus/dann/genetics/wavelets/ExpressionFunction.java b/src/main/java/com/syncleus/dann/genetics/wavelets/ExpressionFunction.java
index a92728fef1007c3aea7407f9bf5e1971227d89f7..2192d9c04449badc843dd89b0f6f6cd6a6cf93a5 100644
--- a/src/main/java/com/syncleus/dann/genetics/wavelets/ExpressionFunction.java
+++ b/src/main/java/com/syncleus/dann/genetics/wavelets/ExpressionFunction.java
@@ -103,7 +103,7 @@ public class ExpressionFunction implements Cloneable
 	public CombinedWaveletFunction getWavelet()
 	{
 		this.reconstructWavelet();
-		return this.wavelet.clone();
+		return (CombinedWaveletFunction) this.wavelet.clone();
 	}
 
 	public boolean receives(final SignalKey signal)
@@ -138,7 +138,7 @@ public class ExpressionFunction implements Cloneable
 	}
 
 	@Override
-	public ExpressionFunction clone()
+	public Object clone()
 	{
 		try
 		{
@@ -146,9 +146,9 @@ public class ExpressionFunction implements Cloneable
 			copy.receptors = new HashSet<ReceptorKey>(this.receptors);
 			final List<WaveMultidimensionalFunction> newWaves = new ArrayList<WaveMultidimensionalFunction>();
 			for(final WaveMultidimensionalFunction wave : this.waves)
-				newWaves.add(wave.clone());
+				newWaves.add((WaveMultidimensionalFunction) wave.clone());
 			copy.waves = newWaves;
-			copy.wavelet = this.wavelet.clone();
+			copy.wavelet = (CombinedWaveletFunction) this.wavelet.clone();
 			return copy;
 		}
 		catch(CloneNotSupportedException caught)
@@ -182,7 +182,7 @@ public class ExpressionFunction implements Cloneable
 	 */
 	public ExpressionFunction mutate(final double deviation)
 	{
-		final ExpressionFunction copy = this.clone();
+		final ExpressionFunction copy = (ExpressionFunction) this.clone();
 		final double changePercentage = 0.1;
 		while( RANDOM.nextFloat() < (float) changePercentage)
 		{
@@ -248,7 +248,7 @@ public class ExpressionFunction implements Cloneable
 	 */
 	public ExpressionFunction mutate(final double deviation, final ReceptorKey newReceptor)
 	{
-		final ExpressionFunction copy = this.clone();
+		final ExpressionFunction copy = (ExpressionFunction) this.clone();
 		copy.receptors.add(newReceptor);
 		if( copy.receptors.size() > this.receptors.size() )
 		{
diff --git a/src/main/java/com/syncleus/dann/genetics/wavelets/ExternalSignalGene.java b/src/main/java/com/syncleus/dann/genetics/wavelets/ExternalSignalGene.java
index e9ef32b09f3970448cf94bad5917f90a331fa69d..1454ac565e0aeefb2169d72fb451ba9fc52b0974 100644
--- a/src/main/java/com/syncleus/dann/genetics/wavelets/ExternalSignalGene.java
+++ b/src/main/java/com/syncleus/dann/genetics/wavelets/ExternalSignalGene.java
@@ -61,12 +61,6 @@ public class ExternalSignalGene extends SignalGene
 		return this.outward;
 	}
 
-	@Override
-	public ExternalSignalGene clone()
-	{
-		return (ExternalSignalGene) super.clone();
-	}
-
 	@Override
 	public void mutate(final Set<AbstractKey> keyPool)
 	{
diff --git a/src/main/java/com/syncleus/dann/genetics/wavelets/Nucleus.java b/src/main/java/com/syncleus/dann/genetics/wavelets/Nucleus.java
index 3057a318c8e23e541b213a2f12cf9399244edaf8..5447dcd2cf0346ae2271ca437efc3221a89c0e0b 100644
--- a/src/main/java/com/syncleus/dann/genetics/wavelets/Nucleus.java
+++ b/src/main/java/com/syncleus/dann/genetics/wavelets/Nucleus.java
@@ -99,14 +99,14 @@ public class Nucleus implements Cloneable
 	}
 
 	@Override
-	public Nucleus clone()
+	public Object clone()
 	{
 		try
 		{
 			final Nucleus copy = (Nucleus) super.clone();
 			copy.chromosomes = new ArrayList<Chromosome>();
 			for(final Chromosome chromosome : this.chromosomes)
-				copy.chromosomes.add(chromosome.clone());
+				copy.chromosomes.add((Chromosome) chromosome.clone());
 			return copy;
 		}
 		catch(CloneNotSupportedException caught)
diff --git a/src/main/java/com/syncleus/dann/genetics/wavelets/PromoterGene.java b/src/main/java/com/syncleus/dann/genetics/wavelets/PromoterGene.java
index e9f087017303a4b2eef56b2d7e44eede502416c0..5d1c76f8ca719baeb611a8f2555bd3b03da9aec2 100644
--- a/src/main/java/com/syncleus/dann/genetics/wavelets/PromoterGene.java
+++ b/src/main/java/com/syncleus/dann/genetics/wavelets/PromoterGene.java
@@ -45,11 +45,11 @@ public class PromoterGene extends AbstractWaveletGene
 	}
 
 	@Override
-	public PromoterGene clone()
+	public Object clone()
 	{
 		final PromoterGene copy = (PromoterGene) super.clone();
 
-		copy.targetDistance = this.targetDistance.clone();
+		copy.targetDistance = (MutableInteger) this.targetDistance.clone();
 
 		return copy;
 	}
diff --git a/src/main/java/com/syncleus/dann/genetics/wavelets/ReceptorKey.java b/src/main/java/com/syncleus/dann/genetics/wavelets/ReceptorKey.java
index 614753565565f8df03bc4d125a0c4c898ada8e68..94a50552d99852fbcb45d9a04f4f43b926232039 100644
--- a/src/main/java/com/syncleus/dann/genetics/wavelets/ReceptorKey.java
+++ b/src/main/java/com/syncleus/dann/genetics/wavelets/ReceptorKey.java
@@ -77,16 +77,4 @@ public class ReceptorKey extends AbstractKey
 
 		return false;
 	}
-
-	@Override
-	public ReceptorKey clone()
-	{
-		return (ReceptorKey) super.clone();
-	}
-
-	@Override
-	public ReceptorKey mutate(final double deviation)
-	{
-		return (ReceptorKey) super.mutate(deviation);
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/genetics/wavelets/SignalGene.java b/src/main/java/com/syncleus/dann/genetics/wavelets/SignalGene.java
index 7467b6fe070664a26103f1777e33bad4ebf9fd80..33adf452f3fb54160f9cbee9e1a752b67999ba55 100644
--- a/src/main/java/com/syncleus/dann/genetics/wavelets/SignalGene.java
+++ b/src/main/java/com/syncleus/dann/genetics/wavelets/SignalGene.java
@@ -86,7 +86,7 @@ public class SignalGene extends AbstractWaveletGene
 	}
 
 	@Override
-	public SignalGene clone()
+	public Object clone()
 	{
 		final SignalGene copy = (SignalGene) super.clone();
 		copy.outputSignal = this.outputSignal;
@@ -97,6 +97,6 @@ public class SignalGene extends AbstractWaveletGene
 	public void mutate(final Set<AbstractKey> keyPool)
 	{
 		super.mutate(keyPool);
-		this.outputSignal = this.outputSignal.mutate(this.getMutability());
+		this.outputSignal = (SignalKey) this.outputSignal.mutate(this.getMutability());
 	}
 }
diff --git a/src/main/java/com/syncleus/dann/genetics/wavelets/SignalKey.java b/src/main/java/com/syncleus/dann/genetics/wavelets/SignalKey.java
index afe06ad5a3e4f31b8d7ed0a5e6ff62bedb2b2fee..4fc5296a4b7cfaff219316a1823cc348cb421a63 100644
--- a/src/main/java/com/syncleus/dann/genetics/wavelets/SignalKey.java
+++ b/src/main/java/com/syncleus/dann/genetics/wavelets/SignalKey.java
@@ -41,16 +41,4 @@ public class SignalKey extends AbstractKey
 	{
 		super(keyString);
 	}
-
-	@Override
-	public SignalKey clone()
-	{
-		return (SignalKey) super.clone();
-	}
-
-	@Override
-	public SignalKey mutate(final double deviation)
-	{
-		return (SignalKey) super.mutate(deviation);
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/genetics/wavelets/SignalProcessingWavelet.java b/src/main/java/com/syncleus/dann/genetics/wavelets/SignalProcessingWavelet.java
index 5a2a5ea78ec21500117f590894f9e289eb9071ed..05d203c016b174c719c4589fb3d3d12fb25c0948 100644
--- a/src/main/java/com/syncleus/dann/genetics/wavelets/SignalProcessingWavelet.java
+++ b/src/main/java/com/syncleus/dann/genetics/wavelets/SignalProcessingWavelet.java
@@ -176,7 +176,7 @@ public class SignalProcessingWavelet implements Comparable<SignalProcessingWavel
 	public CombinedWaveletFunction getWavelet()
 	{
 		this.reconstructWavelet();
-		return this.wavelet.clone();
+		return (CombinedWaveletFunction) this.wavelet.clone();
 	}
 
 	public void preTick()
@@ -195,7 +195,7 @@ public class SignalProcessingWavelet implements Comparable<SignalProcessingWavel
 	}
 
 	@Override
-	public SignalProcessingWavelet clone()
+	public Object clone()
 	{
 		try
 		{
@@ -203,9 +203,9 @@ public class SignalProcessingWavelet implements Comparable<SignalProcessingWavel
 			copy.signals = new TreeSet<SignalConcentration>(this.signals);
 			final List<WaveMultidimensionalFunction> newWaves = new ArrayList<WaveMultidimensionalFunction>();
 			for(final WaveMultidimensionalFunction wave : this.waves)
-				newWaves.add(wave.clone());
+				newWaves.add((WaveMultidimensionalFunction) wave.clone());
 			copy.waves = newWaves;
-			copy.wavelet = (this.wavelet == null ? null : this.wavelet.clone());
+			copy.wavelet = (this.wavelet == null ? null : (CombinedWaveletFunction) this.wavelet.clone());
 			return copy;
 		}
 		catch(CloneNotSupportedException caught)
@@ -246,7 +246,7 @@ public class SignalProcessingWavelet implements Comparable<SignalProcessingWavel
 		final double waveGenerationChance = 0.8;
 		final double waveDeletionChance = 0.9;
 		final double exitChance = 0.1;
-		final SignalProcessingWavelet copy = this.clone();
+		final SignalProcessingWavelet copy = (SignalProcessingWavelet) this.clone();
 		copy.id = RANDOM.nextLong();
 		do
 		{
@@ -327,7 +327,7 @@ public class SignalProcessingWavelet implements Comparable<SignalProcessingWavel
 	{
 		if( this.signals.contains(newSignal) )
 			return this.mutate(deviation);
-		final SignalProcessingWavelet copy = this.clone();
+		final SignalProcessingWavelet copy = (SignalProcessingWavelet) this.clone();
 		copy.signals.add(newSignal);
 		if( copy.signals.size() > this.signals.size() )
 		{
@@ -436,7 +436,7 @@ public class SignalProcessingWavelet implements Comparable<SignalProcessingWavel
 			final WaveMultidimensionalFunction[] wavesArray = new WaveMultidimensionalFunction[this.waves.size()];
 			this.waves.toArray(wavesArray);
 			final WaveMultidimensionalFunction randomWave = wavesArray[RANDOM.nextInt(wavesArray.length)];
-			final WaveMultidimensionalFunction newWave = randomWave.clone();
+			final WaveMultidimensionalFunction newWave = (WaveMultidimensionalFunction) randomWave.clone();
 			// TODO clean this up
 			final double changeProbability = 1.0;
 			final double variableAdjustment = 2.0;
diff --git a/src/main/java/com/syncleus/dann/genetics/wavelets/WaveletChromatid.java b/src/main/java/com/syncleus/dann/genetics/wavelets/WaveletChromatid.java
index 49a322c59f11e24ab873020d5bad78fe1b735023..c3731abc790a4f6962340ca901cf0badc58c34f5 100644
--- a/src/main/java/com/syncleus/dann/genetics/wavelets/WaveletChromatid.java
+++ b/src/main/java/com/syncleus/dann/genetics/wavelets/WaveletChromatid.java
@@ -68,13 +68,13 @@ public class WaveletChromatid implements Chromatid<AbstractWaveletGene>, Cloneab
 		this.externalSignalGenes = new ArrayList<ExternalSignalGene>();
 
 		for(final AbstractWaveletGene currentGene : copy.sequencedGenes)
-			this.sequencedGenes.add(currentGene.clone());
+			this.sequencedGenes.add((AbstractWaveletGene) currentGene.clone());
 		for(final PromoterGene currentGene : copy.promoters)
-			this.promoters.add(currentGene.clone());
+			this.promoters.add((PromoterGene) currentGene.clone());
 		for(final SignalGene currentGene : copy.localSignalGenes)
-			this.localSignalGenes.add(currentGene.clone());
+			this.localSignalGenes.add((SignalGene) currentGene.clone());
 		for(final ExternalSignalGene currentGene : copy.externalSignalGenes)
-			this.externalSignalGenes.add(currentGene.clone());
+			this.externalSignalGenes.add((ExternalSignalGene) currentGene.clone());
 	}
 
 	public static WaveletChromatid newRandomWaveletChromatid()
@@ -264,7 +264,7 @@ public class WaveletChromatid implements Chromatid<AbstractWaveletGene>, Cloneab
 	}
 
 	@Override
-	public WaveletChromatid clone()
+	public Object clone()
 	{
 		try
 		{
@@ -279,13 +279,13 @@ public class WaveletChromatid implements Chromatid<AbstractWaveletGene>, Cloneab
 			copy.externalSignalGenes = new ArrayList<ExternalSignalGene>();
 
 			for(final AbstractWaveletGene currentGene : this.sequencedGenes)
-				copy.sequencedGenes.add(currentGene.clone());
+				copy.sequencedGenes.add((AbstractWaveletGene) currentGene.clone());
 			for(final PromoterGene currentGene : this.promoters)
-				copy.promoters.add(currentGene.clone());
+				copy.promoters.add((PromoterGene) currentGene.clone());
 			for(final SignalGene currentGene : this.localSignalGenes)
-				copy.localSignalGenes.add(currentGene.clone());
+				copy.localSignalGenes.add((SignalGene) currentGene.clone());
 			for(final ExternalSignalGene currentGene : this.externalSignalGenes)
-				copy.externalSignalGenes.add(currentGene.clone());
+				copy.externalSignalGenes.add((ExternalSignalGene) currentGene.clone());
 
 			return copy;
 		}
@@ -328,7 +328,7 @@ public class WaveletChromatid implements Chromatid<AbstractWaveletGene>, Cloneab
 			ReceptorKey newReceptorKey = new ReceptorKey(randomKey(keyPool));
 			//mutate new receptorKey before using it
 			while( Mutations.mutationEvent(this.mutability) )
-				newReceptorKey = newReceptorKey.mutate(this.mutability);
+				newReceptorKey = (ReceptorKey) newReceptorKey.mutate(this.mutability);
 			//create a new gene using the new receptor
 			final AbstractWaveletGene newGene;
 			final SignalKey newSignalKey = new SignalKey(randomKey(keyPool));
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
index f7dc1adb7a3bc340c0d1f3d475ea3dc791d5743b..11bac2c41c035b3e7c62169329c5fea6cb0481fc 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
@@ -297,7 +297,7 @@ public abstract class AbstractAdjacencyGraph<N, E extends Edge<N>> implements Gr
 	 * @return A clone, with the given edge added
 	 */
 	@Override
-	public AbstractAdjacencyGraph<N, E> cloneAdd(final E newEdge)
+	public Graph cloneAdd(final E newEdge)
 	{
 		if( newEdge == null )
 			throw new IllegalArgumentException("newEdge can not be null");
@@ -324,7 +324,7 @@ public abstract class AbstractAdjacencyGraph<N, E extends Edge<N>> implements Gr
 					newAdjacentNodes.get(currentNode).add(currentAdjacentNode);
 			}
 
-			final AbstractAdjacencyGraph<N, E> copy = this.clone();
+			final AbstractAdjacencyGraph<N, E> copy = (AbstractAdjacencyGraph<N, E>) this.clone();
 			copy.edges = newEdges;
 			copy.adjacentEdges = newAdjacentEdges;
 			copy.adjacentNodes = newAdjacentNodes;
@@ -341,35 +341,35 @@ public abstract class AbstractAdjacencyGraph<N, E extends Edge<N>> implements Gr
 	 * @return null
 	 */
 	@Override
-	public AbstractAdjacencyGraph<N, E> cloneAdd(final N newNode)
+	public Graph<N, E> cloneAdd(final N newNode)
 	{
 		// TODO fill this in
 		return null;
 	}
 
 	@Override
-	public AbstractAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
+	public Graph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
 	{
 		// TODO fill this in
 		return null;
 	}
 
 	@Override
-	public AbstractAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
+	public Graph<N, E> cloneRemove(final E edgeToRemove)
 	{
 		// TODO fill this in
 		return null;
 	}
 
 	@Override
-	public AbstractAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
+	public Graph<N, E> cloneRemove(final N nodeToRemove)
 	{
 		// TODO fill this in
 		return null;
 	}
 
 	@Override
-	public AbstractAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
+	public Graph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
 	{
 		// TODO fill this in
 		return null;
@@ -380,7 +380,7 @@ public abstract class AbstractAdjacencyGraph<N, E extends Edge<N>> implements Gr
 	 * @return A clone of the current object, with no changes
 	 */
 	@Override
-	public AbstractAdjacencyGraph<N, E> clone()
+	public Object clone()
 	{
 		try
 		{
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractBidirectedAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractBidirectedAdjacencyGraph.java
index 1b38ece32b5ee155cdb3f3d68b753cddd11f6168..9d528ff0684626d419de6769fd2fec6cc45dc816 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractBidirectedAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractBidirectedAdjacencyGraph.java
@@ -56,46 +56,4 @@ public abstract class AbstractBidirectedAdjacencyGraph<N, E extends BidirectedEd
 		}
 		return Collections.unmodifiableSet(inEdges);
 	}
-
-	@Override
-	public AbstractBidirectedAdjacencyGraph<N, E> cloneAdd(final E newEdge)
-	{
-		return (AbstractBidirectedAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public AbstractBidirectedAdjacencyGraph<N, E> cloneAdd(final N newNode)
-	{
-		return (AbstractBidirectedAdjacencyGraph<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public AbstractBidirectedAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (AbstractBidirectedAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public AbstractBidirectedAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (AbstractBidirectedAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public AbstractBidirectedAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (AbstractBidirectedAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public AbstractBidirectedAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (AbstractBidirectedAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public AbstractBidirectedAdjacencyGraph<N, E> clone()
-	{
-		return (AbstractBidirectedAdjacencyGraph<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractBidirectedEdge.java b/src/main/java/com/syncleus/dann/graph/AbstractBidirectedEdge.java
index 7cad24353ab92356fec42e8fa1470b97df4c246d..ed37961f634631e2a422740bdd4d7ecc2961af83 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractBidirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractBidirectedEdge.java
@@ -177,12 +177,6 @@ public abstract class AbstractBidirectedEdge<N> extends AbstractEdge<N> implemen
 		}
 	}
 
-	@Override
-	public AbstractBidirectedEdge<N> clone()
-	{
-		return (AbstractBidirectedEdge<N>) super.clone();
-	}
-
 	@Override
 	public BidirectedEdgeXml toXml()
 	{
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractDirectedAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractDirectedAdjacencyGraph.java
index 67a162bfe1245ba0a7d03ffeb868eee802425451..4c1a06503c0953a35eeea19f58528e0ef48983a5 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractDirectedAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractDirectedAdjacencyGraph.java
@@ -36,46 +36,4 @@ public abstract class AbstractDirectedAdjacencyGraph<N, E extends DirectedEdge<N
 	{
 		super(nodes, edges);
 	}
-
-	@Override
-	public AbstractDirectedAdjacencyGraph<N, E> cloneAdd(final E newEdge)
-	{
-		return (AbstractDirectedAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public AbstractDirectedAdjacencyGraph<N, E> cloneAdd(final N newNode)
-	{
-		return (AbstractDirectedAdjacencyGraph<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public AbstractDirectedAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (AbstractDirectedAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public AbstractDirectedAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (AbstractDirectedAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public AbstractDirectedAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (AbstractDirectedAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public AbstractDirectedAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (AbstractDirectedAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public AbstractDirectedAdjacencyGraph<N, E> clone()
-	{
-		return (AbstractDirectedAdjacencyGraph<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractDirectedEdge.java b/src/main/java/com/syncleus/dann/graph/AbstractDirectedEdge.java
index bab69395cd2d231294463d5a1830a3221ac2f6f7..81534482e7e17b72b94c821ed51afb064e84bab4 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractDirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractDirectedEdge.java
@@ -101,28 +101,22 @@ public abstract class AbstractDirectedEdge<N> extends AbstractBidirectedEdge<N>
 	}
 
 	@Override
-	public AbstractDirectedEdge<N> disconnect(final N node)
+	public Edge<N> disconnect(final N node)
 	{
 		if( node == null )
 			throw new IllegalArgumentException("node can not be null");
 		if( !this.getNodes().contains(node) )
 			throw new IllegalArgumentException("node is not currently connected to");
-		return (AbstractDirectedEdge<N>) this.remove(node);
+		return this.remove(node);
 	}
 
 	@Override
-	public AbstractDirectedEdge<N> disconnect(final List<N> nodes)
+	public Edge<N> disconnect(final List<N> nodes)
 	{
 		if( nodes == null )
 			throw new IllegalArgumentException("node can not be null");
 		if( !this.getNodes().containsAll(nodes) )
 			throw new IllegalArgumentException("node is not currently connected to");
-		return (AbstractDirectedEdge<N>) this.remove(nodes);
-	}
-
-	@Override
-	public AbstractDirectedEdge<N> clone()
-	{
-		return (AbstractDirectedEdge<N>) super.clone();
+		return this.remove(nodes);
 	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractEdge.java b/src/main/java/com/syncleus/dann/graph/AbstractEdge.java
index 3fedb0b60d1db1939d2098214c3e1789b0a2ed7a..5f4d691550a9f6e9208abaaff86005657fca64e6 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractEdge.java
@@ -68,7 +68,7 @@ public abstract class AbstractEdge<N> extends AbstractContextGraphElement<Graph<
 			final List<N> nodesCopy = new ArrayList<N>(ourNodes.size());
 			for(N ourNode : ourNodes)
 			{
-				if( this.contextEnabled && ( ourNode instanceof ContextNode ) && ( !((ContextNode)ourNode).connectingEdge(this) ))
+				if (this.contextEnabled && (ourNode instanceof ContextNode) && (!((ContextNode)ourNode).connectingEdge(this)))
 					continue;
 				nodesCopy.add(ourNode);
 			}
@@ -193,7 +193,7 @@ public abstract class AbstractEdge<N> extends AbstractContextGraphElement<Graph<
 	}
 
 	@Override
-	public AbstractEdge<N> clone()
+	public Object clone()
 	{
 		try
 		{
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractHyperAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractHyperAdjacencyGraph.java
index 973fb598546c1cdd06548e58f1fcffcb4ae1653f..70d0c9265cbc5706614b0ebea42f1e452ddccc6a 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractHyperAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractHyperAdjacencyGraph.java
@@ -79,46 +79,4 @@ public abstract class AbstractHyperAdjacencyGraph<N, E extends HyperEdge<N>> ext
 	{
 		return -1;
 	}
-
-	@Override
-	public AbstractHyperAdjacencyGraph<N, E> cloneAdd(final E newEdge)
-	{
-		return (AbstractHyperAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public AbstractHyperAdjacencyGraph<N, E> cloneAdd(final N newNode)
-	{
-		return (AbstractHyperAdjacencyGraph<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public AbstractHyperAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (AbstractHyperAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public AbstractHyperAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (AbstractHyperAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public AbstractHyperAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (AbstractHyperAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public AbstractHyperAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (AbstractHyperAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public AbstractHyperAdjacencyGraph<N, E> clone()
-	{
-		return (AbstractHyperAdjacencyGraph<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractHyperEdge.java b/src/main/java/com/syncleus/dann/graph/AbstractHyperEdge.java
index c98af1fd7b9455e4c382dee772ac02c66279401b..22037babe702f784d8f29a8cccbe097d6ac7d04a 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractHyperEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractHyperEdge.java
@@ -68,49 +68,43 @@ public abstract class AbstractHyperEdge<N> extends AbstractEdge<N> implements Hy
 	}
 
 	@Override
-	public AbstractHyperEdge<N> connect(final N node)
+	public HyperEdge<N> connect(final N node)
 	{
 		if( node == null )
 			throw new IllegalArgumentException("node can not be null");
 		if( this.getNodes().contains(node) )
 			throw new IllegalArgumentException("node is already connected");
-		return (AbstractHyperEdge<N>) this.add(node);
+		return (HyperEdge<N>) this.add(node);
 	}
 
 	@Override
-	public AbstractHyperEdge<N> connect(final List<N> nodes)
+	public HyperEdge<N> connect(final List<N> nodes)
 	{
 		if( nodes == null )
 			throw new IllegalArgumentException("node can not be null");
 		for(final N node : nodes)
 			if( this.getNodes().contains(node) )
 				throw new IllegalArgumentException("node is already connected");
-		return (AbstractHyperEdge<N>) this.add(nodes);
+		return (HyperEdge<N>) this.add(nodes);
 	}
 
 	@Override
-	public AbstractHyperEdge<N> disconnect(final N node)
+	public Edge<N> disconnect(final N node)
 	{
 		if( node == null )
 			throw new IllegalArgumentException("node can not be null");
 		if( !this.getNodes().contains(node) )
 			throw new IllegalArgumentException("node is not currently connected to");
-		return (AbstractHyperEdge<N>) this.remove(node);
+		return this.remove(node);
 	}
 
 	@Override
-	public AbstractHyperEdge<N> disconnect(final List<N> nodes)
+	public Edge<N> disconnect(final List<N> nodes)
 	{
 		if( nodes == null )
 			throw new IllegalArgumentException("node can not be null");
 		if( !this.getNodes().containsAll(nodes) )
 			throw new IllegalArgumentException("node is not currently connected to");
-		return (AbstractHyperEdge<N>) this.remove(nodes);
-	}
-
-	@Override
-	public AbstractHyperEdge<N> clone()
-	{
-		return (AbstractHyperEdge<N>) super.clone();
+		return this.remove(nodes);
 	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractRootedTreeAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractRootedTreeAdjacencyGraph.java
index 398e66838cf4e546f682e56ea6c0f9bef2dd617a..1e645eb823f5ebf584b904acf7d9ed0148ca50e1 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractRootedTreeAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractRootedTreeAdjacencyGraph.java
@@ -70,44 +70,38 @@ public abstract class AbstractRootedTreeAdjacencyGraph<N, E extends DirectedEdge
 
 	// TODO ensure these clones cant produce non-rooted trees
 	@Override
-	public AbstractRootedTreeAdjacencyGraph<N, E> cloneAdd(final E newEdge)
+	public Graph<N, E> cloneAdd(final E newEdge)
 	{
 		return (AbstractRootedTreeAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
 	}
 
 	@Override
-	public AbstractRootedTreeAdjacencyGraph<N, E> cloneAdd(final N newNode)
+	public Graph<N, E> cloneAdd(final N newNode)
 	{
 		return (AbstractRootedTreeAdjacencyGraph<N, E>) super.cloneAdd(newNode);
 	}
 
 	@Override
-	public AbstractRootedTreeAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
+	public Graph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
 	{
 		return (AbstractRootedTreeAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
 	}
 
 	@Override
-	public AbstractRootedTreeAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
+	public Graph<N, E> cloneRemove(final E edgeToRemove)
 	{
 		return (AbstractRootedTreeAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
 	}
 
 	@Override
-	public AbstractRootedTreeAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
+	public Graph<N, E> cloneRemove(final N nodeToRemove)
 	{
 		return (AbstractRootedTreeAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
 	}
 
 	@Override
-	public AbstractRootedTreeAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
+	public Graph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
 	{
 		return (AbstractRootedTreeAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
 	}
-
-	@Override
-	public AbstractRootedTreeAdjacencyGraph<N, E> clone()
-	{
-		return (AbstractRootedTreeAdjacencyGraph<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractTreeAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractTreeAdjacencyGraph.java
index 14b0ac2e76706ecc11fc5a4ef0e0bbb12b20cb08..05d630503a509967b179fa447332a47905615937 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractTreeAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractTreeAdjacencyGraph.java
@@ -81,44 +81,38 @@ public abstract class AbstractTreeAdjacencyGraph<N, E extends BidirectedEdge<N>>
 
 	// TODO make sure these clones cant produce non-tree graphs.
 	@Override
-	public AbstractTreeAdjacencyGraph<N, E> cloneAdd(final E newEdge)
+	public Graph<N, E> cloneAdd(final E newEdge)
 	{
 		return (AbstractTreeAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
 	}
 
 	@Override
-	public AbstractTreeAdjacencyGraph<N, E> cloneAdd(final N newNode)
+	public Graph<N, E> cloneAdd(final N newNode)
 	{
 		return (AbstractTreeAdjacencyGraph<N, E>) super.cloneAdd(newNode);
 	}
 
 	@Override
-	public AbstractTreeAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
+	public Graph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
 	{
 		return (AbstractTreeAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
 	}
 
 	@Override
-	public AbstractTreeAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
+	public Graph<N, E> cloneRemove(final E edgeToRemove)
 	{
 		return (AbstractTreeAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
 	}
 
 	@Override
-	public AbstractTreeAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
+	public Graph<N, E> cloneRemove(final N nodeToRemove)
 	{
 		return (AbstractTreeAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
 	}
 
 	@Override
-	public AbstractTreeAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
+	public Graph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
 	{
 		return (AbstractTreeAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
 	}
-
-	@Override
-	public AbstractTreeAdjacencyGraph<N, E> clone()
-	{
-		return (AbstractTreeAdjacencyGraph<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractUndirectedEdge.java b/src/main/java/com/syncleus/dann/graph/AbstractUndirectedEdge.java
index 74a577f337d4c568ab08c724361424664433b781..d950fbc110b0de3bd397068239c485dc76b826e2 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractUndirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractUndirectedEdge.java
@@ -83,28 +83,22 @@ public abstract class AbstractUndirectedEdge<N> extends AbstractBidirectedEdge<N
 	}
 
 	@Override
-	public AbstractUndirectedEdge<N> disconnect(final N node)
+	public Edge<N> disconnect(final N node)
 	{
 		if( node == null )
 			throw new IllegalArgumentException("node can not be null");
 		if( !this.getNodes().contains(node) )
 			throw new IllegalArgumentException("node is not currently connected to");
-		return (AbstractUndirectedEdge<N>) this.remove(node);
+		return this.remove(node);
 	}
 
 	@Override
-	public AbstractUndirectedEdge<N> disconnect(final List<N> nodes)
+	public Edge<N> disconnect(final List<N> nodes)
 	{
 		if( nodes == null )
 			throw new IllegalArgumentException("node can not be null");
 		if( !this.getNodes().containsAll(nodes) )
 			throw new IllegalArgumentException("node is not currently connected to");
-		return (AbstractUndirectedEdge<N>) this.remove(nodes);
-	}
-
-	@Override
-	public AbstractUndirectedEdge<N> clone()
-	{
-		return (AbstractUndirectedEdge<N>) super.clone();
+		return this.remove(nodes);
 	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractWeightedBidirectedEdge.java b/src/main/java/com/syncleus/dann/graph/AbstractWeightedBidirectedEdge.java
index d0c1d628d4c79812c1d9afda6139ddcbdf2d17f2..d2bb7bce80a79dd298ec662e9f9303029e851520 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractWeightedBidirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractWeightedBidirectedEdge.java
@@ -53,10 +53,4 @@ public abstract class AbstractWeightedBidirectedEdge<N> extends AbstractBidirect
 	{
 		return this.weight;
 	}
-
-	@Override
-	public AbstractWeightedBidirectedEdge<N> clone()
-	{
-		return (AbstractWeightedBidirectedEdge<N>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractWeightedEdge.java b/src/main/java/com/syncleus/dann/graph/AbstractWeightedEdge.java
index e76155ef5c7c38b73291db74991d42960b4ac97c..43b5e9959aa87a6b3a7569ba85b61681a00bc424 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractWeightedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractWeightedEdge.java
@@ -53,10 +53,4 @@ public abstract class AbstractWeightedEdge<N> extends AbstractEdge<N> implements
 	{
 		return this.weight;
 	}
-
-	@Override
-	public AbstractWeightedEdge<N> clone()
-	{
-		return (AbstractWeightedEdge<N>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/BidirectedEdge.java b/src/main/java/com/syncleus/dann/graph/BidirectedEdge.java
index 4baff40b2bde175b764cc46b720f479fe88d03b3..7a23ae1902d57cacf3cd1262d32d38e276f4c037 100644
--- a/src/main/java/com/syncleus/dann/graph/BidirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/BidirectedEdge.java
@@ -37,10 +37,4 @@ public interface BidirectedEdge<N> extends Edge<N>
 	boolean isLooseEdge();
 	boolean isOrdinaryEdge();
 	boolean isLoop();
-	@Override
-	BidirectedEdge<N> disconnect(N node);
-	@Override
-	BidirectedEdge<N> disconnect(List<N> node);
-	@Override
-	BidirectedEdge<N> clone();
 }
diff --git a/src/main/java/com/syncleus/dann/graph/DirectedEdge.java b/src/main/java/com/syncleus/dann/graph/DirectedEdge.java
index eca10ca4bcc469ae267f480e9a13f562a301498b..ec70a70c39402728b4a6740336b21714f696b79c 100644
--- a/src/main/java/com/syncleus/dann/graph/DirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/DirectedEdge.java
@@ -18,16 +18,8 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import java.util.List;
-
 public interface DirectedEdge<N> extends BidirectedEdge<N>
 {
 	N getSourceNode();
 	N getDestinationNode();
-	@Override
-	DirectedEdge<N> disconnect(N node);
-	@Override
-	DirectedEdge<N> disconnect(List<N> node);
-	@Override
-	DirectedEdge<N> clone();
 }
diff --git a/src/main/java/com/syncleus/dann/graph/Edge.java b/src/main/java/com/syncleus/dann/graph/Edge.java
index 5d23f6f5e1ed4631a77f190ba829651e2ec64f9f..5bb83efcf974333a43d918a3be1d788704a1a87f 100644
--- a/src/main/java/com/syncleus/dann/graph/Edge.java
+++ b/src/main/java/com/syncleus/dann/graph/Edge.java
@@ -50,6 +50,4 @@ public interface Edge<N> extends Serializable, Cloneable, XmlSerializable<EdgeXm
 	 *   removing the specified nodes.
 	 */
 	Edge<N> disconnect(List<N> node);
-
-	Edge<N> clone();
 }
diff --git a/src/main/java/com/syncleus/dann/graph/Graph.java b/src/main/java/com/syncleus/dann/graph/Graph.java
index c55d19604cf5d2e32b99599d391190407fa03d23..0e4f46d7310c04d146a3da5e4c9f479b0d7dd7c6 100644
--- a/src/main/java/com/syncleus/dann/graph/Graph.java
+++ b/src/main/java/com/syncleus/dann/graph/Graph.java
@@ -160,5 +160,4 @@ public interface Graph<N, E extends Edge<N>> extends Serializable, Cloneable, Xm
 	 * @since 2.0
 	 */
 	Graph<N, E> cloneRemove(Set<N> deleteNodes, Set<E> deleteEdges);
-	Graph<N, E> clone();
 }
diff --git a/src/main/java/com/syncleus/dann/graph/HyperEdge.java b/src/main/java/com/syncleus/dann/graph/HyperEdge.java
index 2877305f04dcc1a890119be75898dc3531e74d90..522468ce99eabc5ceb750b17b45060da8ba34508 100644
--- a/src/main/java/com/syncleus/dann/graph/HyperEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/HyperEdge.java
@@ -26,10 +26,4 @@ public interface HyperEdge<N> extends Edge<N>
 	boolean isSymmetric(HyperEdge symmetricEdge);
 	HyperEdge<N> connect(N node);
 	HyperEdge<N> connect(List<N> node);
-	@Override
-	HyperEdge<N> disconnect(N node);
-	@Override
-	HyperEdge<N> disconnect(List<N> node);
-	@Override
-	HyperEdge<N> clone();
 }
diff --git a/src/main/java/com/syncleus/dann/graph/ImmutableAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/ImmutableAdjacencyGraph.java
index 29369bb5276486c9348625e044868b95b3131984..37adf259f759153b36ede29c2394fc7f589c7544 100644
--- a/src/main/java/com/syncleus/dann/graph/ImmutableAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/ImmutableAdjacencyGraph.java
@@ -73,48 +73,6 @@ public class ImmutableAdjacencyGraph<N, E extends Edge<N>> extends AbstractAdjac
 		return newAdjacentNodes;
 	}
 
-	@Override
-	public ImmutableAdjacencyGraph<N, E> cloneAdd(final E newEdge)
-	{
-		return (ImmutableAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public ImmutableAdjacencyGraph<N, E> cloneAdd(final N newNode)
-	{
-		return (ImmutableAdjacencyGraph<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public ImmutableAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (ImmutableAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public ImmutableAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (ImmutableAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public ImmutableAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (ImmutableAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public ImmutableAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (ImmutableAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public ImmutableAdjacencyGraph<N, E> clone()
-	{
-		return (ImmutableAdjacencyGraph<N, E>) super.clone();
-	}
-
 	@Override
 	public GraphXml toXml(final Namer<Object> namer)
 	{
diff --git a/src/main/java/com/syncleus/dann/graph/ImmutableDirectedAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/ImmutableDirectedAdjacencyGraph.java
index 1d1e6c0bf19f005a4f9b957f24d29e1074a5d07f..92f732d0bd2686412af5e47afde479f9f1c20f17 100644
--- a/src/main/java/com/syncleus/dann/graph/ImmutableDirectedAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/ImmutableDirectedAdjacencyGraph.java
@@ -69,46 +69,4 @@ public class ImmutableDirectedAdjacencyGraph<N, E extends DirectedEdge<N>> exten
 			newAdjacentNodes.put(neighborNodeEntry.getKey(), new ArrayList<N>(neighborNodeEntry.getValue()));
 		return newAdjacentNodes;
 	}
-
-	@Override
-	public ImmutableDirectedAdjacencyGraph<N, E> cloneAdd(final E newEdge)
-	{
-		return (ImmutableDirectedAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public ImmutableDirectedAdjacencyGraph<N, E> cloneAdd(final N newNode)
-	{
-		return (ImmutableDirectedAdjacencyGraph<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public ImmutableDirectedAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (ImmutableDirectedAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public ImmutableDirectedAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (ImmutableDirectedAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public ImmutableDirectedAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (ImmutableDirectedAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public ImmutableDirectedAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (ImmutableDirectedAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public ImmutableDirectedAdjacencyGraph<N, E> clone()
-	{
-		return (ImmutableDirectedAdjacencyGraph<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/ImmutableDirectedEdge.java b/src/main/java/com/syncleus/dann/graph/ImmutableDirectedEdge.java
index dacac5cb9056a1e6b672a0e464c89ab32962119a..32c80b6d3d15303a71edd4c959cc04bee6a0d09a 100644
--- a/src/main/java/com/syncleus/dann/graph/ImmutableDirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/ImmutableDirectedEdge.java
@@ -18,8 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import java.util.List;
-
 public final class ImmutableDirectedEdge<N> extends AbstractDirectedEdge<N>
 {
 	private static final long serialVersionUID = 94357801283489L;
@@ -33,22 +31,4 @@ public final class ImmutableDirectedEdge<N> extends AbstractDirectedEdge<N>
 	{
 		super(source, destination, allowJoiningMultipleGraphs, contextEnabled);
 	}
-
-	@Override
-	public ImmutableDirectedEdge<N> disconnect(final N node)
-	{
-		return (ImmutableDirectedEdge<N>) super.disconnect(node);
-	}
-
-	@Override
-	public ImmutableDirectedEdge<N> disconnect(final List<N> nodes)
-	{
-		return (ImmutableDirectedEdge<N>) super.disconnect(nodes);
-	}
-
-	@Override
-	public ImmutableDirectedEdge<N> clone()
-	{
-		return (ImmutableDirectedEdge<N>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/ImmutableHyperAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/ImmutableHyperAdjacencyGraph.java
index 2f7c2dc191348f1ee5eac2aa4783ad862acabe9c..8b02ace311151733bbaabe9e7c47ce4d1eaf88e4 100644
--- a/src/main/java/com/syncleus/dann/graph/ImmutableHyperAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/ImmutableHyperAdjacencyGraph.java
@@ -69,46 +69,4 @@ public class ImmutableHyperAdjacencyGraph<N, E extends HyperEdge<N>> extends Abs
 			newAdjacentNodes.put(neighborNodeEntry.getKey(), new ArrayList<N>(neighborNodeEntry.getValue()));
 		return newAdjacentNodes;
 	}
-
-	@Override
-	public ImmutableHyperAdjacencyGraph<N, E> cloneAdd(final E newEdge)
-	{
-		return (ImmutableHyperAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public ImmutableHyperAdjacencyGraph<N, E> cloneAdd(final N newNode)
-	{
-		return (ImmutableHyperAdjacencyGraph<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public ImmutableHyperAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (ImmutableHyperAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public ImmutableHyperAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (ImmutableHyperAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public ImmutableHyperAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (ImmutableHyperAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public ImmutableHyperAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (ImmutableHyperAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public ImmutableHyperAdjacencyGraph<N, E> clone()
-	{
-		return (ImmutableHyperAdjacencyGraph<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/ImmutableHyperEdge.java b/src/main/java/com/syncleus/dann/graph/ImmutableHyperEdge.java
index 06cdea927a8360936756531d8dbe8cd5b1e18409..9df968d6dd4a74f3bfbb961199c356897bb39fe0 100644
--- a/src/main/java/com/syncleus/dann/graph/ImmutableHyperEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/ImmutableHyperEdge.java
@@ -43,34 +43,4 @@ public final class ImmutableHyperEdge<N> extends AbstractHyperEdge<N>
 	{
 		super(allowJoiningMultipleGraphs, contextEnabled, nodes);
 	}
-
-	@Override
-	public ImmutableHyperEdge<N> connect(final N node)
-	{
-		return (ImmutableHyperEdge<N>) super.connect(node);
-	}
-
-	@Override
-	public ImmutableHyperEdge<N> connect(final List<N> nodes)
-	{
-		return (ImmutableHyperEdge<N>) super.connect(nodes);
-	}
-
-	@Override
-	public ImmutableHyperEdge<N> disconnect(final N node)
-	{
-		return (ImmutableHyperEdge<N>) super.disconnect(node);
-	}
-
-	@Override
-	public ImmutableHyperEdge<N> disconnect(final List<N> nodes)
-	{
-		return (ImmutableHyperEdge<N>) super.disconnect(nodes);
-	}
-
-	@Override
-	public ImmutableHyperEdge<N> clone()
-	{
-		return (ImmutableHyperEdge<N>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/ImmutableRootedTreeAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/ImmutableRootedTreeAdjacencyGraph.java
index a2b7d1ae435fe00e90af35728c7ee9b145a2f0d0..758eed5f8255ef81e5c69a5f50333b5357fdf315 100644
--- a/src/main/java/com/syncleus/dann/graph/ImmutableRootedTreeAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/ImmutableRootedTreeAdjacencyGraph.java
@@ -68,46 +68,4 @@ public class ImmutableRootedTreeAdjacencyGraph<N, E extends DirectedEdge<N>> ext
 			newAdjacentNodes.put(neighborNodeEntry.getKey(), new ArrayList<N>(neighborNodeEntry.getValue()));
 		return newAdjacentNodes;
 	}
-
-	@Override
-	public ImmutableRootedTreeAdjacencyGraph<N, E> cloneAdd(final E newEdge)
-	{
-		return (ImmutableRootedTreeAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public ImmutableRootedTreeAdjacencyGraph<N, E> cloneAdd(final N newNode)
-	{
-		return (ImmutableRootedTreeAdjacencyGraph<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public ImmutableRootedTreeAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (ImmutableRootedTreeAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public ImmutableRootedTreeAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (ImmutableRootedTreeAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public ImmutableRootedTreeAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (ImmutableRootedTreeAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public ImmutableRootedTreeAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (ImmutableRootedTreeAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public ImmutableRootedTreeAdjacencyGraph<N, E> clone()
-	{
-		return (ImmutableRootedTreeAdjacencyGraph<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/ImmutableTreeAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/ImmutableTreeAdjacencyGraph.java
index efa197b5f9216d0eb86affd4dbcaaec32b336d64..c79685e3b5c3a16f0e546d4b15ea542a03139e73 100644
--- a/src/main/java/com/syncleus/dann/graph/ImmutableTreeAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/ImmutableTreeAdjacencyGraph.java
@@ -69,46 +69,4 @@ public class ImmutableTreeAdjacencyGraph<N, E extends BidirectedEdge<N>> extends
 			newAdjacentNodes.put(neighborNodeEntry.getKey(), new ArrayList<N>(neighborNodeEntry.getValue()));
 		return newAdjacentNodes;
 	}
-
-	@Override
-	public ImmutableTreeAdjacencyGraph<N, E> cloneAdd(final E newEdge)
-	{
-		return (ImmutableTreeAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public ImmutableTreeAdjacencyGraph<N, E> cloneAdd(final N newNode)
-	{
-		return (ImmutableTreeAdjacencyGraph<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public ImmutableTreeAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (ImmutableTreeAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public ImmutableTreeAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (ImmutableTreeAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public ImmutableTreeAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (ImmutableTreeAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public ImmutableTreeAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (ImmutableTreeAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public ImmutableTreeAdjacencyGraph<N, E> clone()
-	{
-		return (ImmutableTreeAdjacencyGraph<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/ImmutableUndirectedEdge.java b/src/main/java/com/syncleus/dann/graph/ImmutableUndirectedEdge.java
index 7f23e46d419f8743f1ecd2641a33ebc056dde59a..6363d1061ebfe127d13ef2e58d73ffcdedae25c5 100644
--- a/src/main/java/com/syncleus/dann/graph/ImmutableUndirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/ImmutableUndirectedEdge.java
@@ -18,8 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import java.util.List;
-
 public final class ImmutableUndirectedEdge<N> extends AbstractUndirectedEdge<N>
 {
 	private static final long serialVersionUID = -1803274027851230L;
@@ -33,22 +31,4 @@ public final class ImmutableUndirectedEdge<N> extends AbstractUndirectedEdge<N>
 	{
 		super(leftNode, rightNode, allowJoiningMultipleGraphs, contextEnabled);
 	}
-
-	@Override
-	public ImmutableUndirectedEdge<N> disconnect(final N node)
-	{
-		return (ImmutableUndirectedEdge<N>) super.disconnect(node);
-	}
-
-	@Override
-	public ImmutableUndirectedEdge<N> disconnect(final List<N> nodes)
-	{
-		return (ImmutableUndirectedEdge<N>) super.disconnect(nodes);
-	}
-
-	@Override
-	public ImmutableUndirectedEdge<N> clone()
-	{
-		return (ImmutableUndirectedEdge<N>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/ImmutableWeightedDirectedEdge.java b/src/main/java/com/syncleus/dann/graph/ImmutableWeightedDirectedEdge.java
index 0fe340f3ad00012b33116f5dc985723190419b74..d334abb52167c8a1c32671fa3f6ea53906b9e09a 100644
--- a/src/main/java/com/syncleus/dann/graph/ImmutableWeightedDirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/ImmutableWeightedDirectedEdge.java
@@ -18,8 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import java.util.List;
-
 public final class ImmutableWeightedDirectedEdge<N> extends AbstractDirectedEdge<N> implements WeightedDirectedEdge<N>
 {
 	private static final long serialVersionUID = -6843921044147012645L;
@@ -42,22 +40,4 @@ public final class ImmutableWeightedDirectedEdge<N> extends AbstractDirectedEdge
 	{
 		return this.weight;
 	}
-
-	@Override
-	public ImmutableWeightedDirectedEdge<N> disconnect(final N node)
-	{
-		return (ImmutableWeightedDirectedEdge<N>) super.disconnect(node);
-	}
-
-	@Override
-	public ImmutableWeightedDirectedEdge<N> disconnect(final List<N> nodes)
-	{
-		return (ImmutableWeightedDirectedEdge<N>) super.disconnect(nodes);
-	}
-
-	@Override
-	public ImmutableWeightedDirectedEdge<N> clone()
-	{
-		return (ImmutableWeightedDirectedEdge<N>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/ImmutableWeightedHyperEdge.java b/src/main/java/com/syncleus/dann/graph/ImmutableWeightedHyperEdge.java
index 4ac6a256ffacaa5e366f760bac7304665eb1b837..812c415d55199c61c518c229a99a40cabe3f9332 100644
--- a/src/main/java/com/syncleus/dann/graph/ImmutableWeightedHyperEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/ImmutableWeightedHyperEdge.java
@@ -42,22 +42,4 @@ public final class ImmutableWeightedHyperEdge<N> extends AbstractHyperEdge<N> im
 	{
 		return this.weight;
 	}
-
-	@Override
-	public ImmutableWeightedHyperEdge<N> disconnect(final N node)
-	{
-		return (ImmutableWeightedHyperEdge<N>) super.remove(node);
-	}
-
-	@Override
-	public ImmutableWeightedHyperEdge<N> disconnect(final List<N> nodes)
-	{
-		return (ImmutableWeightedHyperEdge<N>) super.remove(nodes);
-	}
-
-	@Override
-	public ImmutableWeightedHyperEdge<N> clone()
-	{
-		return (ImmutableWeightedHyperEdge<N>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/ImmutableWeightedUndirectedEdge.java b/src/main/java/com/syncleus/dann/graph/ImmutableWeightedUndirectedEdge.java
index 2afe38cbf4dbfd41feefa7226ba6197c952016c4..0e03ee356adc67abe7054be8933eeeec685c72e4 100644
--- a/src/main/java/com/syncleus/dann/graph/ImmutableWeightedUndirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/ImmutableWeightedUndirectedEdge.java
@@ -18,8 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import java.util.List;
-
 public final class ImmutableWeightedUndirectedEdge<N> extends AbstractUndirectedEdge<N> implements WeightedBidirectedEdge<N>
 {
 	private static final long serialVersionUID = 4622255810663472765L;
@@ -42,22 +40,4 @@ public final class ImmutableWeightedUndirectedEdge<N> extends AbstractUndirected
 	{
 		return this.weight;
 	}
-
-	@Override
-	public ImmutableWeightedUndirectedEdge<N> disconnect(final N node)
-	{
-		return (ImmutableWeightedUndirectedEdge<N>) this.remove(node);
-	}
-
-	@Override
-	public ImmutableWeightedUndirectedEdge<N> disconnect(final List<N> nodes)
-	{
-		return (ImmutableWeightedUndirectedEdge<N>) this.remove(nodes);
-	}
-
-	@Override
-	public ImmutableWeightedUndirectedEdge<N> clone()
-	{
-		return (ImmutableWeightedUndirectedEdge<N>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
index 4e252e5978062fac3d5a0f6829deed1fd91e7dbc..fed46bf3abe6b638a4ec3f323b81cab5e61d60d1 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
@@ -198,46 +198,4 @@ public class MutableAdjacencyGraph<N, E extends Edge<N>> extends AbstractAdjacen
 
 		return removedSomething;
 	}
-
-	@Override
-	public MutableAdjacencyGraph<N, E> cloneAdd(final E newEdge)
-	{
-		return (MutableAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public MutableAdjacencyGraph<N, E> cloneAdd(final N newNode)
-	{
-		return (MutableAdjacencyGraph<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public MutableAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (MutableAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public MutableAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (MutableAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public MutableAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (MutableAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public MutableAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (MutableAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public MutableAdjacencyGraph<N, E> clone()
-	{
-		return (MutableAdjacencyGraph<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/MutableDirectedAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/MutableDirectedAdjacencyGraph.java
index ed8f003bd19292c10c6c5cb7d61736926092582c..89baaf1473078b38afb2880f7991cf86f5968742 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableDirectedAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableDirectedAdjacencyGraph.java
@@ -198,46 +198,4 @@ public class MutableDirectedAdjacencyGraph<N, E extends DirectedEdge<N>> extends
 
 		return removedSomething;
 	}
-
-	@Override
-	public MutableDirectedAdjacencyGraph<N, E> cloneAdd(final E newEdge)
-	{
-		return (MutableDirectedAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public MutableDirectedAdjacencyGraph<N, E> cloneAdd(final N newNode)
-	{
-		return (MutableDirectedAdjacencyGraph<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public MutableDirectedAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (MutableDirectedAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public MutableDirectedAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (MutableDirectedAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public MutableDirectedAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (MutableDirectedAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public MutableDirectedAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (MutableDirectedAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public MutableDirectedAdjacencyGraph<N, E> clone()
-	{
-		return (MutableDirectedAdjacencyGraph<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/MutableHyperAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/MutableHyperAdjacencyGraph.java
index bc6ae075fd82de475e937e4de25030b69c5dc6f3..ab7b58c0f18b51a037fc6164c926e7bd1afd19ce 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableHyperAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableHyperAdjacencyGraph.java
@@ -198,46 +198,4 @@ public class MutableHyperAdjacencyGraph<N, E extends HyperEdge<N>> extends Abstr
 
 		return removedSomething;
 	}
-
-	@Override
-	public MutableHyperAdjacencyGraph<N, E> cloneAdd(final E newEdge)
-	{
-		return (MutableHyperAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public MutableHyperAdjacencyGraph<N, E> cloneAdd(final N newNode)
-	{
-		return (MutableHyperAdjacencyGraph<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public MutableHyperAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (MutableHyperAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public MutableHyperAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (MutableHyperAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public MutableHyperAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (MutableHyperAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public MutableHyperAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (MutableHyperAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public MutableHyperAdjacencyGraph<N, E> clone()
-	{
-		return (MutableHyperAdjacencyGraph<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/MutableRootedTreeAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/MutableRootedTreeAdjacencyGraph.java
index 6c55382aa63c2a596fc4a542a1afdb866cbad8c8..fb60fc6fb33626bb762a2bd46a1a53bc4365a2cb 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableRootedTreeAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableRootedTreeAdjacencyGraph.java
@@ -198,46 +198,4 @@ public class MutableRootedTreeAdjacencyGraph<N, E extends DirectedEdge<N>> exten
 
 		return removedSomething;
 	}
-
-	@Override
-	public MutableRootedTreeAdjacencyGraph<N, E> cloneAdd(final E newEdge)
-	{
-		return (MutableRootedTreeAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public MutableRootedTreeAdjacencyGraph<N, E> cloneAdd(final N newNode)
-	{
-		return (MutableRootedTreeAdjacencyGraph<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public MutableRootedTreeAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (MutableRootedTreeAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public MutableRootedTreeAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (MutableRootedTreeAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public MutableRootedTreeAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (MutableRootedTreeAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public MutableRootedTreeAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (MutableRootedTreeAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public MutableRootedTreeAdjacencyGraph<N, E> clone()
-	{
-		return (MutableRootedTreeAdjacencyGraph<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/MutableTreeAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/MutableTreeAdjacencyGraph.java
index 8e2b6746714cee10b2d68d00c584ebc7807662af..8f375a7f4a71704482ce182821a09d94bf1c8532 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableTreeAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableTreeAdjacencyGraph.java
@@ -210,44 +210,38 @@ public class MutableTreeAdjacencyGraph<N, E extends BidirectedEdge<N>> extends A
 
 	//TODO make sure these clone methods done generate a non-tree TreeGraoh
 	@Override
-	public MutableTreeAdjacencyGraph<N, E> cloneAdd(final E newEdge)
+	public Graph<N, E> cloneAdd(final E newEdge)
 	{
 		return (MutableTreeAdjacencyGraph<N, E>) super.cloneAdd(newEdge);
 	}
 
 	@Override
-	public MutableTreeAdjacencyGraph<N, E> cloneAdd(final N newNode)
+	public Graph<N, E> cloneAdd(final N newNode)
 	{
 		return (MutableTreeAdjacencyGraph<N, E>) super.cloneAdd(newNode);
 	}
 
 	@Override
-	public MutableTreeAdjacencyGraph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
+	public Graph<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
 	{
 		return (MutableTreeAdjacencyGraph<N, E>) super.cloneAdd(newNodes, newEdges);
 	}
 
 	@Override
-	public MutableTreeAdjacencyGraph<N, E> cloneRemove(final E edgeToRemove)
+	public Graph<N, E> cloneRemove(final E edgeToRemove)
 	{
 		return (MutableTreeAdjacencyGraph<N, E>) super.cloneRemove(edgeToRemove);
 	}
 
 	@Override
-	public MutableTreeAdjacencyGraph<N, E> cloneRemove(final N nodeToRemove)
+	public Graph<N, E> cloneRemove(final N nodeToRemove)
 	{
 		return (MutableTreeAdjacencyGraph<N, E>) super.cloneRemove(nodeToRemove);
 	}
 
 	@Override
-	public MutableTreeAdjacencyGraph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
+	public Graph<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
 	{
 		return (MutableTreeAdjacencyGraph<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
 	}
-
-	@Override
-	public MutableTreeAdjacencyGraph<N, E> clone()
-	{
-		return (MutableTreeAdjacencyGraph<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/SimpleWeightedDirectedEdge.java b/src/main/java/com/syncleus/dann/graph/SimpleWeightedDirectedEdge.java
index a40d955603407ded83c6453abd9d022d08b77d79..9e439ae3861ea3247aef8e3f032d71ef5e34824b 100644
--- a/src/main/java/com/syncleus/dann/graph/SimpleWeightedDirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/SimpleWeightedDirectedEdge.java
@@ -18,8 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import java.util.List;
-
 public final class SimpleWeightedDirectedEdge<N> extends AbstractDirectedEdge<N> implements WeightedDirectedEdge<N>, MutableWeighted
 {
 	private static final long serialVersionUID = -6843921044147012645L;
@@ -48,22 +46,4 @@ public final class SimpleWeightedDirectedEdge<N> extends AbstractDirectedEdge<N>
 	{
 		this.weight = newWeight;
 	}
-
-	@Override
-	public SimpleWeightedDirectedEdge<N> disconnect(final N node)
-	{
-		return (SimpleWeightedDirectedEdge<N>) super.disconnect(node);
-	}
-
-	@Override
-	public SimpleWeightedDirectedEdge<N> disconnect(final List<N> nodes)
-	{
-		return (SimpleWeightedDirectedEdge<N>) super.disconnect(nodes);
-	}
-
-	@Override
-	public SimpleWeightedDirectedEdge<N> clone()
-	{
-		return (SimpleWeightedDirectedEdge<N>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/SimpleWeightedHyperEdge.java b/src/main/java/com/syncleus/dann/graph/SimpleWeightedHyperEdge.java
index ba9d72ebe33abe4d10aa539c1a4689a174a12cbd..f53995d773545871ae3e010f30521998fc228650 100644
--- a/src/main/java/com/syncleus/dann/graph/SimpleWeightedHyperEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/SimpleWeightedHyperEdge.java
@@ -48,22 +48,4 @@ public final class SimpleWeightedHyperEdge<N> extends AbstractHyperEdge<N> imple
 	{
 		this.weight = newWeight;
 	}
-
-	@Override
-	public SimpleWeightedHyperEdge<N> disconnect(final N node)
-	{
-		return (SimpleWeightedHyperEdge<N>) super.disconnect(node);
-	}
-
-	@Override
-	public SimpleWeightedHyperEdge<N> disconnect(final List<N> nodes)
-	{
-		return (SimpleWeightedHyperEdge<N>) super.disconnect(nodes);
-	}
-
-	@Override
-	public SimpleWeightedHyperEdge<N> clone()
-	{
-		return (SimpleWeightedHyperEdge<N>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/SimpleWeightedUndirectedEdge.java b/src/main/java/com/syncleus/dann/graph/SimpleWeightedUndirectedEdge.java
index d80afff788cf15b380a89e189f84fed4e7132ce3..22ab180e5352a6437d4c0262a5d2ebf7b789285e 100644
--- a/src/main/java/com/syncleus/dann/graph/SimpleWeightedUndirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/SimpleWeightedUndirectedEdge.java
@@ -18,8 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import java.util.List;
-
 public final class SimpleWeightedUndirectedEdge<N> extends AbstractUndirectedEdge<N> implements WeightedBidirectedEdge<N>, MutableWeighted
 {
 	private static final long serialVersionUID = 4622255810663472765L;
@@ -48,22 +46,4 @@ public final class SimpleWeightedUndirectedEdge<N> extends AbstractUndirectedEdg
 	{
 		this.weight = newWeight;
 	}
-
-	@Override
-	public SimpleWeightedUndirectedEdge<N> disconnect(final N node)
-	{
-		return (SimpleWeightedUndirectedEdge<N>) super.disconnect(node);
-	}
-
-	@Override
-	public SimpleWeightedUndirectedEdge<N> disconnect(final List<N> nodes)
-	{
-		return (SimpleWeightedUndirectedEdge<N>) super.disconnect(nodes);
-	}
-
-	@Override
-	public SimpleWeightedUndirectedEdge<N> clone()
-	{
-		return (SimpleWeightedUndirectedEdge<N>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/WeightedBidirectedEdge.java b/src/main/java/com/syncleus/dann/graph/WeightedBidirectedEdge.java
index 43c56ee81474dcbc5e95468a70bd1b4fa1b89c00..2feae3b663fda89f37d2c6855b3b4c8bd8683142 100644
--- a/src/main/java/com/syncleus/dann/graph/WeightedBidirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/WeightedBidirectedEdge.java
@@ -18,14 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import java.util.List;
-
 public interface WeightedBidirectedEdge<N> extends BidirectedEdge<N>, Weighted
 {
-	@Override
-	WeightedBidirectedEdge<N> disconnect(N node);
-	@Override
-	WeightedBidirectedEdge<N> disconnect(List<N> node);
-	@Override
-	WeightedBidirectedEdge<N> clone();
 }
diff --git a/src/main/java/com/syncleus/dann/graph/WeightedDirectedEdge.java b/src/main/java/com/syncleus/dann/graph/WeightedDirectedEdge.java
index fb5678d572eac220ab84fac0f264dc8fbb6a662a..11dc7377df2ee4600e73ebcfa68205189c88e56e 100644
--- a/src/main/java/com/syncleus/dann/graph/WeightedDirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/WeightedDirectedEdge.java
@@ -18,14 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import java.util.List;
-
 public interface WeightedDirectedEdge<N> extends DirectedEdge<N>, Weighted
 {
-	@Override
-	WeightedDirectedEdge<N> disconnect(N node);
-	@Override
-	WeightedDirectedEdge<N> disconnect(List<N> node);
-	@Override
-	WeightedDirectedEdge<N> clone();
 }
diff --git a/src/main/java/com/syncleus/dann/graph/WeightedEdge.java b/src/main/java/com/syncleus/dann/graph/WeightedEdge.java
index 2ac0ed82000e86359135981940a3cedc98a5ac85..8af5bc38b2960f68b1cef7a69c50b1682b89a224 100644
--- a/src/main/java/com/syncleus/dann/graph/WeightedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/WeightedEdge.java
@@ -18,14 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import java.util.List;
-
 public interface WeightedEdge<N> extends Edge<N>, Weighted
 {
-	@Override
-	WeightedEdge<N> disconnect(N node);
-	@Override
-	WeightedEdge<N> disconnect(List<N> node);
-	@Override
-	WeightedEdge<N> clone();
 }
diff --git a/src/main/java/com/syncleus/dann/graph/WeightedHyperEdge.java b/src/main/java/com/syncleus/dann/graph/WeightedHyperEdge.java
index c242e4ee8580af9c8171f2310d534714664a3c23..dee22cb8d2d0394ae81811fc9db4246570197807 100644
--- a/src/main/java/com/syncleus/dann/graph/WeightedHyperEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/WeightedHyperEdge.java
@@ -18,14 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import java.util.List;
-
 public interface WeightedHyperEdge<N> extends HyperEdge<N>, Weighted
 {
-	@Override
-	WeightedHyperEdge<N> disconnect(N node);
-	@Override
-	WeightedHyperEdge<N> disconnect(List<N> node);
-	@Override
-	WeightedHyperEdge<N> clone();
 }
diff --git a/src/main/java/com/syncleus/dann/graph/context/AbstractSignalingContextEdge.java b/src/main/java/com/syncleus/dann/graph/context/AbstractSignalingContextEdge.java
index 9360010de6b8033df67509ecba69c0e2927ed598..97721963d1ea5516ab1dcab97e6cde0af228e4ef 100644
--- a/src/main/java/com/syncleus/dann/graph/context/AbstractSignalingContextEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/context/AbstractSignalingContextEdge.java
@@ -47,7 +47,4 @@ public abstract class AbstractSignalingContextEdge<N, S> extends AbstractContext
 				((SignalContextNode)traversableNode).neighborNodeStateChanged(this, node, newState);
 		}
 	}
-
-	@Override
-	public abstract AbstractSignalingContextEdge<N, S> clone();
 }
diff --git a/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/AbstractBayesianAdjacencyNetwork.java b/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/AbstractBayesianAdjacencyNetwork.java
index d7d56229f77f81a9b07fa2bc769aaba9d5f251bb..0127db8cdf6647a00eb23e2193410ac12012ead8 100644
--- a/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/AbstractBayesianAdjacencyNetwork.java
+++ b/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/AbstractBayesianAdjacencyNetwork.java
@@ -128,48 +128,6 @@ public abstract class AbstractBayesianAdjacencyNetwork<N extends BayesianNode, E
 		}
 	}
 
-	@Override
-	public AbstractBayesianAdjacencyNetwork<N, E> cloneAdd(final E newEdge)
-	{
-		return (AbstractBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public AbstractBayesianAdjacencyNetwork<N, E> cloneAdd(final N newNode)
-	{
-		return (AbstractBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public AbstractBayesianAdjacencyNetwork<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (AbstractBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public AbstractBayesianAdjacencyNetwork<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (AbstractBayesianAdjacencyNetwork<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public AbstractBayesianAdjacencyNetwork<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (AbstractBayesianAdjacencyNetwork<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public AbstractBayesianAdjacencyNetwork<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (AbstractBayesianAdjacencyNetwork<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public AbstractBayesianAdjacencyNetwork<N, E> clone()
-	{
-		return (AbstractBayesianAdjacencyNetwork<N, E>) super.clone();
-	}
-
 	@Override
 	public BayesianNetworkXml toXml()
 	{
diff --git a/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/ImmutableBayesianAdjacencyNetwork.java b/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/ImmutableBayesianAdjacencyNetwork.java
index 73673bfedf6cac2ed659931f1bceed6a27e1bc64..d0db47dfba8bd599cebe815b78d0b507303135a8 100644
--- a/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/ImmutableBayesianAdjacencyNetwork.java
+++ b/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/ImmutableBayesianAdjacencyNetwork.java
@@ -72,46 +72,4 @@ public class ImmutableBayesianAdjacencyNetwork<N extends BayesianNode, E extends
 			newAdjacentNodes.put(neighborNodeEntry.getKey(), new ArrayList<N>(neighborNodeEntry.getValue()));
 		return newAdjacentNodes;
 	}
-
-	@Override
-	public ImmutableBayesianAdjacencyNetwork<N, E> cloneAdd(final E newEdge)
-	{
-		return (ImmutableBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public ImmutableBayesianAdjacencyNetwork<N, E> cloneAdd(final N newNode)
-	{
-		return (ImmutableBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public ImmutableBayesianAdjacencyNetwork<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (ImmutableBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public ImmutableBayesianAdjacencyNetwork<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (ImmutableBayesianAdjacencyNetwork<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public ImmutableBayesianAdjacencyNetwork<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (ImmutableBayesianAdjacencyNetwork<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public ImmutableBayesianAdjacencyNetwork<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (ImmutableBayesianAdjacencyNetwork<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public ImmutableBayesianAdjacencyNetwork<N, E> clone()
-	{
-		return (ImmutableBayesianAdjacencyNetwork<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/MutableBayesianAdjacencyNetwork.java b/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/MutableBayesianAdjacencyNetwork.java
index 4d2660977eceea62ff8400757e008e11886c244b..e4e645d3be55387ef797c386b09a9c576c0414a5 100644
--- a/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/MutableBayesianAdjacencyNetwork.java
+++ b/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/MutableBayesianAdjacencyNetwork.java
@@ -199,46 +199,4 @@ public class MutableBayesianAdjacencyNetwork<N extends BayesianNode, E extends B
 
 		return removedSomething;
 	}
-
-	@Override
-	public MutableBayesianAdjacencyNetwork<N, E> cloneAdd(final E newEdge)
-	{
-		return (MutableBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public MutableBayesianAdjacencyNetwork<N, E> cloneAdd(final N newNode)
-	{
-		return (MutableBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public MutableBayesianAdjacencyNetwork<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (MutableBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public MutableBayesianAdjacencyNetwork<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (MutableBayesianAdjacencyNetwork<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public MutableBayesianAdjacencyNetwork<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (MutableBayesianAdjacencyNetwork<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public MutableBayesianAdjacencyNetwork<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (MutableBayesianAdjacencyNetwork<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public MutableBayesianAdjacencyNetwork<N, E> clone()
-	{
-		return (MutableBayesianAdjacencyNetwork<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/SimpleBayesianEdge.java b/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/SimpleBayesianEdge.java
index e86ca89d80930974a0cbcaf84a0ecdee083adce3..b8c4f49964f3af2c4c574bf2b84cc48b1017d912 100644
--- a/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/SimpleBayesianEdge.java
+++ b/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/SimpleBayesianEdge.java
@@ -18,7 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.graphicalmodel.bayesian;
 
-import java.util.List;
 import com.syncleus.dann.graph.AbstractDirectedEdge;
 
 public final class SimpleBayesianEdge<N extends BayesianNode> extends AbstractDirectedEdge<N> implements BayesianEdge<N>
@@ -39,22 +38,4 @@ public final class SimpleBayesianEdge<N extends BayesianNode> extends AbstractDi
 	{
 		return this.getSourceNode().getState();
 	}
-
-	@Override
-	public SimpleBayesianEdge<N> disconnect(final N node)
-	{
-		return (SimpleBayesianEdge<N>) this.remove(node);
-	}
-
-	@Override
-	public SimpleBayesianEdge<N> disconnect(final List<N> nodes)
-	{
-		return (SimpleBayesianEdge<N>) this.remove(nodes);
-	}
-
-	@Override
-	public SimpleBayesianEdge<N> clone()
-	{
-		return (SimpleBayesianEdge<N>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/dynamic/AbstractDynamicBayesianAdjacencyNetwork.java b/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/dynamic/AbstractDynamicBayesianAdjacencyNetwork.java
index f898f2c70ecef4ed3a48788d1f253bf9a6a5539e..e7740ebb83dca1ba35838a0a1295841c401727be 100644
--- a/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/dynamic/AbstractDynamicBayesianAdjacencyNetwork.java
+++ b/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/dynamic/AbstractDynamicBayesianAdjacencyNetwork.java
@@ -48,46 +48,4 @@ public abstract class AbstractDynamicBayesianAdjacencyNetwork<N extends DynamicB
 			node.learnState(updateHistory);
 		}
 	}
-
-	@Override
-	public AbstractDynamicBayesianAdjacencyNetwork<N, E> cloneAdd(final E newEdge)
-	{
-		return (AbstractDynamicBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public AbstractDynamicBayesianAdjacencyNetwork<N, E> cloneAdd(final N newNode)
-	{
-		return (AbstractDynamicBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public AbstractDynamicBayesianAdjacencyNetwork<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (AbstractDynamicBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public AbstractDynamicBayesianAdjacencyNetwork<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (AbstractDynamicBayesianAdjacencyNetwork<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public AbstractDynamicBayesianAdjacencyNetwork<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (AbstractDynamicBayesianAdjacencyNetwork<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public AbstractDynamicBayesianAdjacencyNetwork<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (AbstractDynamicBayesianAdjacencyNetwork<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public AbstractDynamicBayesianAdjacencyNetwork<N, E> clone()
-	{
-		return (AbstractDynamicBayesianAdjacencyNetwork<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/dynamic/ImmutableDynamicBayesianAdjacencyNetwork.java b/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/dynamic/ImmutableDynamicBayesianAdjacencyNetwork.java
index bf116fa08e28fb055cd53b6180ea3a5de4fd8cd4..ee393a9616d5acd25797c8123c6c15b9cd594747 100644
--- a/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/dynamic/ImmutableDynamicBayesianAdjacencyNetwork.java
+++ b/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/dynamic/ImmutableDynamicBayesianAdjacencyNetwork.java
@@ -71,46 +71,4 @@ public class ImmutableDynamicBayesianAdjacencyNetwork<N extends DynamicBayesianN
 			newAdjacentNodes.put(neighborNodeEntry.getKey(), new ArrayList<N>(neighborNodeEntry.getValue()));
 		return newAdjacentNodes;
 	}
-
-	@Override
-	public ImmutableDynamicBayesianAdjacencyNetwork<N, E> cloneAdd(final E newEdge)
-	{
-		return (ImmutableDynamicBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public ImmutableDynamicBayesianAdjacencyNetwork<N, E> cloneAdd(final N newNode)
-	{
-		return (ImmutableDynamicBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public ImmutableDynamicBayesianAdjacencyNetwork<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (ImmutableDynamicBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public ImmutableDynamicBayesianAdjacencyNetwork<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (ImmutableDynamicBayesianAdjacencyNetwork<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public ImmutableDynamicBayesianAdjacencyNetwork<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (ImmutableDynamicBayesianAdjacencyNetwork<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public ImmutableDynamicBayesianAdjacencyNetwork<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (ImmutableDynamicBayesianAdjacencyNetwork<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public ImmutableDynamicBayesianAdjacencyNetwork<N, E> clone()
-	{
-		return (ImmutableDynamicBayesianAdjacencyNetwork<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/dynamic/MutableDynamicBayesianAdjacencyNetwork.java b/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/dynamic/MutableDynamicBayesianAdjacencyNetwork.java
index 89de2aae86420d2a51ad68c6a53b3bb8f4c56fa9..349cfe3a1c20f988422b971693d116ecbc6f842f 100644
--- a/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/dynamic/MutableDynamicBayesianAdjacencyNetwork.java
+++ b/src/main/java/com/syncleus/dann/graphicalmodel/bayesian/dynamic/MutableDynamicBayesianAdjacencyNetwork.java
@@ -200,46 +200,4 @@ public class MutableDynamicBayesianAdjacencyNetwork<N extends DynamicBayesianNod
 
 		return removedSomething;
 	}
-
-	@Override
-	public MutableDynamicBayesianAdjacencyNetwork<N, E> cloneAdd(final E newEdge)
-	{
-		return (MutableDynamicBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newEdge);
-	}
-
-	@Override
-	public MutableDynamicBayesianAdjacencyNetwork<N, E> cloneAdd(final N newNode)
-	{
-		return (MutableDynamicBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newNode);
-	}
-
-	@Override
-	public MutableDynamicBayesianAdjacencyNetwork<N, E> cloneAdd(final Set<N> newNodes, final Set<E> newEdges)
-	{
-		return (MutableDynamicBayesianAdjacencyNetwork<N, E>) super.cloneAdd(newNodes, newEdges);
-	}
-
-	@Override
-	public MutableDynamicBayesianAdjacencyNetwork<N, E> cloneRemove(final E edgeToRemove)
-	{
-		return (MutableDynamicBayesianAdjacencyNetwork<N, E>) super.cloneRemove(edgeToRemove);
-	}
-
-	@Override
-	public MutableDynamicBayesianAdjacencyNetwork<N, E> cloneRemove(final N nodeToRemove)
-	{
-		return (MutableDynamicBayesianAdjacencyNetwork<N, E>) super.cloneRemove(nodeToRemove);
-	}
-
-	@Override
-	public MutableDynamicBayesianAdjacencyNetwork<N, E> cloneRemove(final Set<N> deleteNodes, final Set<E> deleteEdges)
-	{
-		return (MutableDynamicBayesianAdjacencyNetwork<N, E>) super.cloneRemove(deleteNodes, deleteEdges);
-	}
-
-	@Override
-	public MutableDynamicBayesianAdjacencyNetwork<N, E> clone()
-	{
-		return (MutableDynamicBayesianAdjacencyNetwork<N, E>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/math/AbstractFunction.java b/src/main/java/com/syncleus/dann/math/AbstractFunction.java
index 4d28827b5b1c553186c944e066ad5f954bc6adde..471d17820cf0141f9185e6d29acb011b33acb2b1 100644
--- a/src/main/java/com/syncleus/dann/math/AbstractFunction.java
+++ b/src/main/java/com/syncleus/dann/math/AbstractFunction.java
@@ -110,7 +110,7 @@ public abstract class AbstractFunction implements Cloneable, Function
 
 	@Override
 	@SuppressWarnings("unchecked")
-	public AbstractFunction clone()
+	public Object clone()
 	{
 		try
 		{
diff --git a/src/main/java/com/syncleus/dann/math/linear/SimpleRealMatrix.java b/src/main/java/com/syncleus/dann/math/linear/SimpleRealMatrix.java
index ed00c0c80fa844812ab999b75f7b74c25b2152f1..21d8b1eafe6ba9b0874de3d6940021a862ba6484 100644
--- a/src/main/java/com/syncleus/dann/math/linear/SimpleRealMatrix.java
+++ b/src/main/java/com/syncleus/dann/math/linear/SimpleRealMatrix.java
@@ -182,7 +182,7 @@ public class SimpleRealMatrix implements Cloneable, Serializable, RealMatrix
 	}
 
 	@Override
-	public SimpleRealMatrix clone()
+	public Object clone()
 	{
 		try
 		{
diff --git a/src/main/java/com/syncleus/dann/math/wave/SharpenedWaveFunction.java b/src/main/java/com/syncleus/dann/math/wave/SharpenedWaveFunction.java
index d0b1a79eba93210cf53b59b6fcaf440d8b4dec38..d472fbfa1c3cc892aa689da5bbbd5912776c81a5 100644
--- a/src/main/java/com/syncleus/dann/math/wave/SharpenedWaveFunction.java
+++ b/src/main/java/com/syncleus/dann/math/wave/SharpenedWaveFunction.java
@@ -56,12 +56,6 @@ public class SharpenedWaveFunction extends WaveFunction
 		return (super.calculate() / Math.abs(super.calculate())) * Math.abs(Math.pow(Math.abs(super.calculate() / this.getAmplitude()), this.getForm()) * this.getAmplitude());
 	}
 
-	@Override
-	public SharpenedWaveFunction clone()
-	{
-		return (SharpenedWaveFunction) super.clone();
-	}
-
 	@Override
 	public String toString()
 	{
diff --git a/src/main/java/com/syncleus/dann/math/wave/WaveFunction.java b/src/main/java/com/syncleus/dann/math/wave/WaveFunction.java
index 7a29109a0e7e7b3b0a491c2a2f59defdd53aeeb5..d5026e44c5b771f04370dab05c95ec3d9c6eb763 100644
--- a/src/main/java/com/syncleus/dann/math/wave/WaveFunction.java
+++ b/src/main/java/com/syncleus/dann/math/wave/WaveFunction.java
@@ -85,12 +85,6 @@ public class WaveFunction extends AbstractFunction
 		return Math.sin((this.getX() + (this.getPhase() / 360)) * 2 * Math.PI * this.getFrequency()) * this.getAmplitude();
 	}
 
-	@Override
-	public WaveFunction clone()
-	{
-		return (WaveFunction) super.clone();
-	}
-
 	@Override
 	public String toString()
 	{
diff --git a/src/main/java/com/syncleus/dann/math/wave/WaveMultidimensionalFunction.java b/src/main/java/com/syncleus/dann/math/wave/WaveMultidimensionalFunction.java
index a30618aa9d0aaa6607ab12fc0b90886ede126d2e..7c57619304a1d4eea40ae5c9cb7e2ddcbffb988f 100644
--- a/src/main/java/com/syncleus/dann/math/wave/WaveMultidimensionalFunction.java
+++ b/src/main/java/com/syncleus/dann/math/wave/WaveMultidimensionalFunction.java
@@ -171,11 +171,11 @@ public class WaveMultidimensionalFunction extends AbstractFunction
 	}
 
 	@Override
-	public WaveMultidimensionalFunction clone()
+	public Object clone()
 	{
 		final WaveMultidimensionalFunction copy = (WaveMultidimensionalFunction) super.clone();
 
-		copy.wave = this.wave.clone();
+		copy.wave = (SharpenedWaveletFunction) this.wave.clone();
 		copy.dimensionNames = this.dimensionNames.clone();
 
 		return copy;
diff --git a/src/main/java/com/syncleus/dann/math/wave/wavelet/CombinedWaveletFunction.java b/src/main/java/com/syncleus/dann/math/wave/wavelet/CombinedWaveletFunction.java
index e1210a10c3a75b5760897c0d49191688417976bd..78c9e2c607855fbfe0a04359df3250041a46f558 100644
--- a/src/main/java/com/syncleus/dann/math/wave/wavelet/CombinedWaveletFunction.java
+++ b/src/main/java/com/syncleus/dann/math/wave/wavelet/CombinedWaveletFunction.java
@@ -79,7 +79,7 @@ public class CombinedWaveletFunction extends AbstractFunction
 	}
 
 	@Override
-	public CombinedWaveletFunction clone()
+	public Object clone()
 	{
 		final CombinedWaveletFunction copy = (CombinedWaveletFunction) super.clone();
 		copy.dimensions = new TreeSet<String>(this.dimensions);
diff --git a/src/main/java/com/syncleus/dann/math/wave/wavelet/SharpenedWaveletFunction.java b/src/main/java/com/syncleus/dann/math/wave/wavelet/SharpenedWaveletFunction.java
index adec82d9728c4c40fa5c5c74314de3b746b7fa9e..8ffc1eedc7e263cac87503ba59cfe59875df0321 100644
--- a/src/main/java/com/syncleus/dann/math/wave/wavelet/SharpenedWaveletFunction.java
+++ b/src/main/java/com/syncleus/dann/math/wave/wavelet/SharpenedWaveletFunction.java
@@ -90,12 +90,6 @@ public class SharpenedWaveletFunction extends SharpenedWaveFunction
 		return super.calculate() * this.calculateDistribution();
 	}
 
-	@Override
-	public SharpenedWaveletFunction clone()
-	{
-		return (SharpenedWaveletFunction) super.clone();
-	}
-
 	@Override
 	public String toString()
 	{
diff --git a/src/main/java/com/syncleus/dann/neural/AbstractSynapse.java b/src/main/java/com/syncleus/dann/neural/AbstractSynapse.java
index 29d3d757d26d6a43633e2dc14ff50e576c0a3906..ae6f134b859644597c6a07230d14ba09f3905719 100644
--- a/src/main/java/com/syncleus/dann/neural/AbstractSynapse.java
+++ b/src/main/java/com/syncleus/dann/neural/AbstractSynapse.java
@@ -18,7 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.neural;
 
-import java.util.List;
 import java.util.Random;
 import com.syncleus.dann.graph.AbstractDirectedEdge;
 
@@ -140,22 +139,4 @@ public abstract class AbstractSynapse<N extends Neuron> extends AbstractDirected
 	{
 		return this.input;
 	}
-
-	@Override
-	public AbstractSynapse<N> disconnect(final N node)
-	{
-		return (AbstractSynapse<N>) super.disconnect(node);
-	}
-
-	@Override
-	public AbstractSynapse<N> disconnect(final List<N> nodes)
-	{
-		return (AbstractSynapse<N>) super.disconnect(nodes);
-	}
-
-	@Override
-	public AbstractSynapse<N> clone()
-	{
-		return (AbstractSynapse<N>) super.clone();
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/neural/SimpleSynapse.java b/src/main/java/com/syncleus/dann/neural/SimpleSynapse.java
index 69b899ea60176d96be64bf1c97ee820d129dfe78..c89a5606fb2014a9044e39cc521882694e3ee79b 100644
--- a/src/main/java/com/syncleus/dann/neural/SimpleSynapse.java
+++ b/src/main/java/com/syncleus/dann/neural/SimpleSynapse.java
@@ -18,8 +18,6 @@
  ******************************************************************************/
 package com.syncleus.dann.neural;
 
-import java.util.List;
-
 /**
  * The synapse acts as a bridge between connected neurons. It is also where the
  * connection weights are stores and manipulated.
@@ -80,22 +78,4 @@ public final class SimpleSynapse<N extends Neuron> extends AbstractSynapse<N>
 	{
 		super(sourceToSet, destinationToSet, allowJoiningMultipleGraphs, contextEnabled);
 	}
-
-	@Override
-	public SimpleSynapse<N> disconnect(final N node)
-	{
-		return (SimpleSynapse<N>) super.disconnect(node);
-	}
-
-	@Override
-	public SimpleSynapse<N> disconnect(final List<N> nodes)
-	{
-		return (SimpleSynapse<N>) super.disconnect(nodes);
-	}
-
-	@Override
-	public SimpleSynapse<N> clone()
-	{
-		return (SimpleSynapse<N>) super.clone();
-	}
 }