diff --git a/MavenChess/.idea/inspectionProfiles/Project_Default.xml b/MavenChess/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000000000000000000000000000000000000..82ed0ad8cd6b2e5c4f05cfd861609c31e78b11de
--- /dev/null
+++ b/MavenChess/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,10 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
+      <Languages>
+        <language minSize="74" name="Java" />
+      </Languages>
+    </inspection_tool>
+  </profile>
+</component>
\ No newline at end of file
diff --git a/MavenChess/MavenChess/src/main/java/model/Bishop.java b/MavenChess/MavenChess/src/main/java/model/Bishop.java
index fa0c14db3058556bceff756ef4a700862e11b028..2f52deaf8fe84dbc777c03def65595305986aefc 100644
--- a/MavenChess/MavenChess/src/main/java/model/Bishop.java
+++ b/MavenChess/MavenChess/src/main/java/model/Bishop.java
@@ -2,7 +2,8 @@ package model;
 
 import java.util.ArrayList;
 
-public class Bishop extends Pawn{
+public class Bishop extends Piece {
+
     public Bishop(Position p, int color) {
         super(p, color);
     }
@@ -14,13 +15,75 @@ public class Bishop extends Pawn{
         ArrayList<Position> moves = new ArrayList<Position>();
 
         Position arrival;
-        if(color == Piece.WHITE) { // black and white have an opposite direction behavior
 
-            // King white move
-        }
-        else {
-            // King black move
+        Position Cursor = new Position(p.getX(), p.getY());
+
+        int i = 1;
+        boolean leftTop = false;
+        boolean rightTop = false;
+        boolean leftDown = false;
+        boolean rightDown = false;
+
+        while (i < 8) {
+
+            //left diagonal
+
+            arrival = new Position(p.getX() + i, p.getY() + i);
+
+            if (!leftTop) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+
+            if (!b.isFree(arrival)) {
+                leftTop = true;
+            }
+
+
+
+
+
+            //right diagonal
+            arrival = new Position(p.getX() - i, p.getY() + i);
+            if (!rightTop) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                rightTop = true;
+            }
+
+
+
+            arrival = new Position(p.getX() + i, p.getY() - i);
+            if (!leftDown) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                leftDown = true;
+            }
+
+
+
+            arrival = new Position(p.getX() - i, p.getY() - i);
+            if (!rightDown) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                rightDown = true;
+            }
+
+
+            i++;
         }
+
+
         return moves;
     }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Board.java b/MavenChess/MavenChess/src/main/java/model/Board.java
index c935d12bbaf66b1aeb8da83bceeb2d5545b41dab..d458d600096b7aa174f0a0b551d4832ee2deaa8b 100644
--- a/MavenChess/MavenChess/src/main/java/model/Board.java
+++ b/MavenChess/MavenChess/src/main/java/model/Board.java
@@ -73,7 +73,7 @@ public class Board {
 	}
 
 	public boolean isFree(Position p) {
-		return (pieces[p.getID()] == null);
+		return (Position.isCorrect(p) && pieces[p.getID()] == null);
 	}
 	public boolean isBlack(Position p) {
 		return (!isFree(p) && pieces[p.getID()].getColor() == Piece.BLACK);
@@ -84,7 +84,7 @@ public class Board {
 	}
 
 	public boolean isEnnemy(Position p, Position origin) {
-		return (!isFree(p) && pieces[p.getID()].getColor() != pieces[origin.getID()].getColor());
+		return (Position.isCorrect(p) &&  !isFree(p) && pieces[p.getID()].getColor() != pieces[origin.getID()].getColor() );
 	}
 	public boolean isKing(Position p) {
 		return (!isFree(p) && pieces[p.getID()].getClass() == King.class);
diff --git a/MavenChess/MavenChess/src/main/java/model/King.java b/MavenChess/MavenChess/src/main/java/model/King.java
index af0389c02e567073a44e1a3f725f362e1588c3ea..e1ec7723dc919b8e121a5b1e4dcd35b6f778177d 100644
--- a/MavenChess/MavenChess/src/main/java/model/King.java
+++ b/MavenChess/MavenChess/src/main/java/model/King.java
@@ -4,8 +4,13 @@ import java.util.ArrayList;
 
 
 public class King extends Piece {
+
+	private boolean Casteling = true;
+	private final Position original;
+
 	public King(Position p, int color) {
 		super(p, color);
+		this.original = p;
 	}
 
 
@@ -15,13 +20,44 @@ public class King extends Piece {
 		ArrayList<Position> moves = new ArrayList<Position>();
 
 		Position arrival;
-		if(color == Piece.WHITE) { // black and white have an opposite direction behavior
 
-			// King white move
-		}
-		else {
-			// King black move
-		}
+		// up
+		arrival = new Position(p.getX(), p.getY() + 1);
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		//down
+		arrival = new Position(p.getX(), p.getY() - 1);
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		//left
+		arrival = new Position(p.getX()+1, p.getY());
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		//right
+		arrival = new Position(p.getX()-1, p.getY());
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		//up left
+		arrival = new Position(p.getX()-1, p.getY() + 1);
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		//up right
+		arrival = new Position(p.getX()+1, p.getY() + 1);
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		//down left
+		arrival = new Position(p.getX()-1, p.getY() -1);
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		//down right
+		arrival = new Position(p.getX()+1, p.getY() - 1);
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		arrival = new Position(p.getX(), p.getY() + 1);
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+
+
 		return moves;
 	}
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Knight.java b/MavenChess/MavenChess/src/main/java/model/Knight.java
index 601368d12d66331323905047d1965c159ded0070..7a731d0c95c2c066eaabfe3670422c754e756156 100644
--- a/MavenChess/MavenChess/src/main/java/model/Knight.java
+++ b/MavenChess/MavenChess/src/main/java/model/Knight.java
@@ -2,7 +2,9 @@ package model;
 
 import java.util.ArrayList;
 
-public class Knight extends Pawn{
+public class Knight extends Piece {
+
+
     public Knight(Position p, int color) {
         super(p, color);
     }
@@ -14,13 +16,53 @@ public class Knight extends Pawn{
         ArrayList<Position> moves = new ArrayList<Position>();
 
         Position arrival;
-        if(color == Piece.WHITE) { // black and white have an opposite direction behavior
 
-            // King white move
+
+        arrival = new Position(p.getX() - 1, p.getY() + 2);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
+        }
+
+        // up right
+        arrival = new Position(p.getX() + 1, p.getY() + 2);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
+        }
+
+        // down left
+        arrival = new Position(p.getX() - 1, p.getY() - 2);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
+        }
+
+        //down right
+        arrival = new Position(p.getX() + 1, p.getY() - 2);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
+        }
+
+        arrival = new Position(p.getX() - 2, p.getY() + 1);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
+        }
+
+        // up right
+        arrival = new Position(p.getX() + 2, p.getY() + 1);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
+        }
+        // down left
+        arrival = new Position(p.getX() - 2, p.getY() - 1);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
         }
-        else {
-            // King black move
+
+        //down right
+        arrival = new Position(p.getX() + 2, p.getY() - 1);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
         }
+
         return moves;
     }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Pawn.java b/MavenChess/MavenChess/src/main/java/model/Pawn.java
index 0467039c5f4efe967f158d8a6fb21bdb8dc38f3e..0861484c74d2ec2a1f1bd1b88f053b011afac658 100644
--- a/MavenChess/MavenChess/src/main/java/model/Pawn.java
+++ b/MavenChess/MavenChess/src/main/java/model/Pawn.java
@@ -3,10 +3,13 @@ package model;
 import java.util.ArrayList;
 
 public class Pawn extends Piece {
+	private final Position original;
 	public Pawn(Position p, int color) {
 		super(p, color);
+		this.original = p;
 	}
 
+
 	public ArrayList<Position> getAvailableMoves(Board b) {
 
 		// creates a dynamic list of available moves
@@ -15,6 +18,13 @@ public class Pawn extends Piece {
 		Position arrival;
 		if(color == Piece.WHITE) { // black and white have an opposite direction behavior
 
+			if(this.p.getID() == this.original.getID()){
+			//	up, free movement first time
+						arrival = new Position(p.getX(), p.getY() + 2);
+				if(Position.isCorrect(arrival) && b.isFree(arrival)) { moves.add(arrival); }
+
+			}
+
 			// up, free movement
 			arrival = new Position(p.getX(), p.getY() + 1);
 			if(Position.isCorrect(arrival) && b.isFree(arrival)) { moves.add(arrival); }
@@ -30,6 +40,12 @@ public class Pawn extends Piece {
 		}
 		else {
 
+			if(this.p.getID() == this.original.getID()){
+				//	up, free movement first time
+				arrival = new Position(p.getX(), p.getY() - 2);
+				if(Position.isCorrect(arrival) && b.isFree(arrival)) { moves.add(arrival); }
+			}
+
 			// down, free movement
 			arrival = new Position(p.getX(), p.getY() - 1);
 			if(Position.isCorrect(arrival) && b.isFree(arrival)) { moves.add(arrival); }
diff --git a/MavenChess/MavenChess/src/main/java/model/Queen.java b/MavenChess/MavenChess/src/main/java/model/Queen.java
index 541e831de3bebe8b08dc5a8758b36e546ceaae07..0d740f16487c0cb1688577459fbe89defc7f35bb 100644
--- a/MavenChess/MavenChess/src/main/java/model/Queen.java
+++ b/MavenChess/MavenChess/src/main/java/model/Queen.java
@@ -14,13 +14,127 @@ public class Queen extends Piece{
         ArrayList<Position> moves = new ArrayList<Position>();
 
         Position arrival;
-        if(color == Piece.WHITE) { // black and white have an opposite direction behavior
 
-            // King white move
-        }
-        else {
-            // King black move
+
+        int i = 1;
+        boolean left = false;
+        boolean right = false;
+        boolean top = false;
+        boolean down = false;
+        boolean leftTop = false;
+        boolean rightTop = false;
+        boolean leftDown = false;
+        boolean rightDown = false;
+
+        while (i < 8) {
+            // Bishop moves
+            arrival = new Position(p.getX() + i, p.getY() + i);
+
+            if (!leftTop) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+
+            if (!b.isFree(arrival)) {
+                leftTop = true;
+            }
+
+
+
+
+
+            //right diagonal
+            arrival = new Position(p.getX() - i, p.getY() + i);
+            if (!rightTop) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                rightTop = true;
+            }
+
+
+
+            arrival = new Position(p.getX() + i, p.getY() - i);
+            if (!leftDown) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                leftDown = true;
+            }
+
+
+
+            arrival = new Position(p.getX() - i, p.getY() - i);
+            if (!rightDown) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                rightDown = true;
+            }
+
+
+            // RooK moves
+
+            arrival = new Position(p.getX() +i, p.getY());
+
+            if (!left) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+
+            if (!b.isFree(arrival)) {
+                left = true;
+            }
+
+
+
+            //right diagonal
+            arrival = new Position(p.getX()- i , p.getY() );
+            if (!right) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                right = true;
+            }
+
+
+
+            arrival = new Position(p.getX(), p.getY() + i);
+            if (!top) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                top = true;
+            }
+
+
+
+            arrival = new Position(p.getX(), p.getY() - i);
+            if (!down) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                down = true;
+            }
+
+
+            i++;
         }
+
         return moves;
     }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Rook.java b/MavenChess/MavenChess/src/main/java/model/Rook.java
index cbb3c82d513266e4db893f966fcdfb616b65c854..859120d2d532b813f744407c780094342c1e7291 100644
--- a/MavenChess/MavenChess/src/main/java/model/Rook.java
+++ b/MavenChess/MavenChess/src/main/java/model/Rook.java
@@ -2,9 +2,14 @@ package model;
 
 import java.util.ArrayList;
 
-public class Rook extends Pawn{
+public class Rook extends Piece {
+
+
+    private final Position original;
+
     public Rook(Position p, int color) {
         super(p, color);
+        this.original = p;
     }
 
 
@@ -14,13 +19,85 @@ public class Rook extends Pawn{
         ArrayList<Position> moves = new ArrayList<Position>();
 
         Position arrival;
-        if(color == Piece.WHITE) { // black and white have an opposite direction behavior
 
-            // King white move
-        }
-        else {
-            // King black move
+        int i = 1;
+        boolean left = false;
+        boolean right = false;
+        boolean top = false;
+        boolean down = false;
+
+
+        while (i < 8) {
+
+            //left
+
+            arrival = new Position(p.getX() + i, p.getY());
+            if (Position.isCorrect(arrival)) {
+                if (!left) {
+                    if (b.isEnnemy(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, p.getY());
+            if (Position.isCorrect(arrival)) {
+                if (!right) {
+                    if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                        moves.add(arrival);
+                    }
+                    if (b.isKing(arrival)) {
+                        moves.add(arrival);
+                    }
+                }
+
+                if (!b.isFree(arrival)) {
+
+                    right = true;
+                }
+            }
+
+
+            arrival = new Position(p.getX(), p.getY() + i);
+            if (Position.isCorrect(arrival)) {
+                if (!top) {
+                    if (b.isEnnemy(arrival, p)|| b.isFree(arrival)) {
+                        moves.add(arrival);
+                    }
+                }
+
+                if (!b.isFree(arrival)) {
+
+                    top = true;
+                }
+            }
+
+
+            arrival = new Position(p.getX(), p.getY() - i);
+            if(Position.isCorrect(arrival)||b.isFree(arrival)) {
+                if (!down) {
+                    if (b.isEnnemy(arrival, p)) {
+                        moves.add(arrival);
+                    }
+                }
+                if (!b.isFree(arrival)) {
+
+                    down = true;
+                }
+            }
+
+            i++;
         }
+
         return moves;
     }
 }
diff --git a/MavenChess/MavenChess/target/classes/model/Bishop.class b/MavenChess/MavenChess/target/classes/model/Bishop.class
index 32156f2253d3bdfe153b1ece2163495390335a29..398d50bd457f077c36e29485a75dfac67ee15440 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 60d2800598b989d8ec14cb16a3ef8ae53b102a85..50215dddae1418b33ede47485b465cdb3d5f4022 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/King.class b/MavenChess/MavenChess/target/classes/model/King.class
index c4aece04f0d991f6eeb05a95e0bd5b8d7a223ac0..2b7365022be2e1d12fc9d6144b60ef72220043f0 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 d5899db6ea9e76ef0a5d0e856cb3bffddb9eeff4..09ed6279d228976b0614f6977c88b26d6efd00ac 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/Pawn.class b/MavenChess/MavenChess/target/classes/model/Pawn.class
index 075844d3ad6e57acb80518f4ceeb7cc1493e88fb..a9d05b2520252001c47ac6dc5354e655d8b2eb69 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/Queen.class b/MavenChess/MavenChess/target/classes/model/Queen.class
index b6a5f4b973d66ee2e73a445038cbd118276673e9..ce7f8807817995cd62883140b43a974c44646d23 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 d20e385f6b33a6b1069572d9926c3a3a17ff46ec..ee62dd3c32855be4fe2f5261aed520c175275f3d 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Rook.class and b/MavenChess/MavenChess/target/classes/model/Rook.class differ