diff --git a/src/asteroids/Asteroid.java b/src/asteroids/Asteroid.java
index c0298ab0605a772c3e0046aaeed9a7182a684c7d..f0f9b7f0a28aa11820eb4c5831a4841e45daa51a 100644
--- a/src/asteroids/Asteroid.java
+++ b/src/asteroids/Asteroid.java
@@ -71,6 +71,13 @@ public class Asteroid extends GameObject {
         g.setTransform(at);
     }
 
+    @Override
+    public GameObject copy() {
+        Asteroid asteroid = new Asteroid(game, s, v, index);
+        updateClone(asteroid);
+        return asteroid;
+    }
+
     public void update() {
         s.add(v);
         rot += rotRate;
diff --git a/src/asteroids/Column.java b/src/asteroids/Column.java
index 1da9879ad136aa10dbd7e95f288a7b365bfc6923..4b5b2c3be19fe4a80c2bb6c016ab8a6c34a345a0 100644
--- a/src/asteroids/Column.java
+++ b/src/asteroids/Column.java
@@ -14,6 +14,7 @@ public class Column extends GameObject implements PolyContains {
     static Stroke stroke = new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
     boolean dead;
     GameState game;
+    private int index;
 
     static double minGap = 0.2;
     static double maxGap = 0.4;
@@ -24,6 +25,7 @@ public class Column extends GameObject implements PolyContains {
 
     public Column(GameState game, int index) {
         super(new Vector2d(width + index * width/4, 0), new Vector2d(-1, 0));
+        this.index = index;
         this.game = game;
         setRandPaths();
     }
@@ -74,6 +76,13 @@ public class Column extends GameObject implements PolyContains {
         g.setTransform(at);
     }
 
+    @Override
+    public GameObject copy() {
+        Column column = new Column(game, index);
+        updateClone(column);
+        return column;
+    }
+
     public void update() {
         s.add(v);
         if (s.x < 0) {
diff --git a/src/asteroids/GameObject.java b/src/asteroids/GameObject.java
index 54aa0610f7dffcd59a8f9dc37a0e92cc3772488b..9eba6beca54207d9b77ad665e12edff13989b60e 100644
--- a/src/asteroids/GameObject.java
+++ b/src/asteroids/GameObject.java
@@ -17,6 +17,17 @@ public abstract class GameObject {
 
     public abstract void update();
     public abstract void draw(Graphics2D g);
+    public abstract GameObject copy();
+
+    protected GameObject updateClone(GameObject copyObject) {
+        copyObject.s = s.copy();
+        copyObject.v = v.copy();
+        copyObject.isTarget = isTarget;
+        copyObject.dead = dead;
+        copyObject.r = r;
+
+        return copyObject;
+    }
 
     public abstract boolean dead();
 
diff --git a/src/asteroids/Missile.java b/src/asteroids/Missile.java
index a8e71a3edb71444e85fce3ae97fea21d027fb911..8bf2674d91352914c5c64022280bc9dcab01cb3a 100644
--- a/src/asteroids/Missile.java
+++ b/src/asteroids/Missile.java
@@ -30,6 +30,14 @@ public class Missile extends GameObject {
         g.fillOval((int) (s.x-r), (int) (s.y-r), (int) r * 2, (int) r * 2);
     }
 
+    @Override
+    public GameObject copy() {
+        Missile object = new Missile(s, v);
+        object.ttl = ttl;
+
+        return object;
+    }
+
     public boolean dead() {
         return ttl <= 0;
     }
diff --git a/src/battle/BattleMissile.java b/src/battle/BattleMissile.java
index e546149cde3caa228aa6645a82d098a5cf4592b8..ab3106d6b33b55d02f2fcd2910605eb2b8881a98 100644
--- a/src/battle/BattleMissile.java
+++ b/src/battle/BattleMissile.java
@@ -29,6 +29,15 @@ public class BattleMissile extends GameObject {
         }
     }
 
+    @Override
+    public BattleMissile copy() {
+        BattleMissile copy = new BattleMissile(s, v, id);
+        updateClone(copy);
+        copy.ttl = ttl;
+        copy.color = color;
+        return copy;
+    }
+
     @Override
     public void draw(Graphics2D g) {
         g.setColor(color);
diff --git a/src/battle/SimpleBattle.java b/src/battle/SimpleBattle.java
index 82e0868136797e6363998eebacfccbef6cd26f6e..9827629a675f0484975ea728a668bc309fdab1a8 100644
--- a/src/battle/SimpleBattle.java
+++ b/src/battle/SimpleBattle.java
@@ -91,7 +91,6 @@ public class SimpleBattle {
 
     public void update(Action a1, Action a2) {
         // now apply them to the ships
-
         s1.update(a1);
         s2.update(a2);
 
@@ -119,6 +118,7 @@ public class SimpleBattle {
         }
     }
 
+
     public SimpleBattle clone() {
         SimpleBattle state = new SimpleBattle();
         state.objects = copyObjects();
@@ -132,7 +132,7 @@ public class SimpleBattle {
     protected ArrayList<GameObject> copyObjects() {
         ArrayList<GameObject> objectClone = new ArrayList<GameObject>();
         for (GameObject object : objects) {
-            objectClone.add(object);
+            objectClone.add(object.copy());
         }
 
         return objectClone;