diff --git a/app/build.gradle b/app/build.gradle
index 265096a..a2694a8 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,7 +1,7 @@
 apply plugin: 'com.android.application'
 
 android {
-    compileSdkVersion 23
+    compileSdkVersion 25
     buildToolsVersion "23.0.3"
 
     lintOptions {
@@ -12,25 +12,41 @@
     applicationVariants.all { variant ->
         variant.outputs.each { output ->
             output.outputFile = new File(
-                    output.outputFile.parent, "masquerade_beta_testers" + versionCode + ".apk")
+                    output.outputFile.parent, "masquerade_" + versionCode + ".apk")
         }
     }
 
     defaultConfig {
         applicationId "masquerade.substratum"
-        minSdkVersion 21
-        targetSdkVersion 23
-        versionCode 20
-        versionName "twenty - procyon"
+        minSdkVersion 25
+        targetSdkVersion 25
+        versionCode 23
+        versionName "twenty three"
+    }
+
+    defaultConfig {
+        jackOptions {
+            enabled true
+        }
+    }
+
+    compileOptions {
+        incremental true
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+
+    dexOptions {
+        javaMaxHeapSize '2048m'
     }
 
     buildTypes {
         debug {
-            minifyEnabled true
+            minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
         release {
-            minifyEnabled true
+            minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
     }
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 13db0f9..2554839 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,40 +1,39 @@
+<!--suppress AndroidUnknownAttribute -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="masquerade.substratum"
-          android:versionCode="21"
-          android:versionName="twentyone - something"
+          xmlns:tools="http://schemas.android.com/tools"
           coreApp="true"
-          android:sharedUserId="android.uid.system">
+          package="masquerade.substratum"
+          android:sharedUserId="android.uid.system"
+          android:versionCode="23"
+          android:versionName="twenty three"
+          tools:ignore="GradleOverrides">
 
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
     <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
-    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
-    <uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"/>
-    <uses-permission android:name="android.permission.DELETE_PACKAGES"/>
-    <uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
+    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
+    <uses-permission
+        android:name="android.permission.FORCE_STOP_PACKAGES"
+        tools:ignore="ProtectedPermissions"/>
+    <uses-permission
+        android:name="android.permission.DELETE_PACKAGES"
+        tools:ignore="ProtectedPermissions"/>
+    <uses-permission
+        android:name="android.permission.INSTALL_PACKAGES"
+        tools:ignore="ProtectedPermissions"/>
     <uses-permission android:name="android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS"/>
     <uses-permission android:name="android.permission.MODIFY_OVERLAYS"/>
 
     <application
-        android:allowBackup="true"
-        android:icon="@mipmap/substratum_masquerade"
+        android:allowBackup="false"
+        android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:supportsRtl="true"
-        android:theme="@style/AppTheme">
-        <receiver android:name=".receivers.BootReceiver">
-            <intent-filter>
-                <action android:name="android.intent.action.BOOT_COMPLETED"/>
-            </intent-filter>
-        </receiver>
-        <receiver android:name=".receivers.UninstallReceiver">
-            <intent-filter>
-                <action android:name="android.intent.action.PACKAGE_REMOVED"/>
-                <data android:scheme="package"/>
-            </intent-filter>
-        </receiver>
-        <service android:name=".services.JobService"
+        android:theme="@style/AppTheme"
+        tools:ignore="GoogleAppIndexingWarning">
+        <service
+            android:name=".services.JobService"
             android:exported="true"
-            android:permission="android.permission.MODIFY_OVERLAYS" />
+            android:permission="android.permission.MODIFY_OVERLAYS"/>
     </application>
 </manifest>
diff --git a/app/src/main/java/masquerade/substratum/receivers/BootReceiver.java b/app/src/main/java/masquerade/substratum/receivers/BootReceiver.java
deleted file mode 100644
index ebc0c8b..0000000
--- a/app/src/main/java/masquerade/substratum/receivers/BootReceiver.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package masquerade.substratum.receivers;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-
-public class BootReceiver extends BroadcastReceiver {
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        // do something
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/masquerade/substratum/receivers/UninstallReceiver.java b/app/src/main/java/masquerade/substratum/receivers/UninstallReceiver.java
deleted file mode 100644
index b377e27..0000000
--- a/app/src/main/java/masquerade/substratum/receivers/UninstallReceiver.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package masquerade.substratum.receivers;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Environment;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class UninstallReceiver extends BroadcastReceiver {
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        if ("android.intent.action.PACKAGE_REMOVED".equals(intent.getAction())) {
-            Uri packageName = intent.getData();
-            if (packageName.toString().substring(8).equals("projekt.substratum")) {
-//                new performUninstalls().execute("");
-            }
-        }
-    }
-/*
-    public class performUninstalls extends AsyncTask<String, Integer, String> {
-        @Override
-        protected String doInBackground(String... sUrl) {
-            // Substratum was uninstalled, uninstall all remaining overlays
-            Log.d("Masquerade",
-                    "Substratum was uninstalled, so all remaining overlays will be removed...");
-            String[] state4 = {Environment.getExternalStorageDirectory()
-                    .getAbsolutePath() + "/.substratum/current_overlays.xml", "4"};
-            String[] state5 = {Environment.getExternalStorageDirectory()
-                    .getAbsolutePath() + "/.substratum/current_overlays.xml", "5"};
-            List<String> state5overlays = ReadOverlaysFile.main(state5);
-            ArrayList<String> all_overlays = new ArrayList<>(ReadOverlaysFile.main(state4));
-            all_overlays.addAll(state5overlays);
-            for (int i = 0; i < all_overlays.size(); i++) {
-                Log.d("Masquerade", "Uninstalling overlay: " + all_overlays.get(i));
-                Root.runCommand("pm uninstall " + all_overlays.get(i));
-            }
-            return null;
-        }
-    }
-    */
-}
\ No newline at end of file
diff --git a/app/src/main/java/masquerade/substratum/services/JobService.java b/app/src/main/java/masquerade/substratum/services/JobService.java
index 20cf166..9e6ef3f 100644
--- a/app/src/main/java/masquerade/substratum/services/JobService.java
+++ b/app/src/main/java/masquerade/substratum/services/JobService.java
@@ -1,3 +1,23 @@
+/*
+ * Copyright (c) 2017 Project Substratum
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ * Also add information on how to contact you by electronic and paper mail.
+ *
+ */
+
 package masquerade.substratum.services;
 
 import android.app.ActivityManager;
@@ -7,24 +27,19 @@
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
-import android.content.IIntentReceiver;
-import android.content.IIntentSender;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.IntentSender;
 import android.content.om.IOverlayManager;
 import android.content.om.OverlayInfo;
 import android.content.pm.IPackageDeleteObserver;
 import android.content.pm.IPackageInstallObserver2;
 import android.content.pm.IPackageManager;
-import android.content.pm.PackageInstaller;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.AssetManager;
 import android.content.res.Configuration;
 import android.graphics.Typeface;
 import android.media.RingtoneManager;
-import android.os.Binder;
 import android.os.Bundle;
 import android.os.Environment;
 import android.os.FileUtils;
@@ -42,42 +57,21 @@
 import android.text.TextUtils;
 import android.util.Log;
 
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
-import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
-import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.TimeUnit;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
+import java.util.stream.Collectors;
 
 import masquerade.substratum.utils.IOUtils;
 import masquerade.substratum.utils.SoundUtils;
 
-import com.android.internal.statusbar.IStatusBarService;
-
 public class JobService extends Service {
-    private static final String TAG = JobService.class.getSimpleName();
-    private static final boolean DEBUG = true;
-
-    private static final String MASQUERADE_TOKEN = "masquerade_token";
-    private static final String SUBSTRATUM_PACKAGE = "projekt.substratum";
-    private static final String[] AUTHORIZED_CALLERS = new String[] {
-            SUBSTRATUM_PACKAGE,
-            "masquerade.substratum"
-    };
-
     public static final String INTENT_STATUS_CHANGED = "masquerade.substratum.STATUS_CHANGED";
-
     public static final String PRIMARY_COMMAND_KEY = "primary_command_key";
     public static final String JOB_TIME_KEY = "job_time_key";
     public static final String INSTALL_LIST_KEY = "install_list";
@@ -109,20 +103,47 @@
     public static final String COMMAND_VALUE_MOVE = "move";
     public static final String COMMAND_VALUE_DELETE = "delete";
     public static final String COMMAND_VALUE_PROFILE = "profile";
-
+    private static final String TAG = JobService.class.getSimpleName();
+    private static final boolean DEBUG = true;
+    private static final String MASQUERADE_TOKEN = "masquerade_token";
+    private static final String MASQUERADE_PACKAGE = "masquerade.substratum";
+    private static final String SUBSTRATUM_PACKAGE = "projekt.substratum";
+    private static final String[] AUTHORIZED_CALLERS = new String[]{
+            MASQUERADE_PACKAGE,
+            SUBSTRATUM_PACKAGE,
+    };
     private static IOverlayManager mOMS;
     private static IPackageManager mPM;
-
-    private HandlerThread mWorker;
+    private final List<Runnable> mJobQueue = new ArrayList<>(0);
     private JobHandler mJobHandler;
     private MainHandler mMainHandler;
-    private final List<Runnable> mJobQueue = new ArrayList<>(0);
     private long mLastJobTime;
     private boolean mIsRunning;
 
+    private static IOverlayManager getOMS() {
+        if (mOMS == null) {
+            mOMS = IOverlayManager.Stub.asInterface(
+                    ServiceManager.getService("overlay"));
+        }
+        return mOMS;
+    }
+
+    private static IPackageManager getPM() {
+        if (mPM == null) {
+            mPM = IPackageManager.Stub.asInterface(
+                    ServiceManager.getService("package"));
+        }
+        return mPM;
+    }
+
+    public static void log(String msg) {
+        if (DEBUG) Log.e(TAG, msg);
+    }
+
     @Override
     public void onCreate() {
-        mWorker = new HandlerThread("BackgroundWorker", Process.THREAD_PRIORITY_BACKGROUND);
+        HandlerThread mWorker = new HandlerThread("BackgroundWorker", Process
+                .THREAD_PRIORITY_BACKGROUND);
         mWorker.start();
         mJobHandler = new JobHandler(mWorker.getLooper());
         mMainHandler = new MainHandler(Looper.getMainLooper());
@@ -137,39 +158,33 @@
         }
 
         // Don't run job if there is another running job
-        mIsRunning = false;
-        if (isProcessing()) mIsRunning = true;
+        mIsRunning = isProcessing();
 
-        // filter out duplicate intents
+        // Filter out duplicate intents
         long jobTime = intent.getLongExtra(JOB_TIME_KEY, 1);
         if (jobTime == 1 || jobTime == mLastJobTime) {
-            log("got empty jobtime or duplicate job time, aborting");
+            log("Received empty job time or duplicate job time, aborting");
             return START_NOT_STICKY;
         }
         mLastJobTime = jobTime;
 
-        // must have a primary command
+        // Must have a primary command
         String command = intent.getStringExtra(PRIMARY_COMMAND_KEY);
         if (TextUtils.isEmpty(command)) {
-            log("Got empty primary command, aborting");
+            log("Received empty primary command, aborting");
             return START_NOT_STICKY;
         }
 
-        // queue up the job
-
+        // Queue up the job
         List<Runnable> jobs_to_add = new ArrayList<>(0);
 
-        log("Starting job with primary command " + command + " With job time " + jobTime);
+        log("Starting job with primary command \'" + command + "\', with job time: " + jobTime);
         if (TextUtils.equals(command, COMMAND_VALUE_INSTALL)) {
             List<String> paths = intent.getStringArrayListExtra(INSTALL_LIST_KEY);
-            for (String path : paths) {
-                jobs_to_add.add(new Installer(path));
-            }
+            jobs_to_add.addAll(paths.stream().map(Installer::new).collect(Collectors.toList()));
         } else if (TextUtils.equals(command, COMMAND_VALUE_UNINSTALL)) {
             List<String> packages = intent.getStringArrayListExtra(UNINSTALL_LIST_KEY);
-            for (String _package : packages) {
-                jobs_to_add.add(new Remover(_package));
-            }
+            jobs_to_add.addAll(packages.stream().map(Remover::new).collect(Collectors.toList()));
             if (shouldRestartUi(packages)) jobs_to_add.add(new UiResetJob());
         } else if (TextUtils.equals(command, COMMAND_VALUE_RESTART_UI)) {
             jobs_to_add.add(new UiResetJob());
@@ -194,15 +209,11 @@
             jobs_to_add.add(new UiResetJob());
         } else if (TextUtils.equals(command, COMMAND_VALUE_ENABLE)) {
             List<String> packages = intent.getStringArrayListExtra(ENABLE_LIST_KEY);
-            for (String _package : packages) {
-                jobs_to_add.add(new Enabler(_package));
-            }
+            jobs_to_add.addAll(packages.stream().map(Enabler::new).collect(Collectors.toList()));
             if (shouldRestartUi(packages)) jobs_to_add.add(new UiResetJob());
         } else if (TextUtils.equals(command, COMMAND_VALUE_DISABLE)) {
             List<String> packages = intent.getStringArrayListExtra(DISABLE_LIST_KEY);
-            for (String _package : packages) {
-                jobs_to_add.add(new Disabler(_package));
-            }
+            jobs_to_add.addAll(packages.stream().map(Disabler::new).collect(Collectors.toList()));
             if (shouldRestartUi(packages)) jobs_to_add.add(new UiResetJob());
         } else if (TextUtils.equals(command, COMMAND_VALUE_PRIORITY)) {
             List<String> packages = intent.getStringArrayListExtra(PRIORITY_LIST_KEY);
@@ -241,7 +252,6 @@
                 mJobHandler.sendEmptyMessage(JobHandler.MESSAGE_CHECK_QUEUE);
             }
         }
-
         return START_NOT_STICKY;
     }
 
@@ -252,35 +262,13 @@
 
     @Override
     public void onDestroy() {
-
     }
 
     private boolean isProcessing() {
         return mJobQueue.size() > 0;
     }
 
-    private class LocalService extends Binder {
-        public JobService getService() {
-            return JobService.this;
-        }
-    }
-
-    private static IOverlayManager getOMS() {
-        if (mOMS == null) {
-            mOMS = IOverlayManager.Stub.asInterface(
-                    ServiceManager.getService("overlay"));
-        }
-        return mOMS;
-    }
-
-    private static IPackageManager getPM() {
-        if (mPM == null) {
-            mPM = IPackageManager.Stub.asInterface(
-                    ServiceManager.getService("package"));
-        }
-        return mPM;
-    }
-
+    @SuppressWarnings("deprecation")
     private void install(String path, IPackageInstallObserver2 observer) {
         try {
             getPM().installPackageAsUser(path, observer,
@@ -292,6 +280,7 @@
         }
     }
 
+    @SuppressWarnings("deprecation")
     private void uninstall(String packageName, IPackageDeleteObserver observer) {
         try {
             getPM().deletePackageAsUser(packageName, observer, 0, UserHandle.USER_SYSTEM);
@@ -315,7 +304,7 @@
             if (info != null) {
                 enabled = info.isEnabled();
             } else {
-                log("info is null");
+                log("OverlayInfo is null.");
             }
         } catch (RemoteException e) {
             e.printStackTrace();
@@ -331,24 +320,25 @@
     }
 
     private void copyFonts(String pid, String zipFileName) {
-        // prepare local cache dir for font package assembly
+        // Prepare local cache dir for font package assembly
         log("Copy Fonts - Package ID = " + pid + " filename = " + zipFileName);
         File cacheDir = new File(getCacheDir(), "/FontCache/");
         if (cacheDir.exists()) {
             IOUtils.deleteRecursive(cacheDir);
         }
-        cacheDir.mkdir();
+        boolean created = cacheDir.mkdir();
+        if (!created) log("Could not create cache directory...");
 
-        // copy system fonts into our cache dir
+        // Copy system fonts into our cache dir
         IOUtils.copyFolder("/system/fonts", cacheDir.getAbsolutePath());
 
-        // append zip to filename since it is probably removed
+        // Append zip to filename since it is probably removed
         // for list presentation
         if (!zipFileName.endsWith(".zip")) {
             zipFileName = zipFileName + ".zip";
         }
 
-        // copy target themed fonts zip to our cache dir
+        // Copy target themed fonts zip to our cache dir
         Context themeContext = getAppContext(pid);
         AssetManager am = themeContext.getAssets();
         try {
@@ -360,12 +350,13 @@
             e.printStackTrace();
         }
 
-        // unzip new fonts and delete zip file, overwriting any system fonts
+        // Unzip new fonts and delete zip file, overwriting any system fonts
         File fontZip = new File(getCacheDir(), "/FontCache/" + zipFileName);
         IOUtils.unzip(fontZip.getAbsolutePath(), cacheDir.getAbsolutePath());
-        fontZip.delete();
+        boolean deleted = fontZip.delete();
+        if (!deleted) log("Could not delete ZIP file...");
 
-        // check if theme zip included a fonts.xml. If not, Substratum
+        // Check if theme zip included a fonts.xml. If not, Substratum
         // is kind enough to provide one for us in it's assets
         try {
             File testConfig = new File(getCacheDir(), "/FontCache/" + "fonts.xml");
@@ -380,12 +371,12 @@
             e.printStackTrace();
         }
 
-        // prepare system theme fonts folder and copy new fonts folder from our cache
+        // Prepare system theme fonts folder and copy new fonts folder from our cache
         IOUtils.deleteThemedFonts();
         IOUtils.createFontDirIfNotExists();
         IOUtils.copyFolder(cacheDir.getAbsolutePath(), IOUtils.SYSTEM_THEME_FONT_PATH);
 
-        // let system know it's time for a font change
+        // Let system know it's time for a font change
         refreshFonts();
     }
 
@@ -395,7 +386,7 @@
     }
 
     private void refreshFonts() {
-        // set permissions on font files and config xml
+        // Set permissions on font files and config xml
         File themeFonts = new File(IOUtils.SYSTEM_THEME_FONT_PATH);
         if (themeFonts.exists()) {
             // Set permissions
@@ -404,7 +395,7 @@
                     FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IROTH | FileUtils.S_IXOTH);
         }
 
-        // let system know it's time for a font change
+        // Let system know it's time for a font change
         SystemProperties.set("sys.refresh_theme", "1");
         Typeface.recreateDefaults();
         float fontSize = Float.valueOf(Settings.System.getString(
@@ -414,21 +405,23 @@
     }
 
     private void applyThemedSounds(String pid, String zipFileName) {
-        // prepare local cache dir for font package assembly
-        log("Copy sounds - Package ID = " + pid + " filename = " + zipFileName);
+        // Prepare local cache dir for font package assembly
+        log("CopySounds - Package ID = \'" + pid + "\'");
+        log("CopySounds - File name = \'" + zipFileName + "\'");
         File cacheDir = new File(getCacheDir(), "/SoundsCache/");
         if (cacheDir.exists()) {
             IOUtils.deleteRecursive(cacheDir);
         }
-        cacheDir.mkdir();
+        boolean created = cacheDir.mkdir();
+        if (!created) log("Could not create cache directory...");
 
-        // append zip to filename since it is probably removed
+        // Append zip to filename since it is probably removed
         // for list presentation
         if (!zipFileName.endsWith(".zip")) {
             zipFileName = zipFileName + ".zip";
         }
 
-        // copy target themed sounds zip to our cache dir
+        // Copy target themed sounds zip to our cache dir
         Context themeContext = getAppContext(pid);
         AssetManager am = themeContext.getAssets();
         try {
@@ -440,10 +433,11 @@
             e.printStackTrace();
         }
 
-        // unzip new sounds and delete zip file
+        // Unzip new sounds and delete zip file
         File soundsZip = new File(getCacheDir(), "/SoundsCache/" + zipFileName);
         IOUtils.unzip(soundsZip.getAbsolutePath(), cacheDir.getAbsolutePath());
-        soundsZip.delete();
+        boolean deleted = soundsZip.delete();
+        if (!deleted) log("Could not delete ZIP file...");
 
         clearSounds(this);
         IOUtils.createAudioDirIfNotExists();
@@ -454,30 +448,38 @@
             File effect_tick_mp3 = new File(getCacheDir(), "/SoundsCache/ui/Effect_Tick.mp3");
             File effect_tick_ogg = new File(getCacheDir(), "/SoundsCache/ui/Effect_Tick.ogg");
             if (effect_tick_ogg.exists()) {
-                IOUtils.bufferedCopy(effect_tick_ogg, new File(IOUtils.SYSTEM_THEME_UI_SOUNDS_PATH + File.separator + "Effect_Tick.ogg"));
+                IOUtils.bufferedCopy(effect_tick_ogg, new File(IOUtils
+                        .SYSTEM_THEME_UI_SOUNDS_PATH + File.separator + "Effect_Tick.ogg"));
             } else if (effect_tick_mp3.exists()) {
-                IOUtils.bufferedCopy(effect_tick_mp3, new File(IOUtils.SYSTEM_THEME_UI_SOUNDS_PATH + File.separator + "Effect_Tick.mp3"));
+                IOUtils.bufferedCopy(effect_tick_mp3, new File(IOUtils
+                        .SYSTEM_THEME_UI_SOUNDS_PATH + File.separator + "Effect_Tick.mp3"));
             }
             File new_lock_mp3 = new File(getCacheDir(), "/SoundsCache/ui/Lock.mp3");
             File new_lock_ogg = new File(getCacheDir(), "/SoundsCache/ui/Lock.ogg");
             if (new_lock_ogg.exists()) {
-                IOUtils.bufferedCopy(new_lock_ogg, new File(IOUtils.SYSTEM_THEME_UI_SOUNDS_PATH + File.separator + "Lock.ogg"));
+                IOUtils.bufferedCopy(new_lock_ogg, new File(IOUtils.SYSTEM_THEME_UI_SOUNDS_PATH +
+                        File.separator + "Lock.ogg"));
             } else if (new_lock_mp3.exists()) {
-                IOUtils.bufferedCopy(new_lock_mp3, new File(IOUtils.SYSTEM_THEME_UI_SOUNDS_PATH + File.separator + "Lock.mp3"));
+                IOUtils.bufferedCopy(new_lock_mp3, new File(IOUtils.SYSTEM_THEME_UI_SOUNDS_PATH +
+                        File.separator + "Lock.mp3"));
             }
             File new_unlock_mp3 = new File(getCacheDir(), "/SoundsCache/ui/Unlock.mp3");
             File new_unlock_ogg = new File(getCacheDir(), "/SoundsCache/ui/Unlock.ogg");
             if (new_unlock_ogg.exists()) {
-                IOUtils.bufferedCopy(new_unlock_ogg, new File(IOUtils.SYSTEM_THEME_UI_SOUNDS_PATH + File.separator + "Unlock.ogg"));
+                IOUtils.bufferedCopy(new_unlock_ogg, new File(IOUtils.SYSTEM_THEME_UI_SOUNDS_PATH
+                        + File.separator + "Unlock.ogg"));
             } else if (new_unlock_mp3.exists()) {
-                IOUtils.bufferedCopy(new_unlock_mp3, new File(IOUtils.SYSTEM_THEME_UI_SOUNDS_PATH + File.separator + "Unlock.mp3"));
+                IOUtils.bufferedCopy(new_unlock_mp3, new File(IOUtils.SYSTEM_THEME_UI_SOUNDS_PATH
+                        + File.separator + "Unlock.mp3"));
             }
             File new_lowbattery_mp3 = new File(getCacheDir(), "/SoundsCache/ui/LowBattery.mp3");
             File new_lowbattery_ogg = new File(getCacheDir(), "/SoundsCache/ui/LowBattery.ogg");
             if (new_lowbattery_ogg.exists()) {
-                IOUtils.bufferedCopy(new_lowbattery_ogg, new File(IOUtils.SYSTEM_THEME_UI_SOUNDS_PATH + File.separator + "LowBattery.ogg"));
+                IOUtils.bufferedCopy(new_lowbattery_ogg, new File(IOUtils
+                        .SYSTEM_THEME_UI_SOUNDS_PATH + File.separator + "LowBattery.ogg"));
             } else if (new_lowbattery_mp3.exists()) {
-                IOUtils.bufferedCopy(new_lowbattery_mp3, new File(IOUtils.SYSTEM_THEME_UI_SOUNDS_PATH + File.separator + "LowBattery.mp3"));
+                IOUtils.bufferedCopy(new_lowbattery_mp3, new File(IOUtils
+                        .SYSTEM_THEME_UI_SOUNDS_PATH + File.separator + "LowBattery.mp3"));
             }
         }
         File alarmCache = new File(getCacheDir(), "/SoundsCache/alarms/");
@@ -486,20 +488,26 @@
             File new_alarm_mp3 = new File(getCacheDir(), "/SoundsCache/alarms/alarm.mp3");
             File new_alarm_ogg = new File(getCacheDir(), "/SoundsCache/alarms/alarm.ogg");
             if (new_alarm_ogg.exists()) {
-                IOUtils.bufferedCopy(new_alarm_ogg, new File(IOUtils.SYSTEM_THEME_ALARM_PATH + File.separator + "alarm.ogg"));
+                IOUtils.bufferedCopy(new_alarm_ogg, new File(IOUtils.SYSTEM_THEME_ALARM_PATH +
+                        File.separator + "alarm.ogg"));
             } else if (new_alarm_mp3.exists()) {
-                IOUtils.bufferedCopy(new_alarm_mp3, new File(IOUtils.SYSTEM_THEME_ALARM_PATH + File.separator + "alarm.mp3"));
+                IOUtils.bufferedCopy(new_alarm_mp3, new File(IOUtils.SYSTEM_THEME_ALARM_PATH +
+                        File.separator + "alarm.mp3"));
             }
         }
         File notifCache = new File(getCacheDir(), "/SoundsCache/notifications/");
         if (notifCache.exists() && notifCache.isDirectory()) {
             IOUtils.createNotificationDirIfNotExists();
-            File new_notif_mp3 = new File(getCacheDir(), "/SoundsCache/notifications/notification.mp3");
-            File new_notif_ogg = new File(getCacheDir(), "/SoundsCache/notifications/notification.ogg");
+            File new_notif_mp3 = new File(getCacheDir(), "/SoundsCache/notifications/notification" +
+                    ".mp3");
+            File new_notif_ogg = new File(getCacheDir(), "/SoundsCache/notifications/notification" +
+                    ".ogg");
             if (new_notif_ogg.exists()) {
-                IOUtils.bufferedCopy(new_notif_ogg, new File(IOUtils.SYSTEM_THEME_NOTIFICATION_PATH + File.separator + "notification.ogg"));
+                IOUtils.bufferedCopy(new_notif_ogg, new File(IOUtils
+                        .SYSTEM_THEME_NOTIFICATION_PATH + File.separator + "notification.ogg"));
             } else if (new_notif_mp3.exists()) {
-                IOUtils.bufferedCopy(new_notif_mp3, new File(IOUtils.SYSTEM_THEME_NOTIFICATION_PATH + File.separator + "notification.mp3"));
+                IOUtils.bufferedCopy(new_notif_mp3, new File(IOUtils
+                        .SYSTEM_THEME_NOTIFICATION_PATH + File.separator + "notification.mp3"));
             }
         }
         File ringtoneCache = new File(getCacheDir(), "/SoundsCache/ringtones/");
@@ -508,28 +516,30 @@
             File new_ring_mp3 = new File(getCacheDir(), "/SoundsCache/ringtones/ringtone.mp3");
             File new_ring_ogg = new File(getCacheDir(), "/SoundsCache/ringtones/ringtone.ogg");
             if (new_ring_ogg.exists()) {
-                IOUtils.bufferedCopy(new_ring_ogg, new File(IOUtils.SYSTEM_THEME_RINGTONE_PATH + File.separator + "ringtone.ogg"));
+                IOUtils.bufferedCopy(new_ring_ogg, new File(IOUtils.SYSTEM_THEME_RINGTONE_PATH +
+                        File.separator + "ringtone.ogg"));
             } else if (new_ring_mp3.exists()) {
-                IOUtils.bufferedCopy(new_ring_mp3, new File(IOUtils.SYSTEM_THEME_RINGTONE_PATH + File.separator + "ringtone.mp3"));
+                IOUtils.bufferedCopy(new_ring_mp3, new File(IOUtils.SYSTEM_THEME_RINGTONE_PATH +
+                        File.separator + "ringtone.mp3"));
             }
         }
 
-        // let system know it's time for a sound change
+        // Let system know it's time for a sound change
         refreshSounds();
     }
 
     private void clearSounds(Context ctx) {
         IOUtils.deleteThemedAudio();
-        SoundUtils.setDefaultAudible(JobService.this, RingtoneManager.TYPE_ALARM);
-        SoundUtils.setDefaultAudible(JobService.this, RingtoneManager.TYPE_NOTIFICATION);
-        SoundUtils.setDefaultAudible(JobService.this, RingtoneManager.TYPE_RINGTONE);
+        SoundUtils.setDefaultAudible(ctx, RingtoneManager.TYPE_ALARM);
+        SoundUtils.setDefaultAudible(ctx, RingtoneManager.TYPE_NOTIFICATION);
+        SoundUtils.setDefaultAudible(ctx, RingtoneManager.TYPE_RINGTONE);
         SoundUtils.setDefaultUISounds(getContentResolver(), "lock_sound", "Lock.ogg");
         SoundUtils.setDefaultUISounds(getContentResolver(), "unlock_sound", "Unlock.ogg");
         SoundUtils.setDefaultUISounds(getContentResolver(), "low_battery_sound",
                 "LowBattery.ogg");
     }
 
-    private void refreshSounds () {
+    private void refreshSounds() {
         File soundsDir = new File(IOUtils.SYSTEM_THEME_AUDIO_PATH);
         if (soundsDir.exists()) {
             // Set permissions
@@ -644,13 +654,15 @@
             }
         }
     }
+
     private void copyBootAnimation(String fileName) {
         try {
             clearBootAnimation();
             File source = new File(fileName);
             File dest = new File(IOUtils.SYSTEM_THEME_BOOTANIMATION_PATH);
             IOUtils.bufferedCopy(source, dest);
-            source.delete();
+            boolean deleted = source.delete();
+            if (!deleted) log("Could not delete source file...");
             IOUtils.setPermissions(dest,
                     FileUtils.S_IRWXU | FileUtils.S_IRGRP | FileUtils.S_IROTH);
         } catch (Exception e) {
@@ -662,21 +674,25 @@
         try {
             File f = new File(IOUtils.SYSTEM_THEME_BOOTANIMATION_PATH);
             if (f.exists()) {
-                f.delete();
+                boolean deleted = f.delete();
+                if (!deleted) log("Could not delete themed boot animation...");
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
+    @SuppressWarnings({"unchecked", "ConfusingArgumentToVarargsMethod"})
     private void restartUi() {
         try {
             ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
             Class ActivityManagerNative = Class.forName("android.app.ActivityManagerNative");
             Method getDefault = ActivityManagerNative.getDeclaredMethod("getDefault", null);
             Object amn = getDefault.invoke(null, null);
-            Method killApplicationProcess = amn.getClass().getDeclaredMethod("killApplicationProcess", String.class, int.class);
-            stopService(new Intent().setComponent(new ComponentName("com.android.systemui", "com.android.systemui.SystemUIService")));
+            Method killApplicationProcess = amn.getClass().getDeclaredMethod
+                    ("killApplicationProcess", String.class, int.class);
+            stopService(new Intent().setComponent(new ComponentName("com.android.systemui", "com" +
+                    ".android.systemui.SystemUIService")));
             am.killBackgroundProcesses("com.android.systemui");
             for (ActivityManager.RunningAppProcessInfo app : am.getRunningAppProcesses()) {
                 if ("com.android.systemui".equals(app.processName)) {
@@ -689,15 +705,6 @@
         }
     }
 
-    private void killPackage(String packageName) {
-        try {
-            ActivityManagerNative.getDefault().forceStopPackage(packageName,
-                    UserHandle.USER_SYSTEM);
-        } catch (RemoteException e) {
-            e.printStackTrace();
-        }
-    }
-
     private Context getSubsContext() {
         return getAppContext(SUBSTRATUM_PACKAGE);
     }
@@ -713,45 +720,38 @@
         return ctx;
     }
 
-    public static void log(String msg) {
-        if (DEBUG) {
-            Log.e(TAG, msg);
-        }
-    }
-
     private boolean isCallerAuthorized(Intent intent) {
         PendingIntent token = null;
         try {
-            token = (PendingIntent) intent.getParcelableExtra(MASQUERADE_TOKEN);
+            token = intent.getParcelableExtra(MASQUERADE_TOKEN);
         } catch (Exception e) {
-            log("Attempt to start serivce without a token, unauthorized");
+            log("Attempting to start service without a token - unauthorized!");
         }
-        if (token == null) {
-            return false;
-        }
-        // SECOND: we got a token, validate originating package
-        // if not in our whitelist, return null
+        if (token == null) return false;
+        // SECOND: We got a token, validate originating package
+        // if not in our white list, return null
         String callingPackage = token.getCreatorPackage();
         boolean isValidPackage = false;
-        for (int i = 0; i < AUTHORIZED_CALLERS.length; i++) {
-            if (TextUtils.equals(callingPackage, AUTHORIZED_CALLERS[i])) {
-                log(callingPackage
-                        + " is an authorized calling package, next validate calling package perms");
+        for (String AUTHORIZED_CALLER : AUTHORIZED_CALLERS) {
+            if (TextUtils.equals(callingPackage, AUTHORIZED_CALLER)) {
+                log("\'" + callingPackage
+                        + "\' is an authorized calling package, validating calling package " +
+                        "permissions...");
                 isValidPackage = true;
                 break;
             }
         }
         if (!isValidPackage) {
-            log(callingPackage + " is not an authorized calling package");
+            log("\'" + callingPackage + "\' is not an authorized calling package.");
             return false;
         }
         return true;
     }
 
     private class MainHandler extends Handler {
-        public static final int MSG_JOB_QUEUE_EMPTY = 1;
+        static final int MSG_JOB_QUEUE_EMPTY = 1;
 
-        public MainHandler(Looper looper) {
+        MainHandler(Looper looper) {
             super(looper);
         }
 
@@ -771,7 +771,7 @@
         private static final int MESSAGE_CHECK_QUEUE = 1;
         private static final int MESSAGE_DEQUEUE = 2;
 
-        public JobHandler(Looper looper) {
+        JobHandler(Looper looper) {
             super(looper);
         }
 
@@ -783,9 +783,7 @@
                     synchronized (mJobQueue) {
                         job = mJobQueue.get(0);
                     }
-                    if (job != null && !mIsRunning) {
-                        job.run();
-                    }
+                    if (job != null && !mIsRunning) job.run();
                     break;
                 case MESSAGE_DEQUEUE:
                     Runnable toRemove = (Runnable) msg.obj;
@@ -796,7 +794,7 @@
                             this.sendEmptyMessage(MESSAGE_CHECK_QUEUE);
                         } else {
                             mIsRunning = false;
-                            log("Job queue empty! All done");
+                            log("Job queue is empty. All done!");
                             mMainHandler.sendEmptyMessage(MainHandler.MSG_JOB_QUEUE_EMPTY);
                         }
                     }
@@ -808,23 +806,6 @@
         }
     }
 
-    private class StopPackageJob implements Runnable {
-        String mPackage;
-
-        public void StopPackageJob(String _package) {
-            mPackage = _package;
-        }
-
-        @Override
-        public void run() {
-            killPackage(mPackage);
-            log("Killed package " + mPackage);
-            Message message = mJobHandler.obtainMessage(JobHandler.MESSAGE_DEQUEUE,
-                    StopPackageJob.this);
-            mJobHandler.sendMessage(message);
-        }
-    }
-
     private class UiResetJob implements Runnable {
         @Override
         public void run() {
@@ -841,7 +822,7 @@
         String mPid;
         String mFileName;
 
-        public FontsJob(String pid, String fileName) {
+        FontsJob(String pid, String fileName) {
             if (pid == null) {
                 mClear = true;
             } else {
@@ -853,10 +834,10 @@
         @Override
         public void run() {
             if (mClear) {
-                log("Resetting system font");
+                log("Restoring system font...");
                 clearFonts();
             } else {
-                log("Setting theme font");
+                log("Configuring theme font...");
                 copyFonts(mPid, mFileName);
             }
             Intent intent = new Intent(INTENT_STATUS_CHANGED);
@@ -873,7 +854,7 @@
         String mPid;
         String mFileName;
 
-        public SoundsJob(String pid, String fileName) {
+        SoundsJob(String pid, String fileName) {
             if (pid == null) {
                 mClear = true;
             } else {
@@ -885,10 +866,10 @@
         @Override
         public void run() {
             if (mClear) {
-                log("Resetting system sounds");
+                log("Restoring system sounds...");
                 clearSounds(JobService.this);
             } else {
-                log("Setting theme sounds");
+                log("Configuring theme sounds...");
                 applyThemedSounds(mPid, mFileName);
             }
             Intent intent = new Intent(INTENT_STATUS_CHANGED);
@@ -901,14 +882,14 @@
     }
 
     private class BootAnimationJob implements Runnable {
-        String mFileName;
         final boolean mClear;
+        String mFileName;
 
-        public BootAnimationJob(boolean clear) {
-            mClear = true;
+        BootAnimationJob(boolean clear) {
+            mClear = clear;
         }
 
-        public BootAnimationJob(String fileName) {
+        BootAnimationJob(String fileName) {
             mFileName = fileName;
             mClear = false;
         }
@@ -916,10 +897,10 @@
         @Override
         public void run() {
             if (mClear) {
-                log("Resetting system boot animation");
+                log("Restoring system boot animation...");
                 clearBootAnimation();
             } else {
-                log("Setting themed boot animation");
+                log("Configuring themed boot animation...");
                 copyBootAnimation(mFileName);
             }
             Intent intent = new Intent(INTENT_STATUS_CHANGED);
@@ -934,13 +915,13 @@
     private class Installer implements Runnable {
         String mPath;
 
-        public Installer(String path) {
+        Installer(String path) {
             mPath = path;
         }
 
         @Override
         public void run() {
-            log("Installer - installing " + mPath);
+            log("Installer - installing \'" + mPath + "\'...");
             PackageInstallObserver observer = new PackageInstallObserver(Installer.this);
             install(mPath, observer);
         }
@@ -949,7 +930,7 @@
     private class PackageInstallObserver extends IPackageInstallObserver2.Stub {
         Object mObject;
 
-        public PackageInstallObserver(Object _object) {
+        PackageInstallObserver(Object _object) {
             mObject = _object;
         }
 
@@ -957,8 +938,9 @@
             log("Installer - user action required callback");
         }
 
-        public void onPackageInstalled(String packageName, int returnCode, String msg, Bundle extras) {
-            log("Installer - successfully installed " + packageName);
+        public void onPackageInstalled(String packageName, int returnCode, String msg, Bundle
+                extras) {
+            log("Installer - successfully installed \'" + packageName + "\'!");
             Message message = mJobHandler.obtainMessage(JobHandler.MESSAGE_DEQUEUE, mObject);
             mJobHandler.sendMessage(message);
         }
@@ -967,20 +949,19 @@
     private class Remover implements Runnable {
         String mPackage;
 
-        public Remover(String _package) {
+        Remover(String _package) {
             mPackage = _package;
         }
 
         @Override
         public void run() {
-
             // TODO: Fix isOverlayEnabled function, for now it's causing NPE
             if (isOverlayEnabled(mPackage)) {
-                log("Remover - disabling overlay for " + mPackage);
+                log("Remover - disabling overlay for \'" + mPackage + "\'...");
                 switchOverlay(mPackage, false);
             }
 
-            log("Remover - uninstalling " + mPackage);
+            log("Remover - uninstalling \'" + mPackage + "\'...");
             PackageDeleteObserver observer = new PackageDeleteObserver(Remover.this);
             uninstall(mPackage, observer);
         }
@@ -989,12 +970,12 @@
     private class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
         Object mObject;
 
-        public PackageDeleteObserver(Object _object) {
+        PackageDeleteObserver(Object _object) {
             mObject = _object;
         }
 
         public void packageDeleted(String packageName, int returnCode) {
-            log("Remover - successfully removed " + packageName);
+            log("Remover - successfully removed \'" + packageName + "\'");
             Message message = mJobHandler.obtainMessage(JobHandler.MESSAGE_DEQUEUE, mObject);
             mJobHandler.sendMessage(message);
         }
@@ -1003,13 +984,13 @@
     private class Enabler implements Runnable {
         String mPackage;
 
-        public Enabler(String _package) {
+        Enabler(String _package) {
             mPackage = _package;
         }
 
         @Override
         public void run() {
-            log("Enabler - enabling overlay for " + mPackage);
+            log("Enabler - enabling overlay for \'" + mPackage + "\'...");
             switchOverlay(mPackage, true);
             Message message = mJobHandler.obtainMessage(JobHandler.MESSAGE_DEQUEUE,
                     Enabler.this);
@@ -1020,13 +1001,13 @@
     private class Disabler implements Runnable {
         String mPackage;
 
-        public Disabler(String _package) {
+        Disabler(String _package) {
             mPackage = _package;
         }
 
         @Override
         public void run() {
-            log("Disabler - disabling overlay for " + mPackage);
+            log("Disabler - disabling overlay for \'" + mPackage + "\'...");
             switchOverlay(mPackage, false);
             Message message = mJobHandler.obtainMessage(JobHandler.MESSAGE_DEQUEUE,
                     Disabler.this);
@@ -1037,18 +1018,18 @@
     private class PriorityJob implements Runnable {
         List<String> mPackages;
 
-        public PriorityJob(List<String> _packages) {
+        PriorityJob(List<String> _packages) {
             mPackages = _packages;
         }
 
         @Override
         public void run() {
-            log("PriorityJob - processing priority changes");
+            log("PriorityJob - processing priority changes...");
             try {
                 int size = mPackages.size();
-                for (int i = 0; i < size-1; i++) {
+                for (int i = 0; i < size - 1; i++) {
                     String parentName = mPackages.get(i);
-                    String packageName = mPackages.get(i+1);
+                    String packageName = mPackages.get(i + 1);
                     getOMS().setPriority(packageName, parentName, UserHandle.USER_SYSTEM);
                 }
             } catch (RemoteException e) {
@@ -1064,14 +1045,14 @@
         String mSource;
         String mDestination;
 
-        public CopyJob(String _source, String _destination) {
+        CopyJob(String _source, String _destination) {
             mSource = _source;
             mDestination = _destination;
         }
 
         @Override
         public void run() {
-            log("CopyJob - copying " + mSource + " to " + mDestination);
+            log("CopyJob - copying \'" + mSource + "\' to \'" + mDestination + "\'...");
             File sourceFile = new File(mSource);
             if (sourceFile.exists()) {
                 if (sourceFile.isFile()) {
@@ -1080,7 +1061,7 @@
                     IOUtils.copyFolder(mSource, mDestination);
                 }
             } else {
-                log("CopyJob - " + mSource + " is not exist! aborting...");
+                log("CopyJob - \'" + mSource + "\' does not exist, aborting...");
             }
             Message message = mJobHandler.obtainMessage(JobHandler.MESSAGE_DEQUEUE,
                     CopyJob.this);
@@ -1092,14 +1073,14 @@
         String mSource;
         String mDestination;
 
-        public MoveJob(String _source, String _destination) {
+        MoveJob(String _source, String _destination) {
             mSource = _source;
             mDestination = _destination;
         }
 
         @Override
         public void run() {
-            log("MoveJob - moving " + mSource + " to " + mDestination);
+            log("MoveJob - moving \'" + mSource + "\' to \'" + mDestination + "\'...");
             File sourceFile = new File(mSource);
             if (sourceFile.exists()) {
                 if (sourceFile.isFile()) {
@@ -1109,7 +1090,7 @@
                 }
                 IOUtils.deleteRecursive(sourceFile);
             } else {
-                log("MoveJob - " + mSource + " is not exist! aborting...");
+                log("MoveJob - \'" + mSource + "\' does not exist, aborting...");
             }
             Message message = mJobHandler.obtainMessage(JobHandler.MESSAGE_DEQUEUE,
                     MoveJob.this);
@@ -1120,18 +1101,18 @@
     private class DeleteJob implements Runnable {
         String mFileOrDirectory;
 
-        public DeleteJob(String _directory) {
+        DeleteJob(String _directory) {
             mFileOrDirectory = _directory;
         }
 
         @Override
         public void run() {
-            log("DeleteJob - deleting " + mFileOrDirectory);
+            log("DeleteJob - deleting \'" + mFileOrDirectory + "\'...");
             File file = new File(mFileOrDirectory);
             if (file.exists()) {
                 IOUtils.deleteRecursive(file);
             } else {
-                log("DeleteJob - " + mFileOrDirectory + " is already deleted!");
+                log("DeleteJob - \'" + mFileOrDirectory + "\' is already deleted.");
             }
             Message message = mJobHandler.obtainMessage(JobHandler.MESSAGE_DEQUEUE,
                     DeleteJob.this);
@@ -1144,7 +1125,7 @@
         List<String> mToBeDisabled;
         List<String> mToBeEnabled;
 
-        public ProfileJob(String _name, List<String> _toBeDisabled, List<String> _toBeEnabled) {
+        ProfileJob(String _name, List<String> _toBeDisabled, List<String> _toBeEnabled) {
             mProfileName = _name;
             mToBeDisabled = _toBeDisabled;
             mToBeEnabled = _toBeEnabled;
@@ -1152,11 +1133,10 @@
 
         @Override
         public void run() {
-            boolean restartUi = false;
             log("Applying profile...");
 
             // Need to restart SystemUI?
-            restartUi = shouldRestartUi(mToBeEnabled) || shouldRestartUi(mToBeDisabled);
+            boolean restartUi = shouldRestartUi(mToBeDisabled);
 
             // Clear system theme folder content
             File themeDir = new File(IOUtils.SYSTEM_THEME_PATH);
@@ -1201,7 +1181,7 @@
 
             // Restart SystemUI when needed
             if (restartUi) {
-                synchronized(mJobQueue) {
+                synchronized (mJobQueue) {
                     mJobQueue.add(new UiResetJob());
                 }
             }
@@ -1214,7 +1194,6 @@
 
     private class LocaleChanger extends BroadcastReceiver implements Runnable {
         private boolean mIsRegistered;
-        private boolean mDoRestore;
         private Context mContext;
         private Handler mHandler;
         private Locale mCurrentLocale;
@@ -1229,12 +1208,7 @@
             Intent i = new Intent(Intent.ACTION_MAIN);
             i.addCategory(Intent.CATEGORY_HOME);
             mContext.startActivity(i);
-            mHandler.postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    spoofLocale();
-                }
-            }, 500);
+            mHandler.postDelayed(this::spoofLocale, 500);
         }
 
         private void register() {
@@ -1253,9 +1227,10 @@
             }
         }
 
+        @SuppressWarnings("deprecation")
         private void spoofLocale() {
             Configuration config;
-            log("LocaleChanger - spoofing locale for configuation change shim");
+            log("LocaleChanger - spoofing locale for configuration change shim...");
             try {
                 register();
                 config = ActivityManagerNative.getDefault().getConfiguration();
@@ -1269,13 +1244,12 @@
                 ActivityManagerNative.getDefault().updateConfiguration(config);
             } catch (RemoteException e) {
                 e.printStackTrace();
-                return;
             }
         }
 
         private void restoreLocale() {
             Configuration config;
-            log("LocaleChanger - restoring original locale for configuation change shim");
+            log("LocaleChanger - restoring original locale for configuration change shim...");
             try {
                 unregister();
                 config = ActivityManagerNative.getDefault().getConfiguration();
@@ -1293,40 +1267,7 @@
 
         @Override
         public void onReceive(Context context, Intent intent) {
-            mHandler.postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    restoreLocale();
-                }
-            }, 500);
-        }
-    }
-
-    private static class LocalIntentReceiver {
-        private final SynchronousQueue<Intent> mResult = new SynchronousQueue<>();
-
-        private IIntentSender.Stub mLocalSender = new IIntentSender.Stub() {
-            @Override
-            public void send(int code, Intent intent, String resolvedType,
-                    IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) {
-                try {
-                    mResult.offer(intent, 5, TimeUnit.SECONDS);
-                } catch (InterruptedException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        };
-
-        public IntentSender getIntentSender() {
-            return new IntentSender((IIntentSender) mLocalSender);
-        }
-
-        public Intent getResult() {
-            try {
-                return mResult.take();
-            } catch (InterruptedException e) {
-                throw new RuntimeException(e);
-            }
+            mHandler.postDelayed(this::restoreLocale, 500);
         }
     }
 }
diff --git a/app/src/main/java/masquerade/substratum/services/MasqDemo.java b/app/src/main/java/masquerade/substratum/services/MasqDemo.java
deleted file mode 100644
index b00d6e0..0000000
--- a/app/src/main/java/masquerade/substratum/services/MasqDemo.java
+++ /dev/null
@@ -1,137 +0,0 @@
-
-package masquerade.substratum.services;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.text.TextUtils;
-
-public class MasqDemo {
-    public static final String MASQUERADE_TOKEN = "masquerade_token";
-    public static final String PRIMARY_COMMAND_KEY = "primary_command_key";
-    public static final String JOB_TIME_KEY = "job_time_key";
-    public static final String INSTALL_LIST_KEY = "install_list";
-    public static final String UNINSTALL_LIST_KEY = "uninstall_list";
-    public static final String WITH_RESTART_UI_KEY = "with_restart_ui";
-    public static final String BOOTANIMATION_PID_KEY = "bootanimation_pid";
-    public static final String BOOTANIMATION_FILE_NAME = "bootanimation_file_name";
-    public static final String FONTS_PID = "fonts_pid";
-    public static final String FONTS_FILENAME = "fonts_filename";
-    public static final String AUDIO_PID = "audio_pid";
-    public static final String AUDIO_FILENAME = "audio_filename";
-    public static final String COMMAND_VALUE_INSTALL = "install";
-    public static final String COMMAND_VALUE_UNINSTALL = "uninstall";
-    public static final String COMMAND_VALUE_RESTART_UI = "restart_ui";
-    public static final String COMMAND_VALUE_CONFIGURATION_SHIM = "configuration_shim";
-    public static final String COMMAND_VALUE_BOOTANIMATION = "bootanimation";
-    public static final String COMMAND_VALUE_FONTS = "fonts";
-    public static final String COMMAND_VALUE_AUDIO = "audio";
-    public static final String INTENT_STATUS_CHANGED = "masquerade.substratum.STATUS_CHANGED";
-    public static final String COMMAND_VALUE_JOB_COMPLETE = "job_complete";
-
-    class MasqReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (TextUtils.equals(intent.getAction(), INTENT_STATUS_CHANGED)) {
-                String command = intent.getStringExtra(PRIMARY_COMMAND_KEY);
-                if (TextUtils.equals(command, COMMAND_VALUE_FONTS)) {
-                    // update ui, dismiss progress dialog, etc
-                } else if (TextUtils.equals(command, COMMAND_VALUE_BOOTANIMATION)) {
-
-                } else if (TextUtils.equals(command, COMMAND_VALUE_AUDIO)) {
-
-                } else if (TextUtils.equals(command, COMMAND_VALUE_JOB_COMPLETE)) {
-
-                }
-            }
-        }
-    }
-
-    // demo code for building a base intent for JobService commands
-    public static Intent getMasqIntent(Context ctx) {
-        Intent intent = new Intent();
-        intent.setClassName("masquerade.substratum", "masquerade.substratum.services.JobService");
-        // Credit StackOverflow http://stackoverflow.com/a/28132098
-        // Use dummy PendingIntent for service to validate caller at onBind
-        PendingIntent pending = PendingIntent.getActivity(ctx, 0, new Intent(), 0);
-        intent.putExtra(MASQUERADE_TOKEN, pending);
-        intent.putExtra(JOB_TIME_KEY, System.currentTimeMillis());
-        return intent;
-    }
-
-    public static void install(Context context, ArrayList<String> overlay_apks) {
-        // populate list however
-        Intent masqIntent = getMasqIntent(context);
-        masqIntent.putExtra(PRIMARY_COMMAND_KEY, COMMAND_VALUE_INSTALL);
-        masqIntent.putExtra(INSTALL_LIST_KEY, overlay_apks);
-        context.startService(masqIntent);
-    }
-
-    public static void uninstall(Context context, ArrayList<String> packages_to_remove) {
-        Intent masqIntent = getMasqIntent(context);
-        masqIntent.putExtra(PRIMARY_COMMAND_KEY, COMMAND_VALUE_UNINSTALL);
-        masqIntent.putExtra(UNINSTALL_LIST_KEY, packages_to_remove);
-        // only need to set if true, will restart SystemUI when done processing packages
-        masqIntent.putExtra(WITH_RESTART_UI_KEY, true);
-        context.startService(masqIntent);
-    }
-
-    public static void restartSystemUI(Context context) {
-        Intent masqIntent = getMasqIntent(context);
-        masqIntent.putExtra(PRIMARY_COMMAND_KEY, COMMAND_VALUE_RESTART_UI);
-        context.startService(masqIntent);
-    }
-
-    public static void configurationChangeShim(Context context) {
-        Intent masqIntent = getMasqIntent(context);
-        masqIntent.putExtra(PRIMARY_COMMAND_KEY, COMMAND_VALUE_CONFIGURATION_SHIM);
-        context.startService(masqIntent);
-    }
-    
-    public static void clearThemedBootAnimation(Context context) {
-        applyThemedBootAnimation(context, null);
-    }
-    
-    public static void applyThemedBootAnimation(Context context, String fileName) {
-        Intent masqIntent = getMasqIntent(context);
-        masqIntent.putExtra(PRIMARY_COMMAND_KEY, COMMAND_VALUE_BOOTANIMATION);
-        if (fileName != null) {
-            masqIntent.putExtra(BOOTANIMATION_FILE_NAME, fileName);
-        } else {
-            // nothing. to reset to stock, just don't add PID and FILE
-        }
-        context.startService(masqIntent);
-    }
-    
-    public static void clearThemedFont(Context context) {
-        applyThemedFont(context, null, null);
-    }
-
-    public static void applyThemedFont(Context context, String pid, String fileName) {
-        Intent masqIntent = getMasqIntent(context);
-        masqIntent.putExtra(PRIMARY_COMMAND_KEY, COMMAND_VALUE_FONTS);
-        if (pid != null) {
-            masqIntent.putExtra(FONTS_PID, pid);
-            masqIntent.putExtra(FONTS_FILENAME, fileName);
-        }
-        context.startService(masqIntent);
-    }
-
-    public static void clearThemedSounds(Context context) {
-        applyThemedSounds(context, null, null);
-    }
-
-    public static void applyThemedSounds(Context context, String pid, String fileName) {
-        Intent masqIntent = getMasqIntent(context);
-        masqIntent.putExtra(PRIMARY_COMMAND_KEY, COMMAND_VALUE_AUDIO);
-        if (pid != null) {
-            masqIntent.putExtra(AUDIO_PID, pid);
-            masqIntent.putExtra(AUDIO_FILENAME, fileName);
-        }
-        context.startService(masqIntent);
-    }
-}
diff --git a/app/src/main/java/masquerade/substratum/utils/IOUtils.java b/app/src/main/java/masquerade/substratum/utils/IOUtils.java
index 06b5260..5c9d5c5 100644
--- a/app/src/main/java/masquerade/substratum/utils/IOUtils.java
+++ b/app/src/main/java/masquerade/substratum/utils/IOUtils.java
@@ -1,6 +1,28 @@
+/*
+ * Copyright (c) 2017 Project Substratum
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ * Also add information on how to contact you by electronic and paper mail.
+ *
+ */
 
 package masquerade.substratum.utils;
 
+import android.os.FileUtils;
+import android.util.Log;
+
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
@@ -12,8 +34,6 @@
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
-import android.os.FileUtils;
-
 public class IOUtils {
     public static final String SYSTEM_THEME_PATH = "/data/system/theme";
     public static final String SYSTEM_THEME_FONT_PATH = SYSTEM_THEME_PATH + File.separator
@@ -31,12 +51,12 @@
     public static final String SYSTEM_THEME_BOOTANIMATION_PATH = SYSTEM_THEME_PATH + File.separator
             + "bootanimation.zip";
 
-    public static boolean dirExists(String dirPath) {
+    private static boolean dirExists(String dirPath) {
         final File dir = new File(dirPath);
         return dir.exists() && dir.isDirectory();
     }
 
-    public static void createDirIfNotExists(String dirPath) {
+    private static void createDirIfNotExists(String dirPath) {
         if (!dirExists(dirPath)) {
             File dir = new File(dirPath);
             if (dir.mkdir()) {
@@ -80,17 +100,17 @@
 
     public static void deleteThemedAudio() {
         try {
-            deleteRecursive(new File(SYSTEM_THEME_UI_SOUNDS_PATH));
-            deleteRecursive(new File(SYSTEM_THEME_RINGTONE_PATH));
-            deleteRecursive(new File(SYSTEM_THEME_NOTIFICATION_PATH));
-            deleteRecursive(new File(SYSTEM_THEME_ALARM_PATH));
+            deleteRecursive(new File(SYSTEM_THEME_AUDIO_PATH));
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
     public static void copyFolder(File source, File dest) {
-        if (!dest.exists()) dest.mkdirs();
+        if (!dest.exists()) {
+            boolean created = dest.mkdirs();
+            if (!created) Log.e("CopyFolder", "Could not create destination folder...");
+        }
         File[] files = source.listFiles();
         for (File file : files) {
             try {
@@ -172,7 +192,9 @@
             for (File child : fileOrDirectory.listFiles())
                 deleteRecursive(child);
 
-        fileOrDirectory.delete();
+        boolean deleted = fileOrDirectory.delete();
+        if (!deleted) Log.e("DeleteRecursive", "Could not delete file or directory - \'" +
+                fileOrDirectory.getName() + "\'");
     }
 
     public static void setPermissions(File path, int permissions) {
diff --git a/app/src/main/java/masquerade/substratum/utils/SoundUtils.java b/app/src/main/java/masquerade/substratum/utils/SoundUtils.java
index dda38eb..73999ce 100644
--- a/app/src/main/java/masquerade/substratum/utils/SoundUtils.java
+++ b/app/src/main/java/masquerade/substratum/utils/SoundUtils.java
@@ -1,9 +1,25 @@
+/*
+ * Copyright (c) 2017 Project Substratum
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ * Also add information on how to contact you by electronic and paper mail.
+ *
+ */
 
 package masquerade.substratum.utils;
 
-import java.io.File;
-import java.util.Arrays;
-
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
@@ -13,8 +29,11 @@
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.provider.MediaStore;
-import android.util.Log;
 import android.provider.Settings;
+import android.util.Log;
+
+import java.io.File;
+import java.util.Arrays;
 
 public class SoundUtils {
     private static final String SYSTEM_MEDIA_PATH = "/system/media/audio";
@@ -26,11 +45,12 @@
             SYSTEM_MEDIA_PATH + File.separator + "notifications";
     private static final String MEDIA_CONTENT_URI = "content://media/internal/audio/media";
 
-    public static void updateGlobalSettings(ContentResolver resolver, String uri, String val) {
+    private static void updateGlobalSettings(ContentResolver resolver, String uri, String val) {
         Settings.Global.putStringForUser(resolver, uri, val, UserHandle.USER_SYSTEM);
     }
 
-    public static boolean setUISounds(ContentResolver resolver, String sound_name, String location) {
+    public static boolean setUISounds(ContentResolver resolver, String sound_name, String
+            location) {
         if (allowedUISound(sound_name)) {
             updateGlobalSettings(resolver, sound_name, location);
             return true;
@@ -39,12 +59,12 @@
     }
 
     public static void setDefaultUISounds(ContentResolver resolver, String sound_name,
-            String sound_file) {
+                                          String sound_file) {
         updateGlobalSettings(resolver, sound_name, "/system/media/audio/ui/" + sound_file);
     }
 
     // This string array contains all the SystemUI acceptable sound files
-    public static Boolean allowedUISound(String targetValue) {
+    private static Boolean allowedUISound(String targetValue) {
         String[] allowed_themable = {
                 "lock_sound",
                 "unlock_sound",
@@ -53,7 +73,7 @@
         return Arrays.asList(allowed_themable).contains(targetValue);
     }
 
-    public static String getDefaultAudiblePath(int type) {
+    private static String getDefaultAudiblePath(int type) {
         final String name;
         final String path;
         switch (type) {
@@ -76,25 +96,8 @@
         return path;
     }
 
-    public static void clearAudibles(Context context, String audiblePath) {
-        final File audibleDir = new File(audiblePath);
-        if (audibleDir.exists() && audibleDir.isDirectory()) {
-            String[] files = audibleDir.list();
-            final ContentResolver resolver = context.getContentResolver();
-            for (String s : files) {
-                final String filePath = audiblePath + File.separator + s;
-                Uri uri = MediaStore.Audio.Media.getContentUriForPath(filePath);
-                resolver.delete(uri, MediaStore.MediaColumns.DATA + "=\""
-                        + filePath + "\"", null);
-                boolean deleted = (new File(filePath)).delete();
-                if (deleted)
-                    Log.e("SoundsHandler", "Database cleared");
-            }
-        }
-    }
-
     public static boolean setAudible(Context context, File ringtone, File ringtoneCache, int type,
-            String name) {
+                                     String name) {
         final String path = ringtone.getAbsolutePath();
         final String mimeType = name.endsWith(".ogg") ? "application/ogg" : "application/mp3";
         ContentValues values = new ContentValues();
@@ -111,8 +114,8 @@
         Uri uri = MediaStore.Audio.Media.getContentUriForPath(path);
         Uri newUri = null;
         Cursor c = context.getContentResolver().query(uri,
-                new String[] {
-                    MediaStore.MediaColumns._ID
+                new String[]{
+                        MediaStore.MediaColumns._ID
                 },
                 MediaStore.MediaColumns.DATA + "='" + path + "'",
                 null, null);
@@ -135,7 +138,7 @@
     }
 
     public static boolean setUIAudible(Context context, File localized_ringtone,
-            File ringtone_file, int type, String name) {
+                                       File ringtone_file, int type, String name) {
         final String path = ringtone_file.getAbsolutePath();
 
         final String path_clone = "/system/media/audio/ui/" + name + ".ogg";
@@ -153,8 +156,8 @@
         Uri uri = MediaStore.Audio.Media.getContentUriForPath(path);
         Uri newUri = null;
         Cursor c = context.getContentResolver().query(uri,
-                new String[] {
-                    MediaStore.MediaColumns._ID
+                new String[]{
+                        MediaStore.MediaColumns._ID
                 },
                 MediaStore.MediaColumns.DATA + "='" + path_clone + "'",
                 null, null);
@@ -187,8 +190,8 @@
         if (audiblePath != null) {
             Uri uri = MediaStore.Audio.Media.getContentUriForPath(audiblePath);
             Cursor c = context.getContentResolver().query(uri,
-                    new String[] {
-                        MediaStore.MediaColumns._ID
+                    new String[]{
+                            MediaStore.MediaColumns._ID
                     },
                     MediaStore.MediaColumns.DATA + "='" + audiblePath + "'",
                     null, null);
@@ -206,5 +209,4 @@
         }
         return true;
     }
-
 }
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..2588952
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/substratum_masquerade.png b/app/src/main/res/mipmap-hdpi/substratum_masquerade.png
deleted file mode 100755
index aa94e2c..0000000
--- a/app/src/main/res/mipmap-hdpi/substratum_masquerade.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..bd2ae71
--- /dev/null
+++ b/app/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-mdpi/substratum_masquerade.png b/app/src/main/res/mipmap-mdpi/substratum_masquerade.png
deleted file mode 100755
index bdc8a5d..0000000
--- a/app/src/main/res/mipmap-mdpi/substratum_masquerade.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..c56d924
--- /dev/null
+++ b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xhdpi/substratum_masquerade.png b/app/src/main/res/mipmap-xhdpi/substratum_masquerade.png
deleted file mode 100755
index 0f2b92b..0000000
--- a/app/src/main/res/mipmap-xhdpi/substratum_masquerade.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..69011b7
--- /dev/null
+++ b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxhdpi/substratum_masquerade.png b/app/src/main/res/mipmap-xxhdpi/substratum_masquerade.png
deleted file mode 100755
index 42ceea8..0000000
--- a/app/src/main/res/mipmap-xxhdpi/substratum_masquerade.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..4448e0b
--- /dev/null
+++ b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/substratum_masquerade.png b/app/src/main/res/mipmap-xxxhdpi/substratum_masquerade.png
deleted file mode 100755
index 5365867..0000000
--- a/app/src/main/res/mipmap-xxxhdpi/substratum_masquerade.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index b960a27..975087e 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,4 +1,3 @@
 <resources>
-
     <style name="AppTheme" parent="@android:style/Theme.NoDisplay"/>
 </resources>
diff --git a/gradlew b/gradlew
old mode 100755
new mode 100644
diff --git a/gradlew.bat b/gradlew.bat
index aec9973..8a0b282 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,90 +1,90 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
