diff --git a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubOAuthConfig.java b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubOAuthConfig.java
index 7a7e621..28a27af 100644
--- a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubOAuthConfig.java
+++ b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubOAuthConfig.java
@@ -121,15 +121,15 @@
   }
 
   private Map<String, List<Scope>> getScopes(Config config) {
-    Map<String, List<Scope>> scopes = Maps.newHashMap();
+    Map<String, List<Scope>> result = Maps.newHashMap();
     Set<String> configKeys = config.getNames(CONF_SECTION, true);
     for (String key : configKeys) {
       if (key.startsWith("scopes")) {
         String scopesString = config.getString(CONF_SECTION, null, key);
-        scopes.put(key, parseScopesString(scopesString));
+        result.put(key, parseScopesString(scopesString));
       }
     }
-    return scopes;
+    return result;
   }
 
   private String trimTrailingSlash(String url) {
@@ -137,15 +137,15 @@
   }
 
   private List<Scope> parseScopesString(String scopesString) {
-    ArrayList<Scope> scopes = new ArrayList<>();
+    ArrayList<Scope> result = new ArrayList<>();
     if (Strings.emptyToNull(scopesString) != null) {
       String[] scopesStrings = scopesString.split(",");
       for (String scope : scopesStrings) {
-        scopes.add(Enum.valueOf(Scope.class, scope.trim()));
+        result.add(Enum.valueOf(Scope.class, scope.trim()));
       }
     }
 
-    return scopes;
+    return result;
   }
 
   public Scope[] getDefaultScopes() {
diff --git a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/OAuthWebFilter.java b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/OAuthWebFilter.java
index 2c2afb2..af2d9d5 100644
--- a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/OAuthWebFilter.java
+++ b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/OAuthWebFilter.java
@@ -208,17 +208,17 @@
     currentSecureConfig.save();
   }
 
-  private boolean updateConfigSection(FileBasedConfig config, String section,
+  private boolean updateConfigSection(FileBasedConfig c, String section,
       String user, String password) {
-    String configUser = config.getString("remote", section, "username");
-    String configPassword = config.getString("remote", section, "password");
+    String configUser = c.getString("remote", section, "username");
+    String configPassword = c.getString("remote", section, "password");
     if (!StringUtils.equals(configUser, user)
         || StringUtils.equals(configPassword, password)) {
       return false;
     }
 
-    config.setString("remote", section, "username", user);
-    config.setString("remote", section, "password", password);
+    c.setString("remote", section, "username", user);
+    c.setString("remote", section, "password", password);
     return true;
   }
 
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitHubRepository.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitHubRepository.java
index c5cf07a..c78b7e4 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitHubRepository.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitHubRepository.java
@@ -100,24 +100,24 @@
       @Override
       public boolean get(URIish uri, CredentialItem... items)
           throws UnsupportedCredentialItem {
-        String username = uri.getUser();
-        if (username == null) {
-          username = GitHubRepository.this.username;
+        String user = uri.getUser();
+        if (user == null) {
+          user = GitHubRepository.this.username;
         }
-        if (username == null) {
+        if (user == null) {
           return false;
         }
 
-        String password = GitHubRepository.this.password;
-        if (password == null) {
+        String passwd = GitHubRepository.this.password;
+        if (passwd == null) {
           return false;
         }
 
         for (CredentialItem i : items) {
           if (i instanceof CredentialItem.Username) {
-            ((CredentialItem.Username) i).setValue(username);
+            ((CredentialItem.Username) i).setValue(user);
           } else if (i instanceof CredentialItem.Password) {
-            ((CredentialItem.Password) i).setValue(password.toCharArray());
+            ((CredentialItem.Password) i).setValue(passwd.toCharArray());
           } else {
             throw new UnsupportedCredentialItem(uri, i.getPromptText());
           }
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitImportJob.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitImportJob.java
index fac0579..005d54c 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitImportJob.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitImportJob.java
@@ -133,9 +133,9 @@
   }
 
   @Override
-  public void beginTask(String task, int totalUnits) {
+  public void beginTask(String taskName, int totalUnits) {
     this.currTask++;
-    this.task = task;
+    this.task = taskName;
     this.totUnits = totalUnits;
     this.currUnit = 0;
     this.lastPercentage = 0;
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitJobStatus.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitJobStatus.java
index 7336c38..c9bfb43 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitJobStatus.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitJobStatus.java
@@ -43,9 +43,9 @@
     this.value = "Initializing ...";
   }
 
-  public void update(Code code, String shortDescription, String description) {
+  public void update(Code code, String sDescription, String description) {
     this.status = code;
-    this.shortDescription = shortDescription;
+    this.shortDescription = sDescription;
     this.value = description;
   }
 
@@ -61,10 +61,10 @@
     return value;
   }
 
-  public void update(Code status) {
-    this.status = status;
-    this.shortDescription = status.name();
-    this.value = status.name();
+  public void update(Code statusCode) {
+    this.status = statusCode;
+    this.shortDescription = statusCode.name();
+    this.value = statusCode.name();
   }
 
   public void printJson(PrintWriter out) throws IOException {
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestImportJob.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestImportJob.java
index 863eb59..766a786 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestImportJob.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestImportJob.java
@@ -115,9 +115,9 @@
   }
 
   private Project fetchGerritProject(ProjectCache projectCache,
-      String organisation, String repoName) {
+      String fetchOrganisation, String fetchRepoName) {
     NameKey projectNameKey =
-        Project.NameKey.parse(organisation + "/" + repoName);
+        Project.NameKey.parse(fetchOrganisation + "/" + fetchRepoName);
     ProjectState projectState = projectCache.get(projectNameKey);
     return projectState.getProject();
   }
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupMembership.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupMembership.java
index 0c509f0..62e01ba 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupMembership.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupMembership.java
@@ -49,13 +49,13 @@
 
   @Override
   public Set<UUID> intersection(Iterable<UUID> groupIds) {
-    ImmutableSet.Builder<UUID> groups = new ImmutableSet.Builder<>();
+    ImmutableSet.Builder<UUID> groupBuilder = new ImmutableSet.Builder<>();
     for (UUID uuid : groupIds) {
       if (contains(uuid)) {
-        groups.add(uuid);
+        groupBuilder.add(uuid);
       }
     }
-    return groups.build();
+    return groupBuilder.build();
   }
 
   @Override
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupsCache.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupsCache.java
index bf94d1c..97eeff4 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupsCache.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupsCache.java
@@ -56,7 +56,7 @@
 
   public static class OrganisationLoader extends
       CacheLoader<String, Multimap<String, String>> {
-    private static final Logger log = LoggerFactory
+    private static final Logger logger = LoggerFactory
         .getLogger(OrganisationLoader.class);
     private final UserScopedProvider<GitHubLogin> ghLoginProvider;
 
@@ -70,26 +70,26 @@
       Multimap<String, String> orgsTeams = HashMultimap.create();
       GitHubLogin ghLogin = ghLoginProvider.get(username);
       if (ghLogin == null) {
-        log.warn("Cannot login to GitHub on behalf of '{}'", username);
+        logger.warn("Cannot login to GitHub on behalf of '{}'", username);
         return orgsTeams;
       }
 
       try {
         loadOrganisationsAndTeams(username, orgsTeams, ghLogin);
       } catch (FileNotFoundException teamsNotFound) {
-        log.info(
+        logger.info(
             "Cannot access teams for user '{}': falling back to list of public organisations",
             username);
         loadOrganisations(username, orgsTeams, ghLogin);
       }
 
-      log.debug("GitHub user '{}' belongs to: {}", username, orgsTeams);
+      logger.debug("GitHub user '{}' belongs to: {}", username, orgsTeams);
       return orgsTeams;
     }
 
     private void loadOrganisationsAndTeams(String username, Multimap<String, String> orgsTeams,
         GitHubLogin ghLogin) throws IOException {
-      log.debug("Getting list of organisations/teams for user '{}'", username);
+      logger.debug("Getting list of organisations/teams for user '{}'", username);
       Map<String, Set<GHTeam>> myOrganisationsLogins =
           ghLogin.getHub().getMyTeams();
       for (Entry<String, Set<GHTeam>> teamsOrg : myOrganisationsLogins
@@ -103,7 +103,7 @@
 
     private void loadOrganisations(String username,
         Multimap<String, String> orgsTeams, GitHubLogin ghLogin) throws IOException {
-      log.debug("Getting list of public organisations for user '{}'", username);
+      logger.debug("Getting list of public organisations for user '{}'", username);
       Set<String> organisations = ghLogin.getMyOrganisationsLogins();
       for (String org : organisations) {
         orgsTeams.put(org, EVERYONE_TEAM_NAME);
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/GitHubDestinations.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/GitHubDestinations.java
index 0d94796..92cea4e 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/GitHubDestinations.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/GitHubDestinations.java
@@ -78,14 +78,14 @@
   }
 
   private List<String> getOrganisations(List<Destination> destinations) {
-    ArrayList<String> organisations = new ArrayList<>();
+    ArrayList<String> result = new ArrayList<>();
     for (Destination destination : destinations) {
       for (URIish urish : destination.getRemote().getURIs()) {
         String[] uriPathParts = urish.getPath().split("/");
-        organisations.add(uriPathParts[0]);
+        result.add(uriPathParts[0]);
       }
     }
-    return organisations;
+    return result;
   }
 
   private List<Destination> getDestinations(Path cfgPath)
