diff --git a/bin/coursework/Main.class b/bin/coursework/Main.class
index e11864fcd4a0c4e5737bfec1dfeeafb4b2b6f0e2..a1011f22830a280134bd2237cb846b343e56df25 100644
Binary files a/bin/coursework/Main.class and b/bin/coursework/Main.class differ
diff --git a/src/coursework/Main.java b/src/coursework/Main.java
index 39d33515271a439637387e6578f1b70a0c0e7395..fb366a6df0e250a7edb1b7aa36f58ffd2034b779 100644
--- a/src/coursework/Main.java
+++ b/src/coursework/Main.java
@@ -8,6 +8,9 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Stack;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 import javafx.application.*;
 import javafx.geometry.Insets;
 import javafx.geometry.Pos;
@@ -174,12 +177,12 @@ public class Main extends Application {
 		topHBox.setAlignment(Pos.BOTTOM_CENTER);
 		topHBox.setSpacing(10);
 		
-		Button loadGameFileButton = new Button("Load game - file");
+		Button loadGameFileButton = new Button("Load Game - File");
 		CheckBox showMistakesCheck = new CheckBox("Show mistakes");
 		if (showMistakes) {
 			showMistakesCheck.setSelected(true);
 		}
-		Button loadGameTextInputButton = new Button("Load game - text input");
+		Button loadGameTextInputButton = new Button("Load Game - Text");
 		loadGameFileButton.setPrefWidth(200);
 		loadGameTextInputButton.setPrefWidth(loadGameFileButton.getPrefWidth());
 		
@@ -348,21 +351,7 @@ public class Main extends Application {
 		}
 	}
 	
-	///////////////////////////////////////////////////////////
-	private void generateRandomGameEvent() {
-		// new popup selecting difficultly and n
-		Stage popupStage = new Stage();
-		popupStage.initModality(Modality.APPLICATION_MODAL);
-		popupStage.initOwner(stage);
-		
-		VBox vbox = new VBox();
-		vbox.setSpacing(5);
-		vbox.setAlignment(Pos.TOP_CENTER);
-		
-		HBox hboxBottom = new HBox();
-		hboxBottom.setSpacing(86);
-		hboxBottom.setPadding(new Insets(10));
-		
+	private Slider setupSlider() {
 		Slider slider = new Slider(2,8,1);
 		slider.setPrefWidth(150);
 		slider.setMaxWidth(150);
@@ -374,7 +363,10 @@ public class Main extends Application {
 		slider.setSnapToTicks(true);
 		slider.setValue(N);
 		slider.setPadding(new Insets(10, 0, 0, 0));
-		
+		return slider;
+	}
+	
+	private HBox setupRadioHBox() {
 		HBox hboxMiddle = new HBox();
 		ToggleGroup tg = new ToggleGroup();
 		RadioButton easy = new RadioButton("Easy");
@@ -389,16 +381,33 @@ public class Main extends Application {
 		radioVBox.setSpacing(5);
 		hboxMiddle.getChildren().addAll(new Label("Difficulty:"), radioVBox);
 		
+		return hboxMiddle;
+	}
+	
+	///////////////////////////////////////////////////////////
+	private void generateRandomGameEvent() {
+		Stage popupStage = new Stage();
+		popupStage.initModality(Modality.APPLICATION_MODAL);
+		popupStage.initOwner(stage);
+		
+		VBox vbox = new VBox();
+		vbox.setSpacing(5);
+		vbox.setAlignment(Pos.TOP_CENTER);
+		
+		HBox hboxBottom = new HBox();
+		hboxBottom.setSpacing(86);
+		hboxBottom.setPadding(new Insets(10));
+		
+		Slider slider = setupSlider();
+		
 		Button generateButton = new Button("Generate");
 		generateButton.setAlignment(Pos.TOP_RIGHT);
 		generateButton.setOnAction(e -> {
 			popupStage.close();
-			if ((int) slider.getValue() != N) {
-				N = (int) slider.getValue();
-				resetGrid();
-			}
+			N = (int) slider.getValue();
+			resetGrid();
 			RandomGenerator rg = new RandomGenerator(N);
-			gridCages = rg.generate();			
+			gridCages = rg.generate();	
 		});
 		
 		Button cancelButton = new Button("Cancel");
@@ -411,10 +420,8 @@ public class Main extends Application {
 		hboxTop.setSpacing(3);
 		hboxTop.setAlignment(Pos.CENTER);
 		
-		
-		
 		hboxBottom.getChildren().addAll(cancelButton, generateButton);
-		vbox.getChildren().addAll(hboxTop, hboxMiddle, hboxBottom);
+		vbox.getChildren().addAll(hboxTop, setupRadioHBox(), hboxBottom);
 		
 		popupStage.setScene(new Scene(vbox, 250, 250));
 		popupStage.show();
@@ -427,16 +434,39 @@ public class Main extends Application {
 			File selectedFile = fileChooser.showOpenDialog(stage);
 			BufferedReader file = new BufferedReader(new FileReader(selectedFile));
 			
-			String line;
-			while ((line = file.readLine()) != null) {
+			
+			List<String> fileLines = file.lines().collect(Collectors.toList());
+			int max = -1;
+			for (String line : fileLines) {
+				String[] rightHalfLine = line.split(" ")[1].split(",");
+				int[] lineIds = new int[rightHalfLine.length];
+				for (int i = 0; i < lineIds.length; i++) {
+					lineIds[i] = Integer.parseInt(rightHalfLine[i]);
+					if (lineIds[i] > max) {
+						max = lineIds[i];
+					}
+				}
+			}
+			
+			if (Math.sqrt(max) != N) {
+				N = (int) Math.sqrt(max);
+				resetGrid();
+			}
+			
+			
+			for (String line : fileLines) {
 				createNewCage(line);
 			}
 			file.close();
-		} catch (FileNotFoundException e1) {
+		}
+		catch (FileNotFoundException e1) {
 			e1.printStackTrace();
-		} catch (IOException e2) {
+		}
+		catch (IOException e2) {
 			e2.printStackTrace();
 		}
+		catch (NullPointerException e3) {}
+		
 	}
 	
 	private void loadTextButtonClickEvent() {
@@ -446,10 +476,17 @@ public class Main extends Application {
 		
 		VBox vbox = new VBox();
 		vbox.setPadding(new Insets(10));
-		vbox.setSpacing(10);
+		vbox.setSpacing(5);
+		
+		HBox hboxBottom = new HBox();
+		hboxBottom.setSpacing(163);
 		
-		HBox hbox = new HBox();
-		hbox.setSpacing(162);
+		
+		HBox hboxTop = new HBox();
+		hboxTop.setSpacing(5);
+		hboxTop.setAlignment(Pos.CENTER);
+		
+		Slider slider = setupSlider();
 		
 		TextArea textArea = new TextArea();
 		Button cancelButton = new Button("Cancel");
@@ -460,6 +497,10 @@ public class Main extends Application {
 		Button loadButton = new Button("Load");
 		loadButton.setAlignment(Pos.TOP_RIGHT);
 		loadButton.setOnAction(e -> {
+			if ((int) slider.getValue() != N) {
+				N = (int) slider.getValue();
+				resetGrid();
+			}
 			String[] lines = textArea.getText().split("\n");
 			for (String line : lines) {
 				if (!line.equals(null) && !line.equals("")) {
@@ -469,8 +510,10 @@ public class Main extends Application {
 			popupStage.hide();
 		});
 		
-		hbox.getChildren().addAll(cancelButton, loadButton);
-		vbox.getChildren().addAll(textArea, hbox);
+		Label sizeLabel = new Label("Size (NxN):");
+		hboxTop.getChildren().addAll(sizeLabel, slider);
+		hboxBottom.getChildren().addAll(cancelButton, loadButton);
+		vbox.getChildren().addAll(hboxTop, textArea, hboxBottom);
 		
 		popupStage.setScene(new Scene(vbox, 300, 300));
 		popupStage.show();
@@ -610,11 +653,36 @@ public class Main extends Application {
 		});
 	}
 	
-	private void textFieldDataChange(int i, int j) {
+	private void textFieldDataChange(int i, int j) {		
 		if (!clearing && !undoing) {
-			undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers)));
-			if (undoButton.isDisabled()) {
-				undoButton.setDisable(false);
+			
+			boolean validInput = true;
+			try {
+				int textInput = Integer.parseInt(gridNumbers[i*N + j].getText());
+				if (textInput < 1) {
+					validInput = false;
+					gridNumbers[i*N + j].setText("");
+				}
+				else if (textInput > N) {
+					validInput = false;
+					gridNumbers[i*N + j].setText(gridNumbers[i*N + j].getText().substring(0, 1));
+				}
+			}
+			catch (NumberFormatException ex) {
+				validInput = false;
+				if (gridNumbers[i*N + j].getText().length() == 2) {
+					gridNumbers[i*N + j].setText(gridNumbers[i*N + j].getText().substring(0, 1));
+				}
+				else {
+					gridNumbers[i*N + j].setText("");
+				}
+			}
+
+			if (validInput) {
+				undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers)));
+				if (undoButton.isDisabled()) {
+					undoButton.setDisable(false);
+				}
 			}
 		}
 		constraints.checkConstraints(j, i, showMistakes);;