diff --git a/src/org/lineageos/updater/ExportUpdateService.java b/src/org/lineageos/updater/ExportUpdateService.java
index f05a7d1..e272dc8 100644
--- a/src/org/lineageos/updater/ExportUpdateService.java
+++ b/src/org/lineageos/updater/ExportUpdateService.java
@@ -175,36 +175,30 @@
         startForeground(NOTIFICATION_ID, notificationBuilder.build());
         notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
 
-        Runnable runnableComplete = new Runnable() {
-            @Override
-            public void run() {
-                notificationStyle.setSummaryText(null);
-                notificationStyle.setBigContentTitle(
-                        getString(R.string.notification_export_success));
-                notificationBuilder.setContentTitle(
-                        getString(R.string.notification_export_success));
-                notificationBuilder.setProgress(0, 0, false);
-                notificationBuilder.setContentText(destination.getName());
-                notificationBuilder.mActions.clear();
-                notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
-                stopForeground(STOP_FOREGROUND_DETACH);
-            }
+        Runnable runnableComplete = () -> {
+            notificationStyle.setSummaryText(null);
+            notificationStyle.setBigContentTitle(
+                    getString(R.string.notification_export_success));
+            notificationBuilder.setContentTitle(
+                    getString(R.string.notification_export_success));
+            notificationBuilder.setProgress(0, 0, false);
+            notificationBuilder.setContentText(destination.getName());
+            notificationBuilder.mActions.clear();
+            notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
+            stopForeground(STOP_FOREGROUND_DETACH);
         };
 
-        Runnable runnableFailed = new Runnable() {
-            @Override
-            public void run() {
-                notificationStyle.setSummaryText(null);
-                notificationStyle.setBigContentTitle(
-                        getString(R.string.notification_export_fail));
-                notificationBuilder.setContentTitle(
-                        getString(R.string.notification_export_fail));
-                notificationBuilder.setProgress(0, 0, false);
-                notificationBuilder.setContentText(null);
-                notificationBuilder.mActions.clear();
-                notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
-                stopForeground(STOP_FOREGROUND_DETACH);
-            }
+        Runnable runnableFailed = () -> {
+            notificationStyle.setSummaryText(null);
+            notificationStyle.setBigContentTitle(
+                    getString(R.string.notification_export_fail));
+            notificationBuilder.setContentTitle(
+                    getString(R.string.notification_export_fail));
+            notificationBuilder.setProgress(0, 0, false);
+            notificationBuilder.setContentText(null);
+            notificationBuilder.mActions.clear();
+            notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
+            stopForeground(STOP_FOREGROUND_DETACH);
         };
 
         mExportRunnable = new ExportRunnable(source, destination, progressCallBack,
diff --git a/src/org/lineageos/updater/UpdatesActivity.java b/src/org/lineageos/updater/UpdatesActivity.java
index 416e1e3..b81f112 100644
--- a/src/org/lineageos/updater/UpdatesActivity.java
+++ b/src/org/lineageos/updater/UpdatesActivity.java
@@ -60,8 +60,6 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 
 public class UpdatesActivity extends UpdatesListActivity {
@@ -308,12 +306,7 @@
         } else {
             findViewById(R.id.no_new_updates_view).setVisibility(View.GONE);
             findViewById(R.id.recycler_view).setVisibility(View.VISIBLE);
-            Collections.sort(sortedUpdates, new Comparator<UpdateInfo>() {
-                @Override
-                public int compare(UpdateInfo u1, UpdateInfo u2) {
-                    return Long.compare(u2.getTimestamp(), u1.getTimestamp());
-                }
-            });
+            sortedUpdates.sort((u1, u2) -> Long.compare(u2.getTimestamp(), u1.getTimestamp()));
             for (UpdateInfo update : sortedUpdates) {
                 updateIds.add(update.getDownloadId());
             }
@@ -366,14 +359,11 @@
             @Override
             public void onFailure(final boolean cancelled) {
                 Log.e(TAG, "Could not download updates list");
-                runOnUiThread(new Runnable() {
-                    @Override
-                    public void run() {
-                        if (!cancelled) {
-                            showSnackbar(R.string.snack_updates_check_failed, Snackbar.LENGTH_LONG);
-                        }
-                        refreshAnimationStop();
+                runOnUiThread(() -> {
+                    if (!cancelled) {
+                        showSnackbar(R.string.snack_updates_check_failed, Snackbar.LENGTH_LONG);
                     }
+                    refreshAnimationStop();
                 });
             }
 
@@ -384,13 +374,10 @@
 
             @Override
             public void onSuccess(File destination) {
-                runOnUiThread(new Runnable() {
-                    @Override
-                    public void run() {
-                        Log.d(TAG, "List downloaded");
-                        processNewJson(jsonFile, jsonFileTmp, manualRefresh);
-                        refreshAnimationStop();
-                    }
+                runOnUiThread(() -> {
+                    Log.d(TAG, "List downloaded");
+                    processNewJson(jsonFile, jsonFileTmp, manualRefresh);
+                    refreshAnimationStop();
                 });
             }
         };
diff --git a/src/org/lineageos/updater/UpdatesListAdapter.java b/src/org/lineageos/updater/UpdatesListAdapter.java
index 5b0705e..15768ff 100644
--- a/src/org/lineageos/updater/UpdatesListAdapter.java
+++ b/src/org/lineageos/updater/UpdatesListAdapter.java
@@ -15,7 +15,6 @@
  */
 package org.lineageos.updater;
 
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.preference.PreferenceManager;
@@ -292,17 +291,14 @@
                 .setMessage(R.string.update_on_mobile_data_message)
                 .setView(checkboxView)
                 .setPositiveButton(R.string.action_description_download,
-                        new DialogInterface.OnClickListener() {
-                            @Override
-                            public void onClick(DialogInterface dialog, int which) {
-                                if (checkbox.isChecked()) {
-                                    preferences.edit()
-                                            .putBoolean(Constants.PREF_MOBILE_DATA_WARNING, false)
-                                            .apply();
-                                    mActivity.supportInvalidateOptionsMenu();
-                                }
-                                mUpdaterController.startDownload(downloadId);
+                        (dialog, which) -> {
+                            if (checkbox.isChecked()) {
+                                preferences.edit()
+                                        .putBoolean(Constants.PREF_MOBILE_DATA_WARNING, false)
+                                        .apply();
+                                mActivity.supportInvalidateOptionsMenu();
                             }
+                            mUpdaterController.startDownload(downloadId);
                         })
                 .setNegativeButton(android.R.string.cancel, null)
                 .show();
@@ -317,24 +313,15 @@
                 button.setContentDescription(
                         mActivity.getString(R.string.action_description_download));
                 button.setEnabled(enabled);
-                clickListener = !enabled ? null : new View.OnClickListener() {
-                    @Override
-                    public void onClick(View view) {
-                        startDownloadWithWarning(downloadId);
-                    }
-                };
+                clickListener = enabled ? view -> startDownloadWithWarning(downloadId) : null;
                 break;
             case PAUSE:
                 button.setImageResource(R.drawable.ic_pause);
                 button.setContentDescription(
                         mActivity.getString(R.string.action_description_pause));
                 button.setEnabled(enabled);
-                clickListener = !enabled ? null : new View.OnClickListener() {
-                    @Override
-                    public void onClick(View view) {
-                        mUpdaterController.pauseDownload(downloadId);
-                    }
-                };
+                clickListener = enabled ? view -> mUpdaterController.pauseDownload(downloadId)
+                        : null;
                 break;
             case RESUME: {
                 button.setImageResource(R.drawable.ic_resume);
@@ -344,17 +331,14 @@
                 UpdateInfo update = mUpdaterController.getUpdate(downloadId);
                 final boolean canInstall = Utils.canInstall(update) ||
                         update.getFile().length() == update.getFileSize();
-                clickListener = !enabled ? null : new View.OnClickListener() {
-                    @Override
-                    public void onClick(View view) {
-                        if (canInstall) {
-                            mUpdaterController.resumeDownload(downloadId);
-                        } else {
-                            mActivity.showSnackbar(R.string.snack_update_not_installable,
-                                    Snackbar.LENGTH_LONG);
-                        }
+                clickListener = enabled ? view -> {
+                    if (canInstall) {
+                        mUpdaterController.resumeDownload(downloadId);
+                    } else {
+                        mActivity.showSnackbar(R.string.snack_update_not_installable,
+                                Snackbar.LENGTH_LONG);
                     }
-                };
+                } : null;
             }
             break;
             case INSTALL: {
@@ -364,29 +348,21 @@
                 button.setEnabled(enabled);
                 UpdateInfo update = mUpdaterController.getUpdate(downloadId);
                 final boolean canInstall = Utils.canInstall(update);
-                clickListener = !enabled ? null : new View.OnClickListener() {
-                    @Override
-                    public void onClick(View view) {
-                        if (canInstall) {
-                            getInstallDialog(downloadId).show();
-                        } else {
-                            mActivity.showSnackbar(R.string.snack_update_not_installable,
-                                    Snackbar.LENGTH_LONG);
-                        }
+                clickListener = enabled ? view -> {
+                    if (canInstall) {
+                        getInstallDialog(downloadId).show();
+                    } else {
+                        mActivity.showSnackbar(R.string.snack_update_not_installable,
+                                Snackbar.LENGTH_LONG);
                     }
-                };
+                } : null;
             }
             break;
             case INFO: {
                 button.setImageResource(R.drawable.ic_info);
                 button.setContentDescription(mActivity.getString(R.string.action_description_info));
                 button.setEnabled(enabled);
-                clickListener = !enabled ? null : new View.OnClickListener() {
-                    @Override
-                    public void onClick(View view) {
-                        showInfoDialog();
-                    }
-                };
+                clickListener = enabled ? view -> showInfoDialog() : null;
             }
             break;
             case DELETE: {
@@ -394,12 +370,7 @@
                 button.setContentDescription(
                         mActivity.getString(R.string.action_description_delete));
                 button.setEnabled(enabled);
-                clickListener = !enabled ? null : new View.OnClickListener() {
-                    @Override
-                    public void onClick(View view) {
-                        getDeleteDialog(downloadId).show();
-                    }
-                };
+                clickListener = enabled ? view -> getDeleteDialog(downloadId).show() : null;
             }
             break;
             case CANCEL_INSTALLATION: {
@@ -407,12 +378,7 @@
                 button.setContentDescription(
                         mActivity.getString(R.string.action_description_cancel));
                 button.setEnabled(enabled);
-                clickListener = !enabled ? null : new View.OnClickListener() {
-                    @Override
-                    public void onClick(View view) {
-                        getCancelInstallationDialog().show();
-                    }
-                };
+                clickListener = enabled ? view -> getCancelInstallationDialog().show() : null;
             }
             break;
             default:
@@ -421,13 +387,10 @@
         button.setAlpha(enabled ? 1.f : mAlphaDisabledValue);
 
         // Disable action mode when a button is clicked
-        button.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (clickListener != null) {
-                    clickListener.onClick(v);
-                    stopActionMode();
-                }
+        button.setOnClickListener(v -> {
+            if (clickListener != null) {
+                clickListener.onClick(v);
+                stopActionMode();
             }
         });
     }
@@ -442,26 +405,20 @@
                 .setTitle(R.string.confirm_delete_dialog_title)
                 .setMessage(R.string.confirm_delete_dialog_message)
                 .setPositiveButton(android.R.string.ok,
-                        new DialogInterface.OnClickListener() {
-                            @Override
-                            public void onClick(DialogInterface dialog, int which) {
-                                mUpdaterController.pauseDownload(downloadId);
-                                mUpdaterController.deleteUpdate(downloadId);
-                            }
+                        (dialog, which) -> {
+                            mUpdaterController.pauseDownload(downloadId);
+                            mUpdaterController.deleteUpdate(downloadId);
                         })
                 .setNegativeButton(android.R.string.cancel, null);
     }
 
     private View.OnLongClickListener getLongClickListener(final UpdateInfo update,
             final boolean canDelete) {
-        return new View.OnLongClickListener() {
-            @Override
-            public boolean onLongClick(View view) {
-                if (mActionMode == null) {
-                    startActionMode(update, canDelete);
-                }
-                return true;
+        return view -> {
+            if (mActionMode == null) {
+                startActionMode(update, canDelete);
             }
+            return true;
         };
     }
 
@@ -488,12 +445,7 @@
                 .setMessage(mActivity.getString(resId, buildInfoText,
                         mActivity.getString(android.R.string.ok)))
                 .setPositiveButton(android.R.string.ok,
-                        new DialogInterface.OnClickListener() {
-                            @Override
-                            public void onClick(DialogInterface dialog, int which) {
-                                Utils.triggerUpdate(mActivity, downloadId);
-                            }
-                        })
+                        (dialog, which) -> Utils.triggerUpdate(mActivity, downloadId))
                 .setNegativeButton(android.R.string.cancel, null);
     }
 
@@ -501,13 +453,10 @@
         return new AlertDialog.Builder(mActivity)
                 .setMessage(R.string.cancel_installation_dialog_message)
                 .setPositiveButton(android.R.string.ok,
-                        new DialogInterface.OnClickListener() {
-                            @Override
-                            public void onClick(DialogInterface dialog, int which) {
-                                Intent intent = new Intent(mActivity, UpdaterService.class);
-                                intent.setAction(UpdaterService.ACTION_INSTALL_STOP);
-                                mActivity.startService(intent);
-                            }
+                        (dialog, which) -> {
+                            Intent intent = new Intent(mActivity, UpdaterService.class);
+                            intent.setAction(UpdaterService.ACTION_INSTALL_STOP);
+                            mActivity.startService(intent);
                         })
                 .setNegativeButton(android.R.string.cancel, null);
     }
@@ -559,12 +508,7 @@
                 switch (item.getItemId()) {
                     case R.id.menu_delete_action:
                         getDeleteDialog(update.getDownloadId())
-                                .setOnDismissListener(new DialogInterface.OnDismissListener() {
-                                    @Override
-                                    public void onDismiss(DialogInterface dialog) {
-                                        mode.finish();
-                                    }
-                                })
+                                .setOnDismissListener(dialog -> mode.finish())
                                 .show();
                         return true;
                     case R.id.menu_copy_url:
diff --git a/src/org/lineageos/updater/controller/UpdaterController.java b/src/org/lineageos/updater/controller/UpdaterController.java
index 35c9e20..97c939d 100644
--- a/src/org/lineageos/updater/controller/UpdaterController.java
+++ b/src/org/lineageos/updater/controller/UpdaterController.java
@@ -172,13 +172,8 @@
                 }
                 update.setStatus(UpdateStatus.DOWNLOADING);
                 update.setPersistentStatus(UpdateStatus.Persistent.INCOMPLETE);
-                new Thread(new Runnable() {
-                    @Override
-                    public void run() {
-                        mUpdatesDbHelper.addUpdateWithOnConflict(update,
-                                SQLiteDatabase.CONFLICT_REPLACE);
-                    }
-                }).start();
+                new Thread(() -> mUpdatesDbHelper.addUpdateWithOnConflict(update,
+                        SQLiteDatabase.CONFLICT_REPLACE)).start();
                 notifyUpdateChange(downloadId);
             }
 
@@ -245,25 +240,22 @@
 
     private void verifyUpdateAsync(final String downloadId) {
         mVerifyingUpdates.add(downloadId);
-        new Thread(new Runnable() {
-            @Override
-            public void run() {
-                Update update = mDownloads.get(downloadId).mUpdate;
-                File file = update.getFile();
-                if (file.exists() && verifyPackage(file)) {
-                    file.setReadable(true, false);
-                    update.setPersistentStatus(UpdateStatus.Persistent.VERIFIED);
-                    mUpdatesDbHelper.changeUpdateStatus(update);
-                    update.setStatus(UpdateStatus.VERIFIED);
-                } else {
-                    update.setPersistentStatus(UpdateStatus.Persistent.UNKNOWN);
-                    mUpdatesDbHelper.removeUpdate(downloadId);
-                    update.setProgress(0);
-                    update.setStatus(UpdateStatus.VERIFICATION_FAILED);
-                }
-                mVerifyingUpdates.remove(downloadId);
-                notifyUpdateChange(downloadId);
+        new Thread(() -> {
+            Update update = mDownloads.get(downloadId).mUpdate;
+            File file = update.getFile();
+            if (file.exists() && verifyPackage(file)) {
+                file.setReadable(true, false);
+                update.setPersistentStatus(UpdateStatus.Persistent.VERIFIED);
+                mUpdatesDbHelper.changeUpdateStatus(update);
+                update.setStatus(UpdateStatus.VERIFIED);
+            } else {
+                update.setPersistentStatus(UpdateStatus.Persistent.UNKNOWN);
+                mUpdatesDbHelper.removeUpdate(downloadId);
+                update.setProgress(0);
+                update.setStatus(UpdateStatus.VERIFICATION_FAILED);
             }
+            mVerifyingUpdates.remove(downloadId);
+            notifyUpdateChange(downloadId);
         }).start();
     }
 
@@ -454,15 +446,12 @@
     }
 
     private void deleteUpdateAsync(final Update update) {
-        new Thread(new Runnable() {
-            @Override
-            public void run() {
-                File file = update.getFile();
-                if (file.exists() && !file.delete()) {
-                    Log.e(TAG, "Could not delete " + file.getAbsolutePath());
-                }
-                mUpdatesDbHelper.removeUpdate(update.getDownloadId());
+        new Thread(() -> {
+            File file = update.getFile();
+            if (file.exists() && !file.delete()) {
+                Log.e(TAG, "Could not delete " + file.getAbsolutePath());
             }
+            mUpdatesDbHelper.removeUpdate(update.getDownloadId());
         }).start();
     }
 
diff --git a/src/org/lineageos/updater/download/HttpURLConnectionClient.java b/src/org/lineageos/updater/download/HttpURLConnectionClient.java
index afee518..2b7c80e 100644
--- a/src/org/lineageos/updater/download/HttpURLConnectionClient.java
+++ b/src/org/lineageos/updater/download/HttpURLConnectionClient.java
@@ -192,12 +192,7 @@
             for (Map.Entry<String, List<String>> entry : mClient.getHeaderFields().entrySet()) {
                 if ("Link".equalsIgnoreCase((entry.getKey()))) {
                     duplicates = new PriorityQueue<>(entry.getValue().size(),
-                            new Comparator<DuplicateLink>() {
-                                @Override
-                                public int compare(DuplicateLink d1, DuplicateLink d2) {
-                                    return Integer.compare(d1.mPriority, d2.mPriority);
-                                }
-                            });
+                            Comparator.comparingInt(d -> d.mPriority));
 
                     // https://tools.ietf.org/html/rfc6249
                     // https://tools.ietf.org/html/rfc5988#section-5
diff --git a/src/org/lineageos/updater/misc/Utils.java b/src/org/lineageos/updater/misc/Utils.java
index 8ce368e..255b750 100644
--- a/src/org/lineageos/updater/misc/Utils.java
+++ b/src/org/lineageos/updater/misc/Utils.java
@@ -43,7 +43,6 @@
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
-import java.io.FilenameFilter;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Enumeration;
@@ -246,12 +245,8 @@
     }
 
     public static void removeUncryptFiles(File downloadPath) {
-        File[] uncryptFiles = downloadPath.listFiles(new FilenameFilter() {
-            @Override
-            public boolean accept(File dir, String name) {
-                return name.endsWith(Constants.UNCRYPT_FILE_EXT);
-            }
-        });
+        File[] uncryptFiles = downloadPath.listFiles(
+                (dir, name) -> name.endsWith(Constants.UNCRYPT_FILE_EXT));
         if (uncryptFiles == null) {
             return;
         }
