diff --git a/src/main/java/fi/utu/tech/threadrunner2/assignment/MyRunnable.java b/src/main/java/fi/utu/tech/threadrunner2/assignment/MyRunnable.java
new file mode 100644
index 0000000000000000000000000000000000000000..c3dc61114790b0b7d5ff5b29d643d21d2a2869c2
--- /dev/null
+++ b/src/main/java/fi/utu/tech/threadrunner2/assignment/MyRunnable.java
@@ -0,0 +1,40 @@
+package fi.utu.tech.threadrunner2.assignment;
+
+import java.util.concurrent.BlockingQueue;
+import fi.utu.tech.threadrunner2.mediator.ControlSet;
+import fi.utu.tech.threadrunner2.mediator.Mediator;
+import fi.utu.tech.threadrunner2.works.Work;
+
+public class MyRunnable implements Runnable{
+	
+	private Mediator mediator;
+	private ControlSet control;
+	private BlockingQueue<Work> workList;
+	
+	MyRunnable(Mediator mediator, ControlSet control) {
+		this.mediator = mediator;
+		this.control = control;
+	}
+
+	public void run() {
+		// register thread
+		mediator.registerThread(this.hashCode(), "Thread");
+		mediator.setRunStatus("Created", this.hashCode());
+		// Set thread status to running
+		mediator.setRunStatus("Running", this.hashCode());
+		
+		// Run works from work list while works are present in work list
+		while (!((workList = mediator.getWorkSlice(control.getBlockSize())).isEmpty())) {
+			for( Work item : workList) {
+				mediator.setWorkStatus("Calculating", item);
+				item.work();
+				mediator.setWorkStatus("Done", item);
+				mediator.increaseCalculated(this.hashCode());
+			}
+		}
+		
+		// Set thread status to ended when worklist is empty
+		mediator.setRunStatus("Ended", this.hashCode());
+	}
+
+}
diff --git a/src/main/java/fi/utu/tech/threadrunner2/assignment/Task2UsingExecutorDistributor.java b/src/main/java/fi/utu/tech/threadrunner2/assignment/Task2UsingExecutorDistributor.java
index 8800c0d0170755ce323510056aec0696e0bc250a..1d1ba43237b368beb9badc794661a4c05de2f53b 100644
--- a/src/main/java/fi/utu/tech/threadrunner2/assignment/Task2UsingExecutorDistributor.java
+++ b/src/main/java/fi/utu/tech/threadrunner2/assignment/Task2UsingExecutorDistributor.java
@@ -2,16 +2,31 @@ package fi.utu.tech.threadrunner2.assignment;
 
 import fi.utu.tech.threadrunner2.mediator.ControlSet;
 import fi.utu.tech.threadrunner2.mediator.Mediator;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 public class Task2UsingExecutorDistributor implements Distributor {
-
+	
+	private Mediator mediator;
+	private ControlSet control;
 
 	public Task2UsingExecutorDistributor(Mediator mediator, ControlSet control) {
-
+		this.mediator = mediator;
+		this.control = control;		
 	}
 
 	public void execute() {
-
+		
+		// Create ExecutorService
+		ExecutorService executor = Executors.newFixedThreadPool(control.getThreadCount());
+		for (int i = 0; i<control.getThreadCount(); i++) {
+			// Create runnable and execute
+			MyRunnable worker = new MyRunnable(mediator, control);
+			executor.execute(worker);
+		}
+		
+		// Shut down executor to conserve memory
+		executor.shutdown();
 	}
 
 }