diff --git a/MavenChess/MavenChess/src/main/java/controller/Main.java b/MavenChess/MavenChess/src/main/java/controller/Main.java
index 9328f91194a1e86914b9c3feb04a53fffb1e2313..c1f195760832a964402094c0ae1839c8c7753de5 100644
--- a/MavenChess/MavenChess/src/main/java/controller/Main.java
+++ b/MavenChess/MavenChess/src/main/java/controller/Main.java
@@ -5,8 +5,7 @@ import javafx.scene.*;
 import javafx.scene.input.MouseEvent;
 import javafx.scene.input.ScrollEvent;
 import javafx.stage.Stage;
-import model.Board;
-import model.Position;
+import model.*;
 import view.*;
 
 import java.util.ArrayList;
@@ -23,6 +22,7 @@ public class Main extends Application {
 
 	private Board board;
 	private BoardView boardView;
+
 	@Override
 	public void start(Stage stage) {
 
@@ -99,11 +99,10 @@ public class Main extends Application {
 		if(clickedPiece.getPosition().getX() < 0) {
 			return;
 		}
-		// if piece is an "attack" or "special" target, we consider it an action to apply (tile click)
+		// if piece is colored (aka targeted), we consider it an action to apply (tile click)
 		if(clickedPiece.isTargeted()) {
 			clickTile(boardView.getTile(clickedPiece.getPosition().getID()));
-		}
-		else {
+		} else {
 			// clicking a piece will ask her available moves
 			Position position = clickedPiece.getPosition();
 			board.setSelected(position);
@@ -111,10 +110,42 @@ public class Main extends Application {
 			boardView.setColor(material, position, CustomMaterial.SELECTED_TILE);
 			ArrayList<Position> moves = board.getPiece(position).getAvailableMoves(board);
 
+			// test if kamikaze, and shows the explosion range
+			if(board.isKamikaze(position)) {
+				ArrayList<Position> explosions = ((Kamikaze) board.getPiece(position)).getExplosion();
+				for (Position explosion : explosions) {
+					boardView.setColor(material, explosion, CustomMaterial.EXPLOSION_TILE);
+				}
+				clickedPiece.setTargeted(material, CustomMaterial.EXPLOSION_TILE);
+			}
+
 			// shows all available moves on the tiles, with colors, each tile-color having a meaning
 			for (Position move : moves) {
+
 				if (board.isFree(move)) {
 					boardView.setColor(material, move, CustomMaterial.MOVABLE_TILE);
+					// test for "en passant"
+					if(board.isPawn(position) || board.isNwap(position)) {
+						Position enemy = new Position(move.getX(), position.getY());
+						boolean isEnPassant = false;
+						if(board.isEnemy(enemy, position)) {
+							if (board.isPawn(enemy)) {
+								if (((Pawn) board.getPiece(enemy)).isEnPassant()) {
+									isEnPassant = true;
+								}
+							}
+							if (board.isNwap(enemy)) {
+								if (((Nwap) board.getPiece(enemy)).isEnPassant()) {
+									isEnPassant = true;
+								}
+							}
+						}
+						if(isEnPassant) {
+							boardView.setColor(material, move, CustomMaterial.SPECIAL_TILE);
+							boardView.setColor(material, enemy, CustomMaterial.SPECIAL_TILE);
+							boardView.getPiece(enemy.getID()).setTargeted(material, CustomMaterial.ATTACK_TILE);
+						}
+					}
 				} else if (board.isEnemy(move, position)) {
 					boardView.setColor(material, move, CustomMaterial.ATTACK_TILE);
 					boardView.getPiece(move.getID()).setTargeted(material, CustomMaterial.ATTACK_TILE);
@@ -123,7 +154,7 @@ public class Main extends Application {
 					boardView.getPiece(move.getID()).setTargeted(material, CustomMaterial.SPECIAL_TILE);
 				}
 				// PROMOTION (attacking or not)
-				if (board.isPawn(position) && (move.getY() == 8 || move.getY() == 1)) {
+				if ((board.isPawn(position) || board.isNwap(position)) && (move.getY() == 8 || move.getY() == 1)) {
 					boardView.setColor(material, move, CustomMaterial.SPECIAL_TILE);
 				}
 			}
@@ -131,13 +162,27 @@ public class Main extends Application {
 	}
 
 	public void clickTile(TileView clickedTile) {
+		// --- Resets enPassant ---
+		for(int j = 1 ; j <= 8 ; j++) {
+			for(int i = 1 ; i <= 8 ; i++) {
+				Position p = new Position(i, j);
+				if (board.isPawn(p)) {
+					((Pawn) board.getPiece(p)).setEnPassant(false);
+				}
+				if (board.isNwap(p)) {
+					((Nwap) board.getPiece(p)).setEnPassant(false);
+				}
+			}
+		}
+
+		// --- Analyses the clicked tile type, and executes related actions ---
 		int state = clickedTile.getState();
 		Position selected = board.getSelected();
 		Position arrival = clickedTile.getPosition();
 		if(state != TileView.NORMAL && state != TileView.SELECTED) {
 			// --- ALL SPECIAL MOVES ---
 			if(state == TileView.SPECIAL) {
-				if(board.isPawn(selected)) {
+				if(board.isPawn(selected) || board.isNwap(selected)) {
 					// --- PROMOTION ---
 					if(arrival.getY() == 8 || arrival.getY() == 1) {
 						// --- ATTACK (while doing promotion) ---
@@ -156,6 +201,16 @@ public class Main extends Application {
 					else {
 						// PRE : if it's not a promotion, then it's "prise en passant", because of pawn rules
 						// we don't need to test y-position
+						Position enemy = new Position(arrival.getX(), selected.getY());
+						boardView.getPiece(enemy.getID()).resetTargeted(material); // reset color
+						boardView.killPiece(enemy); // place piece on graveyard (visual)
+						board.killPiece(enemy.getID()); // because we don't move "on it", we need to kill it manually (model)
+						Position enPassantArrival = new Position(arrival.getX(), selected.getY()+1);
+						if(board.getSelectedPiece().getColor() == Piece.BLACK) {
+							enPassantArrival.setY(selected.getY()-1);
+						}
+						board.movePiece(selected, enPassantArrival); // move piece (on model)
+						boardView.movePiece(selected, enPassantArrival); // move piece (on 3d view)
 					}
 				}
 				// --- CASTLING (from king) ---
@@ -189,12 +244,50 @@ public class Main extends Application {
 					boardView.movePiece(selected, arrival); // move rook (on 3d view)
 				}
 			}
+			// --- EXPLOSION MOVES ---
+			else if (state == TileView.EXPLOSION) {
+				for(int n = 0 ; n < 64 ; n++) {
+					if(boardView.getTile(n).getState() == TileView.EXPLOSION) {
+						if(boardView.getPiece(n) != null) {
+							boardView.getPiece(n).resetTargeted(material); // reset color
+							boardView.killPiece(boardView.getPiece(n).getPosition()); // place piece on graveyard (visual)
+							board.killPiece(n);
+						}
+					}
+				}
+			}
 			// --- STANDARD MOVES ---
 			else {
 				// --- ATTACK ---
 				if(state == TileView.ATTACK) {
 					boardView.getPiece(arrival.getID()).resetTargeted(material); // reset color
 					boardView.killPiece(arrival); // place piece on graveyard (visual)
+					// --- MAGICIAN CHANGE ---
+					if(board.isMagician(selected)) {
+						// we can't do switch statement on ".getClass()"
+						Piece enemy = board.getPiece(arrival);
+						Magician magician = (Magician) board.getPiece(selected);
+						int color = magician.getColor();
+						if (enemy.getClass() == Pawn.class) { magician.setCopiedPiece(new Pawn(selected, color)); }
+						if (enemy.getClass() == Rook.class) { magician.setCopiedPiece(new Rook(selected, color)); }
+						if (enemy.getClass() == Knight.class) { magician.setCopiedPiece(new Knight(selected, color)); }
+						if (enemy.getClass() == Bishop.class) { magician.setCopiedPiece(new Bishop(selected, color)); }
+						if (enemy.getClass() == Queen.class) { magician.setCopiedPiece(new Queen(selected, color)); }
+						if (enemy.getClass() == King.class) { magician.setCopiedPiece(new King(selected, color)); }
+						if (enemy.getClass() == Nwap.class) { magician.setCopiedPiece(new Nwap(selected, color)); }
+						if (enemy.getClass() == Magician.class) { magician.setCopiedPiece(((Magician) enemy).getCopiedPiece()); } // lol, stealing the stealer
+						if (enemy.getClass() == Giant.class) { magician.setCopiedPiece(new Giant(selected, color)); }
+						if (enemy.getClass() == Kamikaze.class) { magician.setCopiedPiece(new Kamikaze(selected, color)); }
+					}
+				}
+				// --- EN PASSANT activation ---
+				if(Math.abs(selected.getY() - arrival.getY()) == 2) {
+					if(board.isPawn(selected)) {
+						((Pawn) board.getPiece(selected)).setEnPassant(true);
+					}
+					if(board.isNwap(selected)) {
+						((Nwap) board.getPiece(selected)).setEnPassant(true);
+					}
 				}
 				// --- MOVE ---
 				board.movePiece(selected, arrival); // move piece (on model)
diff --git a/MavenChess/MavenChess/src/main/java/model/Board.java b/MavenChess/MavenChess/src/main/java/model/Board.java
index b7c82d5d6f593eec61e0081b49ff9a3b7f39afc1..1ba3182cfb691e5c7b3480ab6f3c34f673db4b11 100644
--- a/MavenChess/MavenChess/src/main/java/model/Board.java
+++ b/MavenChess/MavenChess/src/main/java/model/Board.java
@@ -79,7 +79,11 @@ public class Board {
 		Piece piece = getPiece(origin);
 		piece.setPosition(arrival); // changes position to arrival
 		setPiece(piece); // copies the piece (from origin ID) to arrival ID on the pieces list
-		pieces[origin.getID()] = null; // removes the origin ID piece on the pieces list
+		killPiece(origin.getID()); // removes the origin ID piece on the pieces list
+	}
+
+	public void killPiece(int id) {
+		pieces[id] = null;
 	}
 
 	public void mutationOfSelectedPiece(int type) {
@@ -120,4 +124,22 @@ public class Board {
 				&& !isFree(p)
 				&& getPiece(p).getClass() == Pawn.class);
 	}
+
+	public boolean isNwap(Position p) {
+		return (p.isCorrect()
+				&& !isFree(p)
+				&& getPiece(p).getClass() == Nwap.class);
+	}
+
+	public boolean isKamikaze(Position p) {
+		return (p.isCorrect()
+				&& !isFree(p)
+				&& getPiece(p).getClass() == Kamikaze.class);
+	}
+
+	public boolean isMagician(Position p) {
+		return (p.isCorrect()
+				&& !isFree(p)
+				&& getPiece(p).getClass() == Magician.class);
+	}
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Giant.java b/MavenChess/MavenChess/src/main/java/model/Giant.java
index edc669a622e0e6c050960be8cc960170c062b09e..f7f9d899315dbe08cf745ff005b441abbcd68290 100644
--- a/MavenChess/MavenChess/src/main/java/model/Giant.java
+++ b/MavenChess/MavenChess/src/main/java/model/Giant.java
@@ -3,7 +3,7 @@ package model;
 import java.util.ArrayList;
 
 public class Giant extends Piece{
-    protected Giant(Position p, int color) {
+    public Giant(Position p, int color) {
         super(p, color);
     }
 
@@ -12,8 +12,31 @@ public class Giant extends Piece{
     public ArrayList<Position> getAvailableMoves(Board b) {
 
         ArrayList<Position> moves = new ArrayList<>();
-
         Position arrival;
+
+        // list of the 4 giant directions
+        int[] all_x = {0, 2, 0, -2};
+        int[] all_y = {2, 0, -2, 0};
+
+        for(int n = 0 ; n < all_x.length ; n++) { // for each direction
+            int x = all_x[n];
+            int y = all_y[n];
+            boolean blocked = false;
+            int i = 1;
+            while (i < 4 && !blocked) { // continues "as a ray" in that direction until blocked
+                arrival = new Position(p.getX() + (x * i), p.getY() + (y * i));
+                if (b.isEnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+                if (!b.isFree(arrival)) {
+                    blocked = true;
+                }
+                i++;
+            }
+        }
+
+        // Full explicit directions version : ----------------------------
+        /*
         int i = 1;
         boolean left = false;
         boolean right = false;
@@ -21,26 +44,21 @@ public class Giant extends Piece{
         boolean down = false;
 
         while (i < 4) {
-
             //left
-
             arrival = new Position(p.getX() + (i*2), p.getY());
             if (arrival.isCorrect()) {
                 if (!left) {
                     if (b.isEnemy(arrival, p) || b.isFree(arrival)) {
                         moves.add(arrival);
                     }
-
                     if (b.isKing(arrival)) {
                         moves.add(arrival);
-
                     }
                 }
                 if (!b.isFree(arrival)) {
                     left = true;
                 }
             }
-
             //right
             arrival = new Position(p.getX() - (i*2), p.getY());
             if (arrival.isCorrect()) {
@@ -52,14 +70,11 @@ public class Giant extends Piece{
                         moves.add(arrival);
                     }
                 }
-
                 if (!b.isFree(arrival)) {
-
                     right = true;
                 }
             }
 
-
             arrival = new Position(p.getX(), p.getY() + (i*2));
             if (arrival.isCorrect()) {
                 if (!top) {
@@ -67,15 +82,11 @@ public class Giant extends Piece{
                         moves.add(arrival);
                     }
                 }
-
                 if (!b.isFree(arrival)) {
-
                     top = true;
                 }
             }
 
-
-
             arrival = new Position(p.getX(), p.getY() - (i*2));
             if (arrival.isCorrect()) {
                 if (!down) {
@@ -83,15 +94,13 @@ public class Giant extends Piece{
                         moves.add(arrival);
                     }
                 }
-
                 if (!b.isFree(arrival)) {
-
                     top = true;
                 }
             }
-
             i++;
-        }
+        }*/
+        // ------------------------------------------------------------
 
         return moves;
 
diff --git a/MavenChess/MavenChess/src/main/java/model/Kamikaze.java b/MavenChess/MavenChess/src/main/java/model/Kamikaze.java
index 1b8909d0c5df24f5dcb584d6ab246d61d76125fa..882a687868c44d60ebe2ebf59a4f8b42662cad07 100644
--- a/MavenChess/MavenChess/src/main/java/model/Kamikaze.java
+++ b/MavenChess/MavenChess/src/main/java/model/Kamikaze.java
@@ -2,7 +2,7 @@ package model;
 
 import java.util.ArrayList;
 
-public class Kamikaze extends Pawn {
+public class Kamikaze extends Pawn { // aka Trojan knight :P
     public Kamikaze(Position p, int color) {
         super(p, color);
     }
@@ -10,42 +10,56 @@ public class Kamikaze extends Pawn {
     @Override
     public ArrayList<Position> getAvailableMoves(Board b) {
 
-
-        ArrayList<Position> moves = new ArrayList<Position>();
+        ArrayList<Position> moves = new ArrayList<>();
         Position arrival;
 
-
-        // Self-Detonation Position no need for checks as the Kamikaze is already in place
-        arrival = new Position(p.getX(),p.getY());
-        moves.add(arrival);
-
-        if(color == Piece.WHITE) { // black and white have an opposite direction behavior
-
+        /*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};
+
+        for(int n = 0 ; n < all_x.length ; n++) { // for each direction
+            int x = all_x[n];
+            int y = all_y[n];
+            arrival = new Position(p.getX() + x, p.getY() + y);
+            if (b.isEnemy(arrival, p) || b.isFree(arrival)) {
+                moves.add(arrival);
+            }
+        }
 
+        return moves;
+    }
+
+    public ArrayList<Position> getExplosion() {
+
+        ArrayList<Position> moves = new ArrayList<>();
+        Position target;
+
+        for(int x = -1 ; x <= 1 ; x++) {
+            for(int y = -1 ; y <= 1 ; y++) {
+                target = new Position(p.getX() + x, p.getY() + y);
+                if (target.isCorrect()) {
+                    moves.add(target);
+                }
+            }
         }
+
         return moves;
     }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Magician.java b/MavenChess/MavenChess/src/main/java/model/Magician.java
index c0cf19181a0e11db02dc4a7d3859bec71c424ce8..e43e4c502cdb675d20a30f055879ab2b2c42f340 100644
--- a/MavenChess/MavenChess/src/main/java/model/Magician.java
+++ b/MavenChess/MavenChess/src/main/java/model/Magician.java
@@ -18,6 +18,10 @@ public class Magician extends Piece{
     public void setCopiedPiece(Piece copiedPiece) {
         this.copiedPiece = copiedPiece;
     }
+
+    public Piece getCopiedPiece() {
+        return copiedPiece;
+    }
     public void setPosition(Position p) {
         this.p = p;
         copiedPiece.setPosition(p);
diff --git a/MavenChess/MavenChess/src/main/java/model/Nwap.java b/MavenChess/MavenChess/src/main/java/model/Nwap.java
index e15c4485448bb39f3d3b33c5f2b88e0c1bf85c38..61b7f88be68160e78ab4b32ab5ac6d16838b19bc 100644
--- a/MavenChess/MavenChess/src/main/java/model/Nwap.java
+++ b/MavenChess/MavenChess/src/main/java/model/Nwap.java
@@ -3,8 +3,11 @@ package model;
 import java.util.ArrayList;
 
 public class Nwap extends Pawn {
+
+    private boolean enPassant;
     public Nwap(Position p, int color) {
         super(p, color);
+        enPassant = false;
     }
 
     @Override
@@ -73,4 +76,11 @@ public class Nwap extends Pawn {
         }
         return moves;
     }
+    public boolean isEnPassant() {
+        return enPassant;
+    }
+
+    public void setEnPassant(boolean enPassant) {
+        this.enPassant = enPassant;
+    }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Pawn.java b/MavenChess/MavenChess/src/main/java/model/Pawn.java
index 69509fc9bf08129214730783e0d8bf5a87d9f028..a61afdc47e30508188f76d2c6bb7c0aa2e477bd7 100644
--- a/MavenChess/MavenChess/src/main/java/model/Pawn.java
+++ b/MavenChess/MavenChess/src/main/java/model/Pawn.java
@@ -4,9 +4,10 @@ import java.util.ArrayList;
 
 public class Pawn extends Piece {
 
-	private boolean enPassant = true; // temporarily given true but has to be changed in the controller
+	private boolean enPassant;
 	public Pawn(Position p, int color) {
 		super(p, color);
+		enPassant = false;
 	}
 
 	public ArrayList<Position> getAvailableMoves(Board b) {
diff --git a/MavenChess/MavenChess/src/main/java/model/Position.java b/MavenChess/MavenChess/src/main/java/model/Position.java
index b1562dce36959388bc1e51114e3f4f0fd448ea79..2eceaf8d503067c0dcbd9eee21bc718423e01907 100644
--- a/MavenChess/MavenChess/src/main/java/model/Position.java
+++ b/MavenChess/MavenChess/src/main/java/model/Position.java
@@ -8,6 +8,8 @@ public class Position {
 	public static final int WHITE_GRAVEYARD = -1, BLACK_GRAVEYARD = -2;
 
 	public Position(int x, int y) {
+		while(x < 1) { x += 8; }
+		while(x > 8) { x -= 8; }
 		this.x = x;
 		this.y = y;
 	}
diff --git a/MavenChess/MavenChess/src/main/java/model/Queen.java b/MavenChess/MavenChess/src/main/java/model/Queen.java
index 08f4ae3130cfc72640421c3b4b2c3ba558950b40..0bf59fd6223f09a7810b6a2892ac682886312491 100644
--- a/MavenChess/MavenChess/src/main/java/model/Queen.java
+++ b/MavenChess/MavenChess/src/main/java/model/Queen.java
@@ -3,7 +3,7 @@ package model;
 import java.util.ArrayList;
 
 public class Queen extends Piece{
-    protected Queen(Position p, int color) {
+    public Queen(Position p, int color) {
         super(p, color);
     }
 
diff --git a/MavenChess/MavenChess/src/main/java/view/BoardView.java b/MavenChess/MavenChess/src/main/java/view/BoardView.java
index 0a670eae9797be6d129e967426362892f28f6738..2608e65dadfb8341897a59b6c31bb3ebf05120fa 100644
--- a/MavenChess/MavenChess/src/main/java/view/BoardView.java
+++ b/MavenChess/MavenChess/src/main/java/view/BoardView.java
@@ -1,8 +1,10 @@
 package view;
 
+import javafx.animation.TranslateTransition;
 import javafx.scene.Group;
 import javafx.scene.shape.*;
 import model.*;
+import javafx.util.Duration;
 
 public class BoardView {
 
@@ -113,15 +115,30 @@ public class BoardView {
 		}
 	}
 
+	private void updatePieceWithAnimation(Position position) { // updates the piece(i, j), visually, to the right position
+		int id = position.getID();
+		MeshView obj = getPieceObj(id);
+		if(getPiece(id) != null) {
+			TranslateTransition animation = new TranslateTransition();
+			animation.setDuration(Duration.millis(300));
+			animation.setNode(obj);
+			animation.setFromX(obj.getTranslateX());
+			animation.setFromZ(obj.getTranslateZ());
+			animation.setToX((position.getX()-1) * BOARD_SIZE + CENTERED_ORIGIN);
+			animation.setToZ((position.getY()-1) * BOARD_SIZE + CENTERED_ORIGIN);
+			animation.play();
+		}
+	}
+
 	private void updateGraveyardPiece(PieceView piece) { // updates position (visual) of a dead piece
 		int x = piece.getPosition().getX();
 		int y = piece.getPosition().getY();
 		if(x == Position.WHITE_GRAVEYARD) {
 			piece.getObj().setTranslateX(-2 * BOARD_SIZE + CENTERED_ORIGIN);
-			piece.getObj().setTranslateZ(y * BOARD_SIZE*0.65f - BOARD_SIZE*4);
+			piece.getObj().setTranslateZ(y * BOARD_SIZE*0.65f - BOARD_SIZE*5);
 		} else { // x == Position.BLACK_GRAVEYARD
 			piece.getObj().setTranslateX(9 * BOARD_SIZE + CENTERED_ORIGIN);
-			piece.getObj().setTranslateZ(-y * BOARD_SIZE*0.65f + BOARD_SIZE*4);
+			piece.getObj().setTranslateZ(-y * BOARD_SIZE*0.65f + BOARD_SIZE*5);
 		}
 		piece.getObj().setTranslateY(GRAVEYARD_HEIGHT); // place at right height (Y axis) on table
 	}
@@ -149,6 +166,7 @@ public class BoardView {
 		getTileObj(id).setMaterial(material.get(type));
 		// save color-type in the "state" attribute of that tile
 		switch(type) {
+			case CustomMaterial.EXPLOSION_TILE -> getTile(id).setState(TileView.EXPLOSION);
 			case CustomMaterial.SELECTED_TILE -> getTile(id).setState(TileView.SELECTED);
 			case CustomMaterial.MOVABLE_TILE -> getTile(id).setState(TileView.MOVABLE);
 			case CustomMaterial.ATTACK_TILE -> getTile(id).setState(TileView.ATTACK);
@@ -162,19 +180,23 @@ public class BoardView {
 		piece.setPosition(arrival); // changes position to arrival
 		setPiece(piece); // copies the piece from origin ID to arrival ID
 		pieces[origin.getID()] = null; // removes the origin ID piece
-		updatePiece(arrival); // updates 3d model position (visual)
+		// updatePiece(arrival); // updates 3d model position (visual)
+		updatePieceWithAnimation(arrival); // updates 3d model position (visual) but animated
 	}
 
 	public void killPiece(Position p) { // graveyards are specified as negative x
 		PieceView piece = getPiece(p.getID());
 		if(piece.getColor() == Piece.WHITE){
 			white_death_count++;
-			piece.setPosition(new Position(Position.WHITE_GRAVEYARD, white_death_count));
+			piece.setPosition(new Position(1, white_death_count));
+			piece.getPosition().setX(Position.WHITE_GRAVEYARD);
 		} else {
 			black_death_count++;
-			piece.setPosition(new Position(Position.BLACK_GRAVEYARD, black_death_count));
+			piece.setPosition(new Position(1, black_death_count));
+			piece.getPosition().setX(Position.BLACK_GRAVEYARD);
 		}
 		updateGraveyardPiece(piece);
+		pieces[p.getID()] = null;
 	}
 
 	public void mutationPiece(Custom3dModel model, Position selected, int type) {
diff --git a/MavenChess/MavenChess/src/main/java/view/CustomMaterial.java b/MavenChess/MavenChess/src/main/java/view/CustomMaterial.java
index 8a31a0209658c41f93c73b1257df2483653eb62a..ede4a370eba286f4263b2767f92ca8fe82a83fc2 100644
--- a/MavenChess/MavenChess/src/main/java/view/CustomMaterial.java
+++ b/MavenChess/MavenChess/src/main/java/view/CustomMaterial.java
@@ -9,8 +9,8 @@ public class CustomMaterial {
 	private static PhongMaterial[] material;
 	public static final int
 			BLACK = 0, WHITE = 1, SELECTED_TILE = 2, MOVABLE_TILE = 3,
-			ATTACK_TILE = 4, SPECIAL_TILE = 5, BLACK_TILE = 6, WHITE_TILE = 7, WOOD = 8;
-	private static final int MATERIAL_LENGTH = 9;
+			ATTACK_TILE = 4, SPECIAL_TILE = 5, BLACK_TILE = 6, WHITE_TILE = 7, WOOD = 8, EXPLOSION_TILE = 9;
+	private static final int MATERIAL_LENGTH = 10;
 
 	public CustomMaterial() {
 		material = new PhongMaterial[MATERIAL_LENGTH];
@@ -19,9 +19,9 @@ public class CustomMaterial {
 		material[WHITE] = new PhongMaterial();
 		material[WHITE].setDiffuseColor(Color.rgb(240,240,240));
 		material[SELECTED_TILE] = new PhongMaterial();
-		material[SELECTED_TILE].setDiffuseColor(Color.rgb(50,200,100));
+		material[SELECTED_TILE].setDiffuseColor(Color.rgb(40,150,60));
 		material[MOVABLE_TILE] = new PhongMaterial();
-		material[MOVABLE_TILE].setDiffuseColor(Color.rgb(50,240,0));
+		material[MOVABLE_TILE].setDiffuseColor(Color.rgb(50,200,80));
 		material[ATTACK_TILE] = new PhongMaterial();
 		material[ATTACK_TILE].setDiffuseColor(Color.rgb(200,50,50));
 		material[SPECIAL_TILE] = new PhongMaterial();
@@ -32,6 +32,8 @@ public class CustomMaterial {
 		material[WHITE_TILE].setDiffuseColor(Color.grayRgb(200));
 		material[WOOD] = new PhongMaterial();
 		material[WOOD].setDiffuseMap(new Image("/wood.jpg"));
+		material[EXPLOSION_TILE] = new PhongMaterial();
+		material[EXPLOSION_TILE].setDiffuseColor(Color.rgb(200, 80, 50));
 
 		for(int i = 0 ; i < MATERIAL_LENGTH ; i++) {
 			material[i].setSpecularColor(Color.rgb(100, 100, 100));
diff --git a/MavenChess/MavenChess/src/main/java/view/TileView.java b/MavenChess/MavenChess/src/main/java/view/TileView.java
index d92276eb1bb4c1c82b4a5e2bc32f9f67ab69de31..a19c08c735df5ef18345256ee4a502da3b54301f 100644
--- a/MavenChess/MavenChess/src/main/java/view/TileView.java
+++ b/MavenChess/MavenChess/src/main/java/view/TileView.java
@@ -9,7 +9,7 @@ public class TileView {
 	private final Position position;
 	private int state;
 
-	public static final int NORMAL = 0, SELECTED = 1, MOVABLE = 2, ATTACK = 3, SPECIAL = 4;
+	public static final int NORMAL = 0, SELECTED = 1, MOVABLE = 2, ATTACK = 3, SPECIAL = 4, EXPLOSION = 5;
 	public TileView(Box obj, Position position) {
 		this.obj = obj;
 		this.position = position;
diff --git a/MavenChess/MavenChess/target/classes/controller/Main.class b/MavenChess/MavenChess/target/classes/controller/Main.class
index 5e69f5ffa85aa5268903966b3a16a5f30e180f58..8d4ad131fcbb83edbee5e5d469a9676cc242489a 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/Board.class b/MavenChess/MavenChess/target/classes/model/Board.class
index 3f59b5de49f9289154a28c351733feece290d730..d7205579cb1b8491f6d63f543ac471e8ac5a086a 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 212b8b22a9ff9ca0be66779f2376a6f0e3223a40..3585b01c7aac9a58774cfa823e3b6de25154838e 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 621fc71ea9f694f98ebc401e45ae56b6b263c205..bc82b5d2c762f16d0c5a41e2e7af6163853c6daa 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/Magician.class b/MavenChess/MavenChess/target/classes/model/Magician.class
index 9cb9112d36bf90d87c427dbc257a0887af5d10bf..a6c93ebe3cfc690fedc4ddf1307820b1a0664976 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 900487542c16548ca728b2437c64d2dedfb7bbf0..c273033df9b7465fdafc8be19375d84470913a55 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 07a780168facd29ef0f800edf01c6bd32e74749f..6dae773e174ac427e7b93206b7439cdf8da34f98 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/Position.class b/MavenChess/MavenChess/target/classes/model/Position.class
index bf4b97164c8118351d4b88aa50f9425eaff273f9..d08ee04d724822d2ca396ded99593f1d5aef9acc 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Position.class and b/MavenChess/MavenChess/target/classes/model/Position.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Queen.class b/MavenChess/MavenChess/target/classes/model/Queen.class
index 10479f12d5926eab2359e138d32913df50571a05..99db5da17bccc0d501fdc65cf89700ac9c579f60 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/view/BoardView.class b/MavenChess/MavenChess/target/classes/view/BoardView.class
index 0fa96c7105936d1ac4ba9becd2e2e9ba818040e1..dad9befd6db93d0d81adc0e81ba4275c84441a0e 100644
Binary files a/MavenChess/MavenChess/target/classes/view/BoardView.class and b/MavenChess/MavenChess/target/classes/view/BoardView.class differ
diff --git a/MavenChess/MavenChess/target/classes/view/CustomMaterial.class b/MavenChess/MavenChess/target/classes/view/CustomMaterial.class
index 06ac3d5e95495a07bff9fe1ddba2c69a20ed8c70..8dc8f459dec29d3bd79feacd9f5bfa14b963d72e 100644
Binary files a/MavenChess/MavenChess/target/classes/view/CustomMaterial.class and b/MavenChess/MavenChess/target/classes/view/CustomMaterial.class differ
diff --git a/MavenChess/MavenChess/target/classes/view/TileView.class b/MavenChess/MavenChess/target/classes/view/TileView.class
index df2fc8f7e944a9eb86325a43fab5c5685fb402d6..10d5f7a31ef3220a528617df33384f178c13ee0a 100644
Binary files a/MavenChess/MavenChess/target/classes/view/TileView.class and b/MavenChess/MavenChess/target/classes/view/TileView.class differ