diff --git a/bin/de/bricked/resources/textures/powerups/1.png b/bin/de/bricked/resources/textures/powerups/1.png
index ce483cc81df758cb80c62f179fd3cde36751b30b..0a38b3fbb1f7995a25035bf0471ad52569c4f2ab 100644
Binary files a/bin/de/bricked/resources/textures/powerups/1.png and b/bin/de/bricked/resources/textures/powerups/1.png differ
diff --git a/bin/de/bricked/resources/textures/powerups/4.png b/bin/de/bricked/resources/textures/powerups/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c3792036b05fe71d2139e4e98d25b1fe743176b
Binary files /dev/null and b/bin/de/bricked/resources/textures/powerups/4.png differ
diff --git a/bin/de/bricked/resources/textures/powerups/5.png b/bin/de/bricked/resources/textures/powerups/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..778eccf091e8ac2f071b043ba1ca9e549c5bb1fa
Binary files /dev/null and b/bin/de/bricked/resources/textures/powerups/5.png differ
diff --git a/notes/textures/PowerUp-Template.pdn b/notes/textures/PowerUp-Template.pdn
new file mode 100644
index 0000000000000000000000000000000000000000..0e03eff55daf88165bb59976e85ce24effafdc17
Binary files /dev/null and b/notes/textures/PowerUp-Template.pdn differ
diff --git a/src/de/bricked/game/Game.java b/src/de/bricked/game/Game.java
index 85ca1b8f2088a649b9b97cb4f3d18f290a8bf7f0..cf8119ba4f60f914d1f6b7a09fdc48d2560b99f6 100644
--- a/src/de/bricked/game/Game.java
+++ b/src/de/bricked/game/Game.java
@@ -418,4 +418,14 @@ public class Game
 				return null;
 		}
 	}
+	
+	public Point2D getNewSpeedDirection(Point2D oldDirection, double speed)
+	{		
+		double influenceX = 0.5;
+		
+		double newXSpeed = speed * influenceX;
+		double newYSpeed = Math.sqrt(speed * speed - newXSpeed * newXSpeed);
+
+		return new Point2D(-newXSpeed, -newYSpeed);
+	}
 }
\ No newline at end of file
diff --git a/src/de/bricked/game/board/Board.java b/src/de/bricked/game/board/Board.java
index 3db453f4e8f248c2d363f8463cc8c64baacb561e..4a2928dda2a337956374963529e306e5cbea74fe 100644
--- a/src/de/bricked/game/board/Board.java
+++ b/src/de/bricked/game/board/Board.java
@@ -8,6 +8,8 @@ import de.bricked.game.bricks.Brick;
 import de.bricked.game.bricks.BrickType;
 import de.bricked.game.powerups.ExtraLifePowerUp;
 import de.bricked.game.powerups.PowerUp;
+import de.bricked.game.powerups.ball.ExplodeBallPowerUp;
+import de.bricked.game.powerups.ball.NoCollisionBallPowerUp;
 import de.bricked.ui.LevelController;
 
 public class Board
@@ -48,15 +50,17 @@ public class Board
 				case 3:
 					break;
 				case 4:
+					currentPowerUp = new ExplodeBallPowerUp();
 					break;
 				case 5:
+					currentPowerUp = new NoCollisionBallPowerUp();
 					break;
 				case 6:
 					break;
-				default: 
+				default:
 					break;
 			}
-			
+
 			switch(brickValue)
 			{
 				case "N":
diff --git a/src/de/bricked/game/powerups/ExtraLifePowerUp.java b/src/de/bricked/game/powerups/ExtraLifePowerUp.java
index 420f47aae2eb5f603182360d2f6fb7e8c1762b48..37b7d5edcdac1e2cadd6b025bae1858a37c0c0a8 100644
--- a/src/de/bricked/game/powerups/ExtraLifePowerUp.java
+++ b/src/de/bricked/game/powerups/ExtraLifePowerUp.java
@@ -1,17 +1,23 @@
 package de.bricked.game.powerups;
 
+import de.bricked.game.Game;
+import de.bricked.ui.LevelController;
 
 public class ExtraLifePowerUp extends PowerUp
 {
-
     public ExtraLifePowerUp()
     {
-        super(PowerUpType.valueOf("EXTRA_LIFE").getId(), -1);
+        super(PowerUpType.valueOf("EXTRA_LIFE").getId(), 10);
     }
 
-    @Override
-    public void activate()
-    {
+	@Override
+	public void activate(LevelController levelController, Game game)
+	{
+		//TODO
+	}
 
-    }
-}
+	@Override
+	public void deactivate(LevelController levelController, Game game)
+	{		
+	}   
+}
\ No newline at end of file
diff --git a/src/de/bricked/game/powerups/PowerUp.java b/src/de/bricked/game/powerups/PowerUp.java
index cabfed3675e4e91e1844942d1a08322e3367c542..d96641874faf96afe40bc0117a67f4f3d38cf165 100644
--- a/src/de/bricked/game/powerups/PowerUp.java
+++ b/src/de/bricked/game/powerups/PowerUp.java
@@ -1,15 +1,18 @@
 package de.bricked.game.powerups;
 
+import de.bricked.game.Game;
+import de.bricked.ui.LevelController;
+
 public abstract class PowerUp
 {
     protected int id;
-    protected int duration;
+    protected int durationInSeconds;
     protected final double speed = 2.0;  
 
-    public PowerUp(int id, int duration)
+    public PowerUp(int id, int durationInSeconds)
     {
         this.id = id;
-        this.duration = duration;
+        this.durationInSeconds = durationInSeconds;
     }
     
     public int getID()
@@ -19,13 +22,20 @@ public abstract class PowerUp
 
     public boolean isPermanent()
     {
-        return (duration == -1);
-    }    
+        return (durationInSeconds == -1);
+    }
+    
+    public int getDurationInSeconds()
+    {
+    	return durationInSeconds;
+    }
 
     public double getSpeed()
 	{
 		return speed;
 	} 
 
-	public abstract void activate();
+	public abstract void activate(LevelController levelController, Game game);
+	
+	public abstract void deactivate(LevelController levelController, Game game);
 }
\ No newline at end of file
diff --git a/src/de/bricked/game/powerups/PowerUpType.java b/src/de/bricked/game/powerups/PowerUpType.java
index e6802a342a29c2f9f5152c7bc451e57fe0eb2b70..6bc52e10ebd8a9ff010692b8ac2172e5796939f9 100644
--- a/src/de/bricked/game/powerups/PowerUpType.java
+++ b/src/de/bricked/game/powerups/PowerUpType.java
@@ -7,8 +7,7 @@ public enum PowerUpType
     FASTER_BALL(2),
     SLOWER_BALL(3),
     EXPLODE_BALL(4),
-    THROUGH_BALL(5),
-    SPLIT_BALL(6);
+    NO_COLLISION_BALL(5);   
 
     private int id;
 
diff --git a/src/de/bricked/game/powerups/ball/DecreaseBallSizePowerUp.java b/src/de/bricked/game/powerups/ball/DecreaseBallSizePowerUp.java
deleted file mode 100644
index eb4850dca9a551e60b055bab3b97880fcdc6f10d..0000000000000000000000000000000000000000
--- a/src/de/bricked/game/powerups/ball/DecreaseBallSizePowerUp.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package de.bricked.game.powerups.ball;
-
-
-import de.bricked.game.balls.Ball;
-import de.bricked.game.powerups.PowerUp;
-
-public class DecreaseBallSizePowerUp extends PowerUp
-{
-    private Ball ball;
-
-    public DecreaseBallSizePowerUp(int id, int duration, Ball ball)
-    {
-        super(id, duration);
-        this.ball = ball;
-    }
-
-    @Override
-    public void activate()
-    {
-
-    }
-}
diff --git a/src/de/bricked/game/powerups/ball/ExplodeBallPowerUp.java b/src/de/bricked/game/powerups/ball/ExplodeBallPowerUp.java
new file mode 100644
index 0000000000000000000000000000000000000000..a7eb86e7e7de233799df0593c942bbdf7269bff0
--- /dev/null
+++ b/src/de/bricked/game/powerups/ball/ExplodeBallPowerUp.java
@@ -0,0 +1,27 @@
+package de.bricked.game.powerups.ball;
+
+import de.bricked.game.Game;
+import de.bricked.game.balls.Ball;
+import de.bricked.game.balls.BallType;
+import de.bricked.game.powerups.PowerUp;
+import de.bricked.game.powerups.PowerUpType;
+import de.bricked.ui.LevelController;
+
+public class ExplodeBallPowerUp extends PowerUp
+{
+    public ExplodeBallPowerUp()
+    {
+        super(PowerUpType.valueOf("EXPLODE_BALL").getId(), -1);
+    }
+
+    @Override
+    public void activate(LevelController levelController, Game game)
+    {
+    	levelController.changeBall(new Ball(BallType.EXPLOSIVE));
+    }
+
+	@Override
+	public void deactivate(LevelController levelController, Game game)
+	{		
+	}
+}
\ No newline at end of file
diff --git a/src/de/bricked/game/powerups/ball/IncreaseBallSizePowerUp.java b/src/de/bricked/game/powerups/ball/IncreaseBallSizePowerUp.java
deleted file mode 100644
index c40a021896943cff7df9c925a1faec7574539056..0000000000000000000000000000000000000000
--- a/src/de/bricked/game/powerups/ball/IncreaseBallSizePowerUp.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package de.bricked.game.powerups.ball;
-
-
-import de.bricked.game.balls.Ball;
-import de.bricked.game.powerups.PowerUp;
-
-public class IncreaseBallSizePowerUp extends PowerUp
-{
-    private Ball ball;
-
-    public IncreaseBallSizePowerUp(int id, int duration, Ball ball)
-    {
-        super(id, duration);
-        this.ball = ball;
-    }
-
-    @Override
-    public void activate()
-    {
-
-    }
-}
diff --git a/src/de/bricked/game/powerups/ball/NoCollisionBallPowerUp.java b/src/de/bricked/game/powerups/ball/NoCollisionBallPowerUp.java
new file mode 100644
index 0000000000000000000000000000000000000000..099006d8e6703b87ea37b7dd7b45092d1700e4a4
--- /dev/null
+++ b/src/de/bricked/game/powerups/ball/NoCollisionBallPowerUp.java
@@ -0,0 +1,27 @@
+package de.bricked.game.powerups.ball;
+
+import de.bricked.game.Game;
+import de.bricked.game.balls.Ball;
+import de.bricked.game.balls.BallType;
+import de.bricked.game.powerups.PowerUp;
+import de.bricked.game.powerups.PowerUpType;
+import de.bricked.ui.LevelController;
+
+public class NoCollisionBallPowerUp extends PowerUp
+{
+    public NoCollisionBallPowerUp()
+    {
+        super(PowerUpType.valueOf("NO_COLLISION_BALL").getId(), -1);
+    }
+
+    @Override
+    public void activate(LevelController levelController, Game game)
+    {
+    	levelController.changeBall(new Ball(BallType.NO_COLLISION));
+    }
+
+	@Override
+	public void deactivate(LevelController levelController, Game game)
+	{		
+	}
+}
\ No newline at end of file
diff --git a/src/de/bricked/game/powerups/paddle/DecreasePaddleSizePowerUp.java b/src/de/bricked/game/powerups/paddle/DecreasePaddleSizePowerUp.java
index a62639024677ed32ddb2ebdabdc7295306bbdc2f..214145d5e25fc4f0f878af4d2b525b24021d503e 100644
--- a/src/de/bricked/game/powerups/paddle/DecreasePaddleSizePowerUp.java
+++ b/src/de/bricked/game/powerups/paddle/DecreasePaddleSizePowerUp.java
@@ -1,8 +1,10 @@
 package de.bricked.game.powerups.paddle;
 
+import de.bricked.game.Game;
 import de.bricked.game.paddle.Paddle;
 import de.bricked.game.paddle.PaddleSize;
 import de.bricked.game.powerups.PowerUp;
+import de.bricked.ui.LevelController;
 
 
 public class DecreasePaddleSizePowerUp extends PowerUp
@@ -16,8 +18,13 @@ public class DecreasePaddleSizePowerUp extends PowerUp
     }
 
     @Override
-    public void activate()
+    public void activate(LevelController levelController, Game game)
     {
         paddle.setPaddleSize(PaddleSize.getNextSmaller(paddle.getPaddleSize()));
     }
+
+	@Override
+	public void deactivate(LevelController levelController, Game game)
+	{				
+	}
 }
diff --git a/src/de/bricked/game/powerups/paddle/IncreasePaddleSizePowerUp.java b/src/de/bricked/game/powerups/paddle/IncreasePaddleSizePowerUp.java
index 75f3c6aaf3b72673928b21820d06d664fbcb775b..00a6cb3e0b400402c6a1fc35bb6c2711333d910d 100644
--- a/src/de/bricked/game/powerups/paddle/IncreasePaddleSizePowerUp.java
+++ b/src/de/bricked/game/powerups/paddle/IncreasePaddleSizePowerUp.java
@@ -1,8 +1,10 @@
 package de.bricked.game.powerups.paddle;
 
+import de.bricked.game.Game;
 import de.bricked.game.paddle.Paddle;
 import de.bricked.game.paddle.PaddleSize;
 import de.bricked.game.powerups.PowerUp;
+import de.bricked.ui.LevelController;
 
 
 public class IncreasePaddleSizePowerUp extends PowerUp
@@ -16,8 +18,13 @@ public class IncreasePaddleSizePowerUp extends PowerUp
     }
 
     @Override
-    public void activate()
+    public void activate(LevelController levelController, Game game)
     {
         paddle.setPaddleSize(PaddleSize.getNextBigger(paddle.getPaddleSize()));
     }
+
+	@Override
+	public void deactivate(LevelController levelController, Game game)
+	{				
+	}
 }
diff --git a/src/de/bricked/resources/textures/powerups/1.png b/src/de/bricked/resources/textures/powerups/1.png
index ce483cc81df758cb80c62f179fd3cde36751b30b..0a38b3fbb1f7995a25035bf0471ad52569c4f2ab 100644
Binary files a/src/de/bricked/resources/textures/powerups/1.png and b/src/de/bricked/resources/textures/powerups/1.png differ
diff --git a/src/de/bricked/resources/textures/powerups/4.png b/src/de/bricked/resources/textures/powerups/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c3792036b05fe71d2139e4e98d25b1fe743176b
Binary files /dev/null and b/src/de/bricked/resources/textures/powerups/4.png differ
diff --git a/src/de/bricked/resources/textures/powerups/5.png b/src/de/bricked/resources/textures/powerups/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..778eccf091e8ac2f071b043ba1ca9e549c5bb1fa
Binary files /dev/null and b/src/de/bricked/resources/textures/powerups/5.png differ
diff --git a/src/de/bricked/ui/LevelController.java b/src/de/bricked/ui/LevelController.java
index 9125b36abfe53d62d980c3a1ce1150c59298a236..6aa4b4890c3c2046a9837086883f3b181fdc4ae6 100644
--- a/src/de/bricked/ui/LevelController.java
+++ b/src/de/bricked/ui/LevelController.java
@@ -17,6 +17,7 @@ import de.bricked.game.bricks.Brick;
 import de.bricked.game.bricks.BrickType;
 import de.bricked.game.paddle.Paddle;
 import de.bricked.game.powerups.PowerUp;
+import de.bricked.utils.CountdownTimer;
 import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.animation.AnimationTimer;
@@ -94,28 +95,31 @@ public class LevelController
 	private double oldMousePosition;
 	private static ArrayList<Label> brickLabels;
 	private ArrayList<Label> movingPowerUps;
+	private ArrayList<Label> timedPowerUps;
 
-    private void startGame()
-    {   	
-        anchorPaneGame.heightProperty().removeListener(heightListener);
-        anchorPaneGame.widthProperty().removeListener(widthListener);
+	private void startGame()
+	{
+		resetPowerUps();
+
+		anchorPaneGame.heightProperty().removeListener(heightListener);
+		anchorPaneGame.widthProperty().removeListener(widthListener);
 
-        // start random into left or right direction
-        int random = new Random().nextInt(2);
-        if(random == 0)
-        {
-            game.getBall().startBallToRight();
-        }
-        else
-        {
-            game.getBall().startBallToLeft();
-        }
+		// start random into left or right direction
+		int random = new Random().nextInt(2);
+		if(random == 0)
+		{
+			game.getBall().startBallToRight();
+		}
+		else
+		{
+			game.getBall().startBallToLeft();
+		}
 
-        timer.start();
-        Logger.log(LogLevel.INFO, "ball start");
+		timer.start();
+		Logger.log(LogLevel.INFO, "ball start");
 
-        gameState = GameState.RUNNING;
-    }
+		gameState = GameState.RUNNING;
+	}
 
 	public void init(Stage stage, LevelSelectController levelSelectController, Game game)
 	{
@@ -123,18 +127,18 @@ public class LevelController
 		this.levelSelectController = levelSelectController;
 		this.game = game;
 		game.setBoard(new Board(game));
-		game.setLevelController(this);	
-
-        anchorPane.setOnMouseClicked(new EventHandler<MouseEvent>()
-        {
-            @Override
-            public void handle(MouseEvent event)
-            {
-                startGame();
-                event.consume();
-                anchorPaneGame.requestFocus();
-            }
-        });
+		game.setLevelController(this);
+
+		anchorPane.setOnMouseClicked(new EventHandler<MouseEvent>()
+		{
+			@Override
+			public void handle(MouseEvent event)
+			{
+				startGame();
+				event.consume();
+				anchorPaneGame.requestFocus();
+			}
+		});
 
 		anchorPane.setOnKeyReleased(new EventHandler<KeyEvent>()
 		{
@@ -249,6 +253,9 @@ public class LevelController
 		buttonBack.setGraphic(iconBack);
 
 		vboxPowerUps.setStyle("-fx-border-color: #333333; -fx-border-width: 2px;");
+		vboxPowerUps.setPadding(new Insets(3));
+		vboxPowerUps.setAlignment(Pos.TOP_CENTER);
+		vboxPowerUps.setSpacing(7);
 		vboxLives.setStyle("-fx-border-color: #333333; -fx-border-width: 2px;");
 		vboxLives.setPadding(new Insets(3));
 		vboxLives.setAlignment(Pos.BOTTOM_CENTER);
@@ -290,7 +297,8 @@ public class LevelController
 			@Override
 			public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue)
 			{
-				initBall();
+				initBall(BallType.NORMAL);
+				initTimer();
 				gamePaneHeight = newValue.doubleValue();
 			}
 		};
@@ -313,7 +321,8 @@ public class LevelController
 		labelFPS.setStyle("-fx-text-fill: #FF0000");
 
 		resetMultiplicator();
-		movingPowerUps = new ArrayList<>();
+
+		resetPowerUps();
 
 		gameState = GameState.WAITING;
 	}
@@ -372,7 +381,7 @@ public class LevelController
 				if(hitLocation != null)
 				{
 					resetMultiplicator();
-					
+
 					if(hitLocation.equals(HitLocation.LIFE_LOST))
 					{
 						game.setLivesRemaining(game.getLivesRemaining() - 1);
@@ -382,6 +391,7 @@ public class LevelController
 						{
 							// game over
 
+							resetPowerUps();
 							gameState = GameState.STOPPED;
 							timer.stop();
 
@@ -403,7 +413,8 @@ public class LevelController
 
 							// reset paddle and ball
 							initPaddle();
-							initBall();						
+							initBall(BallType.NORMAL);
+							initTimer();
 						}
 					}
 					else
@@ -451,13 +462,13 @@ public class LevelController
 				// ball doesn't collide with border --> check collision with paddle
 				else
 				{
-					hitLocation = game.collides(ballPosition, paddlePosition, paddle.getWidth(), paddle.getHeight(), true);					
+					hitLocation = game.collides(ballPosition, paddlePosition, paddle.getWidth(), paddle.getHeight(), true);
 					if(hitLocation != null && (hitLocation.equals(HitLocation.PADDLE) || hitLocation.equals(HitLocation.CORNER)))
-					{						
+					{
 						game.getBall().setDirection(game.reflectOnPaddle(game.getBall().getDirection(), game.getDistanceToPaddleCenter(ballPosition, paddlePosition, paddle.getWidth())));
 
 						correctBallPosition(hitLocation, ballPosition, paddlePosition, paddle.getWidth(), paddle.getHeight());
-						
+
 						resetMultiplicator();
 					}
 					// ball doesn't collide with paddle --> check collision with bricks
@@ -485,12 +496,12 @@ public class LevelController
 						}
 					}
 				}
-				
-				//move powerups
+
+				// move powerups
 				movePowerUps();
-				//check timed powerups
+				// check timed powerups
 				checkPowerUps();
-			}	
+			}
 		};
 	}
 
@@ -564,8 +575,8 @@ public class LevelController
 				{
 					labelBrick.setStyle("-fx-background-image: url(\"de/bricked/resources/textures/bricks/" + brick.getCurrentTextureID() + ".png\");" + "-fx-background-position: center center;" + "-fx-background-repeat: no-repeat;" + "-fx-background-size: cover");
 				}
-			});			
-			ft.play();	
+			});
+			ft.play();
 		}
 		else
 		{
@@ -575,14 +586,14 @@ public class LevelController
 
 	private void refreshLiveCounter()
 	{
-		vboxLives.getChildren().clear();	
+		vboxLives.getChildren().clear();
 
 		for(int i = 0; i < game.getLivesRemaining() - 1; i++)
 		{
 			ImageView iv = new ImageView(new Image("de/bricked/resources/textures/paddle/paddle-extra-small.png"));
 			iv.setFitWidth(30);
 			iv.setFitHeight(120 / MAX_LIVES);
-			vboxLives.getChildren().add(iv);	
+			vboxLives.getChildren().add(iv);
 		}
 	}
 
@@ -599,11 +610,11 @@ public class LevelController
 		AnchorPane.setBottomAnchor(labelPaddle, paddle.getHeight());
 	}
 
-	private void initBall()
+	private void initBall(BallType ballType)
 	{
 		anchorPaneGame.getChildren().remove(stackPaneBall);
 
-		game.setBall(new Ball(BallType.NORMAL));
+		game.setBall(new Ball(ballType));
 
 		// create circle for ball
 		final Circle circle = new Circle(game.getBall().getBallRadius(), Color.web(game.getBall().getType().getColor()));
@@ -613,8 +624,6 @@ public class LevelController
 		stackPaneBall.setTranslateX(gamePaneWidth / 2 - game.getBall().getBallRadius());
 		stackPaneBall.setTranslateY(anchorPaneGame.getHeight() - paddle.getHeight() * 2 - game.getBall().getBallRadius() * 2);
 		anchorPaneGame.getChildren().add(stackPaneBall);
-
-		initTimer();
 	}
 
 	private void resetMultiplicator()
@@ -627,9 +636,9 @@ public class LevelController
 	}
 
 	public void increaseMultiplicator(int points)
-	{		
-		game.increaseMultiplicator();		
-		game.increasePointsSinceLastMultiplicatorReset(points);	
+	{
+		game.increaseMultiplicator();
+		game.increasePointsSinceLastMultiplicatorReset(points);
 		labelMultiplicator.setText("x" + game.getMultiplicator());
 	}
 
@@ -674,20 +683,21 @@ public class LevelController
 					game.getBall().setDirection(game.reflectBall(hitLocation, game.getBall().getDirection()));
 
 					correctBallPosition(hitLocation, ballPosition, brickPosition, stackPaneBrick.getWidth(), stackPaneBrick.getHeight());
-				}				
-				
+				}
+
 				int points = game.getBoard().hitBrick(i, k, game.getBall());
-				//brick has been destroyed
+				// brick has been destroyed
 				if(points > 0)
-				{					
+				{
 					game.setTotalPoints(game.getTotalPoints() + points);
 					labelPoints.setText(String.valueOf(game.getTotalPoints()));
 					labelBlocksRemaining.setText(game.getBoard().getNumberOfRemainingBricks() + " Bricks remaining");
-				}				
+				}
 
 				if(game.getBoard().getNumberOfRemainingBricks() == 0)
 				{
 					// level done
+					resetPowerUps();
 					gameState = GameState.STOPPED;
 					resetMultiplicator();
 					timer.stop();
@@ -706,12 +716,12 @@ public class LevelController
 			}
 		}
 	}
-	
+
 	public void showAnimatedPoints(int row, int col, int points)
 	{
 		double xPosition = (gamePaneWidth / Board.WIDTH) * (col);
 		double yPosition = (gamePaneHeight / Board.HEIGHT) * (row);
-		
+
 		Label labelNotification = new Label("+" + points);
 		labelNotification.setTranslateX(xPosition);
 		labelNotification.setTranslateY(yPosition);
@@ -730,25 +740,25 @@ public class LevelController
 		translateTransition.setFromY(yPosition);
 		translateTransition.setToY(yPosition - (gamePaneHeight / Board.HEIGHT));
 		translateTransition.setCycleCount(1);
-		translateTransition.setAutoReverse(false);		
+		translateTransition.setAutoReverse(false);
 
 		ParallelTransition parallelTransition = new ParallelTransition();
 		parallelTransition.getChildren().addAll(fadeTransition, translateTransition);
-		parallelTransition.setCycleCount(1);		
+		parallelTransition.setCycleCount(1);
 		parallelTransition.setOnFinished(new EventHandler<ActionEvent>()
 		{
 			@Override
 			public void handle(ActionEvent event)
 			{
-				anchorPaneGame.getChildren().remove(labelNotification);				
+				anchorPaneGame.getChildren().remove(labelNotification);
 			}
 		});
 
 		parallelTransition.play();
 	}
-	
+
 	public void addMovingPowerUp(int row, int col, PowerUp powerUp)
-	{		
+	{
 		Label labelPowerUp = new Label();
 		labelPowerUp.setStyle("-fx-background-image: url(\"de/bricked/resources/textures/powerups/" + powerUp.getID() + ".png\");" + "-fx-background-position: center center;" + "-fx-background-repeat: no-repeat;" + "-fx-background-size: cover");
 		labelPowerUp.setAlignment(Pos.CENTER);
@@ -756,54 +766,100 @@ public class LevelController
 
 		labelPowerUp.setPrefWidth(gamePaneWidth / Board.WIDTH);
 		labelPowerUp.setPrefHeight(gamePaneHeight / Board.HEIGHT);
-		
+
 		anchorPaneGame.getChildren().add(labelPowerUp);
-		labelPowerUp.setTranslateX(col * (gamePaneWidth/Board.WIDTH));
-		labelPowerUp.setTranslateY(row * (gamePaneHeight/Board.HEIGHT));
-		
+		labelPowerUp.setTranslateX(col * (gamePaneWidth / Board.WIDTH));
+		labelPowerUp.setTranslateY(row * (gamePaneHeight / Board.HEIGHT));
+
 		movingPowerUps.add(labelPowerUp);
 	}
-	
+
 	private void movePowerUps()
-	{	
+	{
 		for(Iterator<Label> iterator = movingPowerUps.iterator(); iterator.hasNext();)
 		{
 			Label currentLabel = iterator.next();
-			PowerUp currentPowerUp = (PowerUp)currentLabel.getUserData();			
-			currentLabel.setTranslateY(currentLabel.getTranslateY() + currentPowerUp.getSpeed());		
-			
-			//check collision with paddle
+			PowerUp currentPowerUp = (PowerUp)currentLabel.getUserData();
+			currentLabel.setTranslateY(currentLabel.getTranslateY() + currentPowerUp.getSpeed());
+
+			// check collision with paddle
 			Point2D labelPosition = new Point2D(currentLabel.getTranslateX(), currentLabel.getTranslateY());
 			Point2D paddlePosition = new Point2D(labelPaddle.getLayoutX() + labelPaddle.getTranslateX(), labelPaddle.getLayoutY() + labelPaddle.getTranslateY());
-			
-			HitLocation hitLocation = game.collides(labelPosition, paddlePosition, paddle.getWidth(), paddle.getHeight(), true);					
+
+			HitLocation hitLocation = game.collides(labelPosition, paddlePosition, paddle.getWidth(), paddle.getHeight(), true);
 			if(hitLocation != null && (hitLocation.equals(HitLocation.PADDLE) || hitLocation.equals(HitLocation.CORNER)))
-			{		
-				//TODO activate method
-				//TODO check if timed
+			{
+				// TODO activate method			
 				Logger.log(LogLevel.DEBUG, "Collected PowerUp with ID = " + currentPowerUp.getID());
-				currentPowerUp.activate();
+				if(!currentPowerUp.isPermanent())
+				{
+					addTimedPowerUp(currentPowerUp);
+				}
+				currentPowerUp.activate(this, game);
 				anchorPaneGame.getChildren().remove(currentLabel);
-				iterator.remove();		
+				iterator.remove();
 				continue;
-			}			
-			
+			}
+
 			if(currentLabel.getTranslateY() + currentLabel.getHeight() >= gamePaneHeight)
 			{
-				//power up reached bottom wall
+				// power up reached bottom wall
 				anchorPaneGame.getChildren().remove(currentLabel);
-				iterator.remove();				
+				iterator.remove();
 			}
 		}
 	}
-	
+
+	// TODO if there is already one item of this type?
+	private void addTimedPowerUp(PowerUp powerUp)
+	{
+		Label labelPowerUp = new Label(String.valueOf(powerUp.getDurationInSeconds()));
+		labelPowerUp.setStyle("-fx-background-image: url(\"de/bricked/resources/textures/powerups/" + powerUp.getID() + ".png\");" + "-fx-background-position: center center;" + "-fx-background-repeat: no-repeat;" + "-fx-background-size: contain;" + "-fx-font-size: 16;" + "-fx-font-weight: bold;"
+				+ "-fx-tect-fill: #cc0000;");
+		labelPowerUp.setAlignment(Pos.CENTER);
+		labelPowerUp.setUserData(powerUp);
+
+		labelPowerUp.setPrefWidth(35);
+		labelPowerUp.setPrefHeight(20);
+
+		vboxPowerUps.getChildren().add(labelPowerUp);
+
+		timedPowerUps.add(labelPowerUp);
+
+		new CountdownTimer(powerUp.getDurationInSeconds(), labelPowerUp);
+	}
+
 	private void checkPowerUps()
 	{
-		//TODO check timed powerups
-//		for(Iterator<PowerUp> iterator = game.getActivatedPowerUps().iterator(); iterator.hasNext();)
-//		{
-//			)
-//		}
+		for(Iterator<Label> iterator = timedPowerUps.iterator(); iterator.hasNext();)
+		{
+			Label currentLabel = iterator.next();
+			if(currentLabel.getText().equals("0"))
+			{
+				vboxPowerUps.getChildren().remove(currentLabel);
+				iterator.remove();
+			}
+		}
+	}
+
+	private void resetPowerUps()
+	{
+		movingPowerUps = new ArrayList<>();
+		timedPowerUps = new ArrayList<>();
+		vboxPowerUps.getChildren().clear();
+	}
+	
+	public void changeBall(Ball newBall)
+	{
+		double translateX = stackPaneBall.getTranslateX();
+		double translateY = stackPaneBall.getTranslateY();
+		Point2D direction = game.getBall().getDirection();
+		game.setBall(newBall);
+		
+		initBall(game.getBall().getType());
+		stackPaneBall.setTranslateX(translateX);
+		stackPaneBall.setTranslateY(translateY);		
+		game.getBall().setDirection(game.getNewSpeedDirection(direction, newBall.getType().getSpeedFactor()));
 	}
 
 	public void showLabelFPS(boolean value)
@@ -825,7 +881,7 @@ public class LevelController
 	}
 
 	public void back()
-	{		
+	{
 		if(timer != null)
 		{
 			timer.stop();
@@ -836,7 +892,7 @@ public class LevelController
 		game.resetMultiplicator();
 		game.resetPointsSinceLastMultiplicatorReset();
 		game.setBoard(null);
-		game.setLevelController(null);	
+		game.setLevelController(null);
 		game.setMovingPowerUps(new ArrayList<>());
 		game.setActivatedPowerUps(new ArrayList<>());
 
diff --git a/src/de/bricked/utils/CountdownTimer.java b/src/de/bricked/utils/CountdownTimer.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6e30c9773cb33cf2ca2fc479e088dd4245c10ba
--- /dev/null
+++ b/src/de/bricked/utils/CountdownTimer.java
@@ -0,0 +1,42 @@
+package de.bricked.utils;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import javafx.application.Platform;
+import javafx.scene.control.Label;
+
+public class CountdownTimer
+{
+	private int count;
+
+	public CountdownTimer(int seconds, Label label)
+	{
+		this.count = seconds;
+		
+		Timer timer = new Timer();
+		TimerTask task = new TimerTask()
+		{
+			@Override
+			public void run()
+			{
+				Platform.runLater(()->{
+					try
+					{
+						label.setText(String.valueOf(count));
+					}
+					catch(Exception e)
+					{
+						
+					}
+				});			
+				if(count > 0)
+					count--;
+
+				if(count == 0)
+					timer.cancel();
+			}
+		};
+		timer.schedule(task, 0, 1000);
+	}
+}
\ No newline at end of file
diff --git a/src/de/bricked/utils/FileUtils.java b/src/de/bricked/utils/FileUtils.java
index 6570764251f3203747b3e5b8f7d5154d82c2eff4..3727a554b4a97eda94f8800e5d9cb4c0b2937e73 100644
--- a/src/de/bricked/utils/FileUtils.java
+++ b/src/de/bricked/utils/FileUtils.java
@@ -1,17 +1,15 @@
 package de.bricked.utils;
 
 
-import de.bricked.game.levels.LevelPackHandler;
-import logger.LogLevel;
-import logger.Logger;
-import tools.PathUtils;
-
 import java.io.BufferedInputStream;
 import java.io.BufferedReader;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.net.URL;
 
+import logger.LogLevel;
+import logger.Logger;
+
 public class FileUtils
 {
     private static String getContentsFromInputStream(InputStream inputStream) throws Exception