diff --git a/src/main/java/com/google/gerrit/common/Container.java b/src/main/java/com/google/gerrit/common/Container.java
index 6e11534..0b64d5b 100644
--- a/src/main/java/com/google/gerrit/common/Container.java
+++ b/src/main/java/com/google/gerrit/common/Container.java
@@ -51,7 +51,7 @@
         field.setAccessible(true);
         values.add(field.get(this));
       }
-    } catch (IllegalArgumentException | IllegalAccessException e) {
+    } catch (IllegalArgumentException | IllegalAccessException ignored) {
     }
     return Objects.hash(values);
   }
@@ -62,14 +62,14 @@
     try {
       for (Field field : getClass().getDeclaredFields()) {
         field.setAccessible(true);
-        fieldStrings.add(field.getName() + ": " + Objects.toString(field.get(this)));
+        fieldStrings.add(field.getName() + ": " + field.get(this));
       }
-    } catch (IllegalArgumentException | IllegalAccessException e) {
+    } catch (IllegalArgumentException | IllegalAccessException ignored) {
     }
     String fields = String.join(", ", fieldStrings);
-    if (!"".equals(fields)) {
+    if (!fields.isEmpty()) {
       fields = "{" + fields + "}";
     }
-    return getClass().toString() + fields;
+    return getClass() + fields;
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/IsTrueOperator.java b/src/main/java/com/googlesource/gerrit/plugins/task/IsTrueOperator.java
index 472b1e7..79110d6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/IsTrueOperator.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/IsTrueOperator.java
@@ -37,7 +37,7 @@
     }
   }
 
-  public class TruePredicate extends SubmitRequirementPredicate {
+  public static class TruePredicate extends SubmitRequirementPredicate {
 
     public TruePredicate() {
       super("is", TRUE);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/MatchCache.java b/src/main/java/com/googlesource/gerrit/plugins/task/MatchCache.java
index 60dff17..679be00 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/MatchCache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/MatchCache.java
@@ -48,7 +48,7 @@
   public Boolean matchOrNull(ChangeData changeData, String query, boolean isVisible) {
     try {
       return match(changeData, query, isVisible);
-    } catch (StorageException | QueryParseException e) {
+    } catch (StorageException | QueryParseException ignored) {
     }
     return null;
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/PredicateCache.java b/src/main/java/com/googlesource/gerrit/plugins/task/PredicateCache.java
index ba87fd8..777780a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/PredicateCache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/PredicateCache.java
@@ -22,7 +22,6 @@
 import com.google.gerrit.index.query.QueryParseException;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.query.change.BranchSetIndexPredicate;
 import com.google.gerrit.server.query.change.ChangeData;
 import com.google.gerrit.server.query.change.ChangeIndexPredicate;
 import com.google.gerrit.server.query.change.RegexProjectPredicate;
@@ -75,7 +74,7 @@
       return predProvider.get();
     }
     // never seen 'query' before
-    try (StopWatch stopWatch = predicatesByQuery.createLoadingStopWatch(query, isVisible)) {
+    try (StopWatch ignored = predicatesByQuery.createLoadingStopWatch(query, isVisible)) {
       Predicate<ChangeData> pred = srcqb.parse(query);
       predicatesByQuery.put(query, new ThrowingProvider.Entry<>(pred));
       return pred;
@@ -91,7 +90,7 @@
    */
   public boolean isCacheableByBranch(String query, boolean isVisible) throws QueryParseException {
     if (query == null
-        || "".equals(query)
+        || query.isEmpty()
         || "false".equalsIgnoreCase(query)
         || "true".equalsIgnoreCase(query)) {
       return true;
@@ -110,9 +109,7 @@
       }
       return true;
     }
-    if (predicate instanceof BranchSetIndexPredicate
-        || predicate instanceof RegexProjectPredicate
-        || predicate instanceof RegexRefPredicate) {
+    if (predicate instanceof RegexProjectPredicate || predicate instanceof RegexRefPredicate) {
       return true;
     }
     if (predicate instanceof ChangeIndexPredicate) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/Preloader.java b/src/main/java/com/googlesource/gerrit/plugins/task/Preloader.java
index 7b325cf..bc0f99d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/Preloader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/Preloader.java
@@ -29,7 +29,7 @@
 import java.util.Optional;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 
-/** Use to pre-load a task definition with values from its preload-task definition. */
+/** Use to preload a task definition with values from its preload-task definition. */
 public class Preloader {
   public interface Factory {
     Preloader create(@Assisted TaskConfigCache taskConfigCache);
@@ -139,7 +139,7 @@
     } catch (RuntimeConfigInvalidException e) {
       throw e.checkedException;
     } catch (NoSuchElementException e) {
-      // expression was not optional but we ran out of names to try
+      // expression was not optional, but we ran out of names to try
       throw new ConfigInvalidException("task not defined");
     }
     return Optional.empty();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/RuntimeConfigInvalidException.java b/src/main/java/com/googlesource/gerrit/plugins/task/RuntimeConfigInvalidException.java
index cc0ed94..fabc0fa 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/RuntimeConfigInvalidException.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/RuntimeConfigInvalidException.java
@@ -17,7 +17,7 @@
 import org.eclipse.jgit.errors.ConfigInvalidException;
 
 public class RuntimeConfigInvalidException extends RuntimeException {
-  protected static final long serialVersionUID = 1L;
+  private static final long serialVersionUID = 1L;
   protected ConfigInvalidException checkedException;
 
   public RuntimeConfigInvalidException(ConfigInvalidException e) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TaskConfig.java b/src/main/java/com/googlesource/gerrit/plugins/task/TaskConfig.java
index 69b6fc1..102b675 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskConfig.java
@@ -33,13 +33,14 @@
   public enum NamesFactoryType {
     CHANGE,
     STATIC,
-    PLUGIN;
+    PLUGIN,
+    INVALID;
 
     public static NamesFactoryType getNamesFactoryType(String str) {
       for (NamesFactoryType type : NamesFactoryType.values()) {
         if (type.name().equalsIgnoreCase(str)) return type;
       }
-      return null;
+      return INVALID;
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TaskConfigCache.java b/src/main/java/com/googlesource/gerrit/plugins/task/TaskConfigCache.java
index 8f7d1f6..f3a654b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskConfigCache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskConfigCache.java
@@ -17,7 +17,6 @@
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.BranchNameKey;
 import com.google.gerrit.entities.Project;
-import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.config.AllProjectsName;
 import com.google.gerrit.server.config.AllProjectsNameProvider;
@@ -99,8 +98,6 @@
     } catch (IOException e) {
       log.atWarning().withCause(e).log("Failed to load %s for %s", file.file(), project);
       throw e;
-    } catch (ConfigInvalidException e) {
-      throw e;
     }
     return cfg;
   }
@@ -109,9 +106,8 @@
     try {
       PermissionBackend.ForProject permissions =
           permissionBackend.user(user).project(branch.project());
-      permissions.ref(branch.branch()).check(RefPermission.READ);
-      return true;
-    } catch (AuthException | PermissionBackendException e) {
+      return permissions.ref(branch.branch()).test(RefPermission.READ);
+    } catch (PermissionBackendException e) {
       return false;
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TaskExpression.java b/src/main/java/com/googlesource/gerrit/plugins/task/TaskExpression.java
index 5b9bef0..c0d8704 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskExpression.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskExpression.java
@@ -24,8 +24,8 @@
 
 /**
  * A TaskExpression represents a config string pointing to an expression which includes zero or more
- * task references separated by a '|', and potentially termintated by a '|'. If the expression is
- * not terminated by a '|' it indicates that task resolution of at least one task is required. Task
+ * task references separated by a '|', and potentially terminated by a '|'. If the expression is not
+ * terminated by a '|' it indicates that task resolution of at least one task is required. Task
  * selection priority is from left to right. This can be expressed as:
  *
  * <pre>
@@ -68,7 +68,7 @@
 
   @Override
   public Iterator<TaskKey> iterator() {
-    return new Iterator<TaskKey>() {
+    return new Iterator<>() {
       Matcher m = EXPRESSION_PATTERN.matcher(key.expression());
       Boolean hasNext;
       boolean optional;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TaskKey.java b/src/main/java/com/googlesource/gerrit/plugins/task/TaskKey.java
index 609160e..8a95130 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskKey.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskKey.java
@@ -33,17 +33,17 @@
   protected static final String CONFIG_SECTION = "task";
   protected static final String CONFIG_TASKS_FACTORY = "tasks-factory";
 
-  /** Creates a TaskKey with task name as the name of sub section. */
+  /** Creates a TaskKey with task name as the name of subsection. */
   public static TaskKey create(SubSectionKey section) {
     return create(section, section.subSection());
   }
 
-  /** Creates a TaskKey with given FileKey and task name and sub section's name as 'task'. */
+  /** Creates a TaskKey with given FileKey and task name and subsection's name as 'task'. */
   public static TaskKey create(FileKey file, String task) {
     return create(SubSectionKey.create(file, CONFIG_SECTION, task));
   }
 
-  /** Creates a TaskKey from a sub section and task name, generally used by TasksFactory. */
+  /** Creates a TaskKey from a subsection and task name, generally used by TasksFactory. */
   public static TaskKey create(SubSectionKey section, String task) {
     return new AutoValue_TaskKey(section, task);
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TaskPath.java b/src/main/java/com/googlesource/gerrit/plugins/task/TaskPath.java
index c0c5d8c..a9394b0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskPath.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskPath.java
@@ -69,7 +69,7 @@
           }
         }
       }
-    } catch (ConfigInvalidException | IOException e) {
+    } catch (ConfigInvalidException | IOException ignored) {
     }
     return null;
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TaskPluginDefinedInfoFactory.java b/src/main/java/com/googlesource/gerrit/plugins/task/TaskPluginDefinedInfoFactory.java
index 0791bda..86c30be 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskPluginDefinedInfoFactory.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskPluginDefinedInfoFactory.java
@@ -34,6 +34,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import org.eclipse.jgit.errors.ConfigInvalidException;
@@ -52,7 +53,7 @@
     WAITING,
     READY,
     PASS,
-    FAIL;
+    FAIL
   }
 
   public static class Statistics {
@@ -314,14 +315,14 @@
                 && task.subTasksExternals.isEmpty()
                 && task.subTasksFactories.isEmpty());
         if (hasDefinedSubtasks) {
-          // Remove 'Grouping" tasks (tasks with subtasks but no PASS
+          // Remove "Grouping" tasks (tasks with subtasks but no PASS
           // or FAIL criteria) from the output if none of their subtasks
           // are applicable.  i.e. grouping tasks only really apply if at
           // least one of their subtasks apply.
           return null;
         }
         // A leaf configuration without a PASS or FAIL criteria is a
-        // missconfiguration.  Either someone forgot to add subtasks, or
+        // misconfiguration.  Either someone forgot to add subtasks, or
         // they forgot to add a PASS or FAIL criteria.
         return Status.INVALID;
       }
@@ -332,9 +333,9 @@
           // (like a CodeReview -2).  Thus, if hard blocked, it is
           // irrelevant what the subtask states, or the PASS criteria are.
           //
-          // It is also important that FAIL be useable to indicate that
-          // the task has actually executed.  Thus subtask status,
-          // including a subtask FAIL should not appear as a FAIL on the
+          // It is also important that FAIL be usable to indicate that
+          // the task has actually executed.  Thus, subtask status,
+          // including a subtask FAIL, should not appear as a FAIL on the
           // parent task.  This means that this is should be the only path
           // to make a task have a FAIL status.
           return Status.FAIL;
@@ -384,7 +385,7 @@
         if (subNode instanceof Node.Invalid) {
           subTasks.add(TaskPluginDefinedInfoFactory.invalid());
         } else {
-          new AttributeFactory(subNode).create().ifPresent(t -> subTasks.add(t));
+          new AttributeFactory(subNode).create().ifPresent(subTasks::add);
         }
       }
       if (subTasks.isEmpty()) {
@@ -429,7 +430,7 @@
     if (statistics != null) {
       statistics.numberOfChanges = pluginInfosByChange.size();
       statistics.numberOfTaskPluginAttributes =
-          pluginInfosByChange.values().stream().filter(tpa -> tpa != null).count();
+          pluginInfosByChange.values().stream().filter(Objects::nonNull).count();
       statistics.predicateCache = definitions.predicateCache.getStatistics();
       statistics.matchCache = definitions.matchCache.getStatistics();
       statistics.preloader = definitions.preloader.getStatistics();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TaskReference.java b/src/main/java/com/googlesource/gerrit/plugins/task/TaskReference.java
index 1ccf673..ba27378 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskReference.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskReference.java
@@ -21,6 +21,7 @@
 import com.google.gerrit.server.config.AllUsersNameProvider;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
+import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.NoSuchElementException;
 import org.antlr.v4.runtime.BaseErrorListener;
@@ -38,7 +39,7 @@
   protected final String reference;
   protected final TaskKey.Builder taskKeyBuilder;
 
-  interface Factory {
+  public interface Factory {
     TaskReference create(FileKey relativeTo, String reference);
   }
 
@@ -103,7 +104,7 @@
     }
   }
 
-  protected class TaskReferenceListener extends TaskReferenceBaseListener {
+  protected static class TaskReferenceListener extends TaskReferenceBaseListener {
     TaskKey.Builder builder;
 
     TaskReferenceListener(TaskKey.Builder builder) {
@@ -121,7 +122,7 @@
         builder.setPath(
             ctx.dir().stream()
                 .map(dir -> Paths.get(dir.NAME().getText()))
-                .reduce(Paths.get(""), (a, b) -> a.resolve(b))
+                .reduce(Paths.get(""), Path::resolve)
                 .resolve(ctx.NAME().getText()));
       } catch (ConfigInvalidException e) {
         throw new RuntimeConfigInvalidException(e);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java b/src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java
index 453fff1..baf40f9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java
@@ -280,7 +280,7 @@
               }
               return node;
             }
-          } catch (Exception e) {
+          } catch (Exception ignored) {
           }
         }
         return createInvalid();
@@ -324,7 +324,7 @@
     }
 
     public String key() {
-      return String.valueOf(getChangeData().getId().get()) + TaskConfig.SEP + taskKey;
+      return getChangeData().getId().get() + TaskConfig.SEP + taskKey;
     }
 
     public List<Node> getSubNodes() throws IOException, StorageException, ConfigInvalidException {
@@ -338,7 +338,7 @@
         }
         definitionsBySubSection.computeIfAbsentTimed(
             task.key().subSection(),
-            k -> nodes.stream().map(n -> n.getDefinition()).collect(toList()),
+            k -> nodes.stream().map(Node::getDefinition).collect(toList()),
             task.isVisible);
       } else {
         hasUnfilterableSubNodes = true;
@@ -459,9 +459,7 @@
                 preloader.getOptionalTask(
                     taskExpressionFactory.create(
                         configSourcedValue.sourceFile(), configSourcedValue.value()));
-            if (def.isPresent()) {
-              addPreloaded(def.get());
-            }
+            def.ifPresent(this::addPreloaded);
           } catch (ConfigInvalidException e) {
             addInvalidNode();
           }
@@ -524,6 +522,8 @@
                 case PLUGIN:
                   addPluginTypeTasks(tasksFactory, namesFactory);
                   continue;
+                case INVALID:
+                  log.atWarning().log("Unrecognized names factory type: %s", namesFactory.type);
               }
             }
           }
@@ -566,7 +566,7 @@
         } catch (StorageException e) {
           log.atSevere().withCause(e).log(
               "Running changes query '%s' failed", namesFactory.changes);
-        } catch (QueryParseException | ConfigInvalidException e) {
+        } catch (QueryParseException | ConfigInvalidException ignored) {
         }
         addInvalidNode();
       }
@@ -666,8 +666,7 @@
                 definitionsByBranchBySubSection.put(subSection, definitionsByBranch);
               }
               definitionsByBranch.put(
-                  branch,
-                  filterable.get().stream().map(node -> node.getDefinition()).collect(toList()));
+                  branch, filterable.get().stream().map(Node::getDefinition).collect(toList()));
             }
             return filterable.get();
           }
@@ -697,7 +696,7 @@
                 // altered.
                 continue;
               }
-            } catch (QueryParseException e) {
+            } catch (QueryParseException ignored) {
             }
           }
           applicableNodes.add(node);
@@ -751,7 +750,7 @@
       throws StorageException, QueryParseException {
     List<ChangeData> changeDataList = changesByNamesFactoryQuery.get(query);
     if (changeDataList == null) {
-      try (StopWatch stopWatch =
+      try (StopWatch ignored =
           changesByNamesFactoryQuery.createLoadingStopWatch(query, isVisible)) {
         changeDataList =
             changeQueryProcessorProvider
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/cli/PatchSetArgument.java b/src/main/java/com/googlesource/gerrit/plugins/task/cli/PatchSetArgument.java
index 6fb4e69..93bec5f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/cli/PatchSetArgument.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/cli/PatchSetArgument.java
@@ -52,7 +52,7 @@
         permissionBackend.user(user).change(changeNotes).check(ChangePermission.READ);
         return new PatchSetArgument(changeNotes.getChange(), psUtil.get(changeNotes, patchSetId));
       } catch (PermissionBackendException | AuthException e) {
-        throw new IllegalArgumentException("database error", e);
+        throw new IllegalArgumentException(noSuchPatchSet(token), e);
       } catch (UnloggedFailure e) {
         throw new IllegalArgumentException(e.getMessage(), e);
       } catch (StorageException e) {
@@ -88,10 +88,4 @@
     this.patchSet = patchSet;
     this.change = change;
   }
-
-  public void ensureLatest() {
-    if (!change.currentPatchSetId().equals(patchSet.id())) {
-      throw new IllegalArgumentException(patchSet + " is not the latest patch set");
-    }
-  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/properties/AbstractExpander.java b/src/main/java/com/googlesource/gerrit/plugins/task/properties/AbstractExpander.java
index a3ea8a6..e8b3bba 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/properties/AbstractExpander.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/properties/AbstractExpander.java
@@ -38,7 +38,7 @@
  * <p>a String like: <code>"The brown ${animal} jumped over the ${obstacle}."</code>
  *
  * <p>will expand to: <code>"The brown fox jumped over the fence."</code> This class is meant to be
- * used as a building block for other full featured expanders and thus must be overriden to provide
+ * used as a building block for other full-featured expanders and thus must be overridden to provide
  * the name/value associations via the getValueForName() method.
  */
 public abstract class AbstractExpander {
@@ -178,9 +178,9 @@
    * Get the replacement value for the property identified by name
    *
    * @param name of the property to get the replacement value for
-   * @return the replacement value. Since the expandText() method alwyas needs a String to replace
-   *     '${property-name}' reference with, even when the property does not exist, this will never
-   *     return null, instead it will returns the empty string if the property is not found.
+   * @return the replacement value. Since the expandText() method always needs a String to replace
+   *     the '${property-name}' reference with, even when the property does not exist, this will
+   *     never return null, instead it will return an empty string if the property is not found.
    */
   protected abstract String getValueForName(String name);
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/properties/CopyOnWrite.java b/src/main/java/com/googlesource/gerrit/plugins/task/properties/CopyOnWrite.java
index d1510fa..ddb2119 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/properties/CopyOnWrite.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/properties/CopyOnWrite.java
@@ -25,12 +25,12 @@
 public class CopyOnWrite<T> {
   public static class CloneOnWrite<C extends Cloneable> extends CopyOnWrite<C> {
     public CloneOnWrite(C cloneable) {
-      super(cloneable, copier(cloneable));
+      super(cloneable, copier());
     }
   }
 
-  public static <C extends Cloneable> Function<C, C> copier(C cloneable) {
-    return c -> clone(c);
+  public static <C extends Cloneable> Function<C, C> copier() {
+    return CopyOnWrite::clone;
   }
 
   @SuppressWarnings("unchecked")
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/properties/Expander.java b/src/main/java/com/googlesource/gerrit/plugins/task/properties/Expander.java
index df817a1..dd27264 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/properties/Expander.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/properties/Expander.java
@@ -27,7 +27,7 @@
  * <p>Using a recursive expansion approach makes order of evaluation unimportant as long as there
  * are no looping definitions.
  *
- * <p>Given some property name/value asssociations defined like this:
+ * <p>Given some property name/value associations defined like this:
  *
  * <p><code>
  * valueByName.put("obstacle", "fence");
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/properties/Loader.java b/src/main/java/com/googlesource/gerrit/plugins/task/properties/Loader.java
index 05120b3..19206c4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/properties/Loader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/properties/Loader.java
@@ -59,29 +59,22 @@
       return task.name();
     }
     String changeProp = name.replace("_change_", "");
-    if (changeProp != name) {
+    if (!changeProp.equals(name)) {
       return change(changeProp);
     }
     return "";
   }
 
   protected String change(String changeProp) throws StorageException {
-    switch (changeProp) {
-      case "number":
-        return String.valueOf(change().getId().get());
-      case "id":
-        return change().getKey().get();
-      case "project":
-        return change().getProject().get();
-      case "branch":
-        return change().getDest().branch();
-      case "status":
-        return change().getStatus().toString();
-      case "topic":
-        return change().getTopic();
-      default:
-        return "";
-    }
+    return switch (changeProp) {
+      case "number" -> String.valueOf(change().getId().get());
+      case "id" -> change().getKey().get();
+      case "project" -> change().getProject().get();
+      case "branch" -> change().getDest().branch();
+      case "status" -> change().getStatus().toString();
+      case "topic" -> change().getTopic();
+      default -> "";
+    };
   }
 
   protected Change change() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/properties/Matcher.java b/src/main/java/com/googlesource/gerrit/plugins/task/properties/Matcher.java
index 68151fb..d5de9da 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/properties/Matcher.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/properties/Matcher.java
@@ -60,7 +60,7 @@
   }
 
   public boolean find() {
-    return findNanoseconds.get(() -> findUntimed());
+    return findNanoseconds.get(this::findUntimed);
   }
 
   protected boolean findUntimed() {
@@ -70,8 +70,7 @@
       return false;
     }
     end = text.indexOf('}', nameStart);
-    boolean found = end >= 0;
-    return found;
+    return end >= 0;
   }
 
   public String getName() {
@@ -79,19 +78,19 @@
   }
 
   public void appendValue(StringBuffer buffer, String value) {
-    appendNanoseconds.accept((b, v) -> appendValueUntimed(b, v), buffer, value);
+    appendNanoseconds.accept(this::appendValueUntimed, buffer, value);
   }
 
   protected void appendValueUntimed(StringBuffer buffer, String value) {
     if (start > cursor) {
-      buffer.append(text.substring(cursor, start));
+      buffer.append(text, cursor, start);
     }
     buffer.append(value);
     cursor = end + 1;
   }
 
   public void appendTail(StringBuffer buffer) {
-    appendNanoseconds.accept(b -> appendTailUntimed(b), buffer);
+    appendNanoseconds.accept(this::appendTailUntimed, buffer);
   }
 
   protected void appendTailUntimed(StringBuffer buffer) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/statistics/HitBooleanTable.java b/src/main/java/com/googlesource/gerrit/plugins/task/statistics/HitBooleanTable.java
index 2f35084..bc6cae2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/statistics/HitBooleanTable.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/statistics/HitBooleanTable.java
@@ -54,6 +54,7 @@
     if (statistics.sumNanosecondsLoading == null) {
       statistics.sumNanosecondsLoading = 0L;
     }
+
     return new StopWatch.Enabled()
         .setNanosConsumer(
             ns ->
@@ -63,7 +64,7 @@
 
   public long updateTopLoadingTimes(long nanos, R row, C column, boolean isVisible) {
     statistics.topNanosecondsLoadingKeys.addIfTop(
-        nanos, isVisible ? new TopKeyMap.TableKeyValue<R, C>(row, column) : null);
+        nanos, isVisible ? new TopKeyMap.TableKeyValue<>(row, column) : null);
     return nanos;
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/statistics/HitHashMap.java b/src/main/java/com/googlesource/gerrit/plugins/task/statistics/HitHashMap.java
index b080967..8b370b5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/statistics/HitHashMap.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/statistics/HitHashMap.java
@@ -32,7 +32,7 @@
     public List<Object> elements;
   }
 
-  public static final long serialVersionUID = 1;
+  private static final long serialVersionUID = 1;
 
   @SuppressWarnings("serial")
   protected Statistics<K> statistics;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/statistics/HitHashMapOfCollection.java b/src/main/java/com/googlesource/gerrit/plugins/task/statistics/HitHashMapOfCollection.java
index af68a0c..2b90d2c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/statistics/HitHashMapOfCollection.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/statistics/HitHashMapOfCollection.java
@@ -14,8 +14,6 @@
 
 package com.googlesource.gerrit.plugins.task.statistics;
 
-import static java.util.stream.Collectors.toList;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
@@ -27,9 +25,8 @@
     public List<Integer> bottom5CollectionSizes;
   }
 
-  public static final long serialVersionUID = 1;
+  private static final long serialVersionUID = 1;
 
-  @SuppressWarnings("serial")
   protected Statistics<K> statistics;
 
   public HitHashMapOfCollection() {}
@@ -47,7 +44,7 @@
     statistics.size = super.statistics.size;
 
     List<Integer> collectionSizes =
-        values().stream().map(l -> l.size()).sorted(Comparator.reverseOrder()).collect(toList());
+        values().stream().map(l -> l.size()).sorted(Comparator.reverseOrder()).toList();
     statistics.top5CollectionSizes = new ArrayList<>(5);
     statistics.bottom5CollectionSizes = new ArrayList<>(5);
     for (int i = 0; i < 5 && i < collectionSizes.size(); i++) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/statistics/StopWatch.java b/src/main/java/com/googlesource/gerrit/plugins/task/statistics/StopWatch.java
index 05f942b..661093c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/statistics/StopWatch.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/statistics/StopWatch.java
@@ -26,7 +26,7 @@
  * <p>The Stopwatch class from google commons is used by placing start() and stop() calls around
  * code sections which need to be timed. This approach can be problematic since the code being timed
  * could throw an exception and if the stop() is not in a finally clause, then it will likely never
- * get called, potentially causing bad timings, or worse programatic issues elsewhere due to double
+ * get called, potentially causing bad timings, or worse programmatic issues elsewhere due to double
  * calls to start(). The need for a finally clause to make things safe is an obvious hint that using
  * an AutoCloseable approach is likely going to be safer. With that in mind, the two API approaches
  * provided by these StopWatch classes are:
@@ -43,7 +43,7 @@
  */
 public interface StopWatch extends AutoCloseable {
   /** Designed for the greatest simplicity to time SAM executions. */
-  public abstract static class Runner extends SamTryWrapper<AutoCloseable> {
+  abstract class Runner extends SamTryWrapper<AutoCloseable> {
     public static class Enabled extends Runner {
       protected LongConsumer nanosConsumer = EMPTY_LONG_CONSUMER;
 
@@ -74,7 +74,7 @@
   }
 
   /** Should be created and used only within a try-with-resource */
-  public static class Enabled implements StopWatch {
+  class Enabled implements StopWatch {
     protected LongConsumer nanosConsumer = EMPTY_LONG_CONSUMER;
     protected Stopwatch stopwatch = Stopwatch.createStarted();
 
@@ -92,7 +92,7 @@
   }
 
   /**
-   * A easy way to build a timer which needes to be enabled/disabled based on a runtime boolean.
+   * An easy way to build a timer which needs to be enabled/disabled based on a runtime boolean.
    *
    * <p>Example Usage:
    *
@@ -103,7 +103,7 @@
    * }
    * </code>
    */
-  public static class Builder {
+  class Builder {
     protected static class Enabled extends Builder {
       @Override
       public StopWatch build() {
@@ -124,11 +124,11 @@
   }
 
   /** May be used anywhere that Enabled can be used */
-  public static final StopWatch DISABLED = new StopWatch() {};
+  StopWatch DISABLED = new StopWatch() {};
 
-  public static final LongConsumer EMPTY_LONG_CONSUMER = l -> {};
+  LongConsumer EMPTY_LONG_CONSUMER = l -> {};
 
-  public static Builder builder() {
+  static Builder builder() {
     return Builder.DISABLED;
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/util/SamTryWrapper.java b/src/main/java/com/googlesource/gerrit/plugins/task/util/SamTryWrapper.java
index ef42e5a..a3c29e1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/util/SamTryWrapper.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/util/SamTryWrapper.java
@@ -21,7 +21,7 @@
 import java.util.function.Supplier;
 
 /**
- * Class designed to make SAM calls wrapped by an AutoCloseable. This is usefull with AutoCloseables
+ * Class designed to make SAM calls wrapped by an AutoCloseable. This is useful with AutoCloseables
  * which do not provide resources which are directly needed during the SAM call, but rather with
  * AutoCloseables which likely manage external resources or state such as a locks or timers.
  */
@@ -30,7 +30,7 @@
 
   @SuppressWarnings("try")
   public void run(Runnable runnable) {
-    try (A autoCloseable = getAutoCloseable()) {
+    try (A ignored = getAutoCloseable()) {
       runnable.run();
     } catch (Exception e) {
       throw new RuntimeException(e);
@@ -39,7 +39,7 @@
 
   @SuppressWarnings("try")
   public <T> T get(Supplier<T> supplier) {
-    try (A autoCloseable = getAutoCloseable()) {
+    try (A ignored = getAutoCloseable()) {
       return supplier.get();
     } catch (Exception e) {
       throw new RuntimeException(e);
@@ -48,7 +48,7 @@
 
   @SuppressWarnings("try")
   public <T> void accept(Consumer<T> consumer, T t) {
-    try (A autoCloseable = getAutoCloseable()) {
+    try (A ignored = getAutoCloseable()) {
       consumer.accept(t);
     } catch (Exception e) {
       throw new RuntimeException(e);
@@ -57,7 +57,7 @@
 
   @SuppressWarnings("try")
   public <T, U> void accept(BiConsumer<T, U> consumer, T t, U u) {
-    try (A autoCloseable = getAutoCloseable()) {
+    try (A ignored = getAutoCloseable()) {
       consumer.accept(t, u);
     } catch (Exception e) {
       throw new RuntimeException(e);
@@ -66,7 +66,7 @@
 
   @SuppressWarnings("try")
   public <T, R> R apply(Function<T, R> func, T t) {
-    try (A autoCloseable = getAutoCloseable()) {
+    try (A ignored = getAutoCloseable()) {
       return func.apply(t);
     } catch (Exception e) {
       throw new RuntimeException(e);
@@ -75,7 +75,7 @@
 
   @SuppressWarnings("try")
   public <T, U, R> R apply(BiFunction<T, U, R> func, T t, U u) {
-    try (A autoCloseable = getAutoCloseable()) {
+    try (A ignored = getAutoCloseable()) {
       return func.apply(t, u);
     } catch (Exception e) {
       throw new RuntimeException(e);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/util/ThrowingProvider.java b/src/main/java/com/googlesource/gerrit/plugins/task/util/ThrowingProvider.java
index 3d5197e..ae42bee 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/util/ThrowingProvider.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/util/ThrowingProvider.java
@@ -15,9 +15,9 @@
 package com.googlesource.gerrit.plugins.task.util;
 
 public interface ThrowingProvider<V, E extends Exception> {
-  public V get() throws E;
+  V get() throws E;
 
-  public static class Entry<V, E extends Exception> implements ThrowingProvider<V, E> {
+  class Entry<V, E extends Exception> implements ThrowingProvider<V, E> {
     protected V entry;
 
     public Entry(V entry) {
@@ -30,7 +30,7 @@
     }
   }
 
-  public static class Thrown<V, E extends Exception> implements ThrowingProvider<V, E> {
+  class Thrown<V, E extends Exception> implements ThrowingProvider<V, E> {
     protected E exception;
 
     public Thrown(E exception) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/util/TopKeyMap.java b/src/main/java/com/googlesource/gerrit/plugins/task/util/TopKeyMap.java
index 8603ce0..0be84a6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/util/TopKeyMap.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/util/TopKeyMap.java
@@ -21,10 +21,10 @@
  * <p>A TopKeyMap is array based and has O(n) insertion time. Despite not having O(1) insertion
  * times, it should likely be much faster than a hash based map for small n sizes. It also is more
  * memory efficient than a hash based map, although both are likely O(n) in space usage. The
- * TopKeyMap allocates all of its entries up front so it does not change its memory utilization at
- * all, and it does not have to create or free any Objects during its post constructor lifespan.
+ * TopKeyMap allocates all of its entries up front so that it does not change its memory utilization
+ * at all, and it does not have to create or free any Objects during its post constructor lifespan.
  *
- * <p>While a TopKeyMap currently only uses 'long's as keys, it is possible to easiy upgrade this
+ * <p>While a TopKeyMap currently only uses 'long's as keys, it is possible to easily upgrade this
  * collection to use any type of Comparable key.
  *
  * <p>Although not currently thread safe, due to the simplicity of the data structures used, and the
@@ -32,8 +32,8 @@
  */
 public class TopKeyMap<V> {
   /**
-   * A TableKeyValue is a helper class for TopKeyMap use cases, such as a table with with row and
-   * column keys, which involve two values.
+   * A TableKeyValue is a helper class for TopKeyMap use cases, such as a table with row and column
+   * keys, which involve two values.
    */
   public static class TableKeyValue<R, C> {
     public final R row;
