diff --git a/os-simulator/.DS_Store b/os-simulator/.DS_Store
index ebc51b3142584b9874ae55bc3dbebb8aa97f5b22..0893fd48d718765776876fd0a10d5b98e240e770 100644
Binary files a/os-simulator/.DS_Store and b/os-simulator/.DS_Store differ
diff --git a/os-simulator/.classpath b/os-simulator/.classpath
index 002ad570e2e589f29101a6f361e1e4c36eac358d..dfce6da246eb3b2edf00a159e99f33f7213c2bb1 100644
--- a/os-simulator/.classpath
+++ b/os-simulator/.classpath
@@ -34,5 +34,6 @@
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>
diff --git a/os-simulator/Processes/.DS_Store b/os-simulator/Processes/.DS_Store
index 78344d393449df37c49b645fba70c93197292268..8c8652f0ecbbf7364cd95e5eeb0f0c2d9afba426 100644
Binary files a/os-simulator/Processes/.DS_Store and b/os-simulator/Processes/.DS_Store differ
diff --git a/os-simulator/Processes/Invalid_Processes/.DS_Store b/os-simulator/Processes/Invalid_Processes/.DS_Store
deleted file mode 100644
index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000
Binary files a/os-simulator/Processes/Invalid_Processes/.DS_Store and /dev/null differ
diff --git a/os-simulator/Processes/Valid_Processes/.DS_Store b/os-simulator/Processes/Valid_Processes/.DS_Store
deleted file mode 100644
index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000
Binary files a/os-simulator/Processes/Valid_Processes/.DS_Store and /dev/null differ
diff --git a/os-simulator/Processes/_Tests/FAILED22.txt b/os-simulator/Processes/_Tests/FAILED22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cb733ce0f62df2b4fc9aa3fa41eb7dfa9048aa3b
--- /dev/null
+++ b/os-simulator/Processes/_Tests/FAILED22.txt
@@ -0,0 +1,23 @@
+22
+store a #1
+store b #2
+store a #1
+store b #2
+store a #1
+store b #2
+store a #1
+store b #2
+store a #1
+store b #2
+store a #1
+store b #2
+store a #1
+store b #2
+store a #1
+store b #2
+store a #1
+store b #2
+store a #1
+store b #2
+store b #2
+add c b
\ No newline at end of file
diff --git a/os-simulator/Processes/_Tests/FAILED3.txt b/os-simulator/Processes/_Tests/FAILED3.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b54a735796beb429d3462eade72ac1a79fff6e5b
--- /dev/null
+++ b/os-simulator/Processes/_Tests/FAILED3.txt
@@ -0,0 +1,4 @@
+3
+store a #1
+store b #2
+add c a
\ No newline at end of file
diff --git a/os-simulator/Processes/_Tests/blocked18_3.txt b/os-simulator/Processes/_Tests/blocked18_3.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0605e64b311342e8f9938aba2049081610f8d738
--- /dev/null
+++ b/os-simulator/Processes/_Tests/blocked18_3.txt
@@ -0,0 +1,19 @@
+18
+store a #1
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+sub c b a
+sub c b a
+print c printer
+print b printer
+print a printer
\ No newline at end of file
diff --git a/os-simulator/Processes/_Tests/blocked2_1.txt b/os-simulator/Processes/_Tests/blocked2_1.txt
new file mode 100644
index 0000000000000000000000000000000000000000..20d7ccad427c8cd4057286de0df61d843643f20a
--- /dev/null
+++ b/os-simulator/Processes/_Tests/blocked2_1.txt
@@ -0,0 +1,3 @@
+1
+read a #100 keyboard
+print a printer
\ No newline at end of file
diff --git a/os-simulator/Processes/_Tests/blocked4_1.txt b/os-simulator/Processes/_Tests/blocked4_1.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a1013d076303bd35e0a2f007a9be6ec69490af7c
--- /dev/null
+++ b/os-simulator/Processes/_Tests/blocked4_1.txt
@@ -0,0 +1,5 @@
+1
+store a #1
+store b #2
+sub c b a
+print c printer
\ No newline at end of file
diff --git a/os-simulator/Processes/_Tests/blocked6_2.txt b/os-simulator/Processes/_Tests/blocked6_2.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8b71b38743d2af10976804d3d4549d2de2ab1f32
--- /dev/null
+++ b/os-simulator/Processes/_Tests/blocked6_2.txt
@@ -0,0 +1,7 @@
+1
+store a #1
+store b #2
+sub c b a
+read d #100 keyboard
+sub e a d
+display d monitor
\ No newline at end of file
diff --git a/os-simulator/Processes/_Tests/blockedInvalid6_1.txt b/os-simulator/Processes/_Tests/blockedInvalid6_1.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9f6dd6909c5c14c25dd773e81b5a2118aada520f
--- /dev/null
+++ b/os-simulator/Processes/_Tests/blockedInvalid6_1.txt
@@ -0,0 +1,7 @@
+4
+store a #1
+store b #2
+sub c b a
+read d #100 invalidDevice
+sub e a d
+store f #4
\ No newline at end of file
diff --git a/os-simulator/Processes/_Tests/terminate14.txt b/os-simulator/Processes/_Tests/terminate14.txt
new file mode 100644
index 0000000000000000000000000000000000000000..96dc7e1812d31d4c0dd5c53c24a6937b60c71331
--- /dev/null
+++ b/os-simulator/Processes/_Tests/terminate14.txt
@@ -0,0 +1,15 @@
+14
+store a #1
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+sub c b a
+sub c b a
\ No newline at end of file
diff --git a/os-simulator/Processes/_Tests/terminate28.txt b/os-simulator/Processes/_Tests/terminate28.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ac6597a7b51c6f6b61f07991d5ee691e1a1ad1fb
--- /dev/null
+++ b/os-simulator/Processes/_Tests/terminate28.txt
@@ -0,0 +1,29 @@
+4
+store a #1
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+sub c b a
+sub c b a
+store a #1
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+sub c b a
+sub c b a
\ No newline at end of file
diff --git a/os-simulator/Processes/_Tests/terminate4.txt b/os-simulator/Processes/_Tests/terminate4.txt
new file mode 100644
index 0000000000000000000000000000000000000000..83e064fd937c9323e0240438fd07ffcd4e8d0333
--- /dev/null
+++ b/os-simulator/Processes/_Tests/terminate4.txt
@@ -0,0 +1,5 @@
+4
+store a #1
+store b #2
+store b #3
+add c a b
\ No newline at end of file
diff --git a/os-simulator/Processes/_Tests/terminate70.txt b/os-simulator/Processes/_Tests/terminate70.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a4fb6d0c9b930f258c4ece84bade2d1b44fc032b
--- /dev/null
+++ b/os-simulator/Processes/_Tests/terminate70.txt
@@ -0,0 +1,71 @@
+4
+store a #1
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+sub c b a
+sub c b a
+store a #1
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+sub c b a
+sub c b a
+store a #1
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+sub c b a
+sub c b a
+store a #1
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+sub c b a
+sub c b a
+store a #1
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+store b #2
+sub c b a
+sub c b a
\ No newline at end of file
diff --git a/os-simulator/pom.xml b/os-simulator/pom.xml
index a4a4147dac7ab8411df32be1d46afb4fe9c42d61..c8a30272b1bea512649b4764f527efc8d94c2b91 100644
--- a/os-simulator/pom.xml
+++ b/os-simulator/pom.xml
@@ -8,4 +8,14 @@
       <maven.compiler.source>1.8</maven.compiler.source>
       <maven.compiler.target>1.8</maven.compiler.target>
   </properties>
+  
+  <dependencies>
+  	<dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.11</version>
+      <scope>test</scope>
+    </dependency>
+   </dependencies>
+    
 </project>
\ No newline at end of file
diff --git a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/IOProcessManager.java b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/IOProcessManager.java
index a3f7906398901b9f81c60c0ad67cc3ca7dcd8b86..b4af56c062e220f8413b0afd0fd892937fa51598 100644
--- a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/IOProcessManager.java
+++ b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/IOProcessManager.java
@@ -288,5 +288,13 @@ public class IOProcessManager extends Thread {
 	public String getIOReport() {
 		return this.IOReport.toString();
 	}
+	
+	
+	/**
+	 * @return IOSystem
+	 */
+	public JavaIOSystem getIOSystem() {
+		return this.IOSystem;
+	}
 
 }
diff --git a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OS.java b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OS.java
index fa76a68ad6c401d155aa252f3d088064a1abb236..abe449f8131be092813748b849781c9d698d71d8 100644
--- a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OS.java
+++ b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OS.java
@@ -33,15 +33,23 @@ public class OS {
 	/**
 	 * Runs process scheduling simulation with processes in OS.
 	 */
-	public void turnOn() {
+	public void turnOn(SchedulingAlgorithm algorithm, int quantum) {
 		try {
-			this.ps.startThreads();	
+			this.ps.startThreads(algorithm, quantum);	
 		}
 		catch(Exception e) {
-			e.printStackTrace();;
+			e.printStackTrace();
 		}
 	}
-
+	
+	
+	/**
+	 * Stop running threads.
+	 */
+	public void turnOff() {
+		ps.stopThreads();
+	}
+	
 	/**
 	 * @return the globalTime
 	 */
diff --git a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OSCommandLine.java b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OSCommandLine.java
index 834cf33b1d16ae14e74565f7994e5763e9bdeb96..c89b6c55bbb28b35b88a11845424c0a63eadd99c 100644
--- a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OSCommandLine.java
+++ b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OSCommandLine.java
@@ -20,7 +20,7 @@ public class OSCommandLine {
 	 */
 	public static void main(String[] args) {
 		OS os = new OS();
-		os.turnOn();
+		os.turnOn(SchedulingAlgorithm.FIFO, 5);
 		
         // Create a stream for input
         BufferedReader data = null;
@@ -92,7 +92,7 @@ public class OSCommandLine {
                 }
                 
                 else if (cmd.equalsIgnoreCase("quit")) {
-                    System.exit(0);
+                    os.turnOff();
                 }
                 
                 else if (cmd.equalsIgnoreCase("help")) {
diff --git a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessCreation.java b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessCreation.java
index a22c6ca2457aef28f6ff0d1f79de41c9c8a16a12..28a20e594a86c07fec8ed2e4ed44de0f6ed06efd 100644
--- a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessCreation.java
+++ b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessCreation.java
@@ -10,6 +10,7 @@ import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.NoSuchElementException;
 import java.util.Scanner;
 
 /**
@@ -39,6 +40,8 @@ public class ProcessCreation extends Thread {
 		this.jobQueue = jobQueue;
 		this.errorReport = errorReport;
 		this.globalTime = globalTime;
+		
+		this.clearFolders();
 	}
 	
 	
@@ -138,6 +141,8 @@ public class ProcessCreation extends Thread {
 		
 		//Ran if no file is found from name in system.
 		catch(IOException e) {}
+		
+		catch(NoSuchElementException e) {}
 	}
 	
 	
@@ -192,5 +197,33 @@ public class ProcessCreation extends Thread {
 			break;
 		}
 	}
+	
+	
+	/**
+	 * Clears folders in Valid_Processes and Invalid_Processes.
+	 */
+	public void clearFolders() {
+		File folder = new File("Processes/Valid_Processes");
+		File[] listOfFiles = folder.listFiles();
+		
+		//Cycles through folder 'Valid_Processes' to look for files.
+		for(int i = 0; i < listOfFiles.length; i++) {
+			//If it finds file, delete it.
+			if(listOfFiles[i].isFile()) {
+				listOfFiles[i].delete();
+			}
+		}
+		
+		folder = new File("Processes/Invalid_Processes");
+		listOfFiles = folder.listFiles();
+		
+		//Cycles through folder 'Valid_Processes' to look for files.
+		for(int i = 0; i < listOfFiles.length; i++) {
+			//If it finds file, delete it.
+			if(listOfFiles[i].isFile()) {
+				listOfFiles[i].delete();
+			}
+		}
+	}
 
 }
diff --git a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessDispatcher.java b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessDispatcher.java
index 6f63fe3204894d33176c64c8fdf2971a6c92cf11..28f26d7c1768d80c67e336cc975978a8e1d28e2a 100644
--- a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessDispatcher.java
+++ b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessDispatcher.java
@@ -277,6 +277,7 @@ public class ProcessDispatcher extends Thread {
 		//Non-Preemptive, won't access new process from ready queue if one is already running.
 		if(this.cpuQueue.isEmpty()) {
 			PCB currentProcess = this.readyQueue.get(0);
+			
 			this.scheduleProcess(currentProcess);
 		}
 		else {
diff --git a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessScheduler.java b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessScheduler.java
index 7665aa6087d11da94f6783b29bcb631641062549..f74f407abcd591e5bd51e44887b63af04a50c6f7 100644
--- a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessScheduler.java
+++ b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessScheduler.java
@@ -6,6 +6,7 @@ package com.com1032.assignment.processscheduler;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import com.com1032.assignment.IOsystem.*;
 
 /**
  * @author felipedabrantes
@@ -56,10 +57,13 @@ public class ProcessScheduler {
 	/**
 	 * Starts running the threads needed.
 	 * 
+	 * @param algorithm
+	 * @param quantum
+	 * 
 	 * @throws IOException if there is an error accessing hardware file.
 	 * @throws IndexOutOfBoundsException if there is an error with hardware file parameters.
 	 */
-	public void startThreads() throws IndexOutOfBoundsException, IOException {
+	public void startThreads(SchedulingAlgorithm algorithm, int quantum) throws IndexOutOfBoundsException, IOException {
 		//Thread responsible for creating processes from files.
 		this.pc = new ProcessCreation(this.errorReport, this.os.getGlobalTime(), this.jobQueue);
 		
@@ -68,6 +72,9 @@ public class ProcessScheduler {
 				this.processReport, this.algorithm, this.quantum, 
 				this.jobQueue, this.readyQueue, this.blockedQueue, this.terminatedQueue, this.cpuQueue);
 		
+		//Update algorithm
+		this.setAlgorithm(algorithm, quantum);
+		
 		//Thread responsible for running processes and simulating CPU.
 		this.cpu = new CPUSimulator(this.errorReport, this.os.getGlobalTime(), this.cpuQueue, this.os.getHardware());
 		
@@ -81,6 +88,13 @@ public class ProcessScheduler {
 		io.start();
 	}
 	
+	public void stopThreads() {
+		pc.stop();
+		pd.stop();
+		cpu.stop();
+		io.stop();
+	}
+	
 	
 	public void setAlgorithm(SchedulingAlgorithm algorithm, int quantum) {
 		this.pd.setAlgorithm(algorithm, quantum);
@@ -97,5 +111,9 @@ public class ProcessScheduler {
 	public String getIOReport() {
 		return this.IOReport.toString();
 	}
+	
+	public JavaIOSystem getJavaIOSystem() {
+		return this.io.getIOSystem();
+	}
 
 }
diff --git a/os-simulator/src/test/java/com/com1032/assignment/AllTests.java b/os-simulator/src/test/java/com/com1032/assignment/AllTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..a2c695171f5a30dbfe2f0c0437f8a861cf38163a
--- /dev/null
+++ b/os-simulator/src/test/java/com/com1032/assignment/AllTests.java
@@ -0,0 +1,11 @@
+package com.com1032.assignment;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+@RunWith(Suite.class)
+@SuiteClasses({ IOSystemTest.class, PSAlgorithmsTest.class, PSBlockedTest.class })
+public class AllTests {
+
+}
diff --git a/os-simulator/src/test/java/com/com1032/assignment/IOSystemTest.java b/os-simulator/src/test/java/com/com1032/assignment/IOSystemTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..205b875d88f15a8ab9f16ac64f06475799cb1340
--- /dev/null
+++ b/os-simulator/src/test/java/com/com1032/assignment/IOSystemTest.java
@@ -0,0 +1,94 @@
+/**
+ * 
+ */
+package com.com1032.assignment;
+
+import static org.junit.Assert.*;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.Scanner;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Test;
+
+import com.com1032.assignment.processscheduler.OS;
+import com.com1032.assignment.processscheduler.SchedulingAlgorithm;
+
+/**
+ * @author felipedabrantes
+ *
+ */
+public class IOSystemTest {
+
+	@Test
+	public void OutputDeviceTest() throws IOException, InterruptedException {
+		OS os = new OS();
+		
+		//Start OS with FIFO algorithm..
+		os.turnOn(SchedulingAlgorithm.FIFO, 5);
+		
+		//Copy files from test.
+		//File contains a print statement to device printer.
+		this.copyProcessFile("blocked4_1.txt");
+		
+		//Wait for processes to execute.
+		TimeUnit.MILLISECONDS.sleep(2000);
+		
+		os.turnOff();
+		
+		File file = new File("Peripherals/Buffers/printerBuffer.txt");
+		Scanner fileReader = new Scanner(file);
+		String actualResult = fileReader.nextLine();
+		String expectedResult = "1";
+		fileReader.close();
+		
+		assertEquals(expectedResult, actualResult);
+	}
+	
+	
+	@Test
+	public void InputDeviceTest() throws IOException, InterruptedException {
+		OS os = new OS();
+		
+		//Start OS with FIFO algorithm..
+		os.turnOn(SchedulingAlgorithm.FIFO, 5);
+		
+		//Write to keyboard.
+		String textToAppend = "20";
+		BufferedWriter writer = new BufferedWriter(new FileWriter("Peripherals/Buffers/keyboardBuffer.txt", true));
+		writer.write(textToAppend);
+		writer.close();
+		
+		//Copy files from test.
+		//File contains a print statement to device printer.
+		this.copyProcessFile("blocked2_1.txt");
+		
+		//Wait for processes to execute.
+		TimeUnit.MILLISECONDS.sleep(2000);
+		
+		os.turnOff();
+		
+		File file = new File("Peripherals/Buffers/printerBuffer.txt");
+		Scanner fileReader = new Scanner(file);
+		String actualResult = fileReader.nextLine();
+		String expectedResult = "20";
+		fileReader.close();
+		
+		assertEquals(expectedResult, actualResult);
+	}
+
+	
+	
+	public void copyProcessFile(String fileName) throws IOException {
+		Path testSource = Paths.get("Processes/_Tests/" + fileName);
+		Path target = Paths.get("Processes/New_Processes/" + fileName);
+		Files.copy(testSource, target, StandardCopyOption.REPLACE_EXISTING);
+	}
+}
diff --git a/os-simulator/src/test/java/com/com1032/assignment/PSAlgorithmsTest.java b/os-simulator/src/test/java/com/com1032/assignment/PSAlgorithmsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..23c9ac4c15502ca731279b6ca652dbc2b1efd290
--- /dev/null
+++ b/os-simulator/src/test/java/com/com1032/assignment/PSAlgorithmsTest.java
@@ -0,0 +1,227 @@
+/**
+ * 
+ */
+package com.com1032.assignment;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Test;
+
+import com.com1032.assignment.processscheduler.OS;
+import com.com1032.assignment.processscheduler.SchedulingAlgorithm;
+
+/**
+ * @author felipedabrantes
+ *
+ */
+public class PSAlgorithmsTest {
+
+	@Test
+	public void FIFOProcessTest() throws IOException, InterruptedException {
+		OS os = new OS();
+		
+		//Start OS with FIFO algorithm..
+		os.turnOn(SchedulingAlgorithm.FIFO, 5);
+		
+		//Copy files from test.
+		this.copyProcessFile("terminate14.txt");
+		TimeUnit.MILLISECONDS.sleep(100);
+		this.copyProcessFile("terminate70.txt");
+		TimeUnit.MILLISECONDS.sleep(100);
+		this.copyProcessFile("terminate4.txt");
+		
+		TimeUnit.MILLISECONDS.sleep(5000);
+		
+		String actualReport = os.getPs().getProcessReport();	
+		String simpleReport = this.simplifyReport(actualReport);
+		
+		os.turnOff();
+		
+		StringBuffer expectedReport = new StringBuffer();
+		expectedReport.append("Ready terminate14 NEW false\n");
+		expectedReport.append("Schedule terminate14 NEW false\n");
+		expectedReport.append("Ready terminate70 NEW false\n");
+		expectedReport.append("Ready terminate4 NEW false\n");
+		expectedReport.append("Terminated terminate14 TERMINATED false\n");
+		expectedReport.append("Schedule terminate70 NEW false\n");
+		expectedReport.append("Terminated terminate70 TERMINATED false\n");
+		expectedReport.append("Schedule terminate4 NEW false\n");
+		expectedReport.append("Terminated terminate4 TERMINATED false\n");
+		
+		assertEquals(expectedReport.toString(), simpleReport);
+	}
+	
+	@Test
+	public void SPFProcessTest() throws IOException, InterruptedException {
+		OS os = new OS();
+		
+		//Copy files from test first.
+		this.copyProcessFile("terminate70.txt");
+		
+		//Start OS with SPF algorithm.
+		os.turnOn(SchedulingAlgorithm.SPF, 5);
+		
+		this.copyProcessFile("terminate14.txt");
+		TimeUnit.MILLISECONDS.sleep(100);
+		this.copyProcessFile("terminate4.txt");
+		TimeUnit.MILLISECONDS.sleep(100);
+		this.copyProcessFile("terminate28.txt");
+
+		TimeUnit.MILLISECONDS.sleep(7000);
+		
+		String actualReport = os.getPs().getProcessReport();	
+		String simpleReport = this.simplifyReport(actualReport);
+		
+		os.turnOff();
+		
+		StringBuffer expectedReport = new StringBuffer();
+		expectedReport.append("Ready terminate70 NEW false\n");
+		expectedReport.append("Schedule terminate70 NEW false\n");
+		expectedReport.append("Ready terminate14 NEW false\n");
+		expectedReport.append("Ready terminate4 NEW false\n");
+		expectedReport.append("Ready terminate28 NEW false\n");
+		expectedReport.append("Terminated terminate70 TERMINATED false\n");
+		expectedReport.append("Schedule terminate4 NEW false\n");
+		expectedReport.append("Terminated terminate4 TERMINATED false\n");
+		expectedReport.append("Schedule terminate14 NEW false\n");
+		expectedReport.append("Terminated terminate14 TERMINATED false\n");
+		expectedReport.append("Schedule terminate28 NEW false\n");
+		expectedReport.append("Terminated terminate28 TERMINATED false\n");
+		
+		assertEquals(expectedReport.toString(), simpleReport);
+	}
+	
+	@Test
+	public void SRTFProcessTest() throws IOException, InterruptedException {
+		OS os = new OS();
+		
+		//Start OS with SPF algorithm.
+		os.turnOn(SchedulingAlgorithm.SRTF, 5);
+		
+		//Add files.
+		this.copyProcessFile("terminate14.txt");
+		TimeUnit.MILLISECONDS.sleep(100);
+		this.copyProcessFile("terminate4.txt");
+		TimeUnit.MILLISECONDS.sleep(100);
+		this.copyProcessFile("terminate28.txt");
+
+		TimeUnit.MILLISECONDS.sleep(3000);
+		
+		String actualReport = os.getPs().getProcessReport();	
+		String simpleReport = this.simplifyReport(actualReport);
+		
+		os.turnOff();
+		
+		StringBuffer expectedReport = new StringBuffer();
+		expectedReport.append("Ready terminate14 NEW false\n");
+		expectedReport.append("Schedule terminate14 NEW false\n");
+		expectedReport.append("Ready terminate4 NEW false\n");
+		expectedReport.append("Suspending terminate14 RUNNING false\n");
+		expectedReport.append("Schedule terminate4 NEW false\n");
+		expectedReport.append("Ready terminate28 NEW false\n");
+		expectedReport.append("Terminated terminate4 TERMINATED false\n");
+		expectedReport.append("Schedule terminate14 READY false\n");
+		expectedReport.append("Terminated terminate14 TERMINATED false\n");
+		expectedReport.append("Schedule terminate28 NEW false\n");
+		expectedReport.append("Terminated terminate28 TERMINATED false\n");
+		
+		assertEquals(expectedReport.toString(), simpleReport);
+	}
+	
+	@Test
+	public void RRProcessTest() throws IOException, InterruptedException {
+		OS os = new OS();
+		
+		//Start OS with SPF algorithm.
+		os.turnOn(SchedulingAlgorithm.RR, 5);
+		
+		//Add files.
+		this.copyProcessFile("terminate14.txt");
+		TimeUnit.MILLISECONDS.sleep(100);
+		this.copyProcessFile("terminate4.txt");
+		TimeUnit.MILLISECONDS.sleep(100);
+		this.copyProcessFile("terminate28.txt");
+
+		TimeUnit.MILLISECONDS.sleep(3000);
+		
+		String actualReport = os.getPs().getProcessReport();	
+		String simpleReport = this.simplifyReport(actualReport);
+		
+		os.turnOff();
+		
+		StringBuffer expectedReport = new StringBuffer();
+		expectedReport.append("Ready terminate14 NEW false\n");
+		expectedReport.append("Schedule terminate14 NEW false\n");
+		expectedReport.append("Ready terminate4 NEW false\n");
+		expectedReport.append("Ready terminate28 NEW false\n");
+		expectedReport.append("Suspending terminate14 RUNNING false\n");
+		expectedReport.append("Schedule terminate4 NEW false\n");
+		expectedReport.append("Terminated terminate4 TERMINATED false\n");
+		expectedReport.append("Schedule terminate28 NEW false\n");
+		expectedReport.append("Suspending terminate28 RUNNING false\n");
+		expectedReport.append("Schedule terminate14 READY false\n");
+		expectedReport.append("Suspending terminate14 RUNNING false\n");
+		expectedReport.append("Schedule terminate28 READY false\n");
+		expectedReport.append("Suspending terminate28 RUNNING false\n");
+		expectedReport.append("Schedule terminate14 READY false\n");
+		expectedReport.append("Terminated terminate14 TERMINATED false\n");
+		expectedReport.append("Schedule terminate28 READY false\n");
+		expectedReport.append("Terminated terminate28 TERMINATED false\n");
+		
+		assertEquals(expectedReport.toString(), simpleReport);
+	}
+	
+	
+	public void copyProcessFile(String fileName) throws IOException {
+		Path testSource = Paths.get("Processes/_Tests/" + fileName);
+		Path target = Paths.get("Processes/New_Processes/" + fileName);
+		Files.copy(testSource, target, StandardCopyOption.REPLACE_EXISTING);
+	}
+	
+	
+	public String simplifyReport(String report) {
+		StringBuffer simpleReport = new StringBuffer();
+		
+		String action = null;
+		String name = null;
+		String state = null;
+		boolean failed = false;
+		
+		String[] split = report.split("\n");
+		
+		for(String line: split) {
+			if(!line.equals("")) {
+				
+				action = line.split(" ")[1];
+				name = line.split(" ")[8];
+				
+				if(line.split(" ")[10].equals("FAILED")) {
+					failed = true;
+					state = line.split(" ")[13];
+				}
+				else {
+					state = line.split(" ")[11];
+				}
+				
+				simpleReport.append(action + " ");
+				simpleReport.append(name + " ");
+				simpleReport.append(state + " ");
+				simpleReport.append(failed);
+				simpleReport.append("\n");
+				
+				failed = false;
+			}
+		}
+		
+		return simpleReport.toString();
+		
+	}
+
+}
diff --git a/os-simulator/src/test/java/com/com1032/assignment/PSBlockedTest.java b/os-simulator/src/test/java/com/com1032/assignment/PSBlockedTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..18fc164863235ac4fa8464948760a726c15d5c7f
--- /dev/null
+++ b/os-simulator/src/test/java/com/com1032/assignment/PSBlockedTest.java
@@ -0,0 +1,247 @@
+/**
+ * 
+ */
+package com.com1032.assignment;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Test;
+
+import com.com1032.assignment.processscheduler.OS;
+import com.com1032.assignment.processscheduler.SchedulingAlgorithm;
+
+/**
+ * @author felipedabrantes
+ *
+ */
+public class PSBlockedTest {
+	
+	@Test
+	public void FIFOBlockedProcessTest() throws IOException, InterruptedException {
+		OS os = new OS();
+		
+		//Start OS with FIFO algorithm..
+		os.turnOn(SchedulingAlgorithm.FIFO, 5);
+		
+		//Copy files from test.
+		this.copyProcessFile("blocked4_1.txt");
+		TimeUnit.MILLISECONDS.sleep(100);
+		this.copyProcessFile("blocked6_2.txt");
+		TimeUnit.MILLISECONDS.sleep(200);
+		this.copyProcessFile("blocked18_3.txt");
+		
+		//Wait for processes to execute.
+		TimeUnit.MILLISECONDS.sleep(5000);
+		
+		String actualReport = os.getPs().getProcessReport();	
+		String simpleReport = this.simplifyReport(actualReport);
+		
+		os.turnOff();
+		
+		StringBuffer expectedReport = new StringBuffer();
+		expectedReport.append("Ready blocked4_1 NEW false\n");
+		expectedReport.append("Schedule blocked4_1 NEW false\n");
+		expectedReport.append("Ready blocked6_2 NEW false\n");
+		expectedReport.append("Blocking blocked4_1 BLOCKED false\n");
+		expectedReport.append("Schedule blocked6_2 NEW false\n");
+		expectedReport.append("Terminated blocked4_1 TERMINATED false\n");
+		expectedReport.append("Ready blocked18_3 NEW false\n");
+		expectedReport.append("Blocking blocked6_2 BLOCKED false\n");
+		expectedReport.append("Schedule blocked18_3 NEW false\n");
+		expectedReport.append("Terminated blocked6_2 TERMINATED true\n");
+		expectedReport.append("Blocking blocked18_3 BLOCKED false\n");
+		expectedReport.append("Ready blocked18_3 READY false\n");
+		expectedReport.append("Schedule blocked18_3 READY false\n");
+		expectedReport.append("Blocking blocked18_3 BLOCKED false\n");
+		expectedReport.append("Ready blocked18_3 READY false\n");
+		expectedReport.append("Schedule blocked18_3 READY false\n");
+		expectedReport.append("Blocking blocked18_3 BLOCKED false\n");
+		expectedReport.append("Terminated blocked18_3 TERMINATED false\n");
+		
+		assertEquals(expectedReport.toString(), simpleReport);
+	}
+	
+	@Test
+	public void RRBlockedProcessTest() throws IOException, InterruptedException {
+		OS os = new OS();
+		
+		//Start OS with FIFO algorithm..
+		os.turnOn(SchedulingAlgorithm.FIFO, 5);
+		
+		//Copy files from test.
+		this.copyProcessFile("blocked18_3.txt");
+		TimeUnit.MILLISECONDS.sleep(100);
+		this.copyProcessFile("blocked4_1.txt");
+		TimeUnit.MILLISECONDS.sleep(100);
+		this.copyProcessFile("terminate14.txt");
+
+		
+		//Wait for processes to execute.
+		TimeUnit.MILLISECONDS.sleep(5000);
+		
+		String actualReport = os.getPs().getProcessReport();	
+		String simpleReport = this.simplifyReport(actualReport);
+		
+		os.turnOff();
+		
+		StringBuffer expectedReport = new StringBuffer();		
+			
+		expectedReport.append("Ready blocked18_3 NEW false\n");
+		expectedReport.append("Schedule blocked18_3 NEW false\n");
+		expectedReport.append("Ready blocked4_1 NEW false\n");
+		expectedReport.append("Ready terminate14 NEW false\n");
+		expectedReport.append("Blocking blocked18_3 BLOCKED false\n");
+		expectedReport.append("Schedule blocked4_1 NEW false\n");
+		expectedReport.append("Ready blocked18_3 READY false\n");
+		expectedReport.append("Blocking blocked4_1 BLOCKED false\n");
+		expectedReport.append("Schedule terminate14 NEW false\n");
+		expectedReport.append("Terminated blocked4_1 TERMINATED false\n");
+		expectedReport.append("Terminated terminate14 TERMINATED false\n");
+		expectedReport.append("Schedule blocked18_3 READY false\n");
+		expectedReport.append("Blocking blocked18_3 BLOCKED false\n");
+		expectedReport.append("Ready blocked18_3 READY false\n");
+		expectedReport.append("Schedule blocked18_3 READY false\n");
+		expectedReport.append("Blocking blocked18_3 BLOCKED false\n");
+		expectedReport.append("Terminated blocked18_3 TERMINATED false\n");
+		
+		assertEquals(expectedReport.toString(), simpleReport);
+	}
+	
+	
+	@Test
+	public void ErrorBlockedProcessTest() throws IOException, InterruptedException {
+		OS os = new OS();
+		
+		//Start OS with FIFO algorithm..
+		os.turnOn(SchedulingAlgorithm.FIFO, 3);
+		
+		//Copy files from test.
+		//Code has a device not in hardware file.
+		this.copyProcessFile("blockedInvalid6_1.txt");
+		
+		//Wait for processes to execute.
+		TimeUnit.MILLISECONDS.sleep(1000);
+		
+		String actualProcessReport = os.getPs().getProcessReport();
+		String simpleProcessReport = this.simplifyReport(actualProcessReport);
+		
+		os.turnOff();
+		
+
+		StringBuffer expectedReport = new StringBuffer();
+		expectedReport.append("Ready blockedInvalid6_1 NEW false\n");
+		expectedReport.append("Schedule blockedInvalid6_1 NEW false\n");
+		expectedReport.append("Blocking blockedInvalid6_1 BLOCKED false\n");
+		expectedReport.append("Terminated blockedInvalid6_1 TERMINATED true\n");
+		
+		assertEquals(expectedReport.toString(), simpleProcessReport);
+	}
+	
+	
+	@Test
+	public void ErrorReportBlockedProcessTest() throws IOException, InterruptedException {
+		OS os = new OS();
+		
+		//Start OS with FIFO algorithm..
+		os.turnOn(SchedulingAlgorithm.FIFO, 3);
+		
+		//Copy files from test.
+		//Code has a device not in hardware file.
+		this.copyProcessFile("blockedInvalid6_1.txt");
+		
+		//Wait for processes to execute.
+		TimeUnit.MILLISECONDS.sleep(1000);
+		
+		String actualErrorReport = os.getPs().getErrorReport();
+		String simpleErrorReport = this.simplifyErrorReport(actualErrorReport);
+		os.turnOff();
+		
+		StringBuffer expectedReport = new StringBuffer();
+		expectedReport.append("3: blockedInvalid6_1 BLOCKED");
+		
+		assertEquals(expectedReport.toString(), simpleErrorReport);
+	}
+	
+	
+	
+	public void copyProcessFile(String fileName) throws IOException {
+		Path testSource = Paths.get("Processes/_Tests/" + fileName);
+		Path target = Paths.get("Processes/New_Processes/" + fileName);
+		Files.copy(testSource, target, StandardCopyOption.REPLACE_EXISTING);
+	}
+	
+	
+	public String simplifyReport(String report) {
+		StringBuffer simpleReport = new StringBuffer();
+		
+		String action = null;
+		String name = null;
+		String state = null;
+		boolean failed = false;
+		
+		String[] split = report.split("\n");
+		
+		for(String line: split) {
+			if(!line.equals("")) {
+				
+				action = line.split(" ")[1];
+				name = line.split(" ")[8];
+				
+				if(line.split(" ")[10].equals("FAILED")) {
+					failed = true;
+					state = line.split(" ")[13];
+				}
+				else {
+					state = line.split(" ")[11];
+				}
+				
+				simpleReport.append(action + " ");
+				simpleReport.append(name + " ");
+				simpleReport.append(state + " ");
+				simpleReport.append(failed);
+				simpleReport.append("\n");
+				
+				failed = false;
+			}
+		}
+		
+		return simpleReport.toString();
+		
+	}
+	
+	
+	public String simplifyErrorReport(String report) {
+		StringBuffer simpleReport = new StringBuffer();
+		
+		String lineNum = null;
+		String name = null;
+		String state = null;
+		
+		String[] split = report.split("\n");
+		
+		for(String line: split) {
+			
+			if(!line.equals("")) {
+				lineNum = line.split(" ")[5];
+				name = line.split(" ")[10];
+				state = line.split(" ")[13];
+				
+				simpleReport.append(lineNum + " ");
+				simpleReport.append(name + " ");
+				simpleReport.append(state);
+				
+				break;
+			}
+		}
+		
+		return simpleReport.toString();
+		
+	}
+}