diff --git a/Game_Code/Resources/gameScore.txt b/Game_Code/Resources/gameScore.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b6fc4c620b67d95f953a5c1c1230aaab5db5a1b0
--- /dev/null
+++ b/Game_Code/Resources/gameScore.txt
@@ -0,0 +1 @@
+hello
\ No newline at end of file
diff --git a/Game_Code/Resources/tutorial.png b/Game_Code/Resources/tutorial.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba47a658f7e3d8537670900cd45456cd8996d0a0
Binary files /dev/null and b/Game_Code/Resources/tutorial.png differ
diff --git a/Game_Code/Resources/userData.txt b/Game_Code/Resources/userData.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b6fc4c620b67d95f953a5c1c1230aaab5db5a1b0
--- /dev/null
+++ b/Game_Code/Resources/userData.txt
@@ -0,0 +1 @@
+hello
\ No newline at end of file
diff --git a/Game_Code/src/Game.java b/Game_Code/src/Game.java
deleted file mode 100644
index 77ea340a587cb9b3b12459eb7cbf74c4b80fc802..0000000000000000000000000000000000000000
--- a/Game_Code/src/Game.java
+++ /dev/null
@@ -1,156 +0,0 @@
-
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.Rectangle2D;
-import java.util.HashMap;
-import java.util.HashSet;
-
-import javax.swing.*;
-
-
-public class Game extends JPanel implements KeyListener, ActionListener {
-	
-	private int height, width; 				// the height and width of the screen 
-	private Timer t = new Timer(5, this);   // the 't' variable makes sure that there is a initial delay before the same starts off
-	private boolean first; 					//game state (starting/playing)
-	
-	private HashSet<String> keys = new HashSet<String>();
-	
-	// pad
-	private final int SPEED = 1;			//the speed of the paddles
-	private int padH = 10, padW = 40;		// paddle width/height
-	private int bottomPadX, topPadX;		// these represent the top and the bottom paddles in the game
-	private int inset = 30;					// this helps determine the distance between the paddle 
-											// - and the top and bottom screen boundaries 
-	
-	// ball
-	private double ballX, ballY, velX = 1, velY = 1, ballSize = 20;		//ball position, ball velocity, ball size
-	
-	// score
-	private int scoreTop, scoreBottom;		// keep track of game record
-	
-	public Game() {
-		addKeyListener(this); 			// it helps to read the commands given through the keyboard
-		setFocusable(true);				// keylisterer knows that it needs to look for the movement through keys
-		setFocusTraversalKeysEnabled(false);	// since the argument is set to false, it moves the focus away from tab and shift keys
-		first = true;					// sets the game state to true to start playing
-		t.setInitialDelay(100);			// sets initial delay for the movement of the ball
-		t.start();						// set the delay for every movement of the ball
-	}
-	
-	@Override
-	protected void paintComponent(Graphics g) {
-		super.paintComponent(g);
-		Graphics2D g2d = (Graphics2D) g;	// create an object for graphics (rectangles)
-		height = getHeight();				// get game frame/screen size
-		width = getWidth();
-
-		// initial positioning
-		if (first) {
-			bottomPadX = width / 2 - padW / 2;	// setups for the paddles positions - in the middle of the screen
-			topPadX = bottomPadX;
-			ballX = width / 2 - ballSize / 2;	// setups for the ball positions - in the middle of the screen
-			ballY = height / 2 - ballSize / 2;
-			first = false;						// setup completed
-		}
-		
-		// bottom pad
-		Rectangle2D bottomPad = new Rectangle(bottomPadX, height - padH - inset, padW, padH); // creating the object for bottom paddle
-		g2d.fill(bottomPad);
-		
-		// top pad
-		Rectangle2D topPad = new Rectangle(topPadX, inset, padW, padH); // creating paddle object for the top paddle
-		g2d.fill(topPad);
-		
-		// ball
-		Ellipse2D ball = new Ellipse2D.Double(ballX, ballY, ballSize, ballSize);  // creating the ball object for the game
-		g2d.fill(ball);
-		
-		// scores
-		String scoreB = "Bottom: " + new Integer(scoreBottom).toString(); 	// saving the score of the bottom paddle
-		String scoreT = "Top: " + new Integer(scoreTop).toString();			// saving the score of the top paddle 
-		g2d.drawString(scoreB, 10, height / 2);						// printing the score of the bottom paddle in the screen
-		g2d.drawString(scoreT, width - 50, height / 2);			// printing the score of the top paddle in the screen
-	}
-	
-	@Override
-	public void actionPerformed(ActionEvent e) {
-		// side walls
-		if (ballX < 0 || ballX > width - ballSize) {	// making sure ball is horizontally within the frame (left&right)
-			velX = -velX;								// reverse the ball position if trying to go out
-		}
-		// top / down walls
-		if (ballY < 0) {								// similarly, for vertical position
-			velY = -velY;								// reverse the ball position vertically 
-			++ scoreBottom;
-		}
-		
-		if (ballY + ballSize > height) {	// similarly, for the vertical position of bottom paddle
-			velY = -velY;
-			++ scoreTop;				// points are incremented if the paddle is missed by opponent
-		}
-		// bottom pad
-		if (ballY + ballSize >= height - padH - inset && velY > 0)	// similar to the previous parts
-			if (ballX + ballSize >= bottomPadX && ballX <= bottomPadX + padW)
-				velY = -velY;
-
-		// top pad
-		if (ballY <= padH + inset && velY < 0)
-			if (ballX + ballSize >= topPadX && ballX <= topPadX + padW)
-				velY = -velY;
-
-		ballX += velX;
-		ballY += velY;
-		
-		// pressed keys
-		if (keys.size() == 1) {
-			if (keys.contains("LEFT")) {							// left key is pressed
-				bottomPadX -= (bottomPadX > 0) ? SPEED : 0;			// move the bottom paddle to the left
-			}
-			else if (keys.contains("RIGHT")) {						// right key is pressed
-				bottomPadX += (bottomPadX < width - padW) ? SPEED : 0;
-			}
-		}
-		
-		// AI
-		double delta = ballX - topPadX;
-		if (delta > 0) {											// move right if ball is to the right of the paddle
-			topPadX += (topPadX < width - padW) ? SPEED : 0;
-		}
-		else if (delta < 0) {										// move left if ball is to the left of the paddle
-			topPadX -= (topPadX > 0) ? SPEED : 0;
-		}
-		
-		repaint();
-	}
-
-	@Override
-	public void keyTyped(KeyEvent e) {}
-
-	@Override
-	public void keyPressed(KeyEvent e) {
-		int code = e.getKeyCode();				// get which key is pressed
-		switch (code) {
-		case KeyEvent.VK_LEFT:
-			keys.add("LEFT");
-			break;
-		case KeyEvent.VK_RIGHT:
-			keys.add("RIGHT");
-			break;
-		}
-	}
-
-	@Override
-	public void keyReleased(KeyEvent e) {
-		int code = e.getKeyCode();				// get which key is released
-		switch (code) {
-		case KeyEvent.VK_LEFT:
-			keys.remove("LEFT");
-			break;
-		case KeyEvent.VK_RIGHT:
-			keys.remove("RIGHT");
-			break;
-		}
-	}
-}
diff --git a/Game_Code/src/Pong_viewAndController.java b/Game_Code/src/Pong_viewAndController.java
deleted file mode 100644
index 5e3c1281bc58eaa44ae1cebd60d1840435db61c3..0000000000000000000000000000000000000000
--- a/Game_Code/src/Pong_viewAndController.java
+++ /dev/null
@@ -1,49 +0,0 @@
-import java.awt.*;
-import javax.swing.*;
-public class Pong_viewAndController extends JFrame{
-	private JButton suspend = new JButton("Suspend");
-	private JButton resume = new JButton("Resume");
-	private JButton save = new JButton("Save");
-	private JButton exit = new JButton("Exit");
-	public Pong_viewAndController(){
-		super("FaultInOurPong");
-		this.setSize(700,500);
-		this.setResizable(false);
-		
-		JPanel game_interface = new JPanel();
-		game_interface.setLayout(new BoxLayout(game_interface, BoxLayout.X_AXIS));
-		
-		JPanel buttonPanel = new JPanel();
-		buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS));
-		
-		suspend.setAlignmentX(Component.CENTER_ALIGNMENT);
-		buttonPanel.add(suspend);
-		buttonPanel.add(Box.createVerticalStrut(10));
-		resume.setMaximumSize(suspend.getPreferredSize());
-		resume.setAlignmentX(Component.CENTER_ALIGNMENT);
-		buttonPanel.add(resume);
-		buttonPanel.add(Box.createVerticalStrut(10));
-		save.setMaximumSize(suspend.getPreferredSize());
-		save.setAlignmentX(Component.CENTER_ALIGNMENT);
-		buttonPanel.add(save);
-		buttonPanel.add(Box.createVerticalStrut(10));
-		exit.setMaximumSize(suspend.getPreferredSize());
-		exit.setAlignmentX(Component.CENTER_ALIGNMENT);
-		buttonPanel.add(exit);
-		
-		Game game = new Game();
-		
-		game_interface.add(buttonPanel);
-		game_interface.add(game);
-		add(game_interface);
-		setLocationRelativeTo(null);
-		
-		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
-		this.setVisible(true);
-	}
-	
-	/*public static void main(String[] args){
-		Pong_viewAndController view_controller = new Pong_viewAndController();
-	}*/
-	
-}
\ No newline at end of file
diff --git a/Game_Code/src/View.java b/Game_Code/src/View.java
deleted file mode 100644
index 09812a7871e0983b49d7f2a758384fa34df018a5..0000000000000000000000000000000000000000
--- a/Game_Code/src/View.java
+++ /dev/null
@@ -1,130 +0,0 @@
-
-import java.awt.BorderLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-
-public class View extends JFrame{
-
-	private JButton start = new JButton("Start New Game");
-	private JButton load = new JButton("Load Game");
-	private JButton highScores = new JButton("High Scores");
-	private JButton tutorial = new JButton("Tutorial");
-	private JButton exit = new JButton("Exit");
-	
-	private JButton single = new JButton("Single Player Mode");
-	private JButton sObstacle = new JButton("Advanced Single Player Mode");
-	private JButton multi = new JButton("Multiplayer Mode");
-	
-	JPanel buttonPanel = new JPanel();
-	
-	public View(){
-		super("FaultInOurPong");
-		this.setSize(700,500);
-		this.setResizable(false);
-		
-		buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS));
-		
-		buttonPanel.add(Box.createVerticalGlue());
-		addButton(start);
-		addButton(load);
-		addButton(highScores);
-		addButton(tutorial);
-		addButton(exit);
-		buttonPanel.add(Box.createVerticalGlue());
-		
-		start.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				start();
-			}
-		});
-		
-		load.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				load();
-			}
-		});
-		
-		highScores.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				highScores();
-			}
-		});
-		
-		tutorial.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				tutorial();
-			}
-		});
-		
-		exit.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				System.exit(0);
-			}
-		});
-		
-		add(buttonPanel);
-		
-		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
-		this.setLocationRelativeTo(null);
-		this.setVisible(true);
-	}
-	
-	public void addButton(JButton x) {
-		x.setMaximumSize(sObstacle.getPreferredSize());
-		x.setAlignmentY(CENTER_ALIGNMENT);
-		x.setAlignmentX(CENTER_ALIGNMENT);
-		buttonPanel.add(x);
-		buttonPanel.add(Box.createVerticalStrut(20));
-	}
-	
-	public void start() {
-		buttonPanel.removeAll();
-		this.getContentPane().removeAll();
-		this.repaint();
-		
-		buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS));
-		
-		buttonPanel.add(Box.createVerticalGlue());
-		addButton(single);
-		addButton(sObstacle);
-		buttonPanel.add(Box.createVerticalGlue());
-		
-		add(buttonPanel);
-		this.setVisible(true);
-		
-		single.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				single();
-			}
-		});
-
-	}
-	
-	public void single() {
-		Pong_viewAndController view_controller = new Pong_viewAndController();
-		this.setVisible(false);
-	}
-	
-	public void load() {
-		
-	}
-	
-	public void highScores() {
-		
-	}
-	
-	public void tutorial() {
-		
-	}
-	
-	public static void main(String[] args) {
-		View menuPage = new View();
-	}
-
-}
diff --git a/Game_Code/src/model/Ball.java b/Game_Code/src/model/Ball.java
new file mode 100644
index 0000000000000000000000000000000000000000..b050283adae872d72dad83ed401554f7fc3e4220
--- /dev/null
+++ b/Game_Code/src/model/Ball.java
@@ -0,0 +1,86 @@
+package model;
+
+/**
+ * @file Ball.java
+ * @title Ball
+ * @author Pongthusiastics
+ * @date 4/11/2016
+ * @brief This class represents a ball on the pong game
+ * @details This class saves the information of a ball, including its position,
+ *          size and the speed.
+ */
+
+public class Ball {
+
+	/**
+	 * The X position of a ball on the screen
+	 */
+	private int positionX;
+	/**
+	 * The Y position of a ball on the screen
+	 */
+	private int positionY;
+	/**
+	 * The size of a ball
+	 */
+	private final int SIZE = 20;
+
+	// TODO
+	private int speed;
+
+	/**
+	 * @brief Constructor for Ball
+	 * @details Constructor accepts the x and y position of the ball
+	 * @param x
+	 *            is the x-position
+	 * @param y
+	 *            is the y-position
+	 */
+	public Ball(int x, int y) {
+		positionX = x;
+		positionY = y;
+	}
+
+	/**
+	 * @brief sets the x position of the ball
+	 * @param x-position
+	 *            of the ball
+	 */
+	public void setPositionX(int x) {
+		positionX = x;
+	}
+
+	/**
+	 * @brief sets the y position of the ball
+	 * @param y-position
+	 *            of the ball
+	 */
+	public void setPositionY(int y) {
+		positionY = y;
+	}
+
+	/**
+	 * @brief gets the x-position of the ball
+	 * @return positionX
+	 */
+	public int getPositionX() {
+		return positionX;
+	}
+
+	/**
+	 * @brief gets the y-position of the ball
+	 * @return positionY
+	 */
+	public int getPositionY() {
+		return positionY;
+	}
+
+	/**
+	 * @brief gets the size of the ball
+	 * @return SIZE
+	 */
+	public int getSize() {
+		return SIZE;
+	}
+
+}
diff --git a/Game_Code/src/model/GameModel.java b/Game_Code/src/model/GameModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..4378dec5124128ecd1dee8e63d43a8712bd05d30
--- /dev/null
+++ b/Game_Code/src/model/GameModel.java
@@ -0,0 +1,103 @@
+package model;
+
+
+/**
+ * @file GameModel.java
+ * @title GameModel
+ * @author Pongthusiastics
+ * @date 4/11/2016
+ * @brief This class represents a ball on the pong game
+ * @details This class saves the information of a ball, including its position,
+ *          size and the speed.
+ */
+public class GameModel {
+
+	/**
+	 * The ball object for the game
+	 */
+	private Ball b1;
+	/**
+	 * The two paddle in the game, one for the player and the other for the computer
+	 */
+	private Paddle p_player, p_computer;
+	/**
+	 * The two players in the game, one for the user and the other for the computer
+	 */
+	private Player player, computer;
+	
+	private int ballX, ballY;
+	private int playerX, playerY;
+	private int compX, compY;
+	
+	
+	/**
+	 * @brief Constructor for the game Model
+	 * @details Contains all the data and models for the game, including the player, paddle, and the ball.
+	 * @param ballX is the x-position of the ball
+	 * @param ballY is the y-position of the ball
+	 * @param playerX is the x-position of the user's paddle
+	 * @param playerY is the y-position of the user's paddle
+	 * @param compX is the x-position of the user's paddle
+	 * @param compY is the y-position of the user's paddle
+	 */
+	public GameModel(int ballX, int ballY, int playerX, int playerY, int compX, int compY){
+		b1 = new Ball(ballX, ballY);
+		p_player = new Paddle(playerX, playerY);
+		p_computer = new Paddle(compX, compY);
+		
+		//TODO
+		player = new Player();
+		computer = new Player();
+	}
+	
+	/**
+	 * @brief sets the x and y positions of a ball
+	 * @param x is the x position of the ball
+	 * @param y is the y position of the ball
+	 */
+	public void setBall(int x, int y){
+		b1.setPositionX(x);
+		b1.setPositionY(y);
+	}
+	
+	
+	/**
+	 * @brief gets the Ball object
+	 * @return b1
+	 */
+	public Ball getBall(){
+		return b1;
+	}
+	
+	/**
+	 * @brief gets the user paddle object
+	 * @return p_player
+	 */
+	public Paddle getPlayerPaddle(){
+		return p_player;
+	}
+	
+	/**
+	 * @brief gets the computer paddle object
+	 * @return p_computer
+	 */
+	public Paddle getComputerPaddle(){
+		return p_computer;
+	}
+	
+	/**
+	 * @brief gets the player object
+	 * @return player
+	 */
+	public Player getPlayer(){
+		return player;
+	}
+	
+	/**
+	 * @brief gets the computer object
+	 * @return computer
+	 */
+	public Player getComputer(){
+		return computer;
+	}
+}
diff --git a/Game_Code/src/model/Paddle.java b/Game_Code/src/model/Paddle.java
new file mode 100644
index 0000000000000000000000000000000000000000..660017a3974fa953e167db52a41b955f89181414
--- /dev/null
+++ b/Game_Code/src/model/Paddle.java
@@ -0,0 +1,76 @@
+package model;
+
+public class Paddle {
+
+	private int positionX;
+	private int positionY;
+	
+	private final int HEIGHT = 10;
+	private final int WIDTH = 40;
+	private final int INSET = 10;
+	
+	//TODO 
+	private int speed;
+	
+	
+	public Paddle(int x, int y){
+		positionX = x;
+		positionY = y;
+	}
+	
+	/**
+	 * @brief sets the x-position of the paddle
+	 * @param x is the x position of the paddle
+	 */
+	public void setPositionX(int x){
+		positionX = x;
+	}
+	
+	/**
+	 * @brief sets the y-position of the paddle
+	 * @param y is the y position of the paddle
+	 */
+	public void setPositionY(int y){
+		positionY = y;
+	}
+
+	/**
+	 * @brief returns the x position of the paddle
+	 * @return positionX
+	 */
+	public int getPositionX(){
+		return positionX;
+	}
+	
+	/**
+	 * @brief returns the y position of the paddle
+	 * @return positionY
+	 */
+	public int getPositionY(){
+		return positionY;
+	}
+	
+	/**
+	 * @brief returns the width of the paddle
+	 * @return WIDTH
+	 */
+	public int getWidth(){
+		return WIDTH;
+	}
+	
+	/**
+	 * @brief returns the height of the paddle
+	 * @return HEIGHT
+	 */
+	public int getHeight(){
+		return HEIGHT;
+	}
+	
+	/**
+	 * @brief returns the inset between the paddle and the screen
+	 * @return INSET
+	 */
+	public int getInset(){
+		return INSET;
+	}
+}
diff --git a/Game_Code/src/model/Player.java b/Game_Code/src/model/Player.java
new file mode 100644
index 0000000000000000000000000000000000000000..7c79bc8681fd6906c78a25a86979af3ea6bf4031
--- /dev/null
+++ b/Game_Code/src/model/Player.java
@@ -0,0 +1,49 @@
+package model;
+
+public class Player {
+
+	// Constant declaration for number of life
+	private final int LIFE = 3;
+	private final int NOLIFE = 0;
+	
+	// Variable declaration for storing the player score
+	private int score;
+	
+
+	public Player(){
+		score = LIFE;
+		//TODO: POSITION X, POSITION Y
+		
+	}
+	
+	/**
+	 *  @brief decreases number of life of the player
+	 */
+	public void decrementLife(){
+		score--;
+	}
+	
+	/**
+	 *  @brief increases score for a player
+	 */
+	public void incrementScore(){
+		score++;
+	}
+	
+	/**
+	 * @brief gets the score of a player
+	 * @return playerScore - return the score of the player 
+	 */
+	public int getScore(){
+		return score;
+	}
+	
+	/**
+	 * @brief checks whether the player loses the game or not
+	 * @return - boolean indicating losing or not
+	 */
+	public boolean checkLoss(){
+		if(score==NOLIFE){ return true;}
+		else{ return false; }
+	}
+}
diff --git a/Game_Code/src/original_code/Game.java b/Game_Code/src/original_code/Game.java
deleted file mode 100644
index cc3b5b6c93295b5715e7ffe79ddc7daef8db712e..0000000000000000000000000000000000000000
--- a/Game_Code/src/original_code/Game.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package original_code;
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.Rectangle2D;
-import java.util.HashMap;
-import java.util.HashSet;
-
-import javax.swing.*;
-
-
-public class Game extends JPanel implements KeyListener, ActionListener {
-	
-	private int height, width;
-	private Timer t = new Timer(5, this);
-	private boolean first;
-	
-	private HashSet<String> keys = new HashSet<String>();
-	
-	// pad
-	private final int SPEED = 1;
-	private int padH = 10, padW = 40;
-	private int bottomPadX, topPadX;
-	private int inset = 10;
-	
-	// ball
-	private double ballX, ballY, velX = 1, velY = 1, ballSize = 20;
-	
-	// score
-	private int scoreTop, scoreBottom;
-	
-	public Game() {
-		addKeyListener(this);
-		setFocusable(true);
-		setFocusTraversalKeysEnabled(false);
-		first = true;
-		t.setInitialDelay(100);
-		t.start();
-	}
-	
-	@Override
-	protected void paintComponent(Graphics g) {
-		super.paintComponent(g);
-		Graphics2D g2d = (Graphics2D) g;
-		height = getHeight();
-		width = getWidth();
-
-		// initial positioning
-		if (first) {
-			bottomPadX = width / 2 - padW / 2;
-			topPadX = bottomPadX;
-			ballX = width / 2 - ballSize / 2;
-			ballY = height / 2 - ballSize / 2;
-			first = false;
-		}
-		
-		// bottom pad
-		Rectangle2D bottomPad = new Rectangle(bottomPadX, height - padH - inset, padW, padH);
-		g2d.fill(bottomPad);
-		
-		// top pad
-		Rectangle2D topPad = new Rectangle(topPadX, inset, padW, padH);
-		g2d.fill(topPad);
-		
-		// ball
-		Ellipse2D ball = new Ellipse2D.Double(ballX, ballY, ballSize, ballSize);
-		g2d.fill(ball);
-		
-		// scores
-		String scoreB = "Bottom: " + new Integer(scoreBottom).toString();
-		String scoreT = "Top: " + new Integer(scoreTop).toString();
-		g2d.drawString(scoreB, 10, height / 2);
-		g2d.drawString(scoreT, width - 50, height / 2);
-	}
-	
-	@Override
-	public void actionPerformed(ActionEvent e) {
-		// side walls
-		if (ballX < 0 || ballX > width - ballSize) {
-			velX = -velX;
-		}
-		// top / down walls
-		if (ballY < 0) {
-			velY = -velY;
-			++ scoreBottom;
-		}
-		
-		if (ballY + ballSize > height) {
-			velY = -velY;
-			++ scoreTop;
-		}
-		// bottom pad
-		if (ballY + ballSize >= height - padH - inset && velY > 0)
-			if (ballX + ballSize >= bottomPadX && ballX <= bottomPadX + padW)
-				velY = -velY;
-
-		// top pad
-		if (ballY <= padH + inset && velY < 0)
-			if (ballX + ballSize >= topPadX && ballX <= topPadX + padW)
-				velY = -velY;
-
-		ballX += velX;
-		ballY += velY;
-		
-		// pressed keys
-		if (keys.size() == 1) {
-			if (keys.contains("LEFT")) {
-				bottomPadX -= (bottomPadX > 0) ? SPEED : 0;
-			}
-			else if (keys.contains("RIGHT")) {
-				bottomPadX += (bottomPadX < width - padW) ? SPEED : 0;
-			}
-		}
-		
-		// AI
-		double delta = ballX - topPadX;
-		if (delta > 0) {
-			topPadX += (topPadX < width - padW) ? SPEED : 0;
-		}
-		else if (delta < 0) {
-			topPadX -= (topPadX > 0) ? SPEED : 0;
-		}
-		
-		repaint();
-	}
-
-	@Override
-	public void keyTyped(KeyEvent e) {}
-
-	@Override
-	public void keyPressed(KeyEvent e) {
-		int code = e.getKeyCode();
-		switch (code) {
-		case KeyEvent.VK_LEFT:
-			keys.add("LEFT");
-			break;
-		case KeyEvent.VK_RIGHT:
-			keys.add("RIGHT");
-			break;
-		}
-	}
-
-	@Override
-	public void keyReleased(KeyEvent e) {
-		int code = e.getKeyCode();
-		switch (code) {
-		case KeyEvent.VK_LEFT:
-			keys.remove("LEFT");
-			break;
-		case KeyEvent.VK_RIGHT:
-			keys.remove("RIGHT");
-			break;
-		}
-	}
-}
diff --git a/Game_Code/src/original_code/Main.java b/Game_Code/src/original_code/Main.java
deleted file mode 100644
index 5b5ea9cda3a85412aac11de5b8f2fc7a8d59284a..0000000000000000000000000000000000000000
--- a/Game_Code/src/original_code/Main.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package original_code;
-import java.awt.BorderLayout;
-
-import javax.swing.JFrame;
-
-
-public class Main {
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		JFrame frm = new JFrame();
-		frm.setTitle("Pong");
-		Game g = new Game();
-		frm.setContentPane(g);
-		frm.setSize(300, 700);
-		frm.setResizable(false);
-		frm.setVisible(true);
-		frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-	}
-
-}
diff --git a/Game_Code/src/redevelopedCode/Ball.java b/Game_Code/src/redevelopedCode/Ball.java
deleted file mode 100644
index df8598b4e8a54c75c362213900ca052076edccd8..0000000000000000000000000000000000000000
--- a/Game_Code/src/redevelopedCode/Ball.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package redevelopedCode;
-
-public class Ball {
-	
-	private int positionX;
-	private int positionY;
-	
-	public Ball(int x, int y){
-		positionX = x;
-		positionY = y;
-	}
-	
-	public void setPosition(int x, int y){
-		positionX = x;
-		positionY = y;
-	}
-
-	public int[] getPosition(){
-		int[] temp = {positionX,positionY};
-		return temp;
-	}
-}
diff --git a/Game_Code/src/redevelopedCode/Players.java b/Game_Code/src/redevelopedCode/Players.java
deleted file mode 100644
index ab31458d52366e249477f7e5aa825343e8ef6880..0000000000000000000000000000000000000000
--- a/Game_Code/src/redevelopedCode/Players.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package redevelopedCode;
-
-public class Players {
-
-	// Constant declaration for number of life
-	private final int LIFE = 3;
-	private final int NOLIFE = 0;
-	
-	// Variable declaration that store the player score
-	private int playerScore;
-	private int paddlePositionX;
-	private int paddlePositionY;
-	
-	/**
-	 *  Constructor for the player - set the score to be 0 initially
-	 */
-	public Players(){
-		playerScore = LIFE;
-		//TODO: POSITION X, POSITION Y
-		
-	}
-	
-	/**
-	 *  Decrease number of life of the player
-	 */
-	public void decrementLife(){
-		playerScore--;
-	}
-	
-	/**
-	 *  Increase score for a player
-	 */
-	public void incrementScore(){
-		playerScore++;
-	}
-	
-	/**
-	 * Get the score of a player
-	 * @return playerScore - return the score of the player 
-	 */
-	public int getScore(){
-		return playerScore;
-	}
-	
-	/**
-	 * Save the paddle positions
-	 * @param x - horizontal position of the paddle
-	 * @param y - vertical position of the paddle
-	 */
-	public void setPosition(int x, int y){
-		paddlePositionX = x;
-		paddlePositionY = y;
-	}
-	
-	/**
-	 * Get the paddle positions
-	 * @return - horizontal and vertical positions in an array
-	 */
-	public int[] getPosition(){
-		int[] temp = {paddlePositionX,paddlePositionY};
-		return temp;
-	}
-	
-	/**
-	 * Check whether the player loses the game or not
-	 * @return - boolean indicating losing or not
-	 */
-	public boolean checkLoss(){
-		if(playerScore==NOLIFE){ return true;}
-		else{ return false; }
-	}
-	
-}
diff --git a/Game_Code/src/redevelopedCode/Pong_controller.java b/Game_Code/src/redevelopedCode/Pong_controller.java
deleted file mode 100644
index 3d9d2defe138af9a43c7c96a9781eacdd185ecee..0000000000000000000000000000000000000000
--- a/Game_Code/src/redevelopedCode/Pong_controller.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package redevelopedCode;
-
-import java.io.*;
-
-public class Pong_controller {
-
-	public Pong_model model;
-	public static Pong_view viewer;
-	
-	public Pong_controller(){
-		model = new Pong_model();
-		
-	}
-	
-	public static void main(String[] args){
-		Pong_controller controller = new Pong_controller();
-		viewer = new Pong_view(controller);
-	}
-	
-	
-	public void loadGame(){
-		
-		try{
-		FileReader fr = new FileReader("savedScore.txt");
-		BufferedReader br = new BufferedReader(fr);
-		
-		int score1 = Integer.parseInt(br.readLine());
-		int score2 = Integer.parseInt(br.readLine());
-		
-		
-		
-		// TODO
-		
-		br.close();
-		} catch(Exception e){
-			e.printStackTrace();
-		}
-		
-	}
-
-	public void saveGame(){
-		
-		try{
-			FileWriter fw = new FileWriter("savedScore.txt");
-			BufferedWriter bw = new BufferedWriter(fw);
-			
-			bw.write(model.player1.getScore());
-			bw.write(model.player2.getScore());
-			
-			// TODO
-			
-			bw.close();
-			} catch(Exception e){
-				e.printStackTrace();
-			}
-		
-	}
-	
-	public int gameOver(){
-		if(model.player1.getScore()==0){
-			return 1;
-		}
-		else if(model.player2.getScore()==0){
-			return 2;
-		}
-		else{
-			return -1;
-		}
-	}
-	
-}
diff --git a/Game_Code/src/redevelopedCode/Pong_model.java b/Game_Code/src/redevelopedCode/Pong_model.java
deleted file mode 100644
index 0455df8c02c9dbbc2d92faef59dffb43572b83fe..0000000000000000000000000000000000000000
--- a/Game_Code/src/redevelopedCode/Pong_model.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package redevelopedCode;
-
-public class Pong_model{
-	
-
-	
-	private int score1;
-	private int score2;
-	public Players player1;
-	public Players player2;
-	
-	public Pong_model(){
-		
-		player1 = new Players();
-		player2 = new Players();
-		score1 = player1.getScore();
-		score2 = player2.getScore();
-		
-	}
-	
-	public void changeSpeed(int newSpeed){
-		
-	}
-
-	public String readTutorial(){
-		String content = "";
-		
-		return content;
-	}
-
-	public boolean createObstacle(boolean gameMode){
-		if(gameMode==true){ return true;}
-		else{ return false; }
-	}
-
-
-	
-	
-}
\ No newline at end of file
diff --git a/Game_Code/src/redevelopedCode/Pong_view.java b/Game_Code/src/redevelopedCode/Pong_view.java
deleted file mode 100644
index 55d73ed03a17b5d8902e818ac7bda045e33904f2..0000000000000000000000000000000000000000
--- a/Game_Code/src/redevelopedCode/Pong_view.java
+++ /dev/null
@@ -1,191 +0,0 @@
-package redevelopedCode;
-
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.Rectangle2D;
-import java.util.HashSet;
-
-import javax.swing.*;
-
-
-public class Pong_view extends JFrame{
-
-	private Pong_controller controller;
-	private JButton start = new JButton("Start New Game");
-	private JButton load = new JButton("Load Game");
-	private JButton highScores = new JButton("High Scores");
-	private JButton tutorial = new JButton("Tutorial");
-	private JButton exit = new JButton("Exit");
-	private JButton single = new JButton("Single Player Mode");
-	private JButton sObstacle = new JButton("Advanced Single Player Mode");
-	private JButton multi = new JButton("Multiplayer Mode");
-
-	private JPanel buttonPanel = new JPanel();
-
-	public Pong_view(Pong_controller c){
-		super("FaultInOurPong");
-		controller = c;
-		initializeFrame();
-	}
-
-	private void initializeFrame(){
-
-		this.setSize(700,500);
-		this.setResizable(false);
-
-		buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS));
-
-		buttonPanel.add(Box.createVerticalGlue());
-		addButton(start);
-		addButton(load);
-		addButton(highScores);
-		addButton(tutorial);
-		addButton(exit);
-		buttonPanel.add(Box.createVerticalGlue());
-
-		start.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				start();
-			}
-		});
-
-		load.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				// TODO:
-				//load();
-
-			}
-		});
-
-		highScores.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				// TODO:
-				//highScores();
-			}
-		});
-
-		tutorial.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				// TODO:
-				//tutorial();
-			}
-		});
-
-		exit.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				System.exit(0);
-			}
-		});
-
-		add(buttonPanel);
-
-		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
-		this.setLocationRelativeTo(null);
-		this.setVisible(true);
-	}
-
-	public void addButton(JButton x) {
-		x.setMaximumSize(sObstacle.getPreferredSize());
-		x.setAlignmentY(CENTER_ALIGNMENT);
-		x.setAlignmentX(CENTER_ALIGNMENT);
-		buttonPanel.add(x);
-		buttonPanel.add(Box.createVerticalStrut(20));
-	}
-
-	public void start() {
-		buttonPanel.removeAll();
-		this.getContentPane().removeAll();
-		this.repaint();
-
-		buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS));
-
-		buttonPanel.add(Box.createVerticalGlue());
-		addButton(single);
-		addButton(sObstacle);
-		buttonPanel.add(Box.createVerticalGlue());
-
-		add(buttonPanel);
-		this.setVisible(true);
-
-		single.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				// TODO:
-				single();
-			}
-		});
-
-	}
-
-
-	private int height, width; 				// the height and width of the screen 
-	//private Timer t = new Timer(1, this);   // the 't' variable makes sure that there is a initial delay before the same starts off
-	private boolean first=true; 					//game state (starting/playing)
-	private HashSet<String> keys = new HashSet<String>();
-	// pad
-	private final int SPEED = 1;			//the speed of the paddles
-	private int padH = 10, padW = 40;		// paddle width/height
-	private int bottomPadX, topPadX;		// these represent the top and the bottom paddles in the game
-	private int inset = 10;					// this helps determine the distance between the paddle 
-	// - and the top and bottom screen boundaries 
-	// ball
-	private double ballX, ballY, velX = 1, velY = 1, ballSize = 20;		//ball position, ball velocity, ball size
-	// score
-	private int scoreTop, scoreBottom;		// keep track of game record
-
-	public void single(){
-		buttonPanel.removeAll();
-		this.remove(buttonPanel);
-
-		JPanel game_panel = new JPanel(){
-			protected void paintComponent(Graphics g) {
-				super.paintComponent(g);
-				Graphics2D g2d = (Graphics2D) g;	// create an object for graphics (rectangles)
-				
-				height = getHeight();				// get game frame/screen size
-				width = getWidth();
-
-				// initial positioning
-				if (first) {
-					bottomPadX = width / 2 - padW / 2;	// setups for the paddles positions - in the middle of the screen
-					topPadX = bottomPadX;
-					ballX = width / 2 - ballSize / 2;	// setups for the ball positions - in the middle of the screen
-					ballY = height / 2 - ballSize / 2;
-					first = false;						// setup completed
-				}
-
-				// bottom pad
-				Rectangle2D bottomPad = new Rectangle(bottomPadX, height - padH - inset, padW, padH); // creating the object for bottom paddle
-				g2d.fill(bottomPad);
-
-				// top pad
-				Rectangle2D topPad = new Rectangle(topPadX, inset, padW, padH); // creating paddle object for the top paddle
-				g2d.fill(topPad);
-
-				// ball
-				Ellipse2D ball = new Ellipse2D.Double(ballX, ballY, ballSize, ballSize);  // creating the ball object for the game
-				g2d.fill(ball);
-
-				// scores
-				String scoreB = "Bottom: " + new Integer(scoreBottom).toString(); 	// saving the score of the bottom paddle
-				String scoreT = "Top: " + new Integer(scoreTop).toString();			// saving the score of the top paddle 
-				g2d.drawString(scoreB, 10, height / 2);						// printing the score of the bottom paddle in the screen
-				g2d.drawString(scoreT, width - 50, height / 2);			// printing the score of the top paddle in the screen
-			
-			
-			}
-		};
-
-		this.add(game_panel);
-		this.revalidate();
-		this.repaint();
-		
-		
-	}
-
-
-
-}
diff --git a/Game_Code/src/startGame/GameController.java b/Game_Code/src/startGame/GameController.java
new file mode 100644
index 0000000000000000000000000000000000000000..44c4eafa977bb9a442c1fc15c229cda9affcf5d0
--- /dev/null
+++ b/Game_Code/src/startGame/GameController.java
@@ -0,0 +1,346 @@
+package startGame;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.util.HashSet;
+
+import javax.swing.ImageIcon;
+import javax.swing.JFrame;
+import javax.swing.Timer;
+
+import model.*;
+import view.*;
+
+public class GameController{
+	
+	private GameView v;
+	private GameModel m;
+	private Welcome w;
+	private Mode mode;
+	private Tutorial tut;
+	
+	private HashSet<String> keys = new HashSet<String>();
+
+	private JFrame gameFrame;
+	private int frameWidth, frameHeight;
+	private PongGameDisplay gameDisplay;
+	
+	private int velX=1, velY=1;
+	private int padWidth = 80, padHeight = 10;
+	private int bottomPadX, bottomPadY, topPadX, topPadY;
+	private int ballX, ballY, ballSize=20;
+	private int scoreTop, scoreBottom;
+	private int inset;
+
+	private Timer t;
+	
+	public GameController(GameView v, GameModel m){
+		this.v = v;
+		this.m = m;
+		
+		/*
+		 * Setups for the View
+		 */
+		w = this.v.getWelcome();
+		w.addListener(new WelcomepageListener());
+		
+		mode = this.v.getmode();
+		mode.addListener(new ModeListener());
+		
+		ImageIcon image = new ImageIcon("./Resources/tutorial.png");
+		v.tutorialPage(image);
+		tut = v.getTutorial();
+		tut.addListener(new TutorialListener());
+		
+		gameFrame = this.v.getGameFrame();
+		gameDisplay = this.v.getGame();
+		gameDisplay.addKeyListener(new GameListener());
+		gameDisplay.setFocusable(true);
+		gameDisplay.setFocusTraversalKeysEnabled(false);
+		
+		/*
+		 * Setups for the Model
+		 */
+		frameWidth = v.getFrameWidth();
+		frameHeight = v.getFrameHeight();
+		
+		
+		
+		
+	}
+	
+	/*
+	 * Actionlistener for the welcome page
+	 */
+	class WelcomepageListener implements ActionListener{
+
+		@Override
+		public void actionPerformed(ActionEvent e) {
+			// TODO Auto-generated method stub
+			Object source = e.getSource();
+			
+			// If clicked the start button
+			if(source==w.getStart()){
+				mode.setVisible(true);
+				w.setVisible(false);
+				
+			}else if(source==w.load()){
+			// If clicked the load button
+				//TODO
+				try{
+					FileReader fr = new FileReader("./Resources/userData.txt");
+					BufferedReader br = new BufferedReader(fr);
+					
+					System.out.println("can load data");
+					
+					br.close();
+				}catch(Exception exp){
+					v.cannotLoadMessage();
+				}
+			}else if(source==w.highScores()){
+			// If clicked the high score button
+				//TODO
+				try{
+					FileReader fr = new FileReader("./Resources/gameScore.txt");
+					BufferedReader br = new BufferedReader(fr);
+					
+					System.out.println("can display high score");
+					
+					br.close();
+				}catch(Exception exp){
+					v.noFileAvailMessage();
+				}
+			}else if(source==w.tutorial()){
+			// If clicked the tutorial button
+				//TODO
+				
+				w.setVisible(false);
+				tut.setVisible(true);
+				
+			}else if(source==w.exit()){
+			// If clicked the exit button
+				System.exit(0);
+			}
+			
+		}
+		
+	}
+	
+	/*
+	 * Actionlistener for the Single-Mode page
+	 */
+	class ModeListener implements ActionListener{
+		
+		@Override
+		public void actionPerformed(ActionEvent e) {
+			// TODO Auto-generated method stub
+			Object source = e.getSource();
+			
+			if(source == mode.getSingle()){
+			// If clicked the basic single mode button
+				mode.setVisible(false);
+				gameFrame.setVisible(true);
+				t.start();
+				
+			} 
+		}
+	}
+	
+	/*
+	 * Actionlistener for the tutorial page
+	 */
+	class TutorialListener implements ActionListener{
+
+		@Override
+		public void actionPerformed(ActionEvent e) {
+			// TODO Auto-generated method stub
+			Object source = e.getSource();
+			
+			if(source == tut.getBack()){
+			// If clicked the back button
+				tut.setVisible(false);
+				w.setVisible(true);
+			}
+		}
+		
+	}
+	
+	class GameListener implements ActionListener, KeyListener{
+
+		GameListener(){
+			
+			
+			ballX = gameDisplay.getBallX();
+			ballY = gameDisplay.getBallY();
+			
+			t = new Timer(5,this);  
+			t.setInitialDelay(1000);			// sets initial delay for the movement of the ball
+
+			bottomPadX = gameDisplay.getBottomX();
+			bottomPadY = gameDisplay.getBottomY();
+
+			//TODO: MODEL FOR THE PADDLE
+
+		}
+		
+		@Override
+		public void actionPerformed(ActionEvent e) {
+			
+			// X-direction
+			if(ballX< 0 || ballX > frameWidth-1.5*ballSize){
+				/*
+				 * If the ball is trying to go beyond the left/right border of the frame, 
+				 * reverse the direction.
+				 */
+				velX = -velX;			
+			}
+			
+			// Y-direction
+			if(ballY < 0){
+				/*
+				 * If the ball is trying to go up above the frame, 
+				 * - reverse the direction
+				 * - user gets points because the ball hits the border of the computer side
+				 */
+				velY = -velY;
+				++scoreBottom;
+				gameDisplay.setBottomScore(scoreBottom);
+			} else if(ballY+2.5*ballSize>frameHeight){
+				/*
+				 * If the ball is trying to go down beyond the frame
+				 * - reverse the direction
+				 * - the computer gets points
+				 */
+				velY = -velY;
+				++scoreTop;
+				gameDisplay.setTopScore(scoreTop);
+			} else if(ballY+2.5*ballSize>frameHeight-inset-2*padHeight && velY > 0 && ballX + ballSize >= bottomPadX && ballX <= bottomPadX + padWidth){
+				/*
+				 * If the ball is touching the bottom paddle
+				 * - reverse the direction
+				 */
+				velY = -velY;
+			} else if(ballY<=inset+2*padHeight && velY < 0 && ballX + ballSize >= topPadX && ballX <= topPadX + padWidth){
+				/*
+				 * If the ball is touching the top paddle
+				 * - reverse the direction
+				 */
+				velY = -velY;
+			}
+			
+			/*
+			 * Update the ball position by velocity 
+			 */
+			ballX += velX;
+			ballY += velY;
+			
+			gameDisplay.setBall(ballX,ballY);
+			
+			/*
+			 * Detect the key pressed by the user on the keyboard
+			 */
+			if (keys.size() == 1) {
+				if (keys.contains("LEFT")) {						
+					/*
+					 * If the user presses LEFT
+					 * - update the position of the user paddle
+					 * - display the change on the screen
+					 */
+					if(bottomPadX>0) {
+						//TODO: SPEED
+						bottomPadX-=3;
+						gameDisplay.setBottom(bottomPadX);
+					}
+				}
+				else if (keys.contains("RIGHT")) {	
+					if(bottomPadX < frameWidth - padWidth){
+						/*
+						 * If the user presses RIGHT
+						 * - update the position of the user paddle
+						 * - display the change on the screen
+						 */
+						//TODO: SPEED
+						bottomPadX+=3;
+						gameDisplay.setBottom(bottomPadX);
+					} 
+				}
+			}
+			
+			/*
+			 * Create actions for the AI paddles
+			 */
+			double delta = ballX - topPadX;
+			if (delta > 0) {		
+				
+				if(topPadX < frameWidth - padWidth){
+					/*
+					 * If the AI paddle is trying to reach the right wall
+					 * - move the paddle to the right
+					 * - display the movement on the screen
+					 */
+					topPadX +=1;
+					gameDisplay.setTop(topPadX);
+				}
+			}
+			else if (delta < 0) {			
+				
+				if(topPadX>0){
+					/*
+					 * If the AI paddle is trying to reach the left wall
+					 * - move the paddle to the left
+					 * - display the movement on the screen
+					 */
+					topPadX -=1;
+					gameDisplay.setTop(topPadX);
+				}
+			}
+		
+			gameDisplay.repaint();
+		}
+
+		@Override
+		public void keyPressed(KeyEvent e) {
+
+			// TODO Auto-generated method stub
+			int code = e.getKeyCode();				// get which key is pressed
+			switch (code) {
+			case KeyEvent.VK_LEFT:
+				keys.add("LEFT");
+				break;
+				
+			case KeyEvent.VK_RIGHT:
+				keys.add("RIGHT");
+				break;
+			}
+		}
+
+		@Override
+		public void keyReleased(KeyEvent e) {
+
+			// TODO Auto-generated method stub
+			int code = e.getKeyCode();				// get which key is released
+			switch (code) {
+			case KeyEvent.VK_LEFT:
+				keys.remove("LEFT");
+				break;
+			case KeyEvent.VK_RIGHT:
+				keys.remove("RIGHT");
+				break;
+			}
+		}
+
+		@Override
+		public void keyTyped(KeyEvent e) {}
+		
+	}
+	
+	
+	public void display(){
+		v.display();
+	}
+	
+}
diff --git a/Game_Code/src/startGame/PongGame.java b/Game_Code/src/startGame/PongGame.java
new file mode 100644
index 0000000000000000000000000000000000000000..84f064f4dabe51e3da43dac2589bfa4c804f6375
--- /dev/null
+++ b/Game_Code/src/startGame/PongGame.java
@@ -0,0 +1,26 @@
+package startGame;
+import model.*;
+import view.*;
+
+public class PongGame {
+
+	public PongGame(){
+		
+		
+	}	
+	public static void main(String[] args){
+	
+		/*
+		 * Initialize the model, view, and controller for the game
+		 */
+		GameView view = new GameView();
+		GameModel model = new GameModel(1,1,2,2,2,2);
+		GameController controller = new GameController(view, model);
+		
+		/*
+		 * Invoke the game display from the controller
+		 */
+		controller.display();
+
+	}
+}
diff --git a/Game_Code/src/view/GameView.java b/Game_Code/src/view/GameView.java
new file mode 100644
index 0000000000000000000000000000000000000000..dc84e01ea7d8f76f90b30fad4b57942f3cb0f109
--- /dev/null
+++ b/Game_Code/src/view/GameView.java
@@ -0,0 +1,89 @@
+package view;
+
+import javax.swing.*;
+
+public class GameView{
+	
+	private Welcome welcome;
+	private Mode mode;
+	private PongGameDisplay ponggame;
+	private Tutorial tutorial;
+	
+	private final int FRAMEWIDTH = 700;
+	private final int FRAMEHEIGHT = 500;
+	
+	private JFrame gameFrame;
+	
+	
+	public GameView(){
+		/*
+		 * Pass in different windows to this view interface
+		 * - will wait for further invocation
+		 */
+		welcome = new Welcome();
+		mode = new Mode();
+		ponggame = new PongGameDisplay();
+		
+		createGame();
+	}
+	
+	public void display(){
+		welcome.setVisible(true);
+	}
+	
+	
+	public Welcome getWelcome(){
+		return welcome;
+	}
+	
+	public Mode getmode(){
+		return mode;
+	}
+	
+	public PongGameDisplay getGame(){
+		return ponggame;
+	}
+	
+	public Tutorial getTutorial(){
+		return tutorial;
+	}
+	
+	
+	//TODO: ADD PANEL FOR OPTIONS IN THE GAME	
+	public void createGame(){
+		gameFrame = new JFrame("FaultInOurPong");
+		gameFrame.setContentPane(ponggame);	
+		gameFrame.setSize(FRAMEWIDTH,FRAMEHEIGHT);
+		gameFrame.setResizable(false);
+		gameFrame.setLocationRelativeTo(null);
+		gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+	}
+	
+	public JFrame getGameFrame(){
+		return gameFrame;
+	}
+	
+	// TODO: display a dialogue after successfully saving game records (high score)
+	
+	public void noFileAvailMessage(){
+		JFrame errorFrame = new JFrame("Error");
+		JOptionPane.showMessageDialog(errorFrame, "No record available!");
+	}
+	
+	public void cannotLoadMessage(){
+		JFrame errorFrame = new JFrame("Error");
+		JOptionPane.showMessageDialog(errorFrame, "The record is either damaged or not available, please start a new game!");
+	}
+	
+	public void tutorialPage(ImageIcon img){
+		tutorial = new Tutorial(img);
+	}
+	
+	public int getFrameWidth(){
+		return FRAMEWIDTH;
+	}
+	
+	public int getFrameHeight(){
+		return FRAMEHEIGHT;
+	}
+}
\ No newline at end of file
diff --git a/Game_Code/src/view/Mode.java b/Game_Code/src/view/Mode.java
new file mode 100644
index 0000000000000000000000000000000000000000..45bf202ba4c05c231cb8187ab1b4ed5ea75e4d65
--- /dev/null
+++ b/Game_Code/src/view/Mode.java
@@ -0,0 +1,64 @@
+package view;
+
+import java.awt.event.ActionListener;
+
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+
+import model.*;
+import view.*;
+
+public class Mode extends JFrame{
+
+	private JButton single = new JButton("Single Player Mode");
+	private JButton sObstacle = new JButton("Advanced Single Player Mode");
+	
+	private JPanel buttonPanel;
+	
+	public Mode(){
+		/*
+		 * - Set the header of the window
+		 * - Set the size of the window
+		 */
+		super("FaultInOurPong");
+		this.setSize(700,500);
+		this.setResizable(false);
+		this.setLocationRelativeTo(null);
+		 
+		/*
+		 * Add buttons on the window 
+		 */
+		buttonPanel = new JPanel();
+		buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS));
+		
+		buttonPanel.add(Box.createVerticalGlue());
+		addButton(single);
+		addButton(sObstacle);
+		buttonPanel.add(Box.createVerticalGlue());
+
+
+		add(buttonPanel);
+		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
+	}
+	
+	public void addButton(JButton x) {
+		x.setMaximumSize(sObstacle.getPreferredSize());
+		x.setAlignmentY(CENTER_ALIGNMENT);
+		x.setAlignmentX(CENTER_ALIGNMENT);
+		buttonPanel.add(x);
+		buttonPanel.add(Box.createVerticalStrut(20));
+	}
+	
+	public void addListener(ActionListener buttonListener){
+		single.addActionListener(buttonListener);
+		sObstacle.addActionListener(buttonListener);
+	}
+	
+	public JButton getSingle(){
+		return single;
+	}
+	
+}
diff --git a/Game_Code/src/view/PongGameDisplay.java b/Game_Code/src/view/PongGameDisplay.java
new file mode 100644
index 0000000000000000000000000000000000000000..0711c493f80157f59c8beec1d2178d0fa155200b
--- /dev/null
+++ b/Game_Code/src/view/PongGameDisplay.java
@@ -0,0 +1,118 @@
+package view;
+
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyListener;
+import java.awt.geom.Ellipse2D;
+import java.awt.geom.Rectangle2D;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.Timer;
+
+public class PongGameDisplay extends JPanel{
+
+	//private JFrame gameFrame;
+	private int frameWidth;
+	private int frameHeight;
+	
+	private int scoreTop, scoreBottom;
+	
+	private int ballX, ballY;
+	private int bottomPadX, bottomPadY;
+	private int topPadX, topPadY;
+	private boolean first;
+	private int ballSize;
+	private int padW, padH;
+	private int inset;
+	
+
+	
+	public PongGameDisplay(){
+		first = true;
+		ballSize = 20;
+		padW = 80;
+		padH = 10;
+		inset = 10;
+		
+		scoreTop=0;
+		scoreBottom=0;
+		
+	
+		
+	}
+	
+	@Override
+	protected void paintComponent(Graphics g) {
+		super.paintComponent(g);
+		Graphics2D g2d = (Graphics2D) g;	// create an object for graphics (rectangles)
+		frameHeight = getHeight();				// get game frame/screen size
+		frameWidth = getWidth();
+
+		// initial positioning
+		if (first) {
+			bottomPadX = frameWidth / 2 - padW / 2;	// setups for the paddles positions - in the middle of the screen
+			topPadX = bottomPadX;
+			ballX = frameWidth / 2 - ballSize / 2;	// setups for the ball positions - in the middle of the screen
+			ballY = frameHeight / 2 - ballSize / 2;
+			first = false;						// setup completed
+		}
+		
+		// bottom pad
+		Rectangle2D bottomPad = new Rectangle(bottomPadX, frameHeight - padH - inset, padW, padH); // creating the object for bottom paddle
+		g2d.fill(bottomPad);
+		
+		// top pad
+		Rectangle2D topPad = new Rectangle(topPadX, inset, padW, padH); // creating paddle object for the top paddle
+		g2d.fill(topPad);
+		
+		// ball
+		Ellipse2D ball = new Ellipse2D.Double(ballX, ballY, 20, 20);  // creating the ball object for the game
+		g2d.fill(ball);
+		
+		// scores
+		String scoreB = "Bottom: " + scoreBottom; 	// saving the score of the bottom paddle
+		String scoreT = "Top: " + scoreTop;			// saving the score of the top paddle 
+		g2d.drawString(scoreB, 10, frameHeight / 2);						// printing the score of the bottom paddle in the screen
+		g2d.drawString(scoreT, frameWidth - 50, frameHeight / 2);			// printing the score of the top paddle in the screen
+	}
+		
+	public void setBall(int x, int y){
+		ballX = x;
+		ballY = y;
+	}
+	
+	public void setBottom(int x){
+		bottomPadX = x;
+	}
+	
+	public void setTop(int x){
+		topPadX = x;
+	}
+	
+	public int getBottomX(){
+		return bottomPadX;
+	}
+	
+	public int getBottomY(){
+		return bottomPadY;
+	}
+	
+	public void setTopScore(int s){
+		scoreTop=s;
+	}
+	
+	public void setBottomScore(int s){
+		scoreBottom = s;
+	}
+	
+	public int getBallX(){
+		return ballX;
+	}
+	
+	public int getBallY(){
+		return ballY;
+	}
+}
diff --git a/Game_Code/src/view/Tutorial.java b/Game_Code/src/view/Tutorial.java
new file mode 100644
index 0000000000000000000000000000000000000000..171243454635c053c2db3d918fe756651761a5fa
--- /dev/null
+++ b/Game_Code/src/view/Tutorial.java
@@ -0,0 +1,35 @@
+package view;
+
+import java.awt.event.ActionListener;
+
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+
+public class Tutorial extends JFrame{
+
+	private JButton back;
+	
+	public Tutorial(ImageIcon img){
+		super("FaultInOurPong - Tutorial");
+		this.setSize(700,500);
+		this.setResizable(false);
+		this.setLocationRelativeTo(null);
+		
+		this.add(new JLabel(img));
+		
+		back = new JButton("Back");
+		//this.add(back);
+		
+		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
+	}
+	
+	public JButton getBack(){
+		return back;
+	}
+	
+	public void addListener(ActionListener listener){
+		back.addActionListener(listener);
+	}
+}
diff --git a/Game_Code/src/view/Welcome.java b/Game_Code/src/view/Welcome.java
new file mode 100644
index 0000000000000000000000000000000000000000..76a1cbeea7963cd407cd7fdcac2770e264f6a441
--- /dev/null
+++ b/Game_Code/src/view/Welcome.java
@@ -0,0 +1,83 @@
+package view;
+
+import java.awt.event.ActionListener;
+
+import javax.swing.*;
+
+public class Welcome extends JFrame {
+
+	private JButton start = new JButton("Start New Game");
+	private JButton load = new JButton("Load Game");
+	private JButton highScores = new JButton("High Scores");
+	private JButton tutorial = new JButton("Tutorial");
+	private JButton exit = new JButton("Exit");
+	
+	private JPanel buttonPanel;
+	
+	public Welcome(){
+		
+		/*
+		 * - Set the header of the window
+		 * - Set the size of the window
+		 */
+		super("FaultInOurPong");
+		this.setSize(700,500);
+		this.setResizable(false);
+		this.setLocationRelativeTo(null);
+		
+		/*
+		 * Add buttons on the window 
+		 */
+		buttonPanel = new JPanel();
+		buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS));
+		
+		buttonPanel.add(Box.createVerticalGlue());
+		addButton(start);
+		addButton(load);
+		addButton(highScores);
+		addButton(tutorial);
+		addButton(exit);
+		buttonPanel.add(Box.createVerticalGlue());
+
+
+		add(buttonPanel);
+		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
+		
+	}
+	
+	public JButton getStart(){
+		return start;
+	}
+	
+	public JButton load(){
+		return load;
+	}
+	
+	public JButton highScores(){
+		return highScores;
+	}
+	
+	public JButton tutorial(){
+		return tutorial;
+	}
+	
+	public JButton exit(){
+		return exit;
+	}
+	
+	public void addButton(JButton x) {
+		x.setMaximumSize(start.getPreferredSize());
+		x.setAlignmentY(CENTER_ALIGNMENT);
+		x.setAlignmentX(CENTER_ALIGNMENT);
+		buttonPanel.add(x);
+		buttonPanel.add(Box.createVerticalStrut(20));
+	}
+	
+	public void addListener(ActionListener buttonListener){
+		start.addActionListener(buttonListener);
+		load.addActionListener(buttonListener);
+		highScores.addActionListener(buttonListener);
+		tutorial.addActionListener(buttonListener);
+		exit.addActionListener(buttonListener);
+	}
+}