diff --git a/core/app/Controller.java b/core/app/Controller.java
index 65bbe6f32594f1b4ba642a7b47addfd8bb34a2b2..395e383c157b14544668865060e0ad4d13b75be7 100644
--- a/core/app/Controller.java
+++ b/core/app/Controller.java
@@ -6,6 +6,8 @@ import java.io.FileReader;
 import java.io.IOException;
 import java.util.ArrayList;
 
+import javax.swing.JOptionPane;
+
 import exceptions.GameRunningException;
 import exceptions.UserInputException;
 import game.Direction;
@@ -96,7 +98,9 @@ public class Controller {
 		int failure = 0;
 
 		InitController.generateValidPairs();
-
+		InitController.startColonelZPMs = 0;
+		InitController.startJaffaZPMs = 0;
+		
 		for(; actualLvl <= maxLvl; actualLvl++)
 		{
 			String mapPath = InitController.nextMapName(actualLvl);
@@ -135,6 +139,10 @@ public class Controller {
 		}
 
 		// TODO: Game totally finished
+		JOptionPane.showMessageDialog(null, "Game Finished!\nColonel: " + InitController.startColonelZPMs 
+				+ "\nJaffa: " + InitController.startJaffaZPMs 
+				+ "\n\nCongratulation to both of you!");
+		System.exit(0);
 	}
 
 	/**
@@ -189,16 +197,17 @@ public class Controller {
 	private void uploadMapDatas()
 	{
 		uploadToModel();
-		ArrayList<ViewElement>[][] mapView = uploadToView();
+		ArrayList<ViewElement>[][] mapView = firstUploadToView();
 
 		if(InitController.colonel != null && InitController.jaffa != null)
 		{
-			view.showGame(InitController.map.length, InitController.map[0].length, colonelLife, jaffaLife,
-					Model.getInstance().getColonel().getZpmCount(), Model.getInstance().getJaffa().getZpmCount());
+			view.showGame(InitController.map[0].length, InitController.map.length, colonelLife, jaffaLife,
+					InitController.startColonelZPMs + Model.getInstance().getColonel().getZpmCount(), 
+					InitController.startJaffaZPMs + Model.getInstance().getJaffa().getZpmCount());
 		}
 		else
 		{
-			view.showGame(InitController.map.length, InitController.map[0].length, colonelLife, jaffaLife, 0, 0);
+			view.showGame(InitController.map[0].length, InitController.map.length, colonelLife, jaffaLife, 0, 0);
 			if(InitController.colonel == null)
 				System.err.println("No colonel found when game starts");
 			if(InitController.jaffa == null)
@@ -239,9 +248,9 @@ public class Controller {
 	 * @return	new map with <b>ViewElement</b>s
 	 */
 	@SuppressWarnings("unchecked")
-	public static ArrayList<ViewElement>[][] uploadToView()
+	private ArrayList<ViewElement>[][] firstUploadToView()
 	{
-		ArrayList<ViewElement>[][] mapView = new ArrayList[InitController.map.length][InitController.map[0].length];
+		ArrayList<ViewElement>[][] mapView = new ArrayList[InitController.map[0].length][InitController.map.length];
 
 		for( int i= 0; i< mapView.length; i++) {
 			for (int j = 0; j < mapView[i].length; j++) {
@@ -255,7 +264,7 @@ public class Controller {
 			{
 				for(int k = 1; k < InitController.map[i][j].size(); k++)
 				{
-					mapView[i][j].add(getViewOf(InitController.map[i][j].get(k)));
+					mapView[j][i].add(getViewOf(InitController.map[i][j].get(k)));
 				}
 			}
 		}
@@ -269,7 +278,7 @@ public class Controller {
 	 * @param element	which out-looking is looked for
 	 * @return			graphical version of the given element
 	 */
-	private static ViewElement getViewOf(IElement element)
+	public static ViewElement getViewOf(IElement element)
 	{
 		try
 		{
diff --git a/core/app/GameController.java b/core/app/GameController.java
index d2d7013c22d132430cf0f42b2967ebe09e31dbba..e4f22ec33fa450540bd805d719a36533f1f6c6aa 100644
--- a/core/app/GameController.java
+++ b/core/app/GameController.java
@@ -29,6 +29,9 @@ public class GameController {
 		Model.getInstance().restartMap();
 		
 		int failure = 0;
+		int counter = 0;
+		Integer tmpColonelLives = Model.getInstance().getColonel().getPlayerLives();
+		Integer tmpJaffaLives = Model.getInstance().getJaffa().getPlayerLives();
 		
 		while(true)
 		{
@@ -46,6 +49,19 @@ public class GameController {
 				}
 			}
 			
+			if(counter < 4)
+			{
+				counter++;
+			}
+			else
+			{
+				if(Model.getInstance().getReplicator() != null)
+				{
+					moveReplicator();
+				}
+				counter = 0;
+			}
+			
 			Integer lastKey = view.getLastKey();
 			if(lastKey != null)
 			{
@@ -56,6 +72,7 @@ public class GameController {
 					if(Model.getInstance().getColonel().getDirection() == Direction.UP)
 					{
 						move(Model.getInstance().getColonel());
+						updateViewToolbar(tmpColonelLives, tmpJaffaLives);
 					}
 					else
 					{
@@ -66,6 +83,7 @@ public class GameController {
 					if(Model.getInstance().getColonel().getDirection() == Direction.RIGHT)
 					{
 						move(Model.getInstance().getColonel());
+						updateViewToolbar(tmpColonelLives, tmpJaffaLives);
 					}
 					else
 					{
@@ -76,6 +94,7 @@ public class GameController {
 					if(Model.getInstance().getColonel().getDirection() == Direction.DOWN)
 					{
 						move(Model.getInstance().getColonel());
+						updateViewToolbar(tmpColonelLives, tmpJaffaLives);
 					}
 					else
 					{
@@ -86,6 +105,7 @@ public class GameController {
 					if(Model.getInstance().getColonel().getDirection() == Direction.LEFT)
 					{
 						move(Model.getInstance().getColonel());
+						updateViewToolbar(tmpColonelLives, tmpJaffaLives);
 					}
 					else
 					{
@@ -94,9 +114,11 @@ public class GameController {
 					break;
 				case KeyEvent.VK_8:		// Shoot Blue
 					shoot(Model.getInstance().getColonel(), PortalColor.BLUE);
+					updateViewToolbar(tmpColonelLives, tmpJaffaLives);
 					break;
 				case KeyEvent.VK_9:		// Shoot Yellow
 					shoot(Model.getInstance().getColonel(), PortalColor.YELLOW);
+					updateViewToolbar(tmpColonelLives, tmpJaffaLives);
 					break;
 				case KeyEvent.VK_U:		// Box down
 					boxDown(Model.getInstance().getColonel());
@@ -110,6 +132,7 @@ public class GameController {
 					if(Model.getInstance().getJaffa().getDirection() == Direction.UP)
 					{
 						move(Model.getInstance().getJaffa());
+						updateViewToolbar(tmpColonelLives, tmpJaffaLives);
 					}
 					else
 					{
@@ -120,6 +143,7 @@ public class GameController {
 					if(Model.getInstance().getJaffa().getDirection() == Direction.RIGHT)
 					{
 						move(Model.getInstance().getJaffa());
+						updateViewToolbar(tmpColonelLives, tmpJaffaLives);
 					}
 					else
 					{
@@ -130,6 +154,7 @@ public class GameController {
 					if(Model.getInstance().getJaffa().getDirection() == Direction.DOWN)
 					{
 						move(Model.getInstance().getJaffa());
+						updateViewToolbar(tmpColonelLives, tmpJaffaLives);
 					}
 					else
 					{
@@ -140,6 +165,7 @@ public class GameController {
 					if(Model.getInstance().getJaffa().getDirection() == Direction.LEFT)
 					{
 						move(Model.getInstance().getJaffa());
+						updateViewToolbar(tmpColonelLives, tmpJaffaLives);
 					}
 					else
 					{
@@ -148,14 +174,16 @@ public class GameController {
 					break;
 				case KeyEvent.VK_1:		// Shoot Green
 					shoot(Model.getInstance().getJaffa(), PortalColor.GREEN);
+					updateViewToolbar(tmpColonelLives, tmpJaffaLives);
 					break;
 				case KeyEvent.VK_2:		// Shoot RED
 					shoot(Model.getInstance().getJaffa(), PortalColor.RED);
+					updateViewToolbar(tmpColonelLives, tmpJaffaLives);
 					break;
 				case KeyEvent.VK_Q:		// Box down
 					boxDown(Model.getInstance().getJaffa());
 					break;
-				case KeyEvent.VK_E:
+				case KeyEvent.VK_E:		// Box up
 					boxUp(Model.getInstance().getJaffa());
 					break;
 				}
@@ -167,14 +195,33 @@ public class GameController {
 			}	
 		}
 		
+		endProcess();
+		
 		return;	// Map finished
 	}
 	
+	private void updateViewToolbar(Integer beforeColonelLives, Integer beforeJaffaLives)
+	{
+		int afterColonelLives = Model.getInstance().getColonel().getPlayerLives();
+		int afterJaffaLives = Model.getInstance().getJaffa().getPlayerLives();
+		
+		if(beforeColonelLives.intValue() != afterColonelLives)
+		{
+			view.setColonelLivesDisplayed(afterColonelLives);
+			beforeColonelLives = afterColonelLives;
+		}
+		if(beforeJaffaLives.intValue() != afterJaffaLives)
+		{
+			view.setJaffaLivesDisplayed(afterJaffaLives);
+			beforeJaffaLives = afterJaffaLives;
+		}
+	}
+	
 	private void move(Player player)
 	{
 		player.step();
-		updateMap();
-		ArrayList<ViewElement>[][] viewMap = Controller.uploadToView();
+		updateGameControllerMap();
+		ArrayList<ViewElement>[][] viewMap = uploadToView();
 		
 		view.setMap(viewMap);
 	}
@@ -182,8 +229,8 @@ public class GameController {
 	private void turn(Player player, Direction dir)
 	{
 		player.setDirection(dir);
-		updateMap();
-		ArrayList<ViewElement>[][] viewMap = Controller.uploadToView();
+		updateGameControllerMap();
+		ArrayList<ViewElement>[][] viewMap = uploadToView();
 		
 		view.setMap(viewMap);
 	}
@@ -191,8 +238,8 @@ public class GameController {
 	private void shoot(Player player, PortalColor color)
 	{
 		player.fire(color);
-		updateMap();
-		ArrayList<ViewElement>[][] viewMap = Controller.uploadToView();
+		updateGameControllerMap();
+		ArrayList<ViewElement>[][] viewMap = uploadToView();
 		
 		view.setMap(viewMap);
 	}
@@ -200,8 +247,8 @@ public class GameController {
 	private void boxDown(Player player)
 	{
 		player.putBoxDown();
-		updateMap();
-		ArrayList<ViewElement>[][] viewMap = Controller.uploadToView();
+		updateGameControllerMap();
+		ArrayList<ViewElement>[][] viewMap = uploadToView();
 		
 		view.setMap(viewMap);
 	}
@@ -209,14 +256,30 @@ public class GameController {
 	private void boxUp(Player player)
 	{
 		player.getBoxUp();
-		updateMap();
-		ArrayList<ViewElement>[][] viewMap = Controller.uploadToView();
+		updateGameControllerMap();
+		ArrayList<ViewElement>[][] viewMap = uploadToView();
+		
+		view.setMap(viewMap);
+	}
+	
+	private void moveReplicator()
+	{
+		Model.getInstance().getReplicator().setDirection(Direction.getRandomDir());
+		Model.getInstance().getReplicator().step();
+		updateGameControllerMap();
+		ArrayList<ViewElement>[][] viewMap = uploadToView();
 		
 		view.setMap(viewMap);
 	}
 	
+	private void endProcess()
+	{
+		InitController.startColonelZPMs += Model.getInstance().getColonel().getZpmCount();
+		InitController.startJaffaZPMs += Model.getInstance().getJaffa().getZpmCount();
+	}
+	
 	@SuppressWarnings("unchecked")
-	private void updateMap()
+	private void updateGameControllerMap()
 	{
 		java.lang.reflect.Field tmp;
 		try
@@ -241,4 +304,29 @@ public class GameController {
 			// omg
 		}
 	}
+	
+	@SuppressWarnings("unchecked")
+	private ArrayList<ViewElement>[][] uploadToView()
+	{
+		ArrayList<ViewElement>[][] mapView = new ArrayList[map[0].length][map.length];
+
+		for( int i= 0; i< mapView.length; i++) {
+			for (int j = 0; j < mapView[i].length; j++) {
+				mapView[i][j] = new ArrayList<ViewElement>();
+			}
+		}
+
+		for(int i = 0; i < map.length; i++)
+		{
+			for(int j = 0; j < map[0].length; j++)
+			{
+				for(int k = 1; k < map[i][j].size(); k++)
+				{
+					mapView[j][i].add(Controller.getViewOf(map[i][j].get(k)));
+				}
+			}
+		}
+
+		return mapView;
+	} 
 }
diff --git a/core/app/InitController.java b/core/app/InitController.java
index a5a1eeb6c309957ed656a6ecbadf82e033366247..89c76de2f82d0b805d2d7103584b61ee6a414b90 100644
--- a/core/app/InitController.java
+++ b/core/app/InitController.java
@@ -28,10 +28,10 @@ public class InitController {
 	private static String mapDir = "maps/";
 	private static final String[] mapNames = new String[] {
 			"testmap.txt",		// first map
-			"",		// second map
-			"",		// third map
-			"",		// fourth map
-			""		// fifth map
+			"map01.txt",		// second map
+			"map02.txt",		// third map
+			"map03.txt",		// fourth map
+			"map04.txt"		// fifth map
 			// possibly to add more map
 		};
 
@@ -43,6 +43,8 @@ public class InitController {
 	public static Gate mainGate;
 	public static int ZPMs;
 	public static int specOpen;
+	public static int startColonelZPMs = 0;
+	public static int startJaffaZPMs = 0;
 
 	private InitController() {}
 
diff --git a/core/game/Model.java b/core/game/Model.java
index 496a1ba70e68e153c51bf5511c41ce9ef27ad0e0..6bc7b33ef445fcec858e5c3d29863d3e0ae57540 100644
--- a/core/game/Model.java
+++ b/core/game/Model.java
@@ -64,6 +64,20 @@ public class Model
 	public void resetMapReq()
 	{
 		isMapFinished = true;
+		if(colonel.getPlayerLives() == 0)
+		{
+			for(int i = 0; i < colonel.getZpmCount(); i++)
+			{
+				jaffa.incZPMCount();
+			}
+		}
+		else if(jaffa.getPlayerLives() == 0)
+		{
+			for(int i = 0; i < jaffa.getZpmCount(); i++)
+			{
+				colonel.incZPMCount();
+			}
+		}
 	}
 	
 	public void restartMap()
diff --git a/core/mapobjs/movobjs/Player.java b/core/mapobjs/movobjs/Player.java
index 0ef9c842d1ae57a774fa6cad4a3d645b8a73cb5c..ed2841b55a8abecaaa0b4afc41eb9d32389490c4 100644
--- a/core/mapobjs/movobjs/Player.java
+++ b/core/mapobjs/movobjs/Player.java
@@ -12,10 +12,6 @@ public class Player extends DefaultElement implements IMovable {
 	private Field originField;
 	private Box box = null;
 	private int zpmCount = 0;
-	public int getZpmCount() {
-		return zpmCount;
-	}
-
 	private int playerLives = 3;
 	private Direction dir;
 
@@ -66,6 +62,7 @@ public class Player extends DefaultElement implements IMovable {
     		if(this.box != null)
         		box.damaged();
     		this.getField().addToRemove(this);
+    		Model.getInstance().resetMapReq();
         	//this.getField().deleteElement(this);
         	//this.setField(null);
     	}
@@ -154,4 +151,12 @@ public class Player extends DefaultElement implements IMovable {
 		this.playerLives = playerLives;
 	}
 
+	public int getPlayerLives()
+	{
+		return this.playerLives;
+	}
+	
+	public int getZpmCount() {
+		return zpmCount;
+	}
 }
diff --git a/core/maps/testmap.txt b/core/maps/testmap.txt
index a1bb97888f7341c08b553ef54aebe64d5e8777b8..149c4e94cd3714c614523c463e27ce5c827f3103 100644
--- a/core/maps/testmap.txt
+++ b/core/maps/testmap.txt
@@ -1,8 +1,8 @@
-create map 5 5
+create map 10 10
 create colonel 1 1
 create gate 2 3
 create ra 0 0
-create re 0 1
+create re 5 5
 create jaffa 1 0
 create door 2 2 3 3
 create box 3 2