Index: src/com/example/helloandroid/Fleet.java
===================================================================
--- src/com/example/helloandroid/Fleet.java	(revision 9ef6f68d3d6a036b13e70b935ff93adf81574241)
+++ src/com/example/helloandroid/Fleet.java	(revision 61c4fbcbb69a721f2e7174dffd017c29e9a313ac)
@@ -2,4 +2,9 @@
 
 import java.util.ArrayList;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.util.Log;
 
 public class Fleet {
@@ -14,4 +19,5 @@
 	private int faction;
 	private boolean isNextToAPlanet;
+	private boolean dirChanged;
 	
 	/* Optimising: pre-calculate paths */
@@ -21,4 +27,5 @@
 		//line formula 
 		slope = getSlope(source.getX(),source.getY(),destination.getX(),destination.getY());
+		
 		xIntercept = destination.getY() - (slope*destination.getX());
 		
@@ -52,4 +59,5 @@
 		this.destination = destination;
 		this.isNextToAPlanet = false;
+		dirChanged = false;
 	}
 	
@@ -125,9 +133,21 @@
 	}
 
-
+	public void draw(Canvas canvas, Paint linePaint) {
+		//Log.i("Gencon", "direction: "+direction);
+		canvas.drawLine((float)x, (float)y, (float)(x+10*Math.cos(direction)), (float)(y+10*Math.sin(direction)), linePaint);
+		
+		Path p = new Path();
+		
+		p.moveTo((float)(x+5*Math.cos(direction+Math.PI/2)), (float)(y+5*Math.sin(direction+Math.PI/2)));
+		p.lineTo((float)(x+5*Math.cos(direction-Math.PI/2)), (float)(y+5*Math.sin(direction-Math.PI/2)));
+		p.lineTo((float)(x+10*Math.cos(direction)), (float)(y+10*Math.sin(direction)));
+		p.lineTo((float)(x+5*Math.cos(direction+Math.PI/2)), (float)(y+5*Math.sin(direction+Math.PI/2)));
+		
+		canvas.drawPath(p, linePaint);
+	}
 
 	public void update(ArrayList<Planet> planets) {
 		int speed = 1; //pixels per move
-		double distance, tangentDirection, angle;
+		double distance, tangentDirection;
 		Planet temp = null;
 		//is the ship going around a planet already
@@ -144,5 +164,5 @@
 			}
 			//if temp planet is not picked move along the direction by #speed
-			if(temp == null){
+			if(temp == null || dirChanged) {
 				dblY += (Math.sin(direction)*speed);
 				dblX += (Math.cos(direction)*speed);
@@ -150,12 +170,26 @@
 				x = (int)dblX;
 				y = (int)dblY;
-			} else 
-			//otherwise
-			{
+			}else {				
+				double radAngle = Math.atan(getSlope(temp.getX(), temp.getY(), dblX, dblY));
+				
+				if(dblX < temp.getX())
+					radAngle += Math.PI;
+				
+				double angle = radAngle + Math.PI/2;
+				
+				double diff = direction-angle;
+				
+				if(Math.abs(diff)>Math.PI/2)
+					direction = angle-Math.PI;
+				else
+					direction = angle;
+				
+				dirChanged = true;
+				
 				//figure out which way to go clockwise or counter clockwise 
-				tangentDirection = (Math.atan(getSlope(temp.getX(),temp.getY(),dblX,dblY))) + (Math.PI/2);
+				/*tangentDirection = (Math.atan(getSlope(temp.getX(),temp.getY(),dblX,dblY))) + (Math.PI/2);
 				angle = Math.atan((Math.tan(tangentDirection) - Math.tan(direction))/(1 + Math.tan(tangentDirection)*Math.tan(direction)));
 				if (angle <= Math.PI/2)
-					angle = Math.PI - angle;
+					angle = Math.PI - angle;*/
 				//get next point and the direction and set it
 			}
@@ -182,12 +216,10 @@
 	
 	//helper functions
-	private double getDistanceBetween(double x1, double y1, double x2, double y2)
-	{
+	private double getDistanceBetween(double x1, double y1, double x2, double y2) {
 		return Math.sqrt(Math.pow((x2 - x1),2) + Math.pow((y2 - y1),2));
 	}
 	
-	private double getSlope(double x1, double y1, double x2, double y2)
-	{
-		return ((y1 - y1)/(x2 - x1));
+	private double getSlope(double x1, double y1, double x2, double y2) {
+		return ((y2 - y1)/(double)(x2 - x1));
 	}
 }
Index: src/com/example/helloandroid/GameView.java
===================================================================
--- src/com/example/helloandroid/GameView.java	(revision 9ef6f68d3d6a036b13e70b935ff93adf81574241)
+++ src/com/example/helloandroid/GameView.java	(revision 61c4fbcbb69a721f2e7174dffd017c29e9a313ac)
@@ -171,7 +171,8 @@
         private double mY;
         
-        public Object planetsLock;
+        public Object planetsLock, fleetsLock;
         
         public ArrayList<Planet> planets;
+        public ArrayList<Fleet> fleets;
         public Planet planetSelected;
 
@@ -221,7 +222,10 @@
         
             planetsLock = new Object();
+            fleetsLock = new Object();
             
             planets = new ArrayList<Planet>();
             planetSelected = null;
+            
+            fleets = new ArrayList<Fleet>();
         }
 
@@ -589,4 +593,10 @@
     		}
         	
+        	synchronized(fleetsLock) {
+        		for(Fleet f : fleets) {
+            		f.draw(canvas, mLinePaint);
+            	}
+        	}
+        	
             int yTop = mCanvasHeight - ((int) mY + mLanderHeight / 2);
             int xLeft = (int) mX - mLanderWidth / 2;
@@ -665,4 +675,10 @@
             }
             
+            synchronized(fleetsLock) {
+            	for(Fleet f : fleets) {
+            		f.update(planets);
+            	}
+            }
+            
             double dxOld = mDX;
             double dyOld = mDY;
@@ -734,17 +750,36 @@
     	Log.i("Gencon", "Detected touch event");
     	
+    	if(event.getAction() != MotionEvent.ACTION_DOWN)
+    		return true;
+    	
     	synchronized(thread.planetsLock) {
     		if(thread.planetSelected != null) {
+    			Planet target = null;
+    			
+    			for(Planet p : thread.planets) {
+		        	if(p.contains((int)event.getX(), (int)event.getY())) {
+		        		target = p;
+		        		break;
+		        	}
+		        }
+    			
+    			if(target != null) {
+    				synchronized(thread.fleetsLock) {
+    	                	Fleet f = new Fleet(thread.planetSelected, target, 1, 1);
+    	                	thread.fleets.add(f);
+                    }
+    			}
+    				
     			thread.planetSelected.unselect();
     			thread.planetSelected = null;
+    		}else {
+		        for(Planet p : thread.planets) {
+		        	if(p.contains((int)event.getX(), (int)event.getY())) {
+		        		p.select();
+		        		thread.planetSelected = p;
+		        		break;
+		        	}
+		        }
     		}
-    		
-	        for(Planet p : thread.planets) {
-	        	if(p.contains((int)event.getX(), (int)event.getY())) {
-	        		p.select();
-	        		thread.planetSelected = p;
-	        		break;
-	        	}
-	        }
     	}
         
Index: src/com/example/helloandroid/Planet.java
===================================================================
--- src/com/example/helloandroid/Planet.java	(revision 9ef6f68d3d6a036b13e70b935ff93adf81574241)
+++ src/com/example/helloandroid/Planet.java	(revision 61c4fbcbb69a721f2e7174dffd017c29e9a313ac)
@@ -101,5 +101,5 @@
 			break;
 		case 2:
-			c = Color.argb(255, 0, 255, 0);
+			c = Color.argb(255, 0, 180, 0);
 			break;
 		case 3:
@@ -107,5 +107,5 @@
 			break;
 		case 4:
-			c = Color.argb(255, 255, 255, 0);
+			c = Color.argb(255, 150, 150, 0);
 			break;
 		default:
