diff --git a/src/states/ExtraLifePowerUp.java b/src/states/ExtraLifePowerUp.java
index 539a46e2e0f25969e287cff010ec15de6eb540cb..8493c735aed93ba8395911fc509bdca87d2bff66 100644
--- a/src/states/ExtraLifePowerUp.java
+++ b/src/states/ExtraLifePowerUp.java
@@ -11,6 +11,7 @@ public class ExtraLifePowerUp extends PowerUp {
 	public void use(Player player, PlayState playState) {
 		player.resetLives();
 		
+		
 	}
 
 
diff --git a/src/states/FlyingEnemy.java b/src/states/FlyingEnemy.java
index 23eeb73a8851a534a87d0461e3b4eb2b66ff4105..fff9752d4708eabdc306d2d43f4b31cb5e97e83c 100644
--- a/src/states/FlyingEnemy.java
+++ b/src/states/FlyingEnemy.java
@@ -15,7 +15,6 @@ public class FlyingEnemy extends Object{
 	private double bombDropX;
 	private boolean bombDropped = false;
 
-
 	public FlyingEnemy(String enemyImg, double x, double y, double h, double w) {
 		super(enemyImg, x, y, h, w);	
 
@@ -39,6 +38,7 @@ public class FlyingEnemy extends Object{
 		if (!bombDropped && this.getX() >= bombDropX - 50 && this.getX() <= bombDropX + 50) {
 			Bomb bomb = new Bomb(Constants.bombImg, bombDropX, 50, Constants.bombHeight, Constants.bombWidth);  // Drop the bomb at bombDropX
 			System.out.println("Bomb dropped at: " + bombDropX);
+
 			bombDropped = true;  // Mark that the bomb has been dropped
 
 			// Optionally, reset bombDropX to a new random location after dropping the bomb
diff --git a/src/states/PlayState.java b/src/states/PlayState.java
index a8c487989c0235df057ee29af8500890902c24e0..7d171db2502192399ecf30ee545fa835ad92eeff 100644
--- a/src/states/PlayState.java
+++ b/src/states/PlayState.java
@@ -13,6 +13,7 @@ import javafx.scene.text.Text;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
 import constants.Constants;
 
@@ -54,13 +55,15 @@ public class PlayState extends GameState {
 	private ExtraLifePowerUp extraLife;
 	private FlyingEnemy flyingEnemy;
 	//	private double tempy;
-	private Random engen;
+	private Random engen = new Random(); 
 	private int movingSpeed = 10;
 	private Bomb bomb;
 	private boolean isFlyingEnemyActive = false;
 	private String currScore;
 	private double collisionX = -1.00;
 	private SpeedPowerUp speedUp;
+	private boolean isPowerUpActive;
+	private int num;
 
 
 
@@ -76,8 +79,6 @@ public class PlayState extends GameState {
 		gameOverText = "GAMEOVER\n" + informationText;
 		fontColor = Color.BLACK;
 		scoreText = "Highscore: " + Integer.toString(score.getHighScore());
-		//		+ Integer.toString(score.getHighScore());
-
 
 		if (mode) {
 			mode1();
@@ -85,19 +86,14 @@ public class PlayState extends GameState {
 			mode2();
 		}
 
-
-		//		menu = new MenuState(model);
-
 	}
 
 	public void mode1() {
 		player = new Player(Constants.playerImg);
 		enemy = new Enemy(Constants.enemyImg, -100.00, 270.00, Constants.enemyHeight, Constants.enemyWidth);
-		extraLife = new ExtraLifePowerUp(Constants.lifeImg, 800.00, 170, Constants.powerHeight, Constants.powerWidth);
-		speedUp = new SpeedPowerUp(Constants.powerImg, 800.00, 265.00, Constants.powerHeight, Constants.powerWidth);
+		extraLife = new ExtraLifePowerUp(Constants.lifeImg, 900.00, 170, Constants.powerHeight, Constants.powerWidth);
+		speedUp = new SpeedPowerUp(Constants.powerImg, 900.00, 265.00, Constants.powerHeight, Constants.powerWidth);
 		flyingEnemy = new FlyingEnemy(Constants.flyingEnemyImg, -200.00, 20.00, Constants.enemyHeight, Constants.enemyWidth);
-		//		flyingEnemy.setAntagonistX(800.00);
-		//		tempy = flyingEnemy.getY();
 		bgColor = Color.ROYALBLUE;
 		lineColor = Color.WHITE;
 
@@ -106,10 +102,9 @@ public class PlayState extends GameState {
 	public void mode2() {
 		player = new Player(Constants.playerImg2);
 		enemy = new Enemy(Constants.enemyImg, -100.00, 270.00, Constants.enemyHeight, Constants.enemyWidth);
-		extraLife = new ExtraLifePowerUp(Constants.lifeImg, 800.00, 270, Constants.powerHeight, Constants.powerWidth);
+		extraLife = new ExtraLifePowerUp(Constants.lifeImg, -100.00, 270, Constants.powerHeight, Constants.powerWidth);
+		speedUp = new SpeedPowerUp(Constants.powerImg, -100.00, 265.00, Constants.powerHeight, Constants.powerWidth);
 		flyingEnemy = new FlyingEnemy(Constants.flyingEnemyImg, -200.00, 20.00, Constants.enemyHeight, Constants.enemyWidth);
-		//		flyingEnemy.setAntagonistX(800.00);
-		//		tempy = flyingEnemy.getY();
 		bgColor = Color.BEIGE;
 		lineColor = Color.BLACK;
 
@@ -121,9 +116,20 @@ public class PlayState extends GameState {
 	 */
 	@Override
 	public void draw(GraphicsContext g) {
+		drawBackground(g);
+		drawGameStats(g);
+		drawPlayer(g);
+		drawEnemies(g);
+		drawPowerUps(g);
+	}
+
+	private void drawPlayer(GraphicsContext g) {
+		g.drawImage(player.getImage(), player.getPlayerX(), player.getPlayerY(), Constants.playerWidth, Constants.playerHeight);		
+	}
+
+	private void drawGameStats(GraphicsContext g) {
 		currScore = "Currently: " + Integer.toString(player.getPasses());
 
-		drawBg(g, bgColor);
 
 		g.setFill(fontColor);
 		g.setFont(new Font(30)); // Big letters
@@ -139,99 +145,125 @@ public class PlayState extends GameState {
 			score.saveScore(player.getPasses());
 		}
 
+	}
 
-
+	private void drawBackground(GraphicsContext g) {
+		drawBg(g, bgColor);
 		g.setStroke(lineColor);
 		g.setLineWidth(1);
 		g.setLineDashes(2);
 		g.strokeLine(Constants.screenWidth, 350, 0, 350);
 
+	}
 
-		g.drawImage(player.getImage(), player.getPlayerX(), player.getPlayerY(), Constants.playerWidth, Constants.playerHeight);
-
-
+	private void drawPowerUps(GraphicsContext g) {
 
+		if (isPowerUpActive) {
 
+			if (num == 0) {
 
-		drawEnemy(g);
+				if(speedUp.getX() < 0 - Constants.playerWidth) {
+					speedUp.setX(Constants.screenWidth);
+					isPowerUpActive = false;
+				}
 
-		drawPowerUps(g);
+				g.drawImage(speedUp.getImage(), speedUp.getX(), speedUp.getY(), Constants.powerWidth, Constants.powerHeight);
 
+			} else if (num == 1){
 
+				if(extraLife.getX() < 0 - Constants.playerWidth) {
+					extraLife.setX(Constants.screenWidth);
+					isPowerUpActive = false;
+				}
+				g.drawImage(extraLife.getImage(), extraLife.getX(), extraLife.getY(), Constants.powerWidth, Constants.powerHeight);
 
+			}
+		}
 
 	}
 
-	private void drawPowerUps(GraphicsContext g) {
-		g.drawImage(speedUp.getImage(), speedUp.getX(), speedUp.getY(), Constants.powerWidth, Constants.powerHeight);
-		g.drawImage(extraLife.getImage(), extraLife.getX(), extraLife.getY(), Constants.powerWidth, Constants.powerHeight);
+	public void drawEnemies(GraphicsContext g) {
 
+		if (!isFlyingEnemyActive) {	
+			drawGroundEnemy(g);
+		} else {
+			drawFlyingEnemy(g);	
+		}
+
+		// Render the bomb if it exists
+		if (bomb != null) {
+			g.drawImage(bomb.getImage(), bomb.getX(), bomb.getY(), Constants.bombWidth, Constants.bombHeight);
+		}
 	}
 
-	public void drawEnemy(GraphicsContext g) {
-		engen = new Random(); 
 
 
 
+	private void drawFlyingEnemy(GraphicsContext g) {
+		g.drawImage(flyingEnemy.getImage(), flyingEnemy.getX(), flyingEnemy.getY(), Constants.enemyWidth, Constants.enemyHeight);
 
-		if (!isFlyingEnemyActive) {
+		if (flyingEnemy.getX() < 0 - Constants.enemyWidth) {
+			isFlyingEnemyActive = false;
+			player.updatePasses(1);
 
-			g.drawImage(enemy.getImage(), enemy.getX(), enemy.getY(), Constants.enemyWidth, Constants.enemyHeight);
 
-			if (enemy.getX() < 0 - Constants.enemyWidth) {
-				enemy.setX(Constants.screenWidth);
-				collided = false;
-				collisionX = -1.00;
-				player.updatePasses(1);
+			// Reset bomb drop flag to allow the next bomb drop
+			flyingEnemy.resetBombDrop();
 
-				if (engen.nextInt(2) == 1 && player.getPasses() > 2) {  // 50% chance after player hase passed 
-					isFlyingEnemyActive = true;
-					flyingEnemy.setX(Constants.screenWidth);  // Reset position
-				}
-			}
+			speedCheck();
 
-		} else {
 
-			g.drawImage(flyingEnemy.getImage(), flyingEnemy.getX(), flyingEnemy.getY(), Constants.enemyWidth, Constants.enemyHeight);
+		}		
+	}
 
-			if (flyingEnemy.getX() < 0 - Constants.enemyWidth) {
-				isFlyingEnemyActive = false;
-				player.updatePasses(1);
+	private void drawGroundEnemy(GraphicsContext g) {
 
 
-				// Reset bomb drop flag to allow the next bomb drop
-				flyingEnemy.resetBombDrop();
+		g.drawImage(enemy.getImage(), enemy.getX(), enemy.getY(), Constants.enemyWidth, Constants.enemyHeight);
 
-				//				if (player.getPasses() % 5 == 0) {
-				//					movingSpeed += 2;
-				//				}
-			}
-		}
-
-		// Render the bomb if it exists
-		if (bomb != null) {
-			g.drawImage(bomb.getImage(), bomb.getX(), bomb.getY(), Constants.bombWidth, Constants.bombHeight);
-		}
-	}
+		if (enemy.getX() < 0 - Constants.enemyWidth) {
+			enemy.setX(Constants.screenWidth);
+			collided = false;
+			collisionX = -1.00;
+			player.updatePasses(1);
 
+			speedCheck();
 
 
+			if (getRandom() == 1 && player.getPasses() > 2) {  // 50% chance after player hase passed 
+				isFlyingEnemyActive = true;
+				flyingEnemy.setX(Constants.screenWidth);  // Reset position
+			}
+		}		
+	}
 
 	//TODO om score är större än visst antal --> lotta mellan flying och vanlig, vi kan göra en random med 2 int, ochberoende på vad den blir kan vi rita en
 	//TODO göra en variabel för y positionen som hämtas om vi ritar flygande, för att den ska behålla samma position på hela y axeln
 
+	public void speedCheck() {
+		if (player.getPasses() % 5 == 0) {
+			movingSpeed += 1;
+			System.out.println("speed set to: " + Integer.toString(movingSpeed));
+		} else if (player.getPasses() % 2 == 0) {
+
+			isPowerUpActive = true;			
+			//			num = 0;
+			num = getRandom();
+		}
+	}
+
 	public int getSpeed() {
 		return movingSpeed;
 	}
 
-
 	public void setSpeed(int s) {
 		movingSpeed = s;
 	}
 
 
-
-
+	public int getRandom() {
+		return ThreadLocalRandom.current().nextInt(2);
+	}
 
 
 
@@ -267,38 +299,75 @@ public class PlayState extends GameState {
 
 		default:
 			break;
-
 		}
+	}
 
 
+	@Override
+	public void update() {
 
+		if (!gameOver) {
+			moveEnemies();
+			movePowerUps();
+			checkGroundCollision();
+			checkBombCollision();
+			movePlayer();
+		}
 	}
 
-	@Override
-	public void update() {
 
-		speedUp.setX(speedUp.getX() - movingSpeed);
-//		speedUp.handle(player, this);
+	private void movePowerUps() {
+		if (isPowerUpActive) {
 
-				extraLife.setX(extraLife.getX() - movingSpeed);
-//				extraLife.checkCollision(player, this);
+			if (num == 0) {
 
-		if (isFlyingEnemyActive) {
+				speedUp.setX(speedUp.getX() - movingSpeed);
+				speedUp.handle(player, this);
 
-			flyingEnemy.setX(flyingEnemy.getX() -movingSpeed);
+			} else if (num == 1) {
 
-			Bomb droppedBomb = flyingEnemy.dropBomb();
+				extraLife.setX(extraLife.getX() - movingSpeed);
+				extraLife.checkCollision(player, this);
 
-			if (droppedBomb != null) {
-				bomb = droppedBomb;
 			}
-		} else {
-			enemy.setX(enemy.getX() - movingSpeed);
+		}
+
+	}
 
 
+	private void movePlayer() {
+		if (up) {
 
+			player.jump(movingSpeed);
 		}
 
+		if (player.getPlayerY() == 265) {
+			up = false;
+		}		
+	}
+
+
+	private void checkGroundCollision() {
+		if (!collided && enemy.playerObjectCollision(player)) {
+
+			collided = true;
+
+			if (collisionX == -1.00) {
+				collisionX = enemy.getX();
+				System.out.println("Player-Enemy Collision X Coordinate: " + collisionX);
+			}
+
+			player.decreaseLives();
+
+		}
+
+		if (Integer.valueOf(player.getLives()) == 0) {
+			gameOver = true;
+		} 		
+	}
+
+
+	private void checkBombCollision() {
 		if (bomb != null) {
 			bomb.setY(bomb.getY() + movingSpeed);
 
@@ -312,51 +381,24 @@ public class PlayState extends GameState {
 				System.out.println("Bomb went off-screen and was destroyed");
 			}
 		}
+	}
 
 
-		//		Om 
-		if (!gameOver) {
-
-			if (!collided && enemy.playerObjectCollision(player)) {
-
-				collided = true;
+	private void moveEnemies() {
+		if (isFlyingEnemyActive) {
 
-				if (collisionX == -1.00) {
-					collisionX = enemy.getX();
-					System.out.println("Player-Enemy Collision X Coordinate: " + collisionX);
-				}
+			flyingEnemy.setX(flyingEnemy.getX() -movingSpeed);
 
-				player.decreaseLives();
+			Bomb droppedBomb = flyingEnemy.dropBomb();
 
+			if (droppedBomb != null) {
+				bomb = droppedBomb;
 			}
-
-			if (Integer.valueOf(player.getLives()) == 0) {
-				gameOver = true;
-			} 
-
-		}
-
-
-
-
-
-		if (up) {
-
-			player.jump(movingSpeed);
-		}
-
-		if (player.getPlayerY() == 265) {
-			up = false;
+		} else {
+			enemy.setX(enemy.getX() - movingSpeed);
 		}
-
-
-
 	}
 
-
-
-
-
 	// Here one would probably instead move the player and any
 	// enemies / moving obstacles currently active.
 
diff --git a/src/states/PowerUp.java b/src/states/PowerUp.java
index 04d4f7590621f65971eaef516363f8bf0bc734c8..bc9271a75c30b0b4f2256297473bc0a16f654d89 100644
--- a/src/states/PowerUp.java
+++ b/src/states/PowerUp.java
@@ -29,6 +29,7 @@ public abstract class PowerUp extends Object{
 		if (this.playerObjectCollision(player)) {
 			use(player, playState);
 			scoreSinceActive = player.getPasses();
+		
 		}	
 	}
 	
diff --git a/src/states/SpeedPowerUp.java b/src/states/SpeedPowerUp.java
index 7146300fb7148dc5f06eacd5dfc9a337660407df..64d6176f3c397863b67f342e833f930a7be58957 100644
--- a/src/states/SpeedPowerUp.java
+++ b/src/states/SpeedPowerUp.java
@@ -41,6 +41,7 @@ public class SpeedPowerUp extends PowerUp {
 			if ((player.getPasses() - start) >= 10) {
 				playState.setSpeed(speed);
 				player.lockLives(false);
+				player.setPlayerY(265);
 				active = false;
 
 			}