diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceModule.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceModule.java
index 8822bd9..21926c4 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceModule.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceModule.java
@@ -22,7 +22,7 @@
 import com.google.inject.assistedinject.FactoryModuleBuilder;
 import com.googlesource.gerrit.plugins.github.group.GitHubGroupBackend;
 import com.googlesource.gerrit.plugins.github.group.GitHubGroupMembership;
-import com.googlesource.gerrit.plugins.github.group.GitHubOrganisationsCache;
+import com.googlesource.gerrit.plugins.github.group.GitHubGroupsCache;
 import com.googlesource.gerrit.plugins.github.group.GitHubOrganisationGroup;
 import com.googlesource.gerrit.plugins.github.oauth.GitHubLogin;
 import com.googlesource.gerrit.plugins.github.oauth.IdentifiedUserGitHubLoginProvider;
@@ -34,7 +34,7 @@
     bind(new TypeLiteral<UserScopedProvider<GitHubLogin>>() {}).to(
         IdentifiedUserGitHubLoginProvider.class);
 
-    install(GitHubOrganisationsCache.module());
+    install(GitHubGroupsCache.module());
 
     DynamicSet.bind(binder(), TopMenu.class).to(GitHubTopMenu.class);
     DynamicSet.bind(binder(), GroupBackend.class).to(GitHubGroupBackend.class);
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroup.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroup.java
index 4e1279e..4f5947c 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroup.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroup.java
@@ -14,7 +14,7 @@
 
 package com.googlesource.gerrit.plugins.github.group;
 
-
+import lombok.Getter;
 
 import com.google.gerrit.common.data.GroupDescription.Basic;
 import com.google.gerrit.reviewdb.client.AccountGroup.UUID;
@@ -22,11 +22,15 @@
 public abstract class GitHubGroup implements Basic {
   public static final String UUID_PREFIX = "github:";
   public static final String NAME_PREFIX = "github/";
-  protected final UUID uuid;
+
+  @Getter
+  protected final UUID groupUUID;
+
+  @Getter
   protected final String url;
 
-  public GitHubGroup(UUID uuid, String url) {
-    this.uuid = uuid;
+  GitHubGroup(UUID groupUUID, String url) {
+    this.groupUUID = groupUUID;
     this.url = url;
   }
 
@@ -34,15 +38,4 @@
   public String getEmailAddress() {
     return "";
   }
-
-  @Override
-  public UUID getGroupUUID() {
-    return uuid;
-  }
-
-  @Override
-  public String getUrl() {
-    return url;
-  }
-
 }
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupBackend.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupBackend.java
index 4c22c91..b6fd5cf 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupBackend.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupBackend.java
@@ -43,13 +43,13 @@
   private static final Logger log = LoggerFactory
       .getLogger(GitHubGroupBackend.class);
   private final GitHubGroupMembership.Factory ghMembershipProvider;
-  private final GitHubOrganisationsCache ghOrganisationCache;
+  private final GitHubGroupsCache ghOrganisationCache;
 
   @Inject
-  public GitHubGroupBackend(
+  GitHubGroupBackend(
       UserScopedProvider<GitHubLogin> ghLogin,
       GitHubGroupMembership.Factory ghMembershipProvider,
-      GitHubOrganisationsCache ghOrganisationCache) {
+      GitHubGroupsCache ghOrganisationCache) {
     this.ghMembershipProvider = ghMembershipProvider;
     this.ghOrganisationCache = ghOrganisationCache;
   }
@@ -91,14 +91,14 @@
 
       Builder<GroupReference> orgGroups =
           new ImmutableSet.Builder<GroupReference>();
-      for (String ghOrg : ghOrgs) {
-        if (ghOrg.toLowerCase().startsWith(orgNamePrefixLowercase)) {
+      for (String organizationName : ghOrgs) {
+        if (organizationName.toLowerCase().startsWith(orgNamePrefixLowercase)) {
           GroupReference teamGroupRef =
-              GitHubOrganisationGroup.groupReference(ghOrg);
+              GitHubOrganisationGroup.groupReference(organizationName);
 
           if ((orgNamePrefixLowercase.length() > 0 && orgNamePrefix
               .endsWith("/")) || teamNameLowercase.length() > 0) {
-            for (String teamName : ghOrganisationCache.getTeamsForCurrentUser(ghOrg)) {
+            for (String teamName : ghOrganisationCache.getTeamsForCurrentUser(organizationName)) {
               if (teamName.toLowerCase().startsWith(teamNameLowercase)) {
                 orgGroups.add(GitHubTeamGroup.groupReference(teamGroupRef,
                     teamName));
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 c66c8e0..b93c138 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
@@ -30,11 +30,11 @@
   }
 
   @Inject
-  public GitHubGroupMembership(GitHubOrganisationsCache ghOrganisationCache,
+  GitHubGroupMembership(GitHubGroupsCache ghOrganisationCache,
       @Assisted String username) {
     this.groups =
         new ImmutableSet.Builder<UUID>().addAll(
-            ghOrganisationCache.getAllGroupsForUser(username)).build();
+            ghOrganisationCache.getGroupsForUser(username)).build();
   }
 
   @Override
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubOrganisationsCache.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupsCache.java
similarity index 73%
rename from github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubOrganisationsCache.java
rename to github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupsCache.java
index 671ddc3..8cd82e4 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubOrganisationsCache.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubGroupsCache.java
@@ -44,14 +44,14 @@
 import com.googlesource.gerrit.plugins.github.oauth.UserScopedProvider;
 
 @Singleton
-public class GitHubOrganisationsCache {
+public class GitHubGroupsCache {
   private static final Logger log = LoggerFactory
-      .getLogger(GitHubOrganisationsCache.class);
-  private static final String ORGS_CACHE_NAME = "org-teams";
-  protected static final long GROUPS_CACHE_TTL_MINS = 15;
+      .getLogger(GitHubGroupsCache.class);
+  private static final String ORGS_CACHE_NAME = "groups";
+  protected static final long GROUPS_CACHE_TTL_MINS = 60;
 
   public static class OrganisationLoader extends
-      CacheLoader<String, Multimap<String,String>> {
+      CacheLoader<String, Multimap<String, String>> {
     private static final Logger log = LoggerFactory
         .getLogger(OrganisationLoader.class);
     private final UserScopedProvider<GitHubLogin> ghLoginProvider;
@@ -88,26 +88,26 @@
     return new CacheModule() {
       @Override
       protected void configure() {
-        cache(ORGS_CACHE_NAME, String.class, new TypeLiteral<Multimap<String,String>>() {})
-            .expireAfterWrite(GROUPS_CACHE_TTL_MINS, MINUTES).loader(
-                OrganisationLoader.class);
-        bind(GitHubOrganisationsCache.class);
+        cache(ORGS_CACHE_NAME, String.class,
+            new TypeLiteral<Multimap<String, String>>() {}).expireAfterWrite(
+            GROUPS_CACHE_TTL_MINS, MINUTES).loader(OrganisationLoader.class);
+        bind(GitHubGroupsCache.class);
       }
     };
   }
 
-  private final LoadingCache<String, Multimap<String,String>> orgTeamsByUsername;
+  private final LoadingCache<String, Multimap<String, String>> orgTeamsByUsername;
   private final Provider<IdentifiedUser> userProvider;
 
   @Inject
-  public GitHubOrganisationsCache(
-      @Named(ORGS_CACHE_NAME) LoadingCache<String, Multimap<String,String>> byUsername,
+  GitHubGroupsCache(
+      @Named(ORGS_CACHE_NAME) LoadingCache<String, Multimap<String, String>> byUsername,
       Provider<IdentifiedUser> userProvider) {
     this.orgTeamsByUsername = byUsername;
     this.userProvider = userProvider;
   }
 
-  public Set<String> getOrganizationsForUser(String username) {
+  Set<String> getOrganizationsForUser(String username) {
     try {
       return orgTeamsByUsername.get(username).keySet();
     } catch (ExecutionException e) {
@@ -116,35 +116,35 @@
     }
   }
 
-  public Set<String> getOrganizationsForCurrentUser() throws ExecutionException {
+  Set<String> getOrganizationsForCurrentUser() throws ExecutionException {
     return orgTeamsByUsername.get(userProvider.get().getUserName()).keySet();
   }
 
-  public Set<String> getTeamsForUser(String organizationName, String username) {
+  Set<String> getTeamsForUser(String organizationName, String username) {
     try {
       return new ImmutableSet.Builder<String>().addAll(
           orgTeamsByUsername.get(username).get(organizationName)).build();
     } catch (ExecutionException e) {
-      log.warn("Cannot get Teams membership for organisation '" + organizationName
-          + "' and user '" + username + "'", e);
+      log.warn("Cannot get Teams membership for organisation '"
+          + organizationName + "' and user '" + username + "'", e);
       return Collections.emptySet();
     }
   }
 
-  public Set<String> getTeamsForCurrentUser(String organizationName) {
+  Set<String> getTeamsForCurrentUser(String organizationName) {
     return getTeamsForUser(organizationName, userProvider.get().getUserName());
   }
 
-  public Set<UUID> getAllGroupsForUser(String username) {
+  public Set<UUID> getGroupsForUser(String username) {
     ImmutableSet.Builder<UUID> groupsBuilder = new ImmutableSet.Builder<>();
-      for (String org : getOrganizationsForUser(username)) {
-        groupsBuilder.add(GitHubOrganisationGroup.uuid(org));
+    for (String org : getOrganizationsForUser(username)) {
+      groupsBuilder.add(GitHubOrganisationGroup.uuid(org));
 
-        for (String team : getTeamsForUser(org, username)) {
-          groupsBuilder.add(GitHubTeamGroup.uuid(
-              GitHubOrganisationGroup.uuid(org), team));
-        }
+      for (String team : getTeamsForUser(org, username)) {
+        groupsBuilder.add(GitHubTeamGroup.uuid(
+            GitHubOrganisationGroup.uuid(org), team));
       }
-      return groupsBuilder.build();
+    }
+    return groupsBuilder.build();
   }
 }
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubOrganisationGroup.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubOrganisationGroup.java
index 01a0f89..7dca217 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubOrganisationGroup.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubOrganisationGroup.java
@@ -31,6 +31,7 @@
   }
 
   private final String orgName;
+
   @Inject
   GitHubOrganisationGroup(@Assisted("orgName") String orgName,
       @Assisted("orgUrl") @Nullable String orgUrl) {
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubTeamGroup.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubTeamGroup.java
index 345d2b3..cd53736 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubTeamGroup.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/group/GitHubTeamGroup.java
@@ -18,6 +18,7 @@
 import com.google.gerrit.common.data.GroupReference;
 import com.google.gerrit.reviewdb.client.AccountGroup;
 import com.google.gerrit.reviewdb.client.AccountGroup.UUID;
+import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 
 public class GitHubTeamGroup extends GitHubGroup {
@@ -29,9 +30,10 @@
   private final GitHubOrganisationGroup orgGroup;
   private final String teamName;
 
-  public GitHubTeamGroup(@Assisted GitHubOrganisationGroup orgGroup,
+  @Inject
+  GitHubTeamGroup(@Assisted GitHubOrganisationGroup orgGroup,
       @Assisted String teamName, @Nullable String teamUrl) {
-    super(uuid(orgGroup.uuid, teamName), teamUrl);
+    super(uuid(orgGroup.getGroupUUID(), teamName), teamUrl);
     this.orgGroup = orgGroup;
     this.teamName = teamName;
   }
