diff --git a/plugin.xml b/plugin.xml
index b5e1ad7..dce8caf 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -31,6 +31,8 @@
     <repo>https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git</repo>
     <issue>https://issues.apache.org/jira/browse/CB/component/12320638</issue>
 
+    <dependency id="cordova-plugin-compat" version="^1.0.0" />
+
     <!-- android -->
     <platform name="android">
 
@@ -46,7 +48,6 @@
         </config-file>
 
         <source-file src="src/android/Geolocation.java" target-dir="src/org/apache/cordova/geolocation/" />
-        <source-file src="src/android/PermissionHelper.java" target-dir="src/org/apache/cordova/geolocation/" />
 
         <js-module src="www/android/geolocation.js" name="geolocation">
             <clobbers target="navigator.geolocation" />
diff --git a/src/android/Geolocation.java b/src/android/Geolocation.java
index f5a1cae..3e0bd8a 100644
--- a/src/android/Geolocation.java
+++ b/src/android/Geolocation.java
@@ -26,6 +26,7 @@
 import org.apache.cordova.CallbackContext;
 import org.apache.cordova.CordovaArgs;
 import org.apache.cordova.CordovaPlugin;
+import org.apache.cordova.PermissionHelper;
 import org.apache.cordova.PluginResult;
 import org.apache.cordova.LOG;
 import org.json.JSONArray;
diff --git a/src/android/PermissionHelper.java b/src/android/PermissionHelper.java
deleted file mode 100644
index 4a3ca2d..0000000
--- a/src/android/PermissionHelper.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you 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.
-*/
-package org.apache.cordova.geolocation;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-
-import org.apache.cordova.CordovaInterface;
-import org.apache.cordova.CordovaPlugin;
-import org.apache.cordova.LOG;
-
-import android.content.pm.PackageManager;
-
-/**
- * This class provides reflective methods for permission requesting and checking so that plugins
- * written for cordova-android 5.0.0+ can still compile with earlier cordova-android versions.
- */
-public class PermissionHelper {
-    private static final String LOG_TAG = "CordovaPermissionHelper";
-
-    /**
-     * Requests a "dangerous" permission for the application at runtime. This is a helper method
-     * alternative to cordovaInterface.requestPermission() that does not require the project to be
-     * built with cordova-android 5.0.0+
-     *
-     * @param plugin        The plugin the permission is being requested for
-     * @param requestCode   A requestCode to be passed to the plugin's onRequestPermissionResult()
-     *                      along with the result of the permission request
-     * @param permission    The permission to be requested
-     */
-    public static void requestPermission(CordovaPlugin plugin, int requestCode, String permission) {
-        PermissionHelper.requestPermissions(plugin, requestCode, new String[] {permission});
-    }
-
-    /**
-     * Requests "dangerous" permissions for the application at runtime. This is a helper method
-     * alternative to cordovaInterface.requestPermissions() that does not require the project to be
-     * built with cordova-android 5.0.0+
-     *
-     * @param plugin        The plugin the permissions are being requested for
-     * @param requestCode   A requestCode to be passed to the plugin's onRequestPermissionResult()
-     *                      along with the result of the permissions request
-     * @param permissions   The permissions to be requested
-     */
-    public static void requestPermissions(CordovaPlugin plugin, int requestCode, String[] permissions) {
-        try {
-            Method requestPermission = CordovaInterface.class.getDeclaredMethod(
-                    "requestPermissions", CordovaPlugin.class, int.class, String[].class);
-
-            // If there is no exception, then this is cordova-android 5.0.0+
-            requestPermission.invoke(plugin.cordova, plugin, requestCode, permissions);
-        } catch (NoSuchMethodException noSuchMethodException) {
-            // cordova-android version is less than 5.0.0, so permission is implicitly granted
-            LOG.d(LOG_TAG, "No need to request permissions " + Arrays.toString(permissions));
-
-            // Notify the plugin that all were granted by using more reflection
-            deliverPermissionResult(plugin, requestCode, permissions);
-        } catch (IllegalAccessException illegalAccessException) {
-            // Should never be caught; this is a public method
-            LOG.e(LOG_TAG, "IllegalAccessException when requesting permissions " + Arrays.toString(permissions), illegalAccessException);
-        } catch(InvocationTargetException invocationTargetException) {
-            // This method does not throw any exceptions, so this should never be caught
-            LOG.e(LOG_TAG, "invocationTargetException when requesting permissions " + Arrays.toString(permissions), invocationTargetException);
-        }
-    }
-
-    /**
-     * Checks at runtime to see if the application has been granted a permission. This is a helper
-     * method alternative to cordovaInterface.hasPermission() that does not require the project to
-     * be built with cordova-android 5.0.0+
-     *
-     * @param plugin        The plugin the permission is being checked against
-     * @param permission    The permission to be checked
-     *
-     * @return              True if the permission has already been granted and false otherwise
-     */
-    public static boolean hasPermission(CordovaPlugin plugin, String permission) {
-        try {
-            Method hasPermission = CordovaInterface.class.getDeclaredMethod("hasPermission", String.class);
-
-            // If there is no exception, then this is cordova-android 5.0.0+
-            return (Boolean) hasPermission.invoke(plugin.cordova, permission);
-        } catch (NoSuchMethodException noSuchMethodException) {
-            // cordova-android version is less than 5.0.0, so permission is implicitly granted
-            LOG.d(LOG_TAG, "No need to check for permission " + permission);
-            return true;
-        } catch (IllegalAccessException illegalAccessException) {
-            // Should never be caught; this is a public method
-            LOG.e(LOG_TAG, "IllegalAccessException when checking permission " + permission, illegalAccessException);
-        } catch(InvocationTargetException invocationTargetException) {
-            // This method does not throw any exceptions, so this should never be caught
-            LOG.e(LOG_TAG, "invocationTargetException when checking permission " + permission, invocationTargetException);
-        }
-        return false;
-    }
-
-    private static void deliverPermissionResult(CordovaPlugin plugin, int requestCode, String[] permissions) {
-        // Generate the request results
-        int[] requestResults = new int[permissions.length];
-        Arrays.fill(requestResults, PackageManager.PERMISSION_GRANTED);
-
-        try {
-            Method onRequestPermissionResult = CordovaPlugin.class.getDeclaredMethod(
-                    "onRequestPermissionResult", int.class, String[].class, int[].class);
-
-            onRequestPermissionResult.invoke(plugin, requestCode, permissions, requestResults);
-        } catch (NoSuchMethodException noSuchMethodException) {
-            // Should never be caught since the plugin must be written for cordova-android 5.0.0+ if it
-            // made it to this point
-            LOG.e(LOG_TAG, "NoSuchMethodException when delivering permissions results", noSuchMethodException);
-        } catch (IllegalAccessException illegalAccessException) {
-            // Should never be caught; this is a public method
-            LOG.e(LOG_TAG, "IllegalAccessException when delivering permissions results", illegalAccessException);
-        } catch(InvocationTargetException invocationTargetException) {
-            // This method may throw a JSONException. We are just duplicating cordova-android's
-            // exception handling behavior here; all it does is log the exception in CordovaActivity,
-            // print the stacktrace, and ignore it
-            LOG.e(LOG_TAG, "InvocationTargetException when delivering permissions results", invocationTargetException);
-        }
-    }
-}
