diff --git a/tests/gpstest/gpstest.cpp b/tests/gpstest/gpstest.cpp
new file mode 100644
index 0000000..79f081d
--- /dev/null
+++ b/tests/gpstest/gpstest.cpp
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+extern "C" size_t  dlmalloc_footprint();
+
+#include "hardware/gps.h"
+
+static const GpsInterface* sGpsInterface = NULL;
+
+static bool sDone = false;
+static int sFixes = 0;
+static int sMaxFixes = 0;
+static int sStatus = GPS_STATUS_ENGINE_OFF;
+
+static void location_callback(GpsLocation* location)
+{
+    printf("Got Fix: latitude: %lf longitude: %lf altitude: %.1lf\n", 
+            location->latitude, location->longitude, location->altitude);
+    sFixes++;
+    if (sMaxFixes > 0 && sFixes >= sMaxFixes) {
+        sDone = true;
+    }
+}
+
+static void status_callback(GpsStatus* status)
+{
+    switch (status->status) {
+        case GPS_STATUS_NONE:
+            printf("status: GPS_STATUS_NONE\n");
+            break;
+        case GPS_STATUS_SESSION_BEGIN:
+            printf("status: GPS_STATUS_SESSION_BEGIN\n");
+            break;
+        case GPS_STATUS_SESSION_END:
+            printf("status: GPS_STATUS_SESSION_END\n");
+            break;
+        case GPS_STATUS_ENGINE_ON:
+            printf("status: GPS_STATUS_ENGINE_ON\n");
+            break;
+        case GPS_STATUS_ENGINE_OFF:
+            printf("status: GPS_STATUS_ENGINE_OFF\n");
+            break;
+        default:
+            printf("unknown status: %d\n", status->status);
+            break;
+    }
+
+    sStatus = status->status;
+}
+
+static void sv_status_callback(GpsSvStatus* sv_status)
+{
+    if (sv_status->num_svs > 0) {
+        for (int i = 0; i < sv_status->num_svs; i++) {
+            printf("SV: %2d SNR: %.1f Elev: %.1f Azim: %.1f %s %s\n", sv_status->sv_list[i].prn, 
+                    sv_status->sv_list[i].snr, sv_status->sv_list[i].elevation, 
+                    sv_status->sv_list[i].azimuth,
+             ((sv_status->ephemeris_mask & (1 << (sv_status->sv_list[i].prn - 1))) ? "E" : " "), 
+             ((sv_status->almanac_mask & (1 << (sv_status->sv_list[i].prn - 1))) ? "A" : " ")
+            );
+        }
+        printf("\n");
+    }
+}
+
+GpsCallbacks sCallbacks = {
+    location_callback,
+    status_callback,
+    sv_status_callback,
+};
+
+int main(int argc, char *argv[])
+{
+    size_t   initial = dlmalloc_footprint();
+    
+    if (argc >= 2) {
+        sMaxFixes = atoi(argv[1]);
+        printf("max fixes: %d\n", sMaxFixes);
+    }
+
+    sGpsInterface = gps_get_interface();
+    if (!sGpsInterface) {
+        fprintf(stderr, "could not get gps interface\n");
+        return -1;
+    }
+
+    int err = sGpsInterface->init(&sCallbacks);
+    if (err) {
+        fprintf(stderr, "gps_init failed %d\n", err);
+        return err;
+    }
+
+    sGpsInterface->start();
+    
+    while (!sDone) {
+        sleep(1);
+    }
+    
+    sGpsInterface->stop();
+    
+    printf("waiting for GPS to shut down\n");
+     while (sStatus != GPS_STATUS_ENGINE_OFF) {
+        sleep(1);
+    }
+   
+    sGpsInterface->cleanup();
+
+    size_t   final = dlmalloc_footprint();
+    fprintf(stderr, "KO: initial == %d, final == %d\n", initial, final );
+
+    return 0;
+}
