diff --git a/bin/coursework/Cage.class b/bin/coursework/Cage.class
index a752da327002b690e4bfc92e5e9d2519376df0d7..870cdad95fc9207280743efe057850ed5f5306a1 100644
Binary files a/bin/coursework/Cage.class and b/bin/coursework/Cage.class differ
diff --git a/bin/coursework/Main.class b/bin/coursework/Main.class
index 5e29507a106c3cdfc1cc053e01c9b5fdfba7ce59..bd8e82f3de7abd33e65466a9ef376d862e3b6e08 100644
Binary files a/bin/coursework/Main.class and b/bin/coursework/Main.class differ
diff --git a/src/coursework/Cage.java b/src/coursework/Cage.java
index 9427afab968aacbc47b026ad9e10aa0e8feb10b4..a37ce8600565abdcfdfd5d4e9934914a51d13b76 100644
--- a/src/coursework/Cage.java
+++ b/src/coursework/Cage.java
@@ -1,43 +1,72 @@
 package coursework;
 
+import java.util.Arrays;
+
+import javafx.scene.control.Label;
 import javafx.scene.paint.Color;
 
 public class Cage {
 
-	private int[][] squareIds;
+	private int[] squareIds;
 	private int value;
 	private String operator;
 	private Square[][] gridSquares;
+	private Label[][] cageLabels;
 	
-	public Cage(int[][] squareIds) {
+	public Cage(int[] squareIds, int value, String operator) {
 		this.squareIds = squareIds;
+		this.value = value;
+		this.operator = operator;
 		this.gridSquares = Main.getGridSquares();
+		this.cageLabels = Main.getCageLabels();
 		buildCage();
+		setCageInfo();
 	}
 	
 	public void buildCage() {
-		for (int aIndex[] : squareIds) {
-			for (int bIndex[] : squareIds) {
-				if (!aIndex.equals(bIndex)) {
-					int rowDiff = aIndex[1] - bIndex[1];
-					int colDiff = aIndex[0] - bIndex[0];
+		if (squareIds.length == 1)
+			return;
+		for (int idA : squareIds) {
+			for (int idB : squareIds) {
+				if (idA != idB) {
+					int[] aCoord = idToCoord(idA);
+					int[] bCoord = idToCoord(idB);
+					
+					int rowDiff = aCoord[1] - bCoord[1];
+					int colDiff = aCoord[0] - bCoord[0];
 					
+					final double WIDTH = 2;
 					
 					if (rowDiff == -1 && colDiff == 0) {
-						gridSquares[aIndex[0]][aIndex[1]].setRightStroke(2, Color.LIGHTGREY);
+						gridSquares[aCoord[0]][aCoord[1]].setRightStroke(WIDTH, Color.LIGHTGREY);
 					}
 					else if (rowDiff == 1 && colDiff == 0) {
-						gridSquares[aIndex[0]][aIndex[1]].setLeftStroke(2, Color.LIGHTGREY);
+						gridSquares[aCoord[0]][aCoord[1]].setLeftStroke(WIDTH, Color.LIGHTGREY);
 					}
 					else if (rowDiff == 0 && colDiff == -1) {
-						gridSquares[aIndex[0]][aIndex[1]].setBottomStroke(2, Color.LIGHTGREY);
+						gridSquares[aCoord[0]][aCoord[1]].setBottomStroke(WIDTH, Color.LIGHTGREY);
 					}
 					else if (rowDiff == 0 && colDiff == 1) {
-						gridSquares[aIndex[0]][aIndex[1]].setTopStroke(2, Color.LIGHTGREY);
+						gridSquares[aCoord[0]][aCoord[1]].setTopStroke(WIDTH, Color.LIGHTGREY);
 					}
 				}
 			}
 		}
 	}
+	
+	public void setCageInfo() {
+		if (squareIds.length > 1)
+			Arrays.sort(squareIds);
+		int minVal = squareIds[0];
+		cageLabels[minVal][0].setText(value + " " + operator);
+		cageLabels[minVal][1].setText(value + " " + operator);
+		cageLabels[minVal][1].setVisible(false);
+	}
+	
+	public static int[] idToCoord(int id) {
+		int row = id / Main.N;
+		int col = id % Main.N;
+		return new int[] {row, col};
+	}
 
 }
\ No newline at end of file
diff --git a/src/coursework/Main.java b/src/coursework/Main.java
index 716f23671461824833b2c537e2ca550a91fa68f2..06dabe9a3ad52a52b76ca451c17efd0a47fe417b 100644
--- a/src/coursework/Main.java
+++ b/src/coursework/Main.java
@@ -8,10 +8,12 @@ import javafx.scene.Group;
 import javafx.scene.Node;
 import javafx.scene.Scene;
 import javafx.scene.control.Button;
+import javafx.scene.control.Label;
 import javafx.scene.control.TextField;
 import javafx.scene.image.Image;
 import javafx.scene.image.ImageView;
 import javafx.scene.input.MouseEvent;
+import javafx.scene.layout.BorderPane;
 import javafx.scene.layout.GridPane;
 import javafx.scene.layout.HBox;
 import javafx.scene.layout.Pane;
@@ -28,15 +30,16 @@ import javafx.stage.Stage;
 
 public class Main extends Application {
 	
+	final static public int N = 6;
 	
 	final private double GRID_PERCENTAGE = 0.75;
-	final static private int N = 4;
 	private static Square[][] gridSquares = new Square[N][N];
 	private TextField[] gridNumbers = new TextField[N*N];
+	private static Label[][] cageLabels = new Label[N*N][2];
 	private Rectangle gridOutline;
 	Scene scene;
 	private boolean isWider;
-	private Rectangle previous = null;
+	private HBox previous = null;
 	
 	private GridPane setupGrid() {
 		GridPane gridPane = new GridPane();
@@ -56,8 +59,7 @@ public class Main extends Application {
 	private GridPane addToGridPane(GridPane gridPane, double size, int i, int j) {
 		Square square = setupGridSquare(size);
 		TextField textField = setupGridTextField(size);
-		HBox hbox = setupGridHBox(square, textField);
-		
+		HBox hbox = setupGridHBox(square, textField, i, j);
 		Group group = square.getGroup();
 		
 		gridSquares[i][j] = square;
@@ -70,23 +72,27 @@ public class Main extends Application {
 		return gridPane;
 	}
 	
-	private HBox setupGridHBox(Square square, TextField textField) {
+	private HBox setupGridHBox(Square square, TextField textField, int i, int j) {
 		HBox hbox = new HBox();
-		hbox.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> {
-			square.getRectangle().setFill(Color.LIGHTBLUE);
-			if (previous != null) {
-				previous.setFill(Color.WHITE);
-			}
-			previous = square.getRectangle();
-		});
+		VBox vbox = new VBox();
+		Label cageInfoLabel = new Label("");
+		Label balanceLabel = new Label("");
 		
-		hbox.getChildren().add(textField);
+		cageLabels[i*N + j][0] = cageInfoLabel;
+		cageLabels[i*N + j][1] = balanceLabel;
+		
+		vbox.getChildren().addAll(cageInfoLabel, textField, balanceLabel);
+		vbox.setAlignment(Pos.CENTER);
+		hbox.getChildren().add(vbox);
 		hbox.setAlignment(Pos.CENTER);
+		hboxClickSquareEvent(hbox);
+
 		return hbox;
+
 	}
 	
 	private Rectangle setupGridOutline(double size) {
-		gridOutline = new Rectangle(size*N + N*2.5, size*N + N*2.5, size*N + N*2.5, size*N + N*2.5);
+		gridOutline = new Rectangle(size*N + N*3, size*N + N*3, size*N + N*3, size*N + N*3);
 		gridOutline.setStroke(Color.BLACK);
 		gridOutline.setFill(Color.TRANSPARENT);
 		gridOutline.setStrokeWidth(2);
@@ -96,10 +102,10 @@ public class Main extends Application {
 	
 	private Square setupGridSquare(double size) {
 		Square square = new Square(size);
-		square.setTopStroke(2.5, Color.BLACK);
-		square.setBottomStroke(2.5, Color.BLACK);
-		square.setLeftStroke(2.5, Color.BLACK);
-		square.setRightStroke(2.5, Color.BLACK);
+		square.setTopStroke(3, Color.BLACK);
+		square.setBottomStroke(3, Color.BLACK);
+		square.setLeftStroke(3, Color.BLACK);
+		square.setRightStroke(3, Color.BLACK);
 		return square;
 	}
 	
@@ -125,6 +131,11 @@ public class Main extends Application {
 		loadGameTextInputButton.setPrefWidth(loadGameFileButton.getPrefWidth());
 		
 		topHBox.getChildren().addAll(loadGameFileButton, showMistakesButton, loadGameTextInputButton);
+		
+		loadGameFileButton.setOnAction(e -> {
+			
+		});
+		
 		return topHBox;
 	}
 	
@@ -144,6 +155,16 @@ public class Main extends Application {
 		return bottomHBox;
 	}
 	
+	private void hboxClickSquareEvent(HBox hbox) {
+		hbox.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> {
+			if (previous != null) {
+				previous.setStyle("-fx-border-width:0px;");
+			}
+			hbox.setStyle("-fx-border-color:red; -fx-border-width:2px;");
+			previous = hbox;
+		});
+	}
+	
 	private void clearButtonClickEvent(Button clearButton) {
 		clearButton.setOnAction(e -> {
 			for (TextField textField : gridNumbers) {
@@ -171,13 +192,22 @@ public class Main extends Application {
 	}
 	
 	private void setupCages() {
-		new Cage(new int[][] {{0,0}, {1,0}});
-		new Cage(new int[][] {{2,0}, {1,1}, {2,1}});
-		new Cage(new int[][] {{3,0}, {3,1}});
-		new Cage(new int[][] {{0,1}, {0,2}});
-		new Cage(new int[][] {{1,2}});
-		new Cage(new int[][] {{0,3},{1,3}});
-		new Cage(new int[][] {{2,2},{2,3},{3,2},{3,3}});
+		new Cage(new int[] {0,6},11,"+");
+		new Cage(new int[] {1,2},2,"/");
+		new Cage(new int[] {3,9},20,"x");
+		new Cage(new int[] {7,8},3,"-");
+		new Cage(new int[] {4,5,11,17},6,"x");
+		new Cage(new int[] {10, 16},3,"/");
+		new Cage(new int[] {12,13,18,19},240,"x");
+		new Cage(new int[] {14,15},6,"x");
+		new Cage(new int[] {24,25},6,"x");
+		new Cage(new int[] {20,26},6,"x");
+		new Cage(new int[] {21,27,28},7,"+");
+		new Cage(new int[] {22,23},30,"x");
+		new Cage(new int[] {30,31,32},8,"+");
+		new Cage(new int[] {33,34},2,"/");
+		new Cage(new int[] {29,35},9,"+");
+		
 	}
 	
 	public void resizeGrid(double gridX, double gridY, double gridWidth) {
@@ -190,14 +220,18 @@ public class Main extends Application {
 				gridSquares[i][j].resizeLines(newValue * GRID_PERCENTAGE / N);
 			}
 		}
-		gridOutline.setWidth(newValue * GRID_PERCENTAGE + N*2.5);
-		gridOutline.setHeight(newValue * GRID_PERCENTAGE + N*2.5);
+		//gridOutline.setWidth(newValue * GRID_PERCENTAGE + N*2.5);
+		//gridOutline.setHeight(newValue * GRID_PERCENTAGE + N*2.5);
 	}
 	
 	public static Square[][] getGridSquares() {
 		return gridSquares;
 	}
 	
+	public static Label[][] getCageLabels() {
+		return cageLabels;
+	}
+	
 	@Override
 	public void start(Stage stage) throws Exception {
 		VBox vBox = new VBox();
@@ -218,8 +252,8 @@ public class Main extends Application {
 		stageWidthResizeEvent(stage, gridPane);
 		stageHeightResizeEvent(stage, gridPane);
 		
-		stage.setMinWidth(600);
-		stage.setMinHeight(600);
+		stage.setMinWidth(400 + 50*N);
+		stage.setMinHeight(400 + 50*N);
 		stage.setScene(scene);
 		stage.setTitle("Mathdoku");
 		stage.show();