diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..d8e3e3ee170997d95bce4ca591a79b4e53c44236
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.project
+.classpath
+.settings/*
+bin/*
diff --git a/res/PM31_RGB_LED.png b/res/PM31_RGB_LED.png
new file mode 100644
index 0000000000000000000000000000000000000000..0b41b57258a19805ff63071ce49a250acfe0d6fa
Binary files /dev/null and b/res/PM31_RGB_LED.png differ
diff --git a/src/tec/letsgoing/ardublock/simulator/Simulator.java b/src/tec/letsgoing/ardublock/simulator/Simulator.java
new file mode 100644
index 0000000000000000000000000000000000000000..0e9e154354eaa1eb90f9e5af4281a477dc023c75
--- /dev/null
+++ b/src/tec/letsgoing/ardublock/simulator/Simulator.java
@@ -0,0 +1,145 @@
+/**
+ * 
+ */
+package tec.letsgoing.ardublock.simulator;
+
+import java.util.Vector;
+
+import tec.letsgoing.ardublock.simulator.arduino.Arduino;
+import tec.letsgoing.ardublock.simulator.arduino.Pin;
+import tec.letsgoing.ardublock.simulator.simcode.SimCode;
+import tec.letsgoing.ardublock.simulator.view.GUI;
+import tec.letsgoing.ardublock.simulator.view.modules.RGB;
+
+/**
+ * @author Lucas
+ *
+ */
+public class Simulator implements Runnable {
+	private static Simulator instance;
+	private GUI gui;
+	private Thread guiThread;
+	private Thread simuThread;
+	private Arduino arduino;
+	private Vector<SimCode> setupCode;
+	private Vector<SimCode> loopCode;
+	private Vector<SimCode> functionsCode;
+	
+	private volatile boolean stopFlag=false;
+	
+	private Simulator() {
+		System.out.println("Konstruktor");
+		createSubClasses();
+		
+		
+		guiThread = new Thread(gui);
+		guiThread.start();
+	}
+	
+	public static synchronized Simulator getInstance() {
+		if (instance==null) {
+			instance=new Simulator();
+		}
+		return instance;
+	}
+	
+	private boolean createSubClasses () {
+		gui=new GUI();
+		arduino=new Arduino();
+		gui.connectPins(arduino);
+		return true;
+	}
+	
+	
+	public void startSimu() {
+		simuThread = new Thread(this);
+		simuThread.start();
+	}
+	
+
+	@Override
+	public void run() {
+		int counter = 0;
+		while (!stopFlag) {
+			try {
+				Thread.sleep(500);
+			} catch (InterruptedException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			System.out.println("Thread");
+			arduino.digitalWrite(0, true);
+			if (counter==2) arduino.digitalWrite(1, true);
+			if (counter==3) arduino.digitalWrite(2, true);
+			if (counter==4) arduino.digitalWrite(1, false);
+				
+			counter++;
+		}
+	}
+	
+	
+	public void stopSimu() {
+		stopFlag=true;
+		gui.stopThread();
+		gui.dispose();
+	}
+	
+	//reload new code from Ardublock
+	public boolean reload() {
+		
+		return true;
+	}
+	
+	//Function to reset the Arduino in the Simulation
+	public boolean reset() {
+		
+		return true;
+	}
+	
+	public boolean setSetupCode(Vector<SimCode> _setupCode) {
+		setupCode=_setupCode;
+		return true;
+	}
+	
+	public boolean setLoopCode(Vector<SimCode> _loopCode) {
+		loopCode=_loopCode;
+		return true;
+	}
+	
+	public boolean setFunctionsCode(Vector<SimCode> _functionsCode) {
+		functionsCode=_functionsCode;
+		return true;
+	}
+	
+	
+	
+	
+
+	/**
+	 * @param args
+	 * @throws InterruptedException 
+	 */
+	public static void main(String[] args) throws InterruptedException {
+		// TODO Auto-generated method stub
+		
+		
+		
+		System.out.println("Main Entry");
+		Simulator simu = Simulator.getInstance();
+		simu.startSimu();
+		System.out.println("After Start");
+		Thread.sleep(5000);
+		System.out.println("Send Stop");
+		simu.stopSimu();
+		System.out.println("Stopped");
+		Thread.sleep(2000);
+		simu.startSimu();
+		Thread.sleep(1000);
+		simu.stopSimu();
+		
+		
+		
+
+	}
+
+}
diff --git a/src/tec/letsgoing/ardublock/simulator/arduino/Arduino.java b/src/tec/letsgoing/ardublock/simulator/arduino/Arduino.java
new file mode 100644
index 0000000000000000000000000000000000000000..e72490600eb5e324f06e6533b13edb295ba90b21
--- /dev/null
+++ b/src/tec/letsgoing/ardublock/simulator/arduino/Arduino.java
@@ -0,0 +1,78 @@
+/**
+ * 
+ */
+package tec.letsgoing.ardublock.simulator.arduino;
+
+import java.util.Vector;
+
+/**
+ * @author Lucas
+ *
+ */
+public class Arduino {
+	
+	private Vector<Variable> vars;
+	private Pin[] pins=new Pin[20];
+	
+	public Arduino () {
+		for (int i =0;i<20;i++) {
+			pins[i]=new Pin();
+		}
+	}
+	
+	public void createVariable(String _name,int _type, Object _value) {
+		//TODO search if Var ist already vorhanden
+		vars.add(new Variable(_name,_type));
+		vars.lastElement().setValue(_value);
+		
+	}
+	
+	public void setVariable(String _name, Object _value) {
+		for(Variable var:vars) {
+			if (var.getName()==_name) {
+				var.setValue(_value);
+				break;
+			}
+		}
+	}
+	
+	public Object readVariable(String _name) {
+		for(Variable var:vars) {
+			if (var.getName()==_name) {
+				return var.getValue();
+			}
+		}
+		return null;
+	}
+	
+	public boolean digitalWrite(int _pin, boolean _value) {
+		if (_value==true) pins[_pin].setValue(1023);
+		else pins[_pin].setValue(0);
+		return true;
+	}
+	
+	public boolean digitalRead(int _pin) {
+		if (pins[_pin].getValue()>=512) return true;
+		else return false;
+	}
+	//TODO Check Wie der Analogpin übergeben wird
+	public boolean analogWrite(int _pin,int _value) {
+		pins[_pin].setValue(_value);		
+		return true;
+	}
+	
+	public int analogRead(int _pin) {
+		return pins[_pin].getValue();
+	}
+	
+	public Pin getPin(int number) {
+		return pins[number];
+	}
+	
+	public boolean reset() {
+		vars=new Vector<Variable>();
+		pins=new Pin[20];
+		return true;
+	}
+
+}
diff --git a/src/tec/letsgoing/ardublock/simulator/arduino/Pin.java b/src/tec/letsgoing/ardublock/simulator/arduino/Pin.java
new file mode 100644
index 0000000000000000000000000000000000000000..3ad235ba986660c22d84409728b7606495619c58
--- /dev/null
+++ b/src/tec/letsgoing/ardublock/simulator/arduino/Pin.java
@@ -0,0 +1,52 @@
+/**
+ * 
+ */
+package tec.letsgoing.ardublock.simulator.arduino;
+
+import java.util.Observable;
+import java.util.Observer;
+
+/**
+ * @author Lucas
+ *
+ */
+public class Pin extends Observable implements Observer {
+	private int value=0;
+	private boolean mode=false; //false == Input, true==Output
+
+	@Override
+	public void update(Observable o, Object arg) {
+		// TODO Keine Funktionalität da noch kein Pinobjekt als Gegenstelle.
+//		System.out.println("Pin Update");
+//		System.out.println(arg);
+		//Set Variable direkt
+	}
+	
+	public void setMode(boolean _mode) {
+		mode=_mode;
+	}
+	
+	public boolean getMode() {
+		return mode;
+	}
+	
+	
+	public void setValue(int _value) {
+		if (_value>1023) _value=1023;
+		if (_value<0) _value=0;
+		value=_value;
+		this.setChanged();
+		this.notifyObservers();	
+	}
+	
+	public int getValue() {
+		return value;
+	}
+	
+	
+	
+	public void setObserver(Observer observ) {
+		this.addObserver(observ);
+	}
+
+}
diff --git a/src/tec/letsgoing/ardublock/simulator/arduino/Variable.java b/src/tec/letsgoing/ardublock/simulator/arduino/Variable.java
new file mode 100644
index 0000000000000000000000000000000000000000..d173669cfb8301376c2e7df6b83c32439f8109b1
--- /dev/null
+++ b/src/tec/letsgoing/ardublock/simulator/arduino/Variable.java
@@ -0,0 +1,40 @@
+/**
+ * 
+ */
+package tec.letsgoing.ardublock.simulator.arduino;
+
+/**
+ * @author Lucas
+ *
+ */
+public class Variable {
+	public static final int TYPE_INT=0;
+	public static final int TYPE_FLOAT=1;
+	public static final int TYPE_STRING=2;
+	
+	private String name;
+	private int type;
+	private Object value;
+	
+	public Variable(String _name,int _type) {
+		name=_name;
+		type=_type;
+	}
+	
+	public String getName() {
+		return name;
+	}
+	
+	public int getType() {
+		return type;
+	}
+	
+	public void setValue(Object _value) {
+		value=_value;
+	}
+	
+	public Object getValue() {
+		return value;
+	}
+
+}
diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/SimCode.java b/src/tec/letsgoing/ardublock/simulator/simcode/SimCode.java
new file mode 100644
index 0000000000000000000000000000000000000000..100c8ec107420e0614c115381092c7536f2a90c2
--- /dev/null
+++ b/src/tec/letsgoing/ardublock/simulator/simcode/SimCode.java
@@ -0,0 +1,18 @@
+/**
+ * 
+ */
+package tec.letsgoing.ardublock.simulator.simcode;
+
+import tec.letsgoing.ardublock.simulator.arduino.Arduino;
+
+/**
+ * @author Lucas
+ *
+ */
+public abstract class SimCode {
+	
+	public void run(Arduino ArduinoClass) {
+		
+	}
+
+}
diff --git a/src/tec/letsgoing/ardublock/simulator/view/GUI.java b/src/tec/letsgoing/ardublock/simulator/view/GUI.java
new file mode 100644
index 0000000000000000000000000000000000000000..7ae24f297f712335519779a0bd138d2e8a3b8322
--- /dev/null
+++ b/src/tec/letsgoing/ardublock/simulator/view/GUI.java
@@ -0,0 +1,94 @@
+/**
+ * 
+ */
+package tec.letsgoing.ardublock.simulator.view;
+
+import java.awt.BorderLayout;
+import java.awt.Container;
+import java.util.Vector;
+
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.text.DefaultCaret;
+
+import tec.letsgoing.ardublock.simulator.arduino.Arduino;
+import tec.letsgoing.ardublock.simulator.view.modules.ArduinoUno;
+import tec.letsgoing.ardublock.simulator.view.modules.Button;
+import tec.letsgoing.ardublock.simulator.view.modules.Modul;
+import tec.letsgoing.ardublock.simulator.view.modules.Poti;
+import tec.letsgoing.ardublock.simulator.view.modules.RGB;
+
+/**
+ * @author Lucas
+ *
+ */
+public class GUI extends JFrame implements Runnable{
+	private Vector<String> serialprint;
+	private Modul[] modules= new Modul[4];
+	private volatile boolean stopFlag=false;
+	private JTextArea serialLog=new JTextArea();
+	
+	public GUI() {
+		super();
+		//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+		Container pane= this.getContentPane();
+		JScrollPane scrollPane = new JScrollPane(serialLog);
+		DefaultCaret caret = (DefaultCaret)serialLog.getCaret();
+		caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
+		serialLog.setSize(20, 20);
+		serialLog.setRows(5);
+		serialLog.setAutoscrolls(true);
+		for (int i =0;i<105;i++) {
+			serialLog.append(Integer.toString(i)+"\n");
+		}
+		
+		
+		pane.add(new JButton("Center"),BorderLayout.CENTER);
+		pane.add(new JButton("Line End"),BorderLayout.LINE_END);
+		pane.add(scrollPane,BorderLayout.PAGE_END);
+		this.setSize(400, 300);
+		this.setVisible(true);
+		
+		modules[0]= new RGB();
+		modules[1]= new Button();
+		modules[2]= new Poti();
+		modules[3]= new ArduinoUno();
+	}
+	
+	@Override
+	public void run() {
+		while (!stopFlag) {
+			System.out.println("Gui");
+			super.repaint();
+			try {
+				Thread.sleep(500);
+			} catch (InterruptedException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	public boolean serialPrint(String Content) {
+		serialprint.add(Content);
+		if (serialprint.size()>100) {
+			serialprint.remove(0);
+		}
+		
+		return true;
+	}
+	
+	public boolean connectPins(Arduino arduino) {
+		for (Modul modul:modules) {
+			modul.connect(arduino);
+		}
+		return true;
+	}
+	
+	public void stopThread() {
+		stopFlag=true;
+	}
+	
+}
diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/ArduinoUno.java b/src/tec/letsgoing/ardublock/simulator/view/modules/ArduinoUno.java
new file mode 100644
index 0000000000000000000000000000000000000000..322010c3c7b327fdb91d5da5de6a694e3356903d
--- /dev/null
+++ b/src/tec/letsgoing/ardublock/simulator/view/modules/ArduinoUno.java
@@ -0,0 +1,26 @@
+/**
+ * 
+ */
+package tec.letsgoing.ardublock.simulator.view.modules;
+
+import java.util.Observable;
+
+import tec.letsgoing.ardublock.simulator.arduino.Arduino;
+import tec.letsgoing.ardublock.simulator.arduino.Pin;
+
+/**
+ * @author Lucas
+ *
+ */
+public class ArduinoUno extends Modul {
+
+public void updateModul(Pin arg0) {
+		
+	}
+
+public boolean connect(Arduino arduino) {
+	
+	return true;
+}
+
+}
diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/Button.java b/src/tec/letsgoing/ardublock/simulator/view/modules/Button.java
new file mode 100644
index 0000000000000000000000000000000000000000..f3b49775840524fd7314ebaa98705c2c8b3b9ca4
--- /dev/null
+++ b/src/tec/letsgoing/ardublock/simulator/view/modules/Button.java
@@ -0,0 +1,26 @@
+/**
+ * 
+ */
+package tec.letsgoing.ardublock.simulator.view.modules;
+
+import java.util.Observable;
+
+import tec.letsgoing.ardublock.simulator.arduino.Arduino;
+import tec.letsgoing.ardublock.simulator.arduino.Pin;
+
+/**
+ * @author Lucas
+ *
+ */
+public class Button extends Modul {
+
+public void updateModul(Pin pin) {
+		
+	}
+
+public boolean connect(Arduino arduino) {
+	
+	return true;
+}
+
+}
diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/Modul.java b/src/tec/letsgoing/ardublock/simulator/view/modules/Modul.java
new file mode 100644
index 0000000000000000000000000000000000000000..a1b496c5485426e85356d4126e1d7290d74a9d20
--- /dev/null
+++ b/src/tec/letsgoing/ardublock/simulator/view/modules/Modul.java
@@ -0,0 +1,69 @@
+/**
+ * 
+ */
+package tec.letsgoing.ardublock.simulator.view.modules;
+
+import java.awt.Point;
+import java.util.Observable;
+import java.util.Observer;
+import java.util.Vector;
+
+import javax.swing.JLayeredPane;
+
+import tec.letsgoing.ardublock.simulator.arduino.Arduino;
+import tec.letsgoing.ardublock.simulator.arduino.Pin;
+
+/**
+ * @author Lucas
+ *
+ */
+public abstract class Modul extends Observable implements Observer{
+	private boolean active;
+	private Point position;
+	protected Vector<Pin> pins=new Vector<Pin>();
+	protected JLayeredPane layerpane;
+	
+	public void setState(boolean State) {
+		active=State;
+	}
+	
+	public boolean getState() {
+		return active;
+	}
+	
+	public void setPosition(Point Position) {
+		position=Position;
+	}
+	
+	public Point getPosition() {
+		return position;
+	}
+	
+	public void update(Observable arg0, Object arg1) {
+		System.out.println("Update");
+		if (arg0 instanceof Pin) {
+			System.out.println("is Pin");
+			for (Pin p:pins) {
+				if (p==(Pin)arg0) updateModul((Pin)arg0);
+			}
+		}
+	}
+	
+	public abstract void updateModul(Pin pin);
+	
+	public void addPin(Pin _pin) {
+		pins.add(_pin);
+	}
+	
+	public JLayeredPane getPane() {
+		return layerpane;
+	}
+	
+	public abstract boolean connect(Arduino arduino);
+	
+	
+	
+	
+	
+
+}
diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/Poti.java b/src/tec/letsgoing/ardublock/simulator/view/modules/Poti.java
new file mode 100644
index 0000000000000000000000000000000000000000..0e259432c6be6dc098bc0914d8c469ed26941829
--- /dev/null
+++ b/src/tec/letsgoing/ardublock/simulator/view/modules/Poti.java
@@ -0,0 +1,25 @@
+/**
+ * 
+ */
+package tec.letsgoing.ardublock.simulator.view.modules;
+
+import java.util.Observable;
+
+import tec.letsgoing.ardublock.simulator.arduino.Arduino;
+import tec.letsgoing.ardublock.simulator.arduino.Pin;
+
+/**
+ * @author Lucas
+ *
+ */
+public class Poti extends Modul {
+
+public void updateModul(Pin arg0) {
+		
+	}
+
+public boolean connect(Arduino arduino) {
+	
+	return true;
+}
+}
diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/RGB.java b/src/tec/letsgoing/ardublock/simulator/view/modules/RGB.java
new file mode 100644
index 0000000000000000000000000000000000000000..93922e74edd56693116352f395f7688151423427
--- /dev/null
+++ b/src/tec/letsgoing/ardublock/simulator/view/modules/RGB.java
@@ -0,0 +1,52 @@
+/**
+ * 
+ */
+package tec.letsgoing.ardublock.simulator.view.modules;
+
+import java.util.Observable;
+import java.util.Observer;
+
+import tec.letsgoing.ardublock.simulator.arduino.Arduino;
+import tec.letsgoing.ardublock.simulator.arduino.Pin;
+
+/**
+ * @author Lucas
+ *
+ */
+public class RGB extends Modul {
+	private int redValue=0;
+	private int blueValue=0;
+	private int greenValue=0;
+
+	
+	public void setObserver(Observer observ) {
+		this.addObserver(observ);
+	}
+	
+	
+	
+	public void updateModul(Pin pin) {
+		if (pin==pins.get(0)) redValue=pin.getValue();
+		if (pin==pins.get(1)) blueValue=pin.getValue();
+		if (pin==pins.get(2)) greenValue=pin.getValue();
+		System.out.println("New Values: "+redValue+" "+blueValue+" "+greenValue);
+	}
+	
+	public boolean connect(Arduino arduino) {
+		System.out.println("Connected RGB");
+		Pin tmpPin=arduino.getPin(0);
+		this.addPin(tmpPin);
+		tmpPin.setObserver(this);
+		
+		tmpPin=arduino.getPin(1);
+		this.addPin(tmpPin);
+		tmpPin.setObserver(this);
+		
+		tmpPin=arduino.getPin(2);
+		this.addPin(tmpPin);
+		tmpPin.setObserver(this);
+	
+		return true;
+	}
+
+}