From 58895f386122a954b68d42ca1a794eab2a8d747e Mon Sep 17 00:00:00 2001
From: hoijui <hoijui.quaero@gmail.com>
Date: Mon, 11 Apr 2011 19:21:29 +0200
Subject: [PATCH] do not override only for specializing the return type, this
 fixes ticket #188

---
 .../MutableAttributeTreeAdjacencyGraph.java   | 15 +++----
 .../dann/genetics/AbstractValueGene.java      |  2 +-
 .../syncleus/dann/genetics/ByteValueGene.java | 14 +------
 .../com/syncleus/dann/genetics/Chromatid.java |  9 ----
 .../dann/genetics/DoubleValueGene.java        | 14 +------
 .../dann/genetics/FloatValueGene.java         | 14 +------
 .../java/com/syncleus/dann/genetics/Gene.java |  9 ----
 .../genetics/GeneticAlgorithmChromosome.java  |  4 +-
 .../dann/genetics/IntegerValueGene.java       | 14 +------
 .../syncleus/dann/genetics/LongValueGene.java | 14 +------
 .../syncleus/dann/genetics/MutableByte.java   | 12 ------
 .../syncleus/dann/genetics/MutableDouble.java | 12 ------
 .../syncleus/dann/genetics/MutableFloat.java  | 12 ------
 .../dann/genetics/MutableInteger.java         | 12 ------
 .../syncleus/dann/genetics/MutableLong.java   | 12 ------
 .../syncleus/dann/genetics/MutableNumber.java |  2 +-
 .../syncleus/dann/genetics/MutableShort.java  | 12 ------
 .../dann/genetics/ShortValueGene.java         | 14 +------
 .../dann/genetics/wavelets/AbstractKey.java   |  4 +-
 .../wavelets/AbstractWaveletGene.java         |  4 +-
 .../dann/genetics/wavelets/Chromosome.java    |  6 +--
 .../genetics/wavelets/ExpressionFunction.java | 12 +++---
 .../genetics/wavelets/ExternalSignalGene.java |  6 ---
 .../dann/genetics/wavelets/Nucleus.java       |  4 +-
 .../dann/genetics/wavelets/PromoterGene.java  |  4 +-
 .../dann/genetics/wavelets/ReceptorKey.java   | 12 ------
 .../dann/genetics/wavelets/SignalGene.java    |  4 +-
 .../dann/genetics/wavelets/SignalKey.java     | 12 ------
 .../wavelets/SignalProcessingWavelet.java     | 14 +++----
 .../genetics/wavelets/WaveletChromatid.java   | 20 ++++-----
 .../dann/graph/AbstractAdjacencyGraph.java    | 16 +++----
 .../AbstractBidirectedAdjacencyGraph.java     | 42 -------------------
 .../dann/graph/AbstractBidirectedEdge.java    |  6 ---
 .../graph/AbstractDirectedAdjacencyGraph.java | 42 -------------------
 .../dann/graph/AbstractDirectedEdge.java      | 14 ++-----
 .../com/syncleus/dann/graph/AbstractEdge.java |  4 +-
 .../graph/AbstractHyperAdjacencyGraph.java    | 42 -------------------
 .../dann/graph/AbstractHyperEdge.java         | 22 ++++------
 .../AbstractRootedTreeAdjacencyGraph.java     | 18 +++-----
 .../graph/AbstractTreeAdjacencyGraph.java     | 18 +++-----
 .../dann/graph/AbstractUndirectedEdge.java    | 14 ++-----
 .../graph/AbstractWeightedBidirectedEdge.java |  6 ---
 .../dann/graph/AbstractWeightedEdge.java      |  6 ---
 .../syncleus/dann/graph/BidirectedEdge.java   |  6 ---
 .../com/syncleus/dann/graph/DirectedEdge.java |  8 ----
 .../java/com/syncleus/dann/graph/Edge.java    |  2 -
 .../java/com/syncleus/dann/graph/Graph.java   |  1 -
 .../com/syncleus/dann/graph/HyperEdge.java    |  6 ---
 .../dann/graph/ImmutableAdjacencyGraph.java   | 42 -------------------
 .../ImmutableDirectedAdjacencyGraph.java      | 42 -------------------
 .../dann/graph/ImmutableDirectedEdge.java     | 20 ---------
 .../graph/ImmutableHyperAdjacencyGraph.java   | 42 -------------------
 .../dann/graph/ImmutableHyperEdge.java        | 30 -------------
 .../ImmutableRootedTreeAdjacencyGraph.java    | 42 -------------------
 .../graph/ImmutableTreeAdjacencyGraph.java    | 42 -------------------
 .../dann/graph/ImmutableUndirectedEdge.java   | 20 ---------
 .../graph/ImmutableWeightedDirectedEdge.java  | 20 ---------
 .../graph/ImmutableWeightedHyperEdge.java     | 18 --------
 .../ImmutableWeightedUndirectedEdge.java      | 20 ---------
 .../dann/graph/MutableAdjacencyGraph.java     | 42 -------------------
 .../graph/MutableDirectedAdjacencyGraph.java  | 42 -------------------
 .../graph/MutableHyperAdjacencyGraph.java     | 42 -------------------
 .../MutableRootedTreeAdjacencyGraph.java      | 42 -------------------
 .../dann/graph/MutableTreeAdjacencyGraph.java | 18 +++-----
 .../graph/SimpleWeightedDirectedEdge.java     | 20 ---------
 .../dann/graph/SimpleWeightedHyperEdge.java   | 18 --------
 .../graph/SimpleWeightedUndirectedEdge.java   | 20 ---------
 .../dann/graph/WeightedBidirectedEdge.java    |  8 ----
 .../dann/graph/WeightedDirectedEdge.java      |  8 ----
 .../com/syncleus/dann/graph/WeightedEdge.java |  8 ----
 .../dann/graph/WeightedHyperEdge.java         |  8 ----
 .../context/AbstractSignalingContextEdge.java |  3 --
 .../AbstractBayesianAdjacencyNetwork.java     | 42 -------------------
 .../ImmutableBayesianAdjacencyNetwork.java    | 42 -------------------
 .../MutableBayesianAdjacencyNetwork.java      | 42 -------------------
 .../bayesian/SimpleBayesianEdge.java          | 19 ---------
 ...stractDynamicBayesianAdjacencyNetwork.java | 42 -------------------
 ...utableDynamicBayesianAdjacencyNetwork.java | 42 -------------------
 ...utableDynamicBayesianAdjacencyNetwork.java | 42 -------------------
 .../syncleus/dann/math/AbstractFunction.java  |  2 +-
 .../dann/math/linear/SimpleRealMatrix.java    |  2 +-
 .../dann/math/wave/SharpenedWaveFunction.java |  6 ---
 .../syncleus/dann/math/wave/WaveFunction.java |  6 ---
 .../wave/WaveMultidimensionalFunction.java    |  4 +-
 .../wave/wavelet/CombinedWaveletFunction.java |  2 +-
 .../wavelet/SharpenedWaveletFunction.java     |  6 ---
 .../syncleus/dann/neural/AbstractSynapse.java | 19 ---------
 .../syncleus/dann/neural/SimpleSynapse.java   | 20 ---------
 88 files changed, 103 insertions(+), 1424 deletions(-)

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 f324ec86..c006ecb9 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 00f350ff..ddf00c1d 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 2520ea5e..c9c6d340 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 50b9e784..bf1e627c 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 78137ea9..548a1f9a 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 0d90c280..b6c26af4 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 9f11fa44..ee074cae 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 c31bc498..af9628e3 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 7b0c7216..aa25e180 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 d9fb2fc6..4fb87927 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 b031eddc..6cc08b75 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 a45d41fb..8725647a 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 43d4aad1..a3c0dfea 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 718c9f85..c110f3fe 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 e1042566..9d12b498 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 89b525f3..5dd13b69 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 e21c0b1e..6be7776a 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 cb1f2e2c..70cc8034 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 3e9c9eed..d0fdf75f 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 19da9072..ea7e98ac 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 e48a3d81..4ffee246 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 a92728fe..2192d9c0 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 e9ef32b0..1454ac56 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 3057a318..5447dcd2 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 e9f08701..5d1c76f8 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 61475356..94a50552 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 7467b6fe..33adf452 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 afe06ad5..4fc5296a 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 5a2a5ea7..05d203c0 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 49a322c5..c3731abc 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 f7dc1adb..11bac2c4 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 1b38ece3..9d528ff0 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 7cad2435..ed37961f 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 67a162bf..4c1a0650 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 bab69395..81534482 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 3fedb0b6..5f4d6915 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 973fb598..70d0c926 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 c98af1fd..22037bab 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 398e6683..1e645eb8 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 14b0ac2e..05d63050 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 74a577f3..d950fbc1 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 d0c1d628..d2bb7bce 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 e76155ef..43b5e995 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 4baff40b..7a23ae19 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 eca10ca4..ec70a70c 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 5d23f6f5..5bb83efc 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 c55d1960..0e4f46d7 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 2877305f..522468ce 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 29369bb5..37adf259 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 1d1e6c0b..92f732d0 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 dacac5cb..32c80b6d 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 2f7c2dc1..8b02ace3 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 06cdea92..9df968d6 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 a2b7d1ae..758eed5f 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 efa197b5..c79685e3 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 7f23e46d..6363d106 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 0fe340f3..d334abb5 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 4ac6a256..812c415d 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 2afe38cb..0e03ee35 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 4e252e59..fed46bf3 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 ed8f003b..89baaf14 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 bc6ae075..ab7b58c0 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 6c55382a..fb60fc6f 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 8e2b6746..8f375a7f 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 a40d9556..9e439ae3 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 ba9d72eb..f53995d7 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 d80afff7..22ab180e 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 43c56ee8..2feae3b6 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 fb5678d5..11dc7377 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 2ac0ed82..8af5bc38 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 c242e4ee..dee22cb8 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 9360010d..97721963 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 d7d56229..0127db8c 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 73673bfe..d0db47df 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 4d266097..e4e645d3 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 e86ca89d..b8c4f499 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 f898f2c7..e7740ebb 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 bf116fa0..ee393a96 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 89de2aae..349cfe3a 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 4d28827b..471d1782 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 ed00c0c8..21d8b1ea 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 d0b1a79e..d472fbfa 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 7a29109a..d5026e44 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 a30618aa..7c576193 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 e1210a10..78c9e2c6 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 adec82d9..8ffc1eed 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 29d3d757..ae6f134b 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 69b899ea..c89a5606 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();
-	}
 }
-- 
GitLab