diff --git a/bin/coursework/Cage.class b/bin/coursework/Cage.class
index cf42078f2a031fef67fad643a5262c83393bbbda..f93cf6cd92afb4721aa5581143ec6bcac4afbf0f 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 50b401ba1f7cfe454d8d9798e6a8f2ef4f8247e8..3d978104687481173a895a9c50c1b4e9b64dec3b 100644
Binary files a/bin/coursework/Main.class and b/bin/coursework/Main.class differ
diff --git a/bin/coursework/Square.class b/bin/coursework/Square.class
index d244d5b2579894b681036730669ad911a3c75bf4..ef7b1b6f1ab6cf0ef440306e32c5b7b42af133f4 100644
Binary files a/bin/coursework/Square.class and b/bin/coursework/Square.class differ
diff --git a/src/coursework/Cage.java b/src/coursework/Cage.java
index ac9a83f5abb1a1431a981817852c3889ccf6fe9c..b2d17836b0680fef3f38f5fe4627242b75976bf1 100644
--- a/src/coursework/Cage.java
+++ b/src/coursework/Cage.java
@@ -27,7 +27,6 @@ public class Cage {
 		this.cageLabels = Main.getCageLabels();
 		buildCage();
 		setCageInfo();
-		setSquareCages();
 	}
 	
 	private boolean plusOperator() {
@@ -71,21 +70,25 @@ public class Cage {
 		List<Integer> sortedCageValues = new ArrayList<Integer>();
 		for (int id : squareIds) {
 			gridValue = gridNumbers[id].getText();
-			if (gridValue.equals("")) {
-				return true;
+			if (!gridValue.equals("")) {
+				sortedCageValues.add(Integer.parseInt(gridValue));
 			}
 			else {
-				sortedCageValues.add(Integer.parseInt(gridValue));
+				return false;
 			}
 		}
-		Collections.sort(sortedCageValues);
+		Collections.sort(sortedCageValues, Collections.reverseOrder());
 		int cageVal = sortedCageValues.get(0);
-		for (int i = 1; i < sortedCageValues.size() - 1; i++) {
-			cageVal -= sortedCageValues.get(i);
+		
+		for (int value : sortedCageValues) {
+			if (value != cageVal) {
+				cageVal -= value;
+			}
 		}
 		if (cageVal == value) {
 			return false;
 		}
+		
 		return true;
 	}
 	
@@ -94,18 +97,22 @@ public class Cage {
 		List<Integer> sortedCageValues = new ArrayList<Integer>();
 		for (int id : squareIds) {
 			gridValue = gridNumbers[id].getText();
-			if (gridValue.equals("")) {
-				return true;
+			if (!gridValue.equals("")) {
+				sortedCageValues.add(Integer.parseInt(gridValue));
 			}
 			else {
-				sortedCageValues.add(Integer.parseInt(gridValue));
+				return false;
 			}
 		}
-		Collections.sort(sortedCageValues);
+		Collections.sort(sortedCageValues, Collections.reverseOrder());
 		int cageVal = sortedCageValues.get(0);
-		for (int i = 1; i < sortedCageValues.size() - 1; i++) {
-			cageVal /= sortedCageValues.get(i);
+		
+		for (int value : sortedCageValues) {
+			if (value != cageVal) {
+				cageVal /= value;
+			}
 		}
+		
 		if (cageVal == value) {
 			return false;
 		}
@@ -172,12 +179,6 @@ public class Cage {
 		return new int[] {row, col};
 	}
 	
-	public void setSquareCages() {
-		for (Square square : gridSquares) {
-			square.setCage(this);
-		}
-	}
-	
 	public int[] getCageIds() {
 		return squareIds;
 	}
diff --git a/src/coursework/Main.java b/src/coursework/Main.java
index e068d7c2648b683a2aa59e42609542dd9d034520..35d0332f9ce560bf5fd770704cfa63c64e12b973 100644
--- a/src/coursework/Main.java
+++ b/src/coursework/Main.java
@@ -111,15 +111,45 @@ public class Main extends Application {
 				}
 			}
 			checkConstraints(j, i);
+			checkWinCondition();
 		});
 		
 		square.getRectangle().toFront();
 		return gridPane;
 	}
 	
+	private void checkWinCondition() {
+		if (checkCellsFull() && checkConstraintErrors()) {
+			// win condition fulfilled
+			// animation and pop up
+			System.out.println("You won");
+		}
+	}
+	
+	private boolean checkCellsFull() {
+		for (TextField textField : gridNumbers) {
+			if (!textField.getText().equals("")) {
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	private boolean checkConstraintErrors() {
+		for (boolean[] cellErrors : highlightedError) {
+			for (boolean errorVal : cellErrors) {
+				if (errorVal) {
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+	
 	private void checkConstraints(int col, int row) {
 		columnConstraint(row, col);
 		rowConstraint(row, col);
+		cageConstraint(row, col);
 		highlightCells();
 	}
 
@@ -169,10 +199,19 @@ public class Main extends Application {
 		
 	private void cageConstraint(int row, int col) {
 		if (gridCages.size() > 0) {
-			Cage cage = gridSquares[row*N + col].getCage();
-			boolean cageConstraintsValue = cage.checkCageValues();
-			for (int id : cage.getCageIds()) {
-				highlightedError[id][2] = cageConstraintsValue;
+			Cage searchCage = null;
+			for (Cage cage : gridCages) {
+				for (int id : cage.getCageIds()) {
+					if (id == (row*N + col)) {
+						searchCage = cage;
+						break;
+					}
+				}
+			}
+			
+			boolean validCageValues = searchCage.checkCageValues();
+			for (int id : searchCage.getCageIds()) {
+				highlightedError[id][2] = validCageValues;
 			}
 		}
 	}
@@ -220,7 +259,7 @@ public class Main extends Application {
 		
 		vbox.getChildren().addAll(cageInfoLabel);
 		vbox.setStyle("-fx-border-width: 0px;");
-		vbox.setPadding(new Insets(5));
+		vbox.setPadding(new Insets(2,0,0,5));
 		gridBoxes[i*N + j] = vbox;
 		paneClickSquareEvent(i, j, square);
 
@@ -494,75 +533,54 @@ public class Main extends Application {
 	
 	private HBox setupFontSizeHBox() {
 		HBox hbox = new HBox();
-		Button minus = new Button("-");
-		Button font12 = new Button("Tiny");
-		Button font16 = new Button("Small");
-		Button font20 = new Button("Medium");
-		Button font24 = new Button("Large");
-		Button font28 = new Button("Huge");
-		Button plus = new Button("+");
-		
-		plus.setStyle("-fx-font-size:28px;");
-		plus.setOnAction(e -> {
-			changeFontSize(fontSize + 1, minus, plus);
-		});
-		minus.setStyle("-fx-font-size:12px;");
-		minus.setOnAction(e -> {
-			changeFontSize(fontSize - 1, minus, plus);
-		});
+		Button tiny = new Button("Tiny");
+		Button small = new Button("Small");
+		Button medium = new Button("Medium");
+		Button large = new Button("Large");
+		Button huge = new Button("Huge");
 		
-		font12.setStyle("-fx-font-size:12px;");
-		font12.setOnAction(e -> {
-			changeFontSize(12, minus, plus);
+
+		
+		tiny.setStyle("-fx-font-size:12px;");
+		tiny.setOnAction(e -> {
+			changeFontSize(10);
 		});
 		
-		font16.setStyle("-fx-font-size:16px;");
-		font16.setOnAction(e -> {
-			changeFontSize(16, minus, plus);
+		small.setStyle("-fx-font-size:16px;");
+		small.setOnAction(e -> {
+			changeFontSize(12);
 		});
 		
-		font20.setStyle("-fx-font-size:20px;");
-		font20.setOnAction(e -> {
-			changeFontSize(20, minus, plus);
+		medium.setStyle("-fx-font-size:20px;");
+		medium.setOnAction(e -> {
+			changeFontSize(18);
 		});
 		
-		font24.setStyle("-fx-font-size:24px;");
-		font24.setOnAction(e -> {
-			changeFontSize(24, minus, plus);
+		large.setStyle("-fx-font-size:24px;");
+		large.setOnAction(e -> {
+			changeFontSize(22);
 		});
 		
-		font28.setStyle("-fx-font-size:28px;");
-		font28.setOnAction(e -> {
-			changeFontSize(28, minus, plus);
+		huge.setStyle("-fx-font-size:28px;");
+		huge.setOnAction(e -> {
+			changeFontSize(26);
 		});
 		
-		hbox.getChildren().addAll(minus, font12, font16, font20, font24, font28, plus);
+		hbox.getChildren().addAll(tiny, small, medium, large, huge);
 		hbox.setSpacing(10);
 		hbox.setAlignment(Pos.CENTER);
 		return hbox;
 	}
 	
-	private void changeFontSize(int size, Button minus, Button plus) {
+	private void changeFontSize(int size) {
 		fontSize = size;
 		for (TextField textField : gridNumbers) {
 			textField.setStyle("-fx-focus-color: transparent; -fx-text-box-border: transparent;"
 					+ "-fx-background-color: -fx-text-box-border, -fx-control-inner-background;"
-					+ "-fx-font-size:" + size + ";");
+					+ "-fx-font-size:" + size*1.8 + ";");
 		}
 		for (Label label : cageLabels) {
-			label.setStyle("-fx-font-size:" + size + ";");
-		}
-		if (fontSize == 10) {
-			minus.setDisable(true);
-		}
-		else if (fontSize > 10) {
-			minus.setDisable(false);
-		}
-		if (fontSize == 30) {
-			plus.setDisable(true);
-		}
-		else if (fontSize < 30) {
-			plus.setDisable(false);
+			label.setStyle("-fx-font-size:" + size*0.9 + ";");
 		}
 	}
 	
@@ -589,7 +607,8 @@ public class Main extends Application {
 		GridPane gridPane = setupGrid();
 		undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers)));
 		
-		fontSize = (int) gridNumbers[0].getFont().getSize();
+		fontSize = 18;
+		changeFontSize(fontSize);
 		HBox fontSizeHBox = setupFontSizeHBox();
 		HBox topHBox = setupTopHBox();
 		HBox centerHBox = setupCenterHBox();
diff --git a/src/coursework/Square.java b/src/coursework/Square.java
index 8aa589af591cec3ae69a91b9651dcf7442707176..c44142484257f3bdd77e279b62de530ba3b096b8 100644
--- a/src/coursework/Square.java
+++ b/src/coursework/Square.java
@@ -14,21 +14,12 @@ public class Square {
 	private Line bottom;
 	private Line left;
 	private Group group = new Group();
-	private Cage cage = null;
 	
 	public Square(double size) {
 		this.size = size;
 		draw();
 	}
 	
-	public void setCage(Cage cage) {
-		this.cage = cage;
-	}
-	
-	public Cage getCage() {
-		return cage;
-	}
-	
 	public void draw() {
 		rectangle = new Rectangle(0, 0, size, size);
 		rectangle.setFill(Color.WHITE);