diff --git a/MavenChess/MavenChess/src/main/java/controller/Game.java b/MavenChess/MavenChess/src/main/java/controller/Game.java
index f80862e912f52718317d0359daf9a7d09de74486..7d3ef8f9f455a714bcbfdedd80a5ba4e236ee478 100644
--- a/MavenChess/MavenChess/src/main/java/controller/Game.java
+++ b/MavenChess/MavenChess/src/main/java/controller/Game.java
@@ -35,7 +35,14 @@ public class Game {
         boardView.refresh(board, model);
     }
 
-    public void clickPiece(PieceView clickedPiece, Board board, BoardView boardView, CustomMaterial material, Custom3dModel model, Log log) {
+    public void nextTurn() {
+        if(isWhiteTurn())
+            setStatus(Game.BLACK_TURN);
+        else if(isBlackTurn())
+            setStatus(Game.WHITE_TURN);
+    }
+
+    public void clickPiece(PieceView clickedPiece, Board board, BoardView boardView, CustomMaterial material, Custom3dModel model, Log log, HUD hud) {
 
         // graveyard pieces should not do anything
         if(clickedPiece.getPosition().getX() < 0) {
@@ -44,7 +51,7 @@ public class Game {
         // if piece is colored (aka targeted), we consider it an action to apply (tile click)
         if(clickedPiece.isTargeted()) {
             TileView tile = boardView.getTile(clickedPiece.getPosition().getID());
-            clickTile(tile, board, boardView, material, model, log);
+            clickTile(tile, board, boardView, material, model, log, hud);
             return;
         }
         if(clickedPiece.isWhite() && isWhiteTurn() || clickedPiece.isBlack() && isBlackTurn()) {
@@ -106,7 +113,7 @@ public class Game {
         }
     }
 
-    public void clickTile(TileView clickedTile, Board board, BoardView boardView, CustomMaterial material, Custom3dModel model, Log log) {
+    public void clickTile(TileView clickedTile, Board board, BoardView boardView, CustomMaterial material, Custom3dModel model, Log log, HUD hud) {
 
         boolean moved = false; // to tell if an action/movement was used or not
 
@@ -241,11 +248,9 @@ public class Game {
         boardView.resetColor(material);
         // updates game status
         if(moved) {
-            if(isWhiteTurn())
-                setStatus(Game.BLACK_TURN);
-            else if(isBlackTurn())
-                setStatus(Game.WHITE_TURN);
-            log.save(board, boardView);
+            nextTurn(); // change player turn
+            log.save(board, boardView); // saves current board
+            hud.rollbackShow(); // show rollback button (if not showed already)
         }
     }
 }
diff --git a/MavenChess/MavenChess/src/main/java/controller/Log.java b/MavenChess/MavenChess/src/main/java/controller/Log.java
index d0fb207488667c921142c96e92f2f010174a20d5..cf05e2a68f05e801c7b80552315cabdcba12d298 100644
--- a/MavenChess/MavenChess/src/main/java/controller/Log.java
+++ b/MavenChess/MavenChess/src/main/java/controller/Log.java
@@ -1,20 +1,77 @@
 package controller;
 
-import model.Board;
-import model.Piece;
-import view.BoardView;
+import javafx.scene.Group;
+import javafx.scene.input.MouseEvent;
+import model.*;
+import view.*;
 
 import java.util.ArrayList;
 
 public class Log {
 	// contains dynamic array of board, to be able to ctrl-Z equivalent
     ArrayList<Piece[]> logPieces;
+    ArrayList<PieceView[]> logWhiteGraveyard, logBlackGraveyard;
 
     public Log() {
         logPieces = new ArrayList<>();
+        logWhiteGraveyard = new ArrayList<>();
+        logBlackGraveyard = new ArrayList<>();
     }
 
     public void save(Board board, BoardView boardView) {
-        logPieces.add(board.getAllPieces());
+        Board copy = new Board();
+        for(int n = 0 ; n < 64 ; n++) {
+            // we make a NEW COPY, not just getting pointer !
+            Piece piece = board.getPiece(n);
+            if(piece != null) {
+                copy.setPiece(piece.newInstanceCopy());
+            }
+        }
+        int id = logPieces.size();
+        logPieces.add(id, copy.getAllPieces());
+        // for graveyards, we don't need a copy, because pieces aren't moving at all once inside, so there will be no issues
+        PieceView[] white = new PieceView[16];
+        PieceView[] black = new PieceView[16];
+        for(int n = 0 ; n < 16 ; n++) {
+            white[n] = boardView.getWhiteGraveyard()[n];
+            black[n] = boardView.getBlackGraveyard()[n];
+        }
+        logWhiteGraveyard.add(id, white);
+        logBlackGraveyard.add(id, black);
+
+    }
+
+    public void rollback(Board board, BoardView boardView, CustomMaterial material, Custom3dModel model, Group group3d, Game game, HUD hud) {
+        int id = logPieces.size() - 1;
+        if(id > 0) {
+            // rollback once
+            logPieces.remove(id);
+            logWhiteGraveyard.remove(id);
+            logBlackGraveyard.remove(id);
+            // modify the game, refresh completely the board and creates pieces from log
+            id--;
+            board.clean(); // clean board (model)
+            boardView.visualClean(group3d); // clean board (visual)
+            for(int n = 0 ; n < 64 ; n++) {
+                Piece piece = logPieces.get(id)[n];
+                //System.out.println(piece);
+                if(piece != null) {
+                    board.setPiece(piece.newInstanceCopy()); // set piece (model) - new copy
+                    Position p = piece.getPosition();
+                    int color = piece.getColor();
+                    boardView.createPiece(p, color, boardView.getMeshType(piece), material, model); // set piece (visual)
+                    boardView.updatePiece(p); // place piece at right position in 3d (visual)
+                    // add click-event to piece (visual)
+                    PieceView pieceView = boardView.getPiece(p.getID());
+                    pieceView.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event ->
+                            game.clickPiece(pieceView, board, boardView, material, model, this, hud));
+                }
+            }
+            boardView.addPiecesOnlyToScene(group3d); // adds all the new 3d pieces to scene (visual)
+            game.nextTurn(); // previous turn (same as next turn actually)
+        }
+        if(id == 0) { // if we are on first saving, we don't need to show rollback button anymore
+            hud.rollbackHide();
+        }
     }
 }
diff --git a/MavenChess/MavenChess/src/main/java/controller/Main.java b/MavenChess/MavenChess/src/main/java/controller/Main.java
index a69f812c9a467d71e0b5aa8014e51193acf74f6c..692df0bfc59080f613b88ca70474bc03b7687c2d 100644
--- a/MavenChess/MavenChess/src/main/java/controller/Main.java
+++ b/MavenChess/MavenChess/src/main/java/controller/Main.java
@@ -3,6 +3,8 @@ package controller;
 import javafx.application.Application;
 import javafx.beans.value.ChangeListener;
 import javafx.scene.*;
+import javafx.scene.input.KeyCode;
+import javafx.scene.input.KeyEvent;
 import javafx.scene.input.MouseEvent;
 import javafx.scene.input.ScrollEvent;
 import javafx.scene.layout.AnchorPane;
@@ -71,6 +73,7 @@ public class Main extends Application {
 
 		// init - creates a (model) list of all pieces
 		board = new Board();
+		board.initBoard(); // place standard pieces
 
 		// init - creates a (visual) chessboard of 8x8, and all (visual) 3d pieces
 		boardView = new BoardView(model, material, board);
@@ -99,14 +102,14 @@ public class Main extends Application {
 		for(int n = 0 ; n < 64 ; n++) {
 			PieceView piece = boardView.getPiece(n);
 			if(piece != null) {
-				piece.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> game.clickPiece(piece, board, boardView, material, model, log));
+				piece.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> game.clickPiece(piece, board, boardView, material, model, log, hud));
 			}
 		}
 
 		// event - click on (visual) "colored tiles" to move the selected piece there
 		for(int n = 0 ; n < 64 ; n++) {
 			TileView tile = boardView.getTile(n);
-			tile.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> game.clickTile(tile, board, boardView, material, model, log));
+			tile.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> game.clickTile(tile, board, boardView, material, model, log, hud));
 		}
 
 		// event - window resize
@@ -122,11 +125,19 @@ public class Main extends Application {
 		hud.getStandard().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {
 			hud.removeMenu(group2d);
 			camera.stopAnimation();
+			log.save(board, boardView); // save once
 		});
 		hud.getVariant().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {
 			hud.removeMenu(group2d);
 			camera.stopAnimation();
 			game.setVariant(true, model, board, boardView);
+			log.save(board, boardView); // save once
+		});
+
+		// event - rollback
+		hud.getRollback().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {
+			boardView.resetColor(material);
+			log.rollback(board, boardView, material, model, group3d, game, hud);
 		});
 
 		// start --------------------------------------------------------------
diff --git a/MavenChess/MavenChess/src/main/java/model/Bishop.java b/MavenChess/MavenChess/src/main/java/model/Bishop.java
index cd2e3566b0bc6eaf0cef0c38aa52cf3e1e1dcfea..95adc589ba1e815fd810ad62a2ad3c6107510193 100644
--- a/MavenChess/MavenChess/src/main/java/model/Bishop.java
+++ b/MavenChess/MavenChess/src/main/java/model/Bishop.java
@@ -89,4 +89,8 @@ public class Bishop extends Piece {
 
         return moves;
     }
+
+    public Piece newInstanceCopy() {
+        return new Bishop(p, color);
+    }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Board.java b/MavenChess/MavenChess/src/main/java/model/Board.java
index 93ae81231cf533207dce597fbbc16fc1165a3b2f..f8a24ae6b90b553fea8b66315953b0d8efe78293 100644
--- a/MavenChess/MavenChess/src/main/java/model/Board.java
+++ b/MavenChess/MavenChess/src/main/java/model/Board.java
@@ -14,9 +14,10 @@ public class Board {
 		selected = null;
 		// initialisation of the list of pieces
 		pieces = new Piece[64];
-		for(int i = 0 ; i < 64 ; i++) {
-			pieces[i] = null;
-		}
+		clean();
+	}
+
+	public void initBoard() { // inits board with standard pieces
 		int y;
 		for(int color = Piece.WHITE ; color == Piece.WHITE || color == Piece.BLACK ; color++) {
 			// placement of pawns
@@ -166,6 +167,12 @@ public class Board {
 				&& getPiece(p).getClass() == Bishop.class);
 	}
 
+	public boolean isQueen(Position p) {
+		return (p.isCorrect()
+				&& !isFree(p)
+				&& getPiece(p).getClass() == Queen.class);
+	}
+
 	public void setVariant(boolean isVariant) {
 		isFeyPieces = isVariant;
 		for(int j = 1 ; j <= 8 ; j++) {
@@ -196,4 +203,10 @@ public class Board {
 			}
 		}
 	}
+
+	public void clean() { // cleans board (use carefully !)
+		for(int i = 0 ; i < 64 ; i++) {
+			pieces[i] = null;
+		}
+	}
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Giant.java b/MavenChess/MavenChess/src/main/java/model/Giant.java
index d4f7d911a16e0929a32ffc0825420ac979faf50d..42e925a538178d5fc08a8057d044ec8f0d9bece5 100644
--- a/MavenChess/MavenChess/src/main/java/model/Giant.java
+++ b/MavenChess/MavenChess/src/main/java/model/Giant.java
@@ -23,7 +23,7 @@ public class Giant extends Piece{
             int y = all_y[n];
             boolean blocked = false;
             int i = 1;
-            while (i < 4 && !blocked) { // continues "as a ray" in that direction until blocked
+            while (i < 4 && !blocked) { // continues in that direction until blocked by map
                 arrival = new Position(p.getX() + (x * i), p.getY() + (y * i));
                 if (b.isEnemy(arrival, p) || b.isFree(arrival)) {
                     moves.add(arrival);
@@ -105,4 +105,8 @@ public class Giant extends Piece{
         return moves;
 
     }
+
+    public Piece newInstanceCopy() {
+        return new Giant(p, color);
+    }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Kamikaze.java b/MavenChess/MavenChess/src/main/java/model/Kamikaze.java
index 882a687868c44d60ebe2ebf59a4f8b42662cad07..2dfd29b7581f6387fc0a4c3c156fa62102504a24 100644
--- a/MavenChess/MavenChess/src/main/java/model/Kamikaze.java
+++ b/MavenChess/MavenChess/src/main/java/model/Kamikaze.java
@@ -13,23 +13,6 @@ public class Kamikaze extends Pawn { // aka Trojan knight :P
         ArrayList<Position> moves = new ArrayList<>();
         Position arrival;
 
-        /*if(color == Piece.WHITE) { // black and white have an opposite direction behavior
-            if(!hasBeenMoved){
-                arrival = new Position(p.getX(),p.getY()+2);
-                if(arrival.isCorrect() && b.isFree(arrival)) {moves.add(arrival);}
-            }
-            arrival = new Position(p.getX(),p.getY()+1);
-            if(arrival.isCorrect() && b.isFree(arrival)) {moves.add(arrival);}
-        }
-        else {
-            if(!hasBeenMoved){
-                arrival = new Position(p.getX(),p.getY()-2);
-                if(arrival.isCorrect() && b.isFree(arrival)) {moves.add(arrival);}
-            }
-            arrival = new Position(p.getX(),p.getY()-1);
-            if(arrival.isCorrect() && b.isFree(arrival)) {moves.add(arrival);}
-        }*/
-
         // list of the 8 kamikaze-knight specific movements
         int[] all_x = {1, 2, 2, 1, -1, -2, -2, -1};
         int[] all_y = {2, 1, -1, -2, -2, -1, 1, 2};
@@ -42,7 +25,6 @@ public class Kamikaze extends Pawn { // aka Trojan knight :P
                 moves.add(arrival);
             }
         }
-
         return moves;
     }
 
@@ -59,7 +41,10 @@ public class Kamikaze extends Pawn { // aka Trojan knight :P
                 }
             }
         }
-
         return moves;
     }
+
+    public Piece newInstanceCopy() {
+        return new Kamikaze(p, color);
+    }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/King.java b/MavenChess/MavenChess/src/main/java/model/King.java
index 6bb57ca083c271652356e46586be4771bd88e4ce..09a7c02661b91e4381b20ec2764efa2c94f28229 100644
--- a/MavenChess/MavenChess/src/main/java/model/King.java
+++ b/MavenChess/MavenChess/src/main/java/model/King.java
@@ -86,5 +86,9 @@ public class King extends Piece {
 
 		return moves;
 	}
+
+	public Piece newInstanceCopy() {
+		return new King(p, color);
+	}
 }
 
diff --git a/MavenChess/MavenChess/src/main/java/model/Knight.java b/MavenChess/MavenChess/src/main/java/model/Knight.java
index b65fb00a98ce31af03a06135a2a287345973494e..d777cbd91860dd51f039a4828c5bc6e18894af29 100644
--- a/MavenChess/MavenChess/src/main/java/model/Knight.java
+++ b/MavenChess/MavenChess/src/main/java/model/Knight.java
@@ -79,4 +79,8 @@ public class Knight extends Piece {
 
         return moves;
     }
+
+    public Piece newInstanceCopy() {
+        return new Knight(p, color);
+    }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Magician.java b/MavenChess/MavenChess/src/main/java/model/Magician.java
index 4e3bc173998e9a69bc7813df8e2b2e94c1b106a5..28f7691a13df77376cd7e16b5c31097550732614 100644
--- a/MavenChess/MavenChess/src/main/java/model/Magician.java
+++ b/MavenChess/MavenChess/src/main/java/model/Magician.java
@@ -5,7 +5,7 @@ import java.util.ArrayList;
 public class Magician extends Piece{
 
     private Piece copiedPiece;
-    protected Magician(Position p, int color) {
+    public Magician(Position p, int color) {
         super(p, color);
         copiedPiece = new Bishop(p, color);
     }
@@ -39,4 +39,7 @@ public class Magician extends Piece{
         if (enemy.getClass() == Giant.class) { setCopiedPiece(new Giant(p, color)); }
         if (enemy.getClass() == Kamikaze.class) { setCopiedPiece(new Kamikaze(p, color)); }
     }
+    public Piece newInstanceCopy() {
+        return new Magician(p, color);
+    }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Nwap.java b/MavenChess/MavenChess/src/main/java/model/Nwap.java
index 61b7f88be68160e78ab4b32ab5ac6d16838b19bc..54b22a2aa695d93160ae36d18ccd013ef6f47451 100644
--- a/MavenChess/MavenChess/src/main/java/model/Nwap.java
+++ b/MavenChess/MavenChess/src/main/java/model/Nwap.java
@@ -83,4 +83,8 @@ public class Nwap extends Pawn {
     public void setEnPassant(boolean enPassant) {
         this.enPassant = enPassant;
     }
+
+    public Piece newInstanceCopy() {
+        return new Nwap(p, color);
+    }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Pawn.java b/MavenChess/MavenChess/src/main/java/model/Pawn.java
index a61afdc47e30508188f76d2c6bb7c0aa2e477bd7..b8c0e20fca347eb41ef42531cb58b187fa9a7b5e 100644
--- a/MavenChess/MavenChess/src/main/java/model/Pawn.java
+++ b/MavenChess/MavenChess/src/main/java/model/Pawn.java
@@ -102,5 +102,9 @@ public class Pawn extends Piece {
 		this.enPassant = enPassant;
 	}
 
+	public Piece newInstanceCopy() {
+		return new Pawn(p, color);
+	}
+
 }
 
diff --git a/MavenChess/MavenChess/src/main/java/model/Piece.java b/MavenChess/MavenChess/src/main/java/model/Piece.java
index 03c1f3ede165d4309248bcae4262010bfdb4e9cb..4bfd041d960d6a3747ba879a7de18d46a551b2d1 100644
--- a/MavenChess/MavenChess/src/main/java/model/Piece.java
+++ b/MavenChess/MavenChess/src/main/java/model/Piece.java
@@ -45,4 +45,6 @@ public abstract class Piece {
 		this.p = new Position(p.getX(), p.getY()); // creates a new copy, to avoid using reference
 		hasBeenMoved = true;
 	}
+
+	public abstract Piece newInstanceCopy();
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Queen.java b/MavenChess/MavenChess/src/main/java/model/Queen.java
index 0bf59fd6223f09a7810b6a2892ac682886312491..62b8bc6f85f5aacb19a57ddaec4164c29a90021f 100644
--- a/MavenChess/MavenChess/src/main/java/model/Queen.java
+++ b/MavenChess/MavenChess/src/main/java/model/Queen.java
@@ -131,4 +131,8 @@ public class Queen extends Piece{
 
         return moves;
     }
+
+    public Piece newInstanceCopy() {
+        return new Queen(p, color);
+    }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Rook.java b/MavenChess/MavenChess/src/main/java/model/Rook.java
index a04763e2c50b2fb6d3c7398810462e9e4a5f0d1d..00237f3f1998a883e93cb7b8059407c13f2b5233 100644
--- a/MavenChess/MavenChess/src/main/java/model/Rook.java
+++ b/MavenChess/MavenChess/src/main/java/model/Rook.java
@@ -110,4 +110,8 @@ public class Rook extends Piece {
 
         return moves;
     }
+
+    public Piece newInstanceCopy() {
+        return new Rook(p, color);
+    }
 }
diff --git a/MavenChess/MavenChess/src/main/java/view/BoardView.java b/MavenChess/MavenChess/src/main/java/view/BoardView.java
index ba4d6a675e2a84acdac0de1d1a898904a299efcc..fcf0e986765193fed6bf68f3098d2e658fa5fe1e 100644
--- a/MavenChess/MavenChess/src/main/java/view/BoardView.java
+++ b/MavenChess/MavenChess/src/main/java/view/BoardView.java
@@ -6,6 +6,8 @@ import javafx.scene.shape.*;
 import model.*;
 import javafx.util.Duration;
 
+import java.util.ArrayList;
+
 public class BoardView {
 
 	public static final int BOARD_SIZE = 16, CENTERED_ORIGIN = -BOARD_SIZE*7/2, BOARD_HEIGHT = -5, GRAVEYARD_HEIGHT = -1;
@@ -13,6 +15,7 @@ public class BoardView {
 	private final TileView[] tiles; // contains all the squares/tiles of the board (visual)
 	private final PieceView[] pieces; // contains all the 3d pieces (visual)
 	private int black_death_count, white_death_count; // graveyard counter
+	private PieceView[] blackGraveyard, whiteGraveyard;
 
 	private final Box[] border; // visual border for the board
 
@@ -30,8 +33,8 @@ public class BoardView {
 
 		// creates the 3d pieces (from the board list)
 		pieces = new PieceView[64];
+		clean();
 		for(int n = 0 ; n < 64 ; n++) {
-			pieces[n] = null;
 			Piece piece = board.getPiece(n);
 			if(piece != null) {
 				createPiece(piece.getPosition(), piece.getColor(), getMeshType(piece), material, model);
@@ -40,6 +43,8 @@ public class BoardView {
 		// init graveyards as empty
 		black_death_count = 0;
 		white_death_count = 0;
+		blackGraveyard = new PieceView[16]; // 16 is maximum kills
+		whiteGraveyard = new PieceView[16];
 
 		resetColor(material); // init/reset the board squares with black and white
 
@@ -75,11 +80,23 @@ public class BoardView {
 		return pieces[id].getObj();
 	}
 
+	public PieceView[] getAllPieces() {
+		return pieces;
+	}
+
+	public PieceView[] getWhiteGraveyard() {
+		return whiteGraveyard;
+	}
+
+	public PieceView[] getBlackGraveyard() {
+		return blackGraveyard;
+	}
+
 	public void setPiece(PieceView piece) {
 		pieces[piece.getPosition().getID()] = piece;
 	}
 
-	private int getMeshType(Piece piece) {
+	public int getMeshType(Piece piece) {
 		int type = Custom3dModel.PAWN; // we can't do switch statement on ".getClass()"
 		if (piece.getClass() == Rook.class) { type = Custom3dModel.ROOK; }
 		if (piece.getClass() == Knight.class) { type = Custom3dModel.KNIGHT; }
@@ -102,7 +119,7 @@ public class BoardView {
 		setTile(new TileView(box, position));
 	}
 
-	private void createPiece(Position position, int color, int type, CustomMaterial material, Custom3dModel model) {
+	public void createPiece(Position position, int color, int type, CustomMaterial material, Custom3dModel model) {
 		// creates a piece, 3d-model, materials, draw-mode, scale, and the right height (Y-axis)
 		MeshView obj = new MeshView(model.get(type));
 		obj.setDrawMode(DrawMode.FILL);
@@ -126,7 +143,7 @@ public class BoardView {
 		updatePiece(position);
 	}
 
-	private void updatePiece(Position position) { // updates the piece(i, j), visually, to the right position
+	public void updatePiece(Position position) { // updates the piece(i, j), visually, to the right position
 		int id = position.getID();
 		if(getPiece(id) != null) {
 			getPieceObj(id).setTranslateX((position.getX()-1) * BOARD_SIZE + CENTERED_ORIGIN);
@@ -203,13 +220,16 @@ public class BoardView {
 		updatePieceWithAnimation(arrival); // updates 3d model position (visual) but animated
 	}
 
+	// places a piece on graveyard
 	public void killPiece(Position p) { // graveyards are specified as negative x
 		PieceView piece = getPiece(p.getID());
 		if(piece.getColor() == Piece.WHITE){
+			whiteGraveyard[white_death_count] = piece;
 			white_death_count++;
 			piece.setPosition(new Position(1, white_death_count));
 			piece.getPosition().setX(Position.WHITE_GRAVEYARD);
 		} else {
+			blackGraveyard[black_death_count] = piece;
 			black_death_count++;
 			piece.setPosition(new Position(1, black_death_count));
 			piece.getPosition().setX(Position.BLACK_GRAVEYARD);
@@ -230,16 +250,22 @@ public class BoardView {
 			if(getTile(n) != null) {
 				group.getChildren().add(getTileObj(n));
 			}
-			if(getPiece(n) != null) {
-				group.getChildren().add(getPieceObj(n));
-			}
 		}
 		for(int n = 0 ; n < 4 ; n++) {
 			group.getChildren().add(border[n]);
 		}
+		addPiecesOnlyToScene(group);
+	}
+
+	public void addPiecesOnlyToScene(Group group) {
+		for(int n = 0 ; n < 64 ; n++) {
+			if (getPiece(n) != null) {
+				group.getChildren().add(getPieceObj(n));
+			}
+		}
 	}
 
-	public void refresh(Board b, Custom3dModel model) {
+	public void refresh(Board b, Custom3dModel model) { // refresh the 3d objects/meshes, from piece type
 		for(int j = 1 ; j <= 8 ; j++) {
 			for (int i = 1; i <= 8; i++) {
 				Position p = new Position(i, j);
@@ -252,4 +278,20 @@ public class BoardView {
 			}
 		}
 	}
+
+	public void visualClean(Group group) { // cleans board visually, then data
+		for(int n = 0 ; n < 64 ; n++) {
+			PieceView piece = getPiece(n);
+			if (piece != null) {
+				group.getChildren().remove(piece.getObj());
+			}
+		}
+		clean();
+	}
+
+	private void clean() { // private, don't use clean, use visualClean, otherwise meshes will stay on screen
+		for(int n = 0 ; n < 64 ; n++) {
+			pieces[n] = null;
+		}
+	}
 }
diff --git a/MavenChess/MavenChess/src/main/java/view/HUD.java b/MavenChess/MavenChess/src/main/java/view/HUD.java
index 43a024cb4bff17b5928c21c33a03ee272a431c8c..d3625717df28b2803c23b08a0392cd5b76f8e6ca 100644
--- a/MavenChess/MavenChess/src/main/java/view/HUD.java
+++ b/MavenChess/MavenChess/src/main/java/view/HUD.java
@@ -10,8 +10,8 @@ import javafx.scene.shape.Rectangle;
 
 public class HUD {
 
-    private Image standard_img, variant_img;
-    private ImageView standard_imgView, variant_imgView;
+    private Image standard_img, variant_img, rollback_img;
+    private ImageView standard_imgView, variant_imgView, rollback_imgView;
     private Rectangle darkener;
 
     public HUD() {
@@ -41,6 +41,11 @@ public class HUD {
         variant_imgView.addEventHandler(MouseEvent.MOUSE_EXITED, event -> {
             variant_imgView.setEffect(none);
         });
+        rollback_img = new Image("/rollback.png");
+        rollback_imgView = new ImageView(rollback_img);
+        rollback_imgView.setPreserveRatio(true);
+        rollback_imgView.setFitWidth(64);
+        rollbackHide();
     }
 
     public void resize(double width, double height) {
@@ -54,6 +59,8 @@ public class HUD {
         variant_imgView.setFitWidth(width*weight/total);
         darkener.setWidth(width);
         darkener.setHeight(height);
+        rollback_imgView.setX(width - 100);
+        rollback_imgView.setY(height - 120);
     }
 
     public ImageView getStandard() {
@@ -64,10 +71,21 @@ public class HUD {
         return variant_imgView;
     }
 
+    public ImageView getRollback() {
+        return rollback_imgView;
+    }
+
+    public void rollbackHide() {
+        rollback_imgView.setOpacity(0);
+    }
+    public void rollbackShow() {
+        rollback_imgView.setOpacity(1);
+    }
+
     public void removeMenu(AnchorPane group2d) {
         group2d.getChildren().removeAll(darkener, standard_imgView, variant_imgView);
     }
     public void addAllToScene(AnchorPane group2d) {
-        group2d.getChildren().addAll(darkener, standard_imgView, variant_imgView);
+        group2d.getChildren().addAll(darkener, standard_imgView, variant_imgView, rollback_imgView);
     }
 }
diff --git a/MavenChess/MavenChess/src/main/java/view/Room.java b/MavenChess/MavenChess/src/main/java/view/Room.java
index 79f7c032bb598ce32b2a0ef881f3c7d59fcabdc6..0e3c64c3617196dfeff85602e951d454e3b059c1 100644
--- a/MavenChess/MavenChess/src/main/java/view/Room.java
+++ b/MavenChess/MavenChess/src/main/java/view/Room.java
@@ -2,48 +2,66 @@ package view;
 
 import javafx.scene.Group;
 import javafx.scene.shape.Box;
-import javafx.scene.shape.CullFace;
 
 public class Room {
-    private final Box[] walls;
+    private final Box[] walls, ground;
+    private final Box ceiling;
 
-    public Room(CustomMaterial material) {
+    private final static int WALL_N = 0, WALL_E = 1, WALL_S = 2, WALL_W = 3, GROUND = 4, CEILING = 5;
+    private final static int GROUND_X = 8, GROUND_Y = 8;
 
-        /*int size = BoardView.BOARD_SIZE*64;
-        int height = BoardView.BOARD_SIZE*32;
-        walls = new Box(size, height, size);
-        walls.setMaterial(material.get(CustomMaterial.BLACK_TILE));
-        walls.setCullFace(CullFace.BACK);*/
+    public Room(CustomMaterial material) {
 
         int size = BoardView.BOARD_SIZE*60;
         double height = 0.5;
-        walls = new Box[6];
+
         int[] pos_x = {0, 1, 0, -1, 0, 0};
         int[] pos_y = {0, 0, 0, 0, 1, -1};
         int[] pos_z = {1, 0, -1, 0, 0, 0};
         int[] size_x = {1, 0, 1, 0, 1, 1};
         int[] size_y = {1, 1, 1, 1, 0, 0};
         int[] size_z = {0, 1, 0, 1, 1, 1};
-        for(int n = 0 ; n < 6 ; n++) {
+
+        // Ground
+        ground = new Box[8*8];
+        for(int j = 0 ; j < GROUND_Y ; j++) {
+            for (int i = 0; i < GROUND_X; i++) {
+                int n = j * 8 + i;
+                ground[n] = new Box(1 + size_x[GROUND] * size / GROUND_X, 1 + size_y[GROUND] * size * height, 1 + size_z[GROUND] * size / GROUND_Y);
+                ground[n].translateXProperty().set((double) /*pos_x[GROUND] * (size / 2) +*/ (i * size / GROUND_X) - (size / 2) + (size / GROUND_X / 2));
+                ground[n].translateYProperty().set((double) /*(pos_y[GROUND] * (size / 2) - (size / 2)) * height +*/ BoardView.BOARD_SIZE * 9); // centered up, then down to table legs
+                ground[n].translateZProperty().set((double) /*pos_z[GROUND] * (size / 2) +*/ (j * size / GROUND_Y) - (size / 2) + (size / GROUND_Y / 2));
+                ground[n].setMaterial(material.get(CustomMaterial.CARPET));
+            }
+        }
+
+        // Ceiling
+        ceiling = new Box(1 + size_x[CEILING]*size, 1 + size_y[CEILING]*size*height, 1 + size_z[CEILING]*size);
+        ceiling.translateXProperty().set((double) pos_x[CEILING] * (size/2));
+        ceiling.translateYProperty().set((double) (pos_y[CEILING] * (size/2) - (size/2)) * height + BoardView.BOARD_SIZE*9); // centered up, then down to table legs
+        ceiling.translateZProperty().set((double) pos_z[CEILING] * (size/2));
+        ceiling.setMaterial(material.get(CustomMaterial.WHITE));
+
+        // Walls
+        walls = new Box[4];
+        for(int n = 0 ; n < 4 ; n++) {
             walls[n] = new Box(1 + size_x[n]*size, 1 + size_y[n]*size*height, 1 + size_z[n]*size);
             walls[n].translateXProperty().set((double) pos_x[n] * (size/2));
             walls[n].translateYProperty().set((double) (pos_y[n] * (size/2) - (size/2)) * height + BoardView.BOARD_SIZE*9); // centered up, then down to table legs
             walls[n].translateZProperty().set((double) pos_z[n] * (size/2));
+            walls[n].setMaterial(material.get(CustomMaterial.STUDIO_WALL));
         }
-        // Ground
-        walls[4].setMaterial(material.get(CustomMaterial.CARPET));
-        // Ceiling
-        walls[5].setMaterial(material.get(CustomMaterial.WHITE));
-        // Walls
-        walls[0].setMaterial(material.get(CustomMaterial.STUDIO_WALL));
-        walls[1].setMaterial(material.get(CustomMaterial.STUDIO_WALL));
-        walls[2].setMaterial(material.get(CustomMaterial.STUDIO_WALL));
-        walls[3].setMaterial(material.get(CustomMaterial.STUDIO_WALL));
     }
 
     public void addAllToScene(Group group) {
-        //group.getChildren().add(walls);
-        for(int n = 0 ; n < 6 ; n++) {
+        // Ground
+        for(int n = 0 ; n < 8*8 ; n++) {
+            group.getChildren().add(ground[n]);
+        }
+        // Ceiling
+        group.getChildren().add(ceiling);
+        // Walls
+        for(int n = 0 ; n < 4 ; n++) {
             group.getChildren().add(walls[n]);
         }
     }
diff --git a/MavenChess/MavenChess/src/main/resources/carpet.jpg b/MavenChess/MavenChess/src/main/resources/carpet.jpg
index 9536e031b66400b03564da16b242121cc700ee01..10965db0b337b409977c9591581548f960ef1bd0 100644
Binary files a/MavenChess/MavenChess/src/main/resources/carpet.jpg and b/MavenChess/MavenChess/src/main/resources/carpet.jpg differ
diff --git a/MavenChess/MavenChess/src/main/resources/rollback.png b/MavenChess/MavenChess/src/main/resources/rollback.png
new file mode 100644
index 0000000000000000000000000000000000000000..a57dac8b6628d19f925afb0199234c641a624027
Binary files /dev/null and b/MavenChess/MavenChess/src/main/resources/rollback.png differ
diff --git a/MavenChess/MavenChess/target/classes/controller/Main.class b/MavenChess/MavenChess/target/classes/controller/Main.class
index 86e6c5508d2b7614d60f252634cf6e9ee5ce4704..db8b50f73dea42f53e94e648204e176b02d94a85 100644
Binary files a/MavenChess/MavenChess/target/classes/controller/Main.class and b/MavenChess/MavenChess/target/classes/controller/Main.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Bishop.class b/MavenChess/MavenChess/target/classes/model/Bishop.class
index 832b9497d29b38de2956a0abe0267ae57755b1ad..d67cdb65aa2e0f3ab88d8f133db3ded962eeae64 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Bishop.class and b/MavenChess/MavenChess/target/classes/model/Bishop.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Board.class b/MavenChess/MavenChess/target/classes/model/Board.class
index 8451c0881bd6e5a99e303545b9889a28167d2f60..0873bf14700ddbb8bc09c91d963b18f2f8449b74 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Board.class and b/MavenChess/MavenChess/target/classes/model/Board.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Giant.class b/MavenChess/MavenChess/target/classes/model/Giant.class
index 43177252b08e2c1fb809cd20ce087fe640b76db1..03045689ccd16b0b7712d91e8a0951bcddc84c15 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Giant.class and b/MavenChess/MavenChess/target/classes/model/Giant.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Kamikaze.class b/MavenChess/MavenChess/target/classes/model/Kamikaze.class
index bc82b5d2c762f16d0c5a41e2e7af6163853c6daa..a553fbace5503be18c80d345cf1c68c8be58995a 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Kamikaze.class and b/MavenChess/MavenChess/target/classes/model/Kamikaze.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/King.class b/MavenChess/MavenChess/target/classes/model/King.class
index d65b114ff0c54a6ee0ff7a82f114683e338e82a4..44e5314230738f670e764fe86e51d6b91926a73c 100644
Binary files a/MavenChess/MavenChess/target/classes/model/King.class and b/MavenChess/MavenChess/target/classes/model/King.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Knight.class b/MavenChess/MavenChess/target/classes/model/Knight.class
index a2fb5a72f9b96f88fa01675125be2b18fe9d8c6b..9194f0e6d242b308fae3694395190ac4fffa20a3 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Knight.class and b/MavenChess/MavenChess/target/classes/model/Knight.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Magician.class b/MavenChess/MavenChess/target/classes/model/Magician.class
index f801dce876007630df38376e796dfd993725c0f2..74d8dbc95eaa68146b3165f6af0e790b1e546eba 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Magician.class and b/MavenChess/MavenChess/target/classes/model/Magician.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Nwap.class b/MavenChess/MavenChess/target/classes/model/Nwap.class
index c273033df9b7465fdafc8be19375d84470913a55..ff4b580f756aed50be7d614d201301d61f7dbb91 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Nwap.class and b/MavenChess/MavenChess/target/classes/model/Nwap.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Pawn.class b/MavenChess/MavenChess/target/classes/model/Pawn.class
index 6dae773e174ac427e7b93206b7439cdf8da34f98..86be28f797066004817129314fe773d18fdc2d6e 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Pawn.class and b/MavenChess/MavenChess/target/classes/model/Pawn.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Piece.class b/MavenChess/MavenChess/target/classes/model/Piece.class
index ff3381d6210cc158f50aa92f3eddded279ec977d..a91a7058c2e3e95d3ba4cae8dfdc98aceaa48ac3 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Piece.class and b/MavenChess/MavenChess/target/classes/model/Piece.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Queen.class b/MavenChess/MavenChess/target/classes/model/Queen.class
index 99db5da17bccc0d501fdc65cf89700ac9c579f60..cd0f9082c0fbd3ebc9224d680928b7ffa8023c86 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Queen.class and b/MavenChess/MavenChess/target/classes/model/Queen.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Rook.class b/MavenChess/MavenChess/target/classes/model/Rook.class
index 936be027e604e017fbd32ca0ca0b34308ae8b7a1..ccde08248a119e91baf3a4efefc0806e5f3bea4c 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Rook.class and b/MavenChess/MavenChess/target/classes/model/Rook.class differ
diff --git a/MavenChess/MavenChess/target/classes/view/BoardView.class b/MavenChess/MavenChess/target/classes/view/BoardView.class
index a69cf882baf2ec66c24bb8dcb8fa7b8a97327849..1a8bd63306c2d5a552982958e19c0fdda10f8894 100644
Binary files a/MavenChess/MavenChess/target/classes/view/BoardView.class and b/MavenChess/MavenChess/target/classes/view/BoardView.class differ