diff --git a/2015/android/Geofence/app/src/test/java/com/esrlabs/geofence/GeofenceAppTest.java b/2015/android/Geofence/app/src/test/java/com/esrlabs/geofence/GeofenceAppTest.java
new file mode 100644
index 0000000..dd4eeff
--- /dev/null
+++ b/2015/android/Geofence/app/src/test/java/com/esrlabs/geofence/GeofenceAppTest.java
@@ -0,0 +1,125 @@
+package com.esrlabs.geofence;
+
+import static com.esrlabs.geofence.GeofenceApp.CAN_PROVIDER;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.app.Service;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.location.Location;
+import android.location.LocationManager;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.test.ServiceTestCase;
+
+import com.esrlabs.headunitinterface.HeadUnit;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricGradleTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowLocationManager;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import esrlabs.com.geofence.BuildConfig;
+
+
+@RunWith(RobolectricGradleTestRunner.class)
+@Config(constants = BuildConfig.class, emulateSdk = 17)
+public class GeofenceAppTest extends ServiceTestCase {
+
+    public final LocationManager locationManager = (LocationManager)
+            RuntimeEnvironment.application.getSystemService(Context.LOCATION_SERVICE);
+    private GeofenceApp geofenceApp;
+
+
+    private final Location someLocation = location(CAN_PROVIDER, 12.0, 20.0);
+
+
+
+    public GeofenceAppTest() {
+        super(GeofenceApp.class);
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        geofenceApp = setupMyService(locationManager);
+    }
+
+    @After
+    public void tearDown() throws Exception { }
+
+    @Test
+    public void testLatestLocation() throws Exception {
+        simulateNewLocation(locationManager, someLocation);
+        assertTrue(someLocation.equals(geofenceApp.latestLocation()));
+    }
+
+    private GeofenceApp setupMyService(LocationManager locationManager) {
+        GeofenceApp service = new GeofenceApp(locationManager);
+        service.onCreate();
+        return service;
+    }
+
+    private void simulateNewLocation(LocationManager locationManager, Location someLocation) {
+        ShadowLocationManager shadowLocationManager = shadowOf(locationManager);
+        shadowLocationManager.simulateLocation(someLocation);
+    }
+
+    @Test
+    public void testThatPopupIsShownWhenTheCurrentLocationIsOutsideTheGeofence() throws Exception {
+        final AtomicBoolean notificationVisibility = new AtomicBoolean(false);
+
+        initHeadUnitServiceMock(notificationVisibility);
+        GeofenceApp mainService = setupMyService(locationManager);
+
+//        Location locationInsideTheGeofence = location(CAN_PROVIDER, 10, 10);
+//        simulateNewLocation(locationManager, locationInsideTheGeofence);
+//        assertTrue(locationInsideTheGeofence.equals(mainService.latestLocation()));
+//        assertFalse(notificationVisibility.get());
+
+        Location locationOutsideTheGeofence = location(CAN_PROVIDER, 11, 11);
+        simulateNewLocation(locationManager, locationOutsideTheGeofence);
+        assertTrue(locationOutsideTheGeofence.equals(mainService.latestLocation()));
+        assertTrue(notificationVisibility.get());
+    }
+
+    private void initHeadUnitServiceMock(AtomicBoolean notificationVisibility) {
+        IBinder headUnitStub = getHeadUnitServiceBinder(notificationVisibility);
+        shadowOf(RuntimeEnvironment.application).setComponentNameAndServiceForBindService(
+                new ComponentName("com.esrlabs.headunitinterface", "HeadUnit"), headUnitStub);
+    }
+
+    private IBinder getHeadUnitServiceBinder(final AtomicBoolean notificationVisibility) {
+        return new HeadUnit.Stub() {
+                @Override
+                public void showNotification(String text) throws RemoteException {
+                    notificationVisibility.set(true);
+                }
+
+                @Override
+                public void hideAllNotifications() throws RemoteException {
+                    notificationVisibility.set(false);
+                }
+            };
+    }
+
+
+    private Location location(String provider, double latitude, double longitude) {
+        Location location = new Location(provider);
+        location.setLatitude(latitude);
+        location.setLongitude(longitude);
+        location.setTime(System.currentTimeMillis());
+        return location;
+    }
+
+}
\ No newline at end of file
diff --git a/2015/android/Geofence/app/src/test/java/com/esrlabs/geofence/HeadUnitServiceMock.java b/2015/android/Geofence/app/src/test/java/com/esrlabs/geofence/HeadUnitServiceMock.java
new file mode 100644
index 0000000..80546d9
--- /dev/null
+++ b/2015/android/Geofence/app/src/test/java/com/esrlabs/geofence/HeadUnitServiceMock.java
@@ -0,0 +1,22 @@
+package com.esrlabs.geofence;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+import android.util.Log;
+
+public class HeadUnitServiceMock extends Service {
+    public static final String TAG = "HeadUnitServiceMockTest";
+
+    final IBinder headUnitStub;
+
+    public HeadUnitServiceMock(IBinder headUnitStub) {
+        this.headUnitStub = headUnitStub;
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        Log.i(TAG, "onBind");
+        return headUnitStub;
+    }
+}