diff --git a/VerteilteSysteme-Examples/build/RMIEchoServer.jar b/VerteilteSysteme-Examples/build/RMIEchoServer.jar
index 851a951d10161484f736fd11cf82b7c49f6ae913..ca48150d87fec478f775191f4151bcd212ffc32f 100644
Binary files a/VerteilteSysteme-Examples/build/RMIEchoServer.jar and b/VerteilteSysteme-Examples/build/RMIEchoServer.jar differ
diff --git a/VerteilteSysteme-Examples/build/RMIMandelbrotCalculationsServer.jar b/VerteilteSysteme-Examples/build/RMIMandelbrotCalculationsServer.jar
index 6f0a37f7bfa11d7e0ed52e4affe0779c7bddd681..495fe5a81155859038093ed626faa8c81f6b9c8d 100644
Binary files a/VerteilteSysteme-Examples/build/RMIMandelbrotCalculationsServer.jar and b/VerteilteSysteme-Examples/build/RMIMandelbrotCalculationsServer.jar differ
diff --git a/VerteilteSysteme-Examples/build/TCPPerfServer.jar b/VerteilteSysteme-Examples/build/TCPPerfServer.jar
index 4898508e7314cd9ebac8d13388272d30ca5612a6..2259a07cad1378c0a402911449ad92233ad83a66 100644
Binary files a/VerteilteSysteme-Examples/build/TCPPerfServer.jar and b/VerteilteSysteme-Examples/build/TCPPerfServer.jar differ
diff --git a/VerteilteSysteme-Examples/build/TCPServer.jar b/VerteilteSysteme-Examples/build/TCPServer.jar
index 843fa591589fde03fdc7fd3442ec6bea110b4322..870945195399dc4f86df6e7f32ea81b2dc1b1bda 100644
Binary files a/VerteilteSysteme-Examples/build/TCPServer.jar and b/VerteilteSysteme-Examples/build/TCPServer.jar differ
diff --git a/VerteilteSysteme-Examples/build/TCPServerMulti.jar b/VerteilteSysteme-Examples/build/TCPServerMulti.jar
index e45870968ed369400f60dc87af455d26097af74c..fbcc208b233ef2bdc1ccd8add86bc9c29317e493 100644
Binary files a/VerteilteSysteme-Examples/build/TCPServerMulti.jar and b/VerteilteSysteme-Examples/build/TCPServerMulti.jar differ
diff --git a/VerteilteSysteme-Examples/build/TCPTimeCounterRESTServer.jar b/VerteilteSysteme-Examples/build/TCPTimeCounterRESTServer.jar
index ad191139d25f469f7ce905336077da274eea5f0b..11e2f04ebd7390e5ccb51c396d6d74e85f9afd00 100644
Binary files a/VerteilteSysteme-Examples/build/TCPTimeCounterRESTServer.jar and b/VerteilteSysteme-Examples/build/TCPTimeCounterRESTServer.jar differ
diff --git a/VerteilteSysteme-Examples/build/TCPTimeCounterServer.jar b/VerteilteSysteme-Examples/build/TCPTimeCounterServer.jar
index 7e64a4fa5632b3f18fa00a1c2419a16b286f9eb9..085f00f8498aa845e48be044943e913bee7519d4 100644
Binary files a/VerteilteSysteme-Examples/build/TCPTimeCounterServer.jar and b/VerteilteSysteme-Examples/build/TCPTimeCounterServer.jar differ
diff --git a/VerteilteSysteme-Examples/build/UDPServer.jar b/VerteilteSysteme-Examples/build/UDPServer.jar
index 035b29dc499958e29a66fa8e2ac0f7389f49373f..2cd8ced683411398ed1f00cad3bd9dec51a754a1 100644
Binary files a/VerteilteSysteme-Examples/build/UDPServer.jar and b/VerteilteSysteme-Examples/build/UDPServer.jar differ
diff --git a/VerteilteSysteme-Examples/build/UDPServerMulti.jar b/VerteilteSysteme-Examples/build/UDPServerMulti.jar
index 98455f9a6e3bc0cd12cca286b84aaa11efa22e05..35805dbd443ac815c09aae6b5cd3e0b41d0f9f2d 100644
Binary files a/VerteilteSysteme-Examples/build/UDPServerMulti.jar and b/VerteilteSysteme-Examples/build/UDPServerMulti.jar differ
diff --git a/VerteilteSysteme-Examples/build/UDPTimeCounterServer.jar b/VerteilteSysteme-Examples/build/UDPTimeCounterServer.jar
index 721a20f781171a1e0ffbda856301285ef0afae28..95fdf25244a8b197cde5e69cf6ce5548832a5947 100644
Binary files a/VerteilteSysteme-Examples/build/UDPTimeCounterServer.jar and b/VerteilteSysteme-Examples/build/UDPTimeCounterServer.jar differ
diff --git a/VerteilteSysteme-Examples/src/verteiltesysteme/aws/TCPTimeCounterRESTServer.java b/VerteilteSysteme-Examples/src/verteiltesysteme/aws/TCPTimeCounterRESTServer.java
index 894f966a68d73442fa59c6b7e01bbfe6c277188e..5e71b6adfe7f60d764048f811b6d3141adbc159d 100644
--- a/VerteilteSysteme-Examples/src/verteiltesysteme/aws/TCPTimeCounterRESTServer.java
+++ b/VerteilteSysteme-Examples/src/verteiltesysteme/aws/TCPTimeCounterRESTServer.java
@@ -1,32 +1,52 @@
 /* Beispiel angelehnt an http://www.torsten-horn.de/techdocs/jee-rest.htm */
 package verteiltesysteme.aws;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.PrintStream;
 import java.net.URI;
+
+import org.glassfish.grizzly.http.server.ErrorPageGenerator;
 import org.glassfish.grizzly.http.server.HttpServer;
+import org.glassfish.grizzly.http.server.Request;
 import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
 import org.glassfish.jersey.server.ResourceConfig;
 
-public class TCPTimeCounterRESTServer
-{
-   public static void main( String[] args ) throws IOException, InterruptedException 
-   {
-      String baseUrl = ( args.length > 0 ) ? args[0] : "http://0.0.0.0:36042";
-
-      final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(
-            URI.create( baseUrl ), new ResourceConfig( TCPTimeCounterRESTService.class ), false );
-      Runtime.getRuntime().addShutdownHook( new Thread( new Runnable() {
-         @Override
-         public void run() {
-            server.shutdownNow();
-         }
-      } ) );
-      server.start();
-
-      System.out.println("Grizzly-HTTP-Server gestartet");
-      System.out.println("Stoppen des Grizzly-HTTP-Servers mit: Strg+C\n");
-      System.out.println("RESTful Web Service URL: " + baseUrl + TCPTimeCounterRESTService.webContextPath);
-
-      Thread.currentThread().join();
-   }
+public class TCPTimeCounterRESTServer {
+	public static void main(String[] args) throws IOException, InterruptedException {
+		String baseUrl = (args.length > 0) ? args[0] : "http://0.0.0.0:36042";
+
+		final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(baseUrl),
+				new ResourceConfig(TCPTimeCounterRESTService.class), false);
+		Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
+			@Override
+			public void run() {
+				server.shutdownNow();
+			}
+		}));
+
+		ErrorPageGenerator epg = new ErrorPageGenerator() {
+			@Override
+			public String generate(Request request, int status, String reasonPhrase, String description,
+					Throwable exception) {
+				StringBuilder sb = new StringBuilder();
+				ByteArrayOutputStream baos = new ByteArrayOutputStream();
+				PrintStream ps = new PrintStream(baos);
+				exception.printStackTrace(ps);
+				ps.close();
+				sb.append(new String(baos.toByteArray()));
+				System.out.println(sb.toString());
+				return sb.toString();
+			}
+		};
+		server.getServerConfiguration().setDefaultErrorPageGenerator(epg);
+
+		server.start();
+
+		System.out.println("Grizzly-HTTP-Server gestartet");
+		System.out.println("Stoppen des Grizzly-HTTP-Servers mit: Strg+C\n");
+		System.out.println("RESTful Web Service URL: " + baseUrl + TCPTimeCounterRESTService.webContextPath);
+
+		Thread.currentThread().join();
+	}
 }
\ No newline at end of file
diff --git a/VerteilteSysteme-Examples/src/verteiltesysteme/aws/TCPTimeCounterRESTService.java b/VerteilteSysteme-Examples/src/verteiltesysteme/aws/TCPTimeCounterRESTService.java
index 00f4e0ce587f0336e2e7918a8fc3a9f04e0b59ed..deba8fdd361ab9b08d35d416bdb63cb9c83e28f7 100644
--- a/VerteilteSysteme-Examples/src/verteiltesysteme/aws/TCPTimeCounterRESTService.java
+++ b/VerteilteSysteme-Examples/src/verteiltesysteme/aws/TCPTimeCounterRESTService.java
@@ -14,18 +14,15 @@ public class TCPTimeCounterRESTService {
 	static final String bucketName = "vertsys-counter";
 	static final String bucketRegion = "eu-central-1";
 
-	static final String dnsNameELB = "cloudcomp-loadbalancer-1492513132.eu-central-1.elb.amazonaws.com";
-	static final int portELBTarget = 36042;
-
 	private Long getCounter() {
 		// Verbindung zu S3
-		AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
+		AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion(bucketRegion).build();
 		return new Long(s3Client.getObjectAsString(bucketName, bucketRegion));
 	}
 
 	private boolean setCounter(Long counter) {
 		// Verbindung zu S3
-		AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
+		AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion(bucketRegion).build();
 		s3Client.putObject(bucketName, bucketRegion, new Long(counter).toString());
 		return true;
 	}
@@ -41,8 +38,11 @@ public class TCPTimeCounterRESTService {
 	public String getCounterHtml() {
 		return "<html><head><title>TCPTimeCounter REST Service</title>" +
 				"<meta http-equiv=\"refresh\" content=\"5\"/></head><body>" +
-				"<h2>Cloud Computing HS Fulda - TCPTimeCounter REST Service</h2>"+
-				"<p><b>HTML-Output:</b> " + getCounter() + "</p></body></html>";
+				"<h2>HS Fulda - TCPTimeCounter REST Service</h2>"+
+				"<p><b>HTML-Output:</b> " + getCounter() + "</p></body>"+
+				"<form method=POST action=\"/counter\">" +
+				"<input type=\"hidden\" name=\"input\" value=\"1\">"+
+				"<input type=\"submit\" value=\"Increment\"></form></body></html>";
 	}
 
 	@GET
@@ -68,12 +68,13 @@ public class TCPTimeCounterRESTService {
 		Long currentCounterValue = getCounter();
 		currentCounterValue = currentCounterValue + (new Long(input)).longValue();
 		setCounter(currentCounterValue);
-		return "<html><head><title>TCPTimeCounter REST Service</title></head></body>" +
-				"<h2>Cloud Computing HS Fulda - TCPTimeCounter REST Service</h2>" +
-				"<p><b>HTML-Output:</b> counter increased by " +
-				input + " to " + currentCounterValue + "</p>" +
-				"<form method=POST action=\"http://" + dnsNameELB + ":" + portELBTarget + webContextPath +"\">" +
-				"<input name=\"input\" value=\"\"></form></body></html>";
+		return "<html><head><title>TCPTimeCounter REST Service</title>" +
+			"<meta http-equiv=\"refresh\" content=\"5\"/></head><body>" +
+			"<h2>HS Fulda - TCPTimeCounter REST Service</h2>"+
+			"<p><b>HTML-Output:</b> " + getCounter() + "</p></body>"+
+			"<form method=POST action=\"/counter\">" +
+			"<input type=\"hidden\" name=\"input\" value=\"1\">"+
+			"<input type=\"submit\" value=\"Increment\"></form></body></html>";
 	}
 
 	@POST
diff --git a/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/MGuiRMI.java b/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/MGuiRMI.java
index 2b3a7f155cabd883d05556e72ab00af19fe87b40..83be002d3b2e10e1caad69182c4ed698722d9cf9 100644
--- a/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/MGuiRMI.java
+++ b/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/MGuiRMI.java
@@ -31,282 +31,402 @@ import javax.swing.event.ChangeListener;
 
 class MyJLabel extends JLabel {
 
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -7750935382747799343L;
-
-	int boxULx, boxULy, boxW, boxH;
-
-	MyJLabel() {
-		super();
-	}
-
-	MyJLabel(String s) {
-		super(s);
-	}
-
-	void setBox(int boxULx, int boxULy, int boxW, int boxH) {
-		this.boxULx = boxULx;
-		this.boxULy = boxULy;
-		this.boxW = boxW;
-		this.boxH = boxH;
-	}
-
-	@Override
-	protected void paintComponent(Graphics g) {
-		super.paintComponent(g);
-		g.setColor(Color.black);
-		g.drawRect(this.boxULx, this.boxULy, this.boxW, this.boxH);
-	}
+  /**
+   *
+   */
+  private static final long serialVersionUID = -7750935382747799343L;
+
+  int boxULx, boxULy, boxW, boxH;
+
+  MyJLabel() {
+    super();
+  }
+
+  MyJLabel(String s) {
+    super(s);
+  }
+
+  void setBox(int boxULx, int boxULy, int boxW, int boxH) {
+    this.boxULx = boxULx;
+    this.boxULy = boxULy;
+    this.boxW = boxW;
+    this.boxH = boxH;
+  }
+
+  @Override
+  protected void paintComponent(Graphics g) {
+    super.paintComponent(g);
+    g.setColor(Color.black);
+    g.drawRect(this.boxULx, this.boxULy, this.boxW, this.boxH);
+  }
 
 }
 
-public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, MouseMotionListener {
-
-	// GUI elements
-	JFrame frame;
-	JPanel panel;
-	JButton endButton;
-	JButton backButton;
-	JButton calcButton;
-	JTextField hostTextField;
-	JSlider maxIterations;
+class RMIMandelbrotCalculationThread extends Thread {
 	MyJLabel view;
-	JLabel message;
-	int nrIterations;
-
-	// box management
-	int boxULx, boxULy, boxW, boxH;
-	boolean dragging = false;
-
-	// this one does all the calculating work
 	RMIMandelbrotCalculationsInterface remoteCalcObj;
-
-	// how many points in the image?
-	// change if you want a higher resolution
+	int boxULx, boxULy, boxW, boxH;
 	public static int RESX = 600;
 	public static int RESY = 600;
-
-	MGuiRMI() {
-		// set up GUI
-		this.frame = new JFrame("Mandelbrotmenge");
-		this.panel = new JPanel();
-		this.endButton = new JButton("Ende");
-		this.panel.add(this.endButton);
-		this.backButton = new JButton("Zur�ck");
-		this.panel.add(this.backButton);
-		this.calcButton = new JButton("Rechnen");
-		this.hostTextField = new JTextField(20);
-		this.hostTextField.setText("localhost");
-		this.panel.add(this.calcButton);
-		this.panel.add(this.hostTextField);
-		this.frame.add(this.panel);
-		this.frame.setSize(700, 720);
-		this.frame.setVisible(true);
-		this.view = new MyJLabel();
-		this.maxIterations = new JSlider(0, 50, 30);
-		this.panel.add(this.maxIterations);
-		this.panel.add(this.view);
-		this.message = new JLabel("Status");
-		this.message.setBorder(new BevelBorder(BevelBorder.LOWERED));
-		this.frame.add(this.message,BorderLayout.SOUTH);
-
-		this.endButton.addActionListener(this);
-		this.backButton.addActionListener(this);
-		this.calcButton.addActionListener(this);
-		this.maxIterations.addChangeListener(this);
-
-		this.maxIterations.setMajorTickSpacing(10);
-		this.maxIterations.setPaintTicks(true);
-		this.maxIterations.setPaintLabels(true);
-
-		this.view.addMouseListener(this);
-		this.view.addMouseMotionListener(this);
-
-		this.boxULx = 0;
-		this.boxULy = 0;
-		this.boxW = MGuiRMI.RESX;
-		this.boxH = MGuiRMI.RESY;
-		
-		this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
-		// Non-Gui stuff
-		this.nrIterations = 1000;
-	}
-
-	// visualization related stuff, do not touch!
-	int[] generateLookupTable(int nrHues) {
-		int[] tmp = new int[nrHues + 1];
-		int cycle = 2048;
-		for (int i = 0; i < nrHues; i++) {
-			float hue = 1 * ((float) (i % cycle)) / cycle/* ((float)nrHues) */ ;
-			tmp[i] = Color.HSBtoRGB(hue, 0.8f, 1.0f);
-		}
-		tmp[0] = Color.HSBtoRGB(0f, 1.0f, 0.0f);
-		return tmp;
-	}
-
-	// visualization
-	static void applyLookupTable(int[] data, int[] dest, int[] lookupTable) {
-		for (int i = 0; i < data.length; i++) {
-			dest[i] = lookupTable[data[i]];
-		}
-	}
-
-	// here we check what the buttons do
-	public void actionPerformed(ActionEvent ae) {
-		if (ae.getSource() == this.endButton) {
-			System.out.println("Ende");
-			System.exit(0);
-		} else
-
-		if (ae.getSource() == this.backButton) {
-			System.out.println("Zurueck");
-			// Zoom und Ausschnitt zur�cksetzen
-			double ULx = -0.16099999999999995;
-			double ULy = -0.9365333333333333;
-			double LRx = -0.03533333333333327;
-			double LRy = -0.8108666666666666;
-			this.boxULx = 0;
-			this.boxULy = 0;
-			this.boxW = MGuiRMI.RESX;
-			this.boxH = MGuiRMI.RESY;
-			this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH);
-			this.view.repaint();
-			if (this.remoteCalcObj == null)
+	Boolean upperPart;
+	int maxIterations;
+
+	RMIMandelbrotCalculationThread(Boolean upperPart, MyJLabel view, RMIMandelbrotCalculationsInterface remoteCalcObj, int maxIterations) {
+        this.view = view;
+        this.remoteCalcObj = remoteCalcObj;
+        this.upperPart = upperPart;
+        this.maxIterations = maxIterations;
+    }
+	
+	  // visualization related stuff, do not touch!
+	  int[] generateLookupTable(int nrHues) {
+	    int[] tmp = new int[nrHues + 1];
+	    int cycle = 2048;
+	    for (int i = 0; i < nrHues; i++) {
+	      float hue = 1 * ((float) (i % cycle)) / cycle/* ((float)nrHues) */ ;
+	      tmp[i] = Color.HSBtoRGB(hue, 0.8f, 1.0f);
+	    }
+	    tmp[0] = Color.HSBtoRGB(0f, 1.0f, 0.0f);
+	    return tmp;
+	  }
+
+    public void run() {
+        try {
+            long timestampStart = System.currentTimeMillis();
+        	
+        	double ULx = this.remoteCalcObj.getULx();
+			double ULy = this.remoteCalcObj.getULy();
+			double LRx = this.remoteCalcObj.getLRx();
+			double LRy = this.remoteCalcObj.getLRy();
+			System.out.println("actual="+ULx + "/" + ULy + "/" + LRx + "/" + LRy);
+			double w = LRx - ULx;
+			double h = LRy - ULy;
+			// AG change define box such that it contains only upper half of apple man :-)
+			if (this.upperPart == true)
 			{
-				String message = "Fehler: noch nicht verbunden, noch keine Berechnung durchgef�hrt";
-				this.message.setText(message);
-				System.out.println(message);
+				boxULx = 0 ; boxULy = 0; boxW = MGuiRMI.RESX ; boxH = MGuiRMI.RESY/2;
 			}
 			else
 			{
-				try {
-					this.remoteCalcObj.setView(ULx, ULy, LRx, LRy);
-				} catch (RemoteException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
-				}
-				this.message.setText("Ausschnitt zur�ckgesetzt");
-			}
-		} else
-
-		if (ae.getSource() == this.calcButton) {
-			String hostname = this.hostTextField.getText();
-			System.out.println("Verbinde mit RMI Registry auf Host: " + hostname);
-			try {
-				Registry registry = LocateRegistry.getRegistry(hostname);
-				this.remoteCalcObj = (RMIMandelbrotCalculationsInterface) registry.lookup("RMIMandelbrotCalculationsInterface");
-				System.out.println("Rechnen");
-				long timestampStart = System.currentTimeMillis();
-
-				//this.boxW = this.boxW / 2;
-				//MGuiRMI.RESX = MGuiRMI.RESX / 2;
-				
-				double ULx = 0;
-				double ULy = 0;
-				double LRx = 0;
-				double LRy = 0;
-
-				ULx = this.remoteCalcObj.getULx();
-				ULy = this.remoteCalcObj.getULy();
-				LRx = this.remoteCalcObj.getLRx();
-				LRy = this.remoteCalcObj.getLRy();
-
-				double w = LRx - ULx;
-				double h = LRy - ULy;
-				ULx = ULx + w * this.boxULx / (double) MGuiRMI.RESX;
-				ULy = ULy + h * this.boxULy / (double) MGuiRMI.RESY;
-				w *= this.boxW / (double) (RESX);
-				h *= this.boxH / (double) (RESX);
-				LRx = ULx + w;
-				LRy = ULy + h;
-				System.out.println(ULx + "/" + ULy + "/" + LRx + "/" + LRy);
-				this.boxULx = 0;
-				this.boxULy = 0;
-				this.boxW = MGuiRMI.RESX;
-				this.boxH = MGuiRMI.RESY;
-				int[] colors = null;
-
-				//this.remoteCalcObj.setView(ULx, ULy, LRx, LRy);
-				this.remoteCalcObj.setView(ULx, ULy, LRx, LRy);
-				this.remoteCalcObj.iterateAllPoints(this.maxIterations.getValue() * 1000, MGuiRMI.RESX, MGuiRMI.RESY);
-				int[] lookupTable = generateLookupTable(this.maxIterations.getValue() * 1000);
-				colors = new int[MGuiRMI.RESX * MGuiRMI.RESY];
-				MGuiRMI.applyLookupTable(remoteCalcObj.getResult(), colors, lookupTable);
-
-				BufferedImage colorImage = new BufferedImage(MGuiRMI.RESX, MGuiRMI.RESY, BufferedImage.TYPE_INT_ARGB);
-				colorImage.setRGB(0, 0, MGuiRMI.RESX, MGuiRMI.RESY, colors, 0, MGuiRMI.RESX);
-				this.view.setIcon(new ImageIcon(colorImage));
-
-				this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH);
-				this.view.repaint();
-
-				long timestampEnd = System.currentTimeMillis();
-
-				String timeElapsed = "Dauer: " + ((timestampEnd - timestampStart) / 1000.0) + " sec";
-				System.out.println(timeElapsed);
-				this.message.setText(timeElapsed);
-			} catch (RemoteException | NotBoundException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
+			    // for lower half:
+			    boxULx = 0 ; boxULy = RESY/2; boxW = RESX ; boxH = RESY/2;
 			}
 
-		}
-	}
-
-	public void mousePressed(MouseEvent e) {
-		this.boxULx = e.getX();
-		this.boxULy = e.getY();
-		this.boxW = 1;
-		this.boxH = 1;
-		this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH);
-		this.message.setText("boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH);
-	}
-
-	public void mouseDragged(MouseEvent e) {
-		this.boxW = e.getX() - this.boxULx + 1;
-		this.boxH = e.getY() - this.boxULy + 1;
-		int m = Math.min(boxW, boxH);
-		this.boxW = m;
-		this.boxH = m;
-		this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH);
-		this.message.setText("boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH);
-		this.view.repaint();
-	}
-
-	public void mouseReleased(MouseEvent e) {
-
-		if (e.getButton() == MouseEvent.BUTTON1) {
-			this.view.repaint();
-			this.message.setText("Gesetzt: boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH);
-		}
-	}
 
-	public void mouseMoved(MouseEvent e) {
-	}
+			ULx = ULx + w * this.boxULx / (double) MGuiRMI.RESX;
+			ULy = ULy + h * this.boxULy / (double) MGuiRMI.RESY;
+			w *= this.boxW / (double) (RESX);
+			h *= this.boxH / (double) (RESY);
+			LRx = ULx + w;
+			LRy = ULy + h;
+			System.out.println("computed="+ULx + "/" + ULy + "/" + LRx + "/" + LRy);
+			this.boxULx = 0;
+			this.boxULy = 0;
+			this.boxW = MGuiRMI.RESX;
+			this.boxH = MGuiRMI.RESY;
+			this.remoteCalcObj.setView(ULx, ULy, LRx, LRy);
+			// end alex
+			  int[] colors = null;
+
+
+			  this.remoteCalcObj.iterateAllPoints(this.maxIterations * 1000, MGuiRMI.RESX, MGuiRMI.RESY/2);
+
+			  /*
+			  int[] lookupTable = generateLookupTable(this.maxIterations.getValue() * 1000);
+			  colors = new int[MGuiRMI.RESX * MGuiRMI.RESY];
+			  MGuiRMI.applyLookupTable(remoteCalcObj.getResult(), colors, lookupTable);
+
+			  BufferedImage colorImage = new BufferedImage(MGuiRMI.RESX, MGuiRMI.RESY, BufferedImage.TYPE_INT_ARGB);
+			  colorImage.setRGB(0, 0, MGuiRMI.RESX, MGuiRMI.RESY, colors, 0, MGuiRMI.RESX);
+			  this.view.setIcon(new ImageIcon(colorImage));
+
+			  this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH);
+			  this.view.repaint();
 
-	public void mouseExited(MouseEvent e) {
-	}
+			  long timestampEnd = System.currentTimeMillis();
 
-	public void mouseEntered(MouseEvent e) {
-	}
+			  String timeElapsed = "Dauer: " + ((timestampEnd - timestampStart) / 1000.0) + " sec";
+			  System.out.println(timeElapsed);
+			  this.message.setText(timeElapsed);
+			  * */
 
-	public void mouseClicked(MouseEvent e) {
-	}
+			  int[] lookupTable = generateLookupTable(this.maxIterations * 1000);
+			colors = new int[MGuiRMI.RESX * MGuiRMI.RESY/2];
+			MGuiRMI.applyLookupTable(remoteCalcObj.getResult(), colors, lookupTable);
 
-	// process a new slider value
-	public void stateChanged(ChangeEvent ce) {
-		if (ce.getSource() == this.maxIterations) {
-			// System.out.println("Neuer Wert");
-			this.nrIterations = this.maxIterations.getValue() * 1000;
+			BufferedImage colorImage = new BufferedImage(MGuiRMI.RESX, MGuiRMI.RESY/2, BufferedImage.TYPE_INT_ARGB);
+			colorImage.setRGB(0, 0, MGuiRMI.RESX, MGuiRMI.RESY/2, colors, 0, MGuiRMI.RESX);
+			this.view.setIcon(new ImageIcon(colorImage));
+			
+		      long timestampEnd = System.currentTimeMillis();
+	
+		      String timeElapsed = "Zeit: " + ((timestampEnd - timestampStart) / 1000.0) + " sec";
+		      System.out.println(timeElapsed);
+		      //this.view.setText(timeElapsed);
+
+		} catch (RemoteException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
 		}
-	}
+    }
+}
+
+public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, MouseMotionListener {
 
-	// main, just instantiate an MGui object, gives control to the Gui
-	public static void main(String[] args) {
-		@SuppressWarnings("unused")
-		MGuiRMI gui = new MGuiRMI();
-	}
+  // GUI elements
+  JFrame frame;
+  JPanel panel;
+  JButton endButton;
+  JButton backButton;
+  JButton calcButton;
+  JTextField hostTextField;
+  JSlider maxIterations;
+  MyJLabel viewUpper;
+  MyJLabel viewLower;
+  JLabel message;
+  int nrIterations;
+
+  // box management
+  int boxULx, boxULy, boxW, boxH;
+  boolean dragging = false;
+
+  // this one does all the calculating work
+  RMIMandelbrotCalculationsInterface remoteCalcObj;
+  RMIMandelbrotCalculationsInterface remoteCalcObj2;
+
+  // how many points in the image?
+  // change if you want a higher resolution
+  public static int RESX = 600;
+  public static int RESY = 600;
+
+  MGuiRMI() {
+    // set up GUI
+    this.frame = new JFrame("Mandelbrotmenge");
+    this.panel = new JPanel();
+    this.endButton = new JButton("Ende");
+    this.panel.add(this.endButton);
+    this.backButton = new JButton("Zur�ck");
+    this.panel.add(this.backButton);
+    this.calcButton = new JButton("Rechnen");
+    this.hostTextField = new JTextField(20);
+    this.hostTextField.setText("localhost");
+    this.panel.add(this.calcButton);
+    this.panel.add(this.hostTextField);
+    this.frame.add(this.panel);
+    this.frame.setSize(700, 720);
+    this.frame.setVisible(true);
+    this.viewUpper = new MyJLabel();
+    this.viewLower = new MyJLabel();
+    this.maxIterations = new JSlider(0, 50, 30);
+    this.panel.add(this.maxIterations);
+    this.panel.add(this.viewUpper);
+    this.panel.add(this.viewLower);
+    this.message = new JLabel("Status");
+    this.message.setBorder(new BevelBorder(BevelBorder.LOWERED));
+    this.frame.add(this.message,BorderLayout.SOUTH);
+
+    this.endButton.addActionListener(this);
+    this.backButton.addActionListener(this);
+    this.calcButton.addActionListener(this);
+    this.maxIterations.addChangeListener(this);
+
+    this.maxIterations.setMajorTickSpacing(10);
+    this.maxIterations.setPaintTicks(true);
+    this.maxIterations.setPaintLabels(true);
+
+    this.viewUpper.addMouseListener(this);
+    this.viewUpper.addMouseMotionListener(this);
+    this.viewLower.addMouseListener(this);
+    this.viewLower.addMouseMotionListener(this);
+
+    this.boxULx = 0;
+    this.boxULy = 0;
+    this.boxW = MGuiRMI.RESX;
+    this.boxH = MGuiRMI.RESY;
+
+    this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+    // Non-Gui stuff
+    this.nrIterations = 1000;
+  }
+
+  // visualization
+  static void applyLookupTable(int[] data, int[] dest, int[] lookupTable) {
+    for (int i = 0; i < data.length; i++) {
+      dest[i] = lookupTable[data[i]];
+    }
+  }
+
+  // here we check what the buttons do
+  public void actionPerformed(ActionEvent ae) {
+    if (ae.getSource() == this.endButton) {
+      System.out.println("Ende");
+      System.exit(0);
+    } else
+
+    if (ae.getSource() == this.backButton) {
+      System.out.println("Zurueck");
+      // Zoom und Ausschnitt zur�cksetzen
+
+      double ULx = -2;
+      double ULy = 2;
+      double LRx = 2;
+      double LRy = -2;
+      this.boxULx = 0;
+      this.boxULy = 0;
+      this.boxW = MGuiRMI.RESX;
+      this.boxH = MGuiRMI.RESY;
+      this.viewUpper.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH);
+      this.viewUpper.repaint();
+      this.viewLower.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH);
+      this.viewLower.repaint();
+      if (this.remoteCalcObj == null)
+      {
+        String message = "Fehler: noch nicht verbunden, noch keine Berechnung durchgef�hrt";
+        this.message.setText(message);
+        System.out.println(message);
+      }
+      else
+      {
+        try {
+          this.remoteCalcObj.setView(ULx, ULy, LRx, LRy);
+        } catch (RemoteException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+        }
+        this.message.setText("Ausschnitt zur�ckgesetzt");
+      }
+      if (this.remoteCalcObj2 == null)
+      {
+        String message = "Fehler: noch nicht verbunden, noch keine Berechnung durchgef�hrt";
+        this.message.setText(message);
+        System.out.println(message);
+      }
+      else
+      {
+        try {
+          this.remoteCalcObj2.setView(ULx, ULy, LRx, LRy);
+        } catch (RemoteException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+        }
+        this.message.setText("Ausschnitt zur�ckgesetzt");
+      }
+    } else
+
+    if (ae.getSource() == this.calcButton) {
+      String hostname = this.hostTextField.getText();
+      System.out.println("Verbinde mit RMI Registry auf Host: " + hostname);
+      try {
+        Registry registry = LocateRegistry.getRegistry(hostname);
+        this.remoteCalcObj = (RMIMandelbrotCalculationsInterface) registry.lookup("RMIMandelbrotCalculationsInterface");
+        this.remoteCalcObj2 = (RMIMandelbrotCalculationsInterface) registry.lookup("RMIMandelbrotCalculationsInterface2");
+        /** CODE SEBASTIAN
+
+        System.out.println("Rechnen");
+        long timestampStart = System.currentTimeMillis();
+
+        //this.boxW = this.boxW / 2;
+        //MGuiRMI.RESX = MGuiRMI.RESX / 2;
+
+        double ULx = 0;
+        double ULy = 0;
+        double LRx = 0;
+        double LRy = 0;
+
+        ULx = this.remoteCalcObj.getULx();
+        ULy = this.remoteCalcObj.getULy();
+        LRx = this.remoteCalcObj.getLRx();
+        LRy = this.remoteCalcObj.getLRy();
+
+        double w = LRx - ULx;
+        double h = LRy - ULy;
+        ULx = ULx + w * this.boxULx / (double) MGuiRMI.RESX;
+        ULy = ULy + h * this.boxULy / (double) MGuiRMI.RESY;
+        w *= this.boxW / (double) (RESX);
+        h *= this.boxH / (double) (RESX);
+        LRx = ULx + w;
+        LRy = ULy + h;
+        System.out.println(ULx + "/" + ULy + "/" + LRx + "/" + LRy);
+        this.boxULx = 0;
+        this.boxULy = 0;
+        this.boxW = MGuiRMI.RESX;
+        this.boxH = MGuiRMI.RESY;
+        int[] colors = null;
+
+        //this.remoteCalcObj.setView(ULx, ULy, LRx, LRy);
+        this.remoteCalcObj.setView(ULx, ULy, LRx, LRy);
+
+        end */
+        /* Code Alex */
+      System.out.println("Rechnen");
+
+      RMIMandelbrotCalculationThread rmimct = new RMIMandelbrotCalculationThread(true, this.viewUpper, this.remoteCalcObj, maxIterations.getValue());
+      new Thread(rmimct).start();
+      RMIMandelbrotCalculationThread rmimct2 = new RMIMandelbrotCalculationThread(false, this.viewLower, this.remoteCalcObj2, maxIterations.getValue());
+      new Thread(rmimct2).start();
+      
+      } catch (RemoteException | NotBoundException e) {
+        // TODO Auto-generated catch block
+        e.printStackTrace();
+      }
+
+    }
+  }
+
+  // Zoom not wirking for lower...
+  
+  public void mousePressed(MouseEvent e) {
+    this.boxULx = e.getX();
+    this.boxULy = e.getY();
+    this.boxW = 1;
+    this.boxH = 1;
+    this.viewUpper.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH);
+    this.message.setText("boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH);
+  }
+
+  public void mouseDragged(MouseEvent e) {
+    this.boxW = e.getX() - this.boxULx + 1;
+    this.boxH = e.getY() - this.boxULy + 1;
+    int m = Math.min(boxW, boxH);
+    this.boxW = m;
+    this.boxH = m;
+    this.viewUpper.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH);
+    this.message.setText("boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH);
+    this.viewUpper.repaint();
+  }
+
+  public void mouseReleased(MouseEvent e) {
+
+    if (e.getButton() == MouseEvent.BUTTON1) {
+      this.viewUpper.repaint();
+      this.message.setText("Gesetzt: boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH);
+    }
+  }
+
+  public void mouseMoved(MouseEvent e) {
+  }
+
+  public void mouseExited(MouseEvent e) {
+  }
+
+  public void mouseEntered(MouseEvent e) {
+  }
+
+  public void mouseClicked(MouseEvent e) {
+  }
+
+  // process a new slider value
+  public void stateChanged(ChangeEvent ce) {
+    if (ce.getSource() == this.maxIterations) {
+      // System.out.println("Neuer Wert");
+      this.nrIterations = this.maxIterations.getValue() * 1000;
+    }
+  }
+
+  // main, just instantiate an MGui object, gives control to the Gui
+  public static void main(String[] args) {
+    @SuppressWarnings("unused")
+    MGuiRMI gui = new MGuiRMI();
+  }
 }
diff --git a/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/RMIMandelbrotCalculationsServer.java b/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/RMIMandelbrotCalculationsServer.java
index ba6b699be967aba3ddd09b894f360c9516ed5f08..9997b42792d78cbb6736ddbd9176de56e54f542f 100644
--- a/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/RMIMandelbrotCalculationsServer.java
+++ b/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/RMIMandelbrotCalculationsServer.java
@@ -21,53 +21,53 @@ class LoopbackSocketFactory extends RMISocketFactory {
                                .createSocket(host, port);
     }
 }
-*/	
+*/
 
 class Complex {
-	double r;
-	double i;
-
-	Complex() {
-		r = 0.0;
-		i = 0.0;
-	}
-
-	Complex(double r, double i) {
-		this.r = r;
-		this.i = i;
-	}
-
-	void mulBy(Complex other) {
-		double rTmp = this.r * other.r - this.i * other.i;
-		this.i = this.r * other.i + this.i * other.r;
-		this.r = rTmp;
-	}
-
-	void add(Complex other) {
-		this.r += other.r;
-		this.i += other.i;
-	}
-
-	void sub(Complex other) {
-		this.r -= other.r;
-		this.i -= other.i;
-	}
-
-	double absValue() {
-		return Math.sqrt(this.r * this.r + this.i * this.i);
-	}
+  double r;
+  double i;
+
+  Complex() {
+    r = 0.0;
+    i = 0.0;
+  }
+
+  Complex(double r, double i) {
+    this.r = r;
+    this.i = i;
+  }
+
+  void mulBy(Complex other) {
+    double rTmp = this.r * other.r - this.i * other.i;
+    this.i = this.r * other.i + this.i * other.r;
+    this.r = rTmp;
+  }
+
+  void add(Complex other) {
+    this.r += other.r;
+    this.i += other.i;
+  }
+
+  void sub(Complex other) {
+    this.r -= other.r;
+    this.i -= other.i;
+  }
+
+  double absValue() {
+    return Math.sqrt(this.r * this.r + this.i * this.i);
+  }
 }
 
 public class RMIMandelbrotCalculationsServer implements RMIMandelbrotCalculationsInterface {
     public RMIMandelbrotCalculationsServer() {}
-	
+
     public static void main(String args[]) {
 
         try {
-        	//RMISocketFactory.setSocketFactory(new LoopbackSocketFactory());
-        	
-        	RMIMandelbrotCalculationsServer obj = new RMIMandelbrotCalculationsServer();
-        	RMIMandelbrotCalculationsInterface stub = (RMIMandelbrotCalculationsInterface) UnicastRemoteObject.exportObject(obj, 0);
+          //RMISocketFactory.setSocketFactory(new LoopbackSocketFactory());
+
+          RMIMandelbrotCalculationsServer obj = new RMIMandelbrotCalculationsServer();
+          RMIMandelbrotCalculationsInterface stub = (RMIMandelbrotCalculationsInterface) UnicastRemoteObject.exportObject(obj, 0);
 
             // Bind the remote object's stub in the registry
             Registry registry = LocateRegistry.getRegistry();
@@ -79,73 +79,72 @@ public class RMIMandelbrotCalculationsServer implements RMIMandelbrotCalculation
             e.printStackTrace();
         }
     }
-    
-	// hier wird das Ergebnis von iterateAll() gespeichert
-	protected int[] result = null;
-
-	// der augenblicklich gewaehlte Ausschnitt
-	//double ULx = -2, ULy = -2, LRx = 2, LRy = 2;
-	double ULx = -0.16099999999999995, ULy = -0.9365333333333333, LRx = -0.03533333333333327, LRy = -0.8108666666666666;
-
-	int iterateOnePoint(Complex c, int maxIterations, double maxModulus) {
-		Complex z = new Complex(0., 0.);
-
-		for (int i = 0; i < maxIterations; i++) {
-			z.mulBy(z);
-			z.add(c);
-			double m = z.absValue();
-			if (m > maxModulus) {
-				return i;
-			}
-		}
-		return maxIterations;
-	}
-
-	public void iterateAllPoints(int maxIterations, double nrPointsX, double nrPointsY) {
-
-		this.result = new int[(int) (nrPointsX * nrPointsY)];
-
-		int counter = 0;
-		double stepX = (this.LRx - this.ULx) / nrPointsX;
-		double stepY = (this.LRy - this.ULy) / nrPointsY;
-		double i = this.ULy;
-		for (int cy = 0; cy < nrPointsY; cy++) {
-			double r = this.ULx;
-			for (int cx = 0; cx < nrPointsX; cx++) {
-				Complex c = new Complex(r, i);
-				this.result[counter] = maxIterations - this.iterateOnePoint(c, maxIterations, 2.0);
-				counter += 1;
-				r += stepX;
-			}
-			i += stepY;
-		}
-	}
-
-	public int[] getResult() {
-		return this.result;
-	}
-
-	public double getULx() {
-		return this.ULx;
-	}
-
-	public double getLRx() {
-		return this.LRx;
-	}
-
-	public double getULy() {
-		return this.ULy;
-	}
-
-	public double getLRy() {
-		return this.LRy;
-	}
-
-	public void setView(double ULx, double ULy, double LRx, double LRy) {
-		this.ULx = ULx;
-		this.ULy = ULy;
-		this.LRx = LRx;
-		this.LRy = LRy;
-	}
+
+  // hier wird das Ergebnis von iterateAll() gespeichert
+  protected int[] result = null;
+
+  // der augenblicklich gewaehlte Ausschnitt
+  double ULx = -2, ULy = 2, LRx = 2, LRy = -2;
+
+  int iterateOnePoint(Complex c, int maxIterations, double maxModulus) {
+    Complex z = new Complex(0., 0.);
+
+    for (int i = 0; i < maxIterations; i++) {
+      z.mulBy(z);
+      z.add(c);
+      double m = z.absValue();
+      if (m > maxModulus) {
+        return i;
+      }
+    }
+    return maxIterations;
+  }
+
+  public void iterateAllPoints(int maxIterations, double nrPointsX, double nrPointsY) {
+
+    this.result = new int[(int) (nrPointsX * nrPointsY)];
+
+    int counter = 0;
+    double stepX = (this.LRx - this.ULx) / nrPointsX;
+    double stepY = (this.LRy - this.ULy) / nrPointsY;
+    double i = this.ULy;
+    for (int cy = 0; cy < nrPointsY; cy++) {
+      double r = this.ULx;
+      for (int cx = 0; cx < nrPointsX; cx++) {
+        Complex c = new Complex(r, i);
+        this.result[counter] = maxIterations - this.iterateOnePoint(c, maxIterations, 2.0);
+        counter += 1;
+        r += stepX;
+      }
+      i += stepY;
+    }
+  }
+
+  public int[] getResult() {
+    return this.result;
+  }
+
+  public double getULx() {
+    return this.ULx;
+  }
+
+  public double getLRx() {
+    return this.LRx;
+  }
+
+  public double getULy() {
+    return this.ULy;
+  }
+
+  public double getLRy() {
+    return this.LRy;
+  }
+
+  public void setView(double ULx, double ULy, double LRx, double LRy) {
+    this.ULx = ULx;
+    this.ULy = ULy;
+    this.LRx = LRx;
+    this.LRy = LRy;
+  }
 
 }
diff --git a/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/RMIMandelbrotCalculationsServer2.java b/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/RMIMandelbrotCalculationsServer2.java
new file mode 100644
index 0000000000000000000000000000000000000000..a0feee940f0be85787513bedff8b778813ab0450
--- /dev/null
+++ b/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/RMIMandelbrotCalculationsServer2.java
@@ -0,0 +1,115 @@
+package verteiltesysteme.mandelbrot.rmi;
+
+//import java.io.IOException;
+//import java.net.InetAddress;
+//import java.net.ServerSocket;
+//import java.net.Socket;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+//import java.rmi.server.RMISocketFactory;
+import java.rmi.server.UnicastRemoteObject;
+
+/*
+class LoopbackSocketFactory extends RMISocketFactory {
+    public ServerSocket createServerSocket(int port) throws IOException {
+        return new ServerSocket(port, 5, InetAddress.getByName("127.0.0.1"));
+    }
+
+    public Socket createSocket(String host, int port) throws IOException {
+        // just call the default client socket factory
+        return RMISocketFactory.getDefaultSocketFactory()
+                               .createSocket(host, port);
+    }
+}
+*/
+
+public class RMIMandelbrotCalculationsServer2 implements RMIMandelbrotCalculationsInterface {
+    public RMIMandelbrotCalculationsServer2() {}
+
+    public static void main(String args[]) {
+
+        try {
+          //RMISocketFactory.setSocketFactory(new LoopbackSocketFactory());
+
+          RMIMandelbrotCalculationsServer2 obj = new RMIMandelbrotCalculationsServer2();
+          RMIMandelbrotCalculationsInterface stub = (RMIMandelbrotCalculationsInterface) UnicastRemoteObject.exportObject(obj, 0);
+
+            // Bind the remote object's stub in the registry
+            Registry registry = LocateRegistry.getRegistry();
+            registry.bind("RMIMandelbrotCalculationsInterface2", stub);
+
+            System.err.println("Server ready");
+        } catch (Exception e) {
+            System.err.println("Server exception: " + e.toString());
+            e.printStackTrace();
+        }
+    }
+
+  // hier wird das Ergebnis von iterateAll() gespeichert
+  protected int[] result = null;
+
+  // der augenblicklich gewaehlte Ausschnitt
+  double ULx = -2, ULy = 2, LRx = 2, LRy = -2;
+
+  int iterateOnePoint(Complex c, int maxIterations, double maxModulus) {
+    Complex z = new Complex(0., 0.);
+
+    for (int i = 0; i < maxIterations; i++) {
+      z.mulBy(z);
+      z.add(c);
+      double m = z.absValue();
+      if (m > maxModulus) {
+        return i;
+      }
+    }
+    return maxIterations;
+  }
+
+  public void iterateAllPoints(int maxIterations, double nrPointsX, double nrPointsY) {
+
+    this.result = new int[(int) (nrPointsX * nrPointsY)];
+
+    int counter = 0;
+    double stepX = (this.LRx - this.ULx) / nrPointsX;
+    double stepY = (this.LRy - this.ULy) / nrPointsY;
+    double i = this.ULy;
+    for (int cy = 0; cy < nrPointsY; cy++) {
+      double r = this.ULx;
+      for (int cx = 0; cx < nrPointsX; cx++) {
+        Complex c = new Complex(r, i);
+        this.result[counter] = maxIterations - this.iterateOnePoint(c, maxIterations, 2.0);
+        counter += 1;
+        r += stepX;
+      }
+      i += stepY;
+    }
+  }
+
+  public int[] getResult() {
+    return this.result;
+  }
+
+  public double getULx() {
+    return this.ULx;
+  }
+
+  public double getLRx() {
+    return this.LRx;
+  }
+
+  public double getULy() {
+    return this.ULy;
+  }
+
+  public double getLRy() {
+    return this.LRy;
+  }
+
+  public void setView(double ULx, double ULy, double LRx, double LRy) {
+    this.ULx = ULx;
+    this.ULy = ULy;
+    this.LRx = LRx;
+    this.LRy = LRy;
+  }
+
+}
diff --git a/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/TCPClient.java b/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/TCPClient.java
index 21e799710f5191e663240e97759f4cf2afbc47a7..24b27d3e106862a2c3ca12e86ffd06745bb2930b 100644
--- a/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/TCPClient.java
+++ b/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/TCPClient.java
@@ -18,6 +18,8 @@ class TCPClient {
 		DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
 		BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
 
+		System.out.println("Enter message to sent to the server:");
+		
 		sentence = inFromUser.readLine();
 		outToServer.writeBytes(sentence + '\n');
 		modifiedSentence = inFromServer.readLine();
diff --git a/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/TCPServer.java b/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/TCPServer.java
index 63ccbc1c722aa11e018a56aa824b4f49b1d197c5..dc3c85870d6691a0d73eda1ea82c887b6aa9c295 100644
--- a/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/TCPServer.java
+++ b/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/TCPServer.java
@@ -15,9 +15,13 @@ class TCPServer {
 		@SuppressWarnings("resource")
 		ServerSocket welcomeSocket = new ServerSocket(tcpPort);
 		
+		System.out.println("TCP Server started. Waiting for incoming requests...");
+		
 		while (true) {
 			Socket connectionSocket = welcomeSocket.accept();
 
+			System.out.println("Received request from client " + connectionSocket.getInetAddress() + ":" + connectionSocket.getPort() + " generating response...");
+			
 			BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
 			DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
 
diff --git a/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/UDPClient.java b/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/UDPClient.java
index ef609dd098770ed6fc7a049d74bb9a5aa3d19480..565c5bb2d104f56f88ac3d7e311fcb7b8cf810b6 100644
--- a/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/UDPClient.java
+++ b/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/UDPClient.java
@@ -15,6 +15,8 @@ class UDPClient {
 		byte[] sendData = new byte[1024];
 		byte[] receiveData = new byte[1024];
 
+		System.out.println("Enter message to sent to the server:");
+		
 		String sentence = inFromUser.readLine();
 		sendData = sentence.getBytes();
 
diff --git a/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/UDPServer.java b/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/UDPServer.java
index 1be8961f25a2136679ff384e025c7b07853f3db7..4b6f03384d71efe48aa8821fa0a602ae07a077e5 100644
--- a/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/UDPServer.java
+++ b/VerteilteSysteme-Examples/src/verteiltesysteme/socket/simple/UDPServer.java
@@ -12,6 +12,8 @@ class UDPServer {
 		byte[] receiveData = new byte[1024];
 		byte[] sendData = new byte[1024];
 
+		System.out.println("UDP Server started. Waiting for incoming requests...");
+		
 		while (true) {
 			DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
 			serverSocket.receive(receivePacket);
@@ -19,8 +21,9 @@ class UDPServer {
 
 			InetAddress IPAddress = receivePacket.getAddress();
 			int clientSrcPort = receivePacket.getPort();
-			
 
+			System.out.println("Received request from client " + IPAddress + ":" + clientSrcPort + " generating response...");
+			
 			String capitalizedSentence = sentence.toUpperCase();
 			sendData = capitalizedSentence.getBytes();
 			DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, clientSrcPort);