diff --git a/include/hardware/gps.h b/include/hardware/gps.h
index 0b604f2..69bfd50 100644
--- a/include/hardware/gps.h
+++ b/include/hardware/gps.h
@@ -103,8 +103,6 @@
 #define GPS_CAPABILITY_SINGLE_SHOT      0x0000008
 /** GPS supports on demand time injection */
 #define GPS_CAPABILITY_ON_DEMAND_TIME   0x0000010
-/** GPS supports Geofencing  */
-#define GPS_CAPABILITY_GEOFENCING       0x0000020
 
 /** Flags used to specify which aiding data to delete
     when calling delete_aiding_data(). */
@@ -230,12 +228,6 @@
  */
 #define AGPS_RIL_INTERFACE      "agps_ril"
 
-/**
- * Name for the GPS_Geofencing interface.
- */
-#define GPS_GEOFENCING_INTERFACE   "gps_geofencing"
-
-
 /** Represents a location. */
 typedef struct {
     /** set to sizeof(GpsLocation) */
@@ -681,201 +673,6 @@
     void (*update_network_availability) (int avaiable, const char* apn);
 } AGpsRilInterface;
 
-/**
- * GPS Geofence.
- *      There are 3 states associated with a Geofence: Inside, Outside, Unknown.
- * There are 3 transitions: ENTERED, EXITED, UNCERTAIN.
- *
- * An example state diagram with confidence level: 95% and Unknown time limit
- * set as 30 secs is shown below. (confidence level and Unknown time limit are
- * explained latter)
- *                         ____________________________
- *                        |       Unknown (30 secs)   |
- *                         """"""""""""""""""""""""""""
- *                            ^ |                  |  ^
- *                   UNCERTAIN| |ENTERED     EXITED|  |UNCERTAIN
- *                            | v                  v  |
- *                        ________    EXITED     _________
- *                       | Inside | -----------> | Outside |
- *                       |        | <----------- |         |
- *                        """"""""    ENTERED    """""""""
- *
- * Inside state: We are 95% confident that the user is inside the geofence.
- * Outside state: We are 95% confident that the user is outside the geofence
- * Unknown state: Rest of the time.
- *
- * The Unknown state is better explained with an example:
- *
- *                            __________
- *                           |         c|
- *                           |  ___     |    _______
- *                           |  |a|     |   |   b   |
- *                           |  """     |    """""""
- *                           |          |
- *                            """"""""""
- * In the diagram above, "a" and "b" are 2 geofences and "c" is the accuracy
- * circle reported by the GPS subsystem. Now with regard to "b", the system is
- * confident that the user is outside. But with regard to "a" is not confident
- * whether it is inside or outside the geofence. If the accuracy remains the
- * same for a sufficient period of time, the UNCERTAIN transition would be
- * triggered with the state set to Unknown. If the accuracy improves later, an
- * appropriate transition should be triggered.  This "sufficient period of time"
- * is defined by the parameter in the add_geofence_area API.
- *     In other words, Unknown state can be interpreted as a state in which the
- * GPS subsystem isn't confident enough that the user is either inside or
- * outside the Geofence. It moves to Unknown state only after the expiry of the
- * timeout.
- *
- * The geofence callback needs to be triggered for the ENTERED and EXITED
- * transitions, when the GPS system is confident that the user has entered
- * (Inside state) or exited (Outside state) the Geofence. A implementation
- * which uses a value of 95% as the confidence is recommended. The callback
- * should be triggered only for the transitions requested by the
- * add_geofence_area call.
- *
- * Even though the diagram and explanation talks about states and transitions,
- * the callee is only interested in the transistions. The states are mentioned
- * here for illustrative purposes.
- *
- * Startup Scenario: When the device boots up, if an application adds geofences,
- * and then we get an accurate GPS location fix, it needs to trigger the
- * appropriate (ENTERED or EXITED) transition for every Geofence it knows about.
- * By default, all the Geofences will be in the Unknown state.
- *
- * When the GPS system is unavailable, gps_geofence_status_callback should be
- * called to inform the upper layers of the same. Similarly, when it becomes
- * available the callback should be called. This is a global state while the
- * UNKNOWN transition described above is per geofence.
- *
- * An important aspect to note is that users of this API (framework), will use
- * other subsystems like wifi, sensors, cell to handle Unknown case and
- * hopefully provide a definitive state transition to the third party
- * application. GPS Geofence will just be a signal indicating what the GPS
- * subsystem knows about the Geofence.
- *
- */
-#define GPS_GEOFENCE_ENTERED     (1<<0L)
-#define GPS_GEOFENCE_EXITED      (1<<1L)
-#define GPS_GEOFENCE_UNCERTAIN   (1<<2L)
-
-#define GPS_GEOFENCE_UNAVAILABLE (1<<0L)
-#define GPS_GEOFENCE_AVAILABLE   (1<<1L)
-
-/**
- * The callback associated with the geofence.
- * Parameters:
- *      geofence_id - The id associated with the add_geofence_area.
- *      location    - The current GPS location.
- *      transition  - Can be one of GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED,
- *                    GPS_GEOFENCE_UNCERTAIN.
- *      timestamp   - Timestamp when the transition was detected.
- *
- * The callback should only be called when the caller is interested in that
- * particular transition. For instance, if the caller is interested only in
- * ENTERED transition, then the callback should NOT be called with the EXITED
- * transition.
- *
- * IMPORTANT: If a transition is triggered resulting in this callback, the GPS
- * subsystem will wake up the application processor, if its in suspend state.
- */
-typedef void (*gps_geofence_transition_callback) (int32_t geofence_id,  GpsLocation* location,
-        int32_t transition, GpsUtcTime timestamp);
-
-/**
- * The callback associated with the availablity of the GPS system for geofencing
- * monitoring. If the GPS system determines that it cannot monitor geofences
- * because of lack of reliability or unavailability of the GPS signals, it will
- * call this callback with GPS_GEOFENCE_UNAVAILABLE parameter.
- *
- * Parameters:
- *  status - GPS_GEOFENCE_UNAVAILABLE or GPS_GEOFENCE_AVAILABLE.
- *  last_location - Last known location.
- */
-typedef void (*gps_geofence_status_callback) (int32_t status, GpsLocation* last_location);
-
-typedef struct {
-    gps_geofence_callback geofence_callback;
-    gps_create_thread create_thread_cb;
-} GpsGeofenceCallbacks;
-
-/** Extended interface for GPS_Geofencing support */
-typedef struct {
-   /** set to sizeof(GpsGeofencingInterface) */
-   size_t          size;
-
-   /**
-    * Opens the geofence interface and provides the callback routines
-    * to the implemenation of this interface.
-    */
-   void  (*init)( GpsGeoFenceCallbacks* callbacks );
-
-   /**
-    * Add a geofence area. This api currently supports circular geofences.
-    * Parameters:
-    *    geofence_id - The id for the geofence. If a geofence with this id
-            already exists, an error value (-1) should be returned.
-    *    latitude, longtitude, radius_meters - The lat, long and radius
-    *       (in meters) for the geofence
-    *    last_transition - The current state of the geofence. For example, if
-    *       the system already knows that the user is inside the geofence,
-    *       this will be set to GPS_GEOFENCE_ENTERED. In most cases, it
-    *       will be GPS_GEOFENCE_UNCERTAIN.
-    *    monitor_transition - Which transitions to monitor. Bitwise OR of
-    *       GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED and
-    *       GPS_GEOFENCE_UNCERTAIN.
-    *    notification_responsiveness_ms - Defines the best-effort description
-    *       of how soon should the callback be called when the transition
-    *       associated with the Geofence is triggered. For instance, if set
-    *       to 1000 millseconds with GPS_GEOFENCE_ENTERED, the callback
-    *       should be called 1000 milliseconds within entering the geofence.
-    *       This parameter is defined in milliseconds.
-    *       NOTE: This is not to be confused with the rate that the GPS is
-    *       polled at. It is acceptable to dynamically vary the rate of
-    *       sampling the GPS for power-saving reasons; thus the rate of
-    *       sampling may be faster or slower than this.
-    *    unknown_timer_ms - The time limit after which the UNCERTAIN transition
-    *       should be triggered. This paramter is defined in milliseconds.
-    *       See above for a detailed explanation.
-    *    Return value: 0 on success, -1 on error.
-    */
-   int (*add_geofence_area) (int32_t geofence_id, double latitude,
-                                double longitude, double radius_meters,
-                                int last_transition, int monitor_transitions,
-                                int notification_responsiveness_ms,
-                                int unknown_timer_ms);
-
-   /**
-    * Pause monitoring a particular geofence.
-    * Parameters:
-    *   geofence_id - The id for the geofence.
-    *
-    * Return value: 0 on success, -1 on error.
-    */
-   int (*pause_geofence) (int32_t geofence_id);
-
-   /**
-    * Resume monitoring a particular geofence.
-    * Parameters:
-    *   geofence_id - The id for the geofence.
-    *   monitor_transitions - Which transitions to monitor. Bitwise OR of
-    *       GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED and
-    *       GPS_GEOFENCE_UNCERTAIN.
-    *       This supersedes the value associated provided in the
-    *       add_geofence_area call.
-    *
-    * Return value: 0 on success, -1 on error.
-    *
-    */
-   int (*resume_geofence) (int32_t geofence_id, int monitor_transitions);
-
-   /**
-    * Remove a geofence area
-    * Parameter:
-    *   geofence_id - The id for the geofence.
-    * Return value: 0 on success, -1 on error.
-    */
-   int (*remove_geofence_area) (int32_t geofence_id);
-} GpsGeofencingInterface;
 __END_DECLS
 
 #endif /* ANDROID_INCLUDE_HARDWARE_GPS_H */
