diff --git a/app/src/main/java/brickbreaker/App.java b/app/src/main/java/brickbreaker/App.java
index 4ab69aee324fe4900bbadee34b5b1c9debe34516..a18c0a57e7bb771609c246be6024cf3c8b168e21 100644
--- a/app/src/main/java/brickbreaker/App.java
+++ b/app/src/main/java/brickbreaker/App.java
@@ -7,13 +7,13 @@ import javax.swing.JFrame;
 
 public class App {
     public static void main(String[] args) {
-        		JFrame obj = new JFrame();
-		GamePanel gamePanel = new GamePanel();
-		obj.setBounds(10, 10, 700, 600);
-		obj.setTitle("Brick Breaker");
-		obj.setResizable(false);
-		obj.setVisible(true);
-		obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-		obj.add(gamePanel);
+        JFrame obj = new JFrame();
+        GamePanel gamePanel = new GamePanel();
+	obj.setBounds(10, 10, 700, 600);
+	obj.setTitle("Brick Breaker");
+	obj.setResizable(false);
+	obj.setVisible(true);
+	obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+	obj.add(gamePanel);
     }
 }
diff --git a/app/src/main/java/brickbreaker/Ball.java b/app/src/main/java/brickbreaker/Ball.java
new file mode 100644
index 0000000000000000000000000000000000000000..42c5006a9cd1d31edebf8d38b079063dd8ff25dc
--- /dev/null
+++ b/app/src/main/java/brickbreaker/Ball.java
@@ -0,0 +1,60 @@
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
+ */
+package brickbreaker;
+
+/**
+ *
+ * @author Suman
+ */
+public class Ball {
+    private Vector position;
+    private Vector direction;
+    private int radius;
+    
+    public Ball(int posX, int posY, int dirX, int dirY, int radius) {
+        this.position = new Vector(posX, posY);
+        this.direction = new Vector(dirX, dirY);
+        this.radius = radius;
+    }
+    
+    public void setPosition(int posX, int posY) {
+        this.position = new Vector(posX, posY);
+    }
+    
+    public void setDirection(int dirX, int dirY) {
+        this.direction = new Vector(dirX, dirY);
+    }
+    
+    public Vector getPosition() {
+        return this.position;
+    }
+    
+    public Vector getDirection() {
+        return this.direction;
+    }
+    
+    public void move(){
+        position.x += direction.x;
+        position.y += direction.y;
+    }
+    
+    public void checkForWallCollisions() {
+        if (position.x <= 0) { // Left wall collision
+        position.x = 0; // Set the ball at the left edge
+        direction.x = Math.abs(direction.x); // Reverse the x direction
+        }
+
+        if (position.x + radius >= 680) { // Right wall collision
+            position.x = 680 - radius; // Set the ball at the right edge
+            direction.x = -Math.abs(direction.x); // Reverse the x direction
+        }
+
+        if (position.y <= 0) { // Top wall collision
+            position.y = 0; // Set the ball at the top edge
+            direction.y = Math.abs(direction.y); // Reverse the y direction
+        }
+
+    }
+}
diff --git a/app/src/main/java/brickbreaker/GameMapBuilder.java b/app/src/main/java/brickbreaker/GameMapBuilder.java
index c01cfcaceff12e74ef39d6fd442f5e713e91f052..2ebb2f2928442e885ac53cf5160521865e1526f8 100644
--- a/app/src/main/java/brickbreaker/GameMapBuilder.java
+++ b/app/src/main/java/brickbreaker/GameMapBuilder.java
@@ -12,7 +12,7 @@ import java.awt.Graphics2D;
  *
  * @author Suman
  */
-class GameMapBuilder {
+public class GameMapBuilder {
 	
 	public int map [][];
 	public int brickWidth;
diff --git a/app/src/main/java/brickbreaker/GamePanel.java b/app/src/main/java/brickbreaker/GamePanel.java
index 965f1c536cf27850408c2f95625da1b137f78442..4601626cc6cc7361210093b66144843f5598a138 100644
--- a/app/src/main/java/brickbreaker/GamePanel.java
+++ b/app/src/main/java/brickbreaker/GamePanel.java
@@ -6,6 +6,9 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
 
 public class GamePanel extends JPanel implements KeyListener, ActionListener {
     private boolean play = true;
@@ -18,19 +21,19 @@ public class GamePanel extends JPanel implements KeyListener, ActionListener {
     private Timer timer;
     private int delay = 8;
 
-    private int playerX = 310;
+    private int paddle = 310;
+
+    private List<Ball> balls = new ArrayList<>(); // Use List interface instead of ArrayList
 
-    private Vector ballPosition;
-    private Vector ballDirection;
     private String font = "MV Boli";
 
     private GameMapBuilder map;
 
     public GamePanel() {
-        this.ballPosition = new Vector(120, 350);
-        this.ballDirection = new Vector(-1, -2);
+        this.balls.add(new Ball(350, 450, 1, -1, 20)); // Adjust the initial ball position and direction
+        this.balls.add(new Ball(380, 420, -1, 1, 20));
         this.totalBricks = rows * columns;
-        
+
         map = new GameMapBuilder(rows, columns);
         addKeyListener(this);
         setFocusable(true);
@@ -41,7 +44,9 @@ public class GamePanel extends JPanel implements KeyListener, ActionListener {
 
     protected void paintComponent(Graphics graphics) {
         super.paintComponent(graphics);
-
+        if (balls.isEmpty()) {
+            gameOver(graphics, "Game Over", Color.BLACK);
+        }   
         // background color
         graphics.setColor(Color.green);
         graphics.fillRect(1, 1, 692, 592);
@@ -53,31 +58,39 @@ public class GamePanel extends JPanel implements KeyListener, ActionListener {
         graphics.fillRect(691, 0, 3, 592);
 
         graphics.setColor(Color.blue);
-        graphics.fillRect(playerX, 550, 100, 12);
+        graphics.fillRect(paddle, 550, 100, 12);
 
         graphics.setColor(Color.RED); // ball color
-        graphics.fillOval(ballPosition.x, ballPosition.y, 20, 20);
+        Iterator<Ball> ballsIterator = balls.iterator();
+
+        while (ballsIterator.hasNext()) {
+            Ball ball = ballsIterator.next();
+            Vector ballPosition = ball.getPosition();
+
+            if (ballPosition.y > 570) {
+                ballsIterator.remove();
+                continue;
+            } else {
+                ball.checkForWallCollisions();
+            }
+
+            graphics.setColor(Color.RED); // ball color
+            graphics.fillOval(ballPosition.x, ballPosition.y, 20, 20);
+        }
 
         graphics.setColor(Color.black);
         graphics.setFont(new Font("MV Boli", Font.BOLD, 25));
         graphics.drawString("Score: " + score, 520, 30);
 
-        if (totalBricks <= 0) { // if all bricks are destroyed then you win
-            
+        if (totalBricks <= 0) {
             Color color = new Color(0XFF6464);
             gameOver(graphics, "You Won", color);
-            
         }
 
-        if (ballPosition.y > 570) { // if ball goes below the paddle then you lose
-            gameOver(graphics, "Game Over", Color.BLACK);
-        }
     }
-    
-    public void gameOver(Graphics graphics, String gameOverText,Color color) {
+
+    public void gameOver(Graphics graphics, String gameOverText, Color color) {
         play = false;
-        ballDirection.x = 0;
-        ballDirection.y = 0;
         graphics.setColor(color);
         graphics.setFont(new Font(font, Font.BOLD, 30));
         graphics.drawString(gameOverText + ", Your Score: " + score, 190, 300);
@@ -85,113 +98,98 @@ public class GamePanel extends JPanel implements KeyListener, ActionListener {
         graphics.setFont(new Font(font, Font.BOLD, 20));
         graphics.drawString("Press Enter to Restart", 230, 350);
     }
-    
+
     @Override
     public void actionPerformed(ActionEvent arg0) {
         if (play) {
-            // Ball - Pedal interaction
-            if (new Rectangle(ballPosition.x, ballPosition.y, 20, 20).intersects(new Rectangle(playerX, 550, 100, 8))) {
-                ballDirection.y = -ballDirection.y;
-            }
-            for (int i = 0; i < map.map.length; i++) { // Ball - Brick interaction
-                for (int j = 0; j < map.map[0].length; j++) { // map.map[0].length is the number of columns
-                    if (map.map[i][j] > 0) {
-                        int brickX = j * map.brickWidth;
-                        int brickY = i * map.brickHeight;
-                        int brickWidth = map.brickWidth;
-                        int brickHeight = map.brickHeight;
-
-                        Rectangle rect = new Rectangle(brickX, brickY, brickWidth, brickHeight);
-                        Rectangle ballRect = new Rectangle(ballPosition.x, ballPosition.y, 20, 20);
-                        Rectangle brickRect = rect;
-
-                        if (ballRect.intersects(brickRect)) {
-                            map.setBrickValue(0, i, j);
-                            totalBricks--;
-                            score += 5;
-
-                            if (ballPosition.x + 19 <= brickRect.x || ballPosition.x + 1 >= brickRect.x + brickRect.width)
-                                ballDirection.x = -ballDirection.x;
-                            else {
-                                ballDirection.y = -ballDirection.y;
+            for (Ball ball : balls) {
+                Vector ballPosition = ball.getPosition();
+                Vector ballDirection = ball.getDirection();
+
+                if (new Rectangle(ballPosition.x, ballPosition.y, 20, 20).intersects(new Rectangle(paddle, 550, 100, 8))) {
+                    ballDirection.y = -ballDirection.y;
+                    ball.setDirection(ballDirection.x, ballDirection.y);
+                }
+
+                for (int i = 0; i < map.map.length; i++) {
+                    for (int j = 0; j < map.map[0].length; j++) {
+                        if (map.map[i][j] > 0) {
+                            int brickX = j * map.brickWidth;
+                            int brickY = i * map.brickHeight;
+                            int brickWidth = map.brickWidth;
+                            int brickHeight = map.brickHeight;
+
+                            Rectangle brickRect = new Rectangle(brickX, brickY, brickWidth, brickHeight);
+                            Rectangle ballRect = new Rectangle(ballPosition.x, ballPosition.y, 20, 20);
+                            
+                            
+                            if (ballRect.intersects(brickRect)) {
+                                map.setBrickValue(0, i, j);
+                                totalBricks--;
+                                score += 5;
+
+                                if (ballPosition.x + 19 <= brickRect.x || ballPosition.x + 1 >= brickRect.x + brickRect.width) {
+                                    ballDirection.x = -ballDirection.x;
+                                } else {
+                                    ballDirection.y = -ballDirection.y;
+                                }
                             }
                         }
-
                     }
-
                 }
+                ball.setDirection(ballDirection.x, ballDirection.y);
+                ball.move(); // Call the move() method to update the ball's position
             }
-
-            ballPosition.x += ballDirection.x;
-            ballPosition.y += ballDirection.y;
-            if (ballPosition.x < 0) { // if ball hits the left wall then it bounces back
-                ballDirection.x = -ballDirection.x;
-            }
-            if (ballPosition.y < 0) { // if ball hits the top wall then it bounces back
-                ballDirection.y = -ballDirection.y;
-            }
-            if (ballPosition.x > 670) { // if ball hits the right wall then it bounces back
-                ballDirection.x = -ballDirection.x;
-            }
-
         }
 
-         repaint();
+        repaint();
     }
 
     @Override
     public void keyTyped(KeyEvent arg0) {
-
     }
 
     @Override
     public void keyPressed(KeyEvent arg0) {
-        if (arg0.getKeyCode() == KeyEvent.VK_RIGHT) { // if right arrow key is pressed then paddle moves right
-            if (playerX >= 600) {
-                playerX = 600;
+        if (arg0.getKeyCode() == KeyEvent.VK_RIGHT) {
+            if (paddle >= 600) {
+                paddle = 600;
             } else {
                 moveRight();
-
             }
         }
-        if (arg0.getKeyCode() == KeyEvent.VK_LEFT) { // if left arrow key is pressed then paddle moves left
-            if (playerX < 10) {
-                playerX = 10;
+        if (arg0.getKeyCode() == KeyEvent.VK_LEFT) {
+            if (paddle < 10) {
+                paddle = 10;
             } else {
                 moveLeft();
-
             }
         }
 
-        if (arg0.getKeyCode() == KeyEvent.VK_ENTER) { // if enter key is pressed then game restarts
+        if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
             if (!play) {
                 play = true;
-                ballPosition.x = 120;
-                ballPosition.y = 350;
-                ballDirection.x = -1;
-                ballDirection.y = -2;
+                this.balls.add(new Ball(350, 450, 1, -1, 20)); // Adjust the initial ball position and direction
                 score = 0;
-                totalBricks = rows * columns;;
+                totalBricks = rows * columns;
                 map = new GameMapBuilder(rows, columns);
 
                 repaint();
             }
         }
-
     }
 
-    public void moveRight() { // paddle moves right by 50 pixels
+    public void moveRight() {
         play = true;
-        playerX += 50;
+        paddle += 50;
     }
 
-    public void moveLeft() { // paddle moves left by 50 pixels
+    public void moveLeft() {
         play = true;
-        playerX -= 50;
+        paddle -= 50;
     }
 
     @Override
     public void keyReleased(KeyEvent arg0) {
-
     }
 }