diff --git a/.gitignore b/.gitignore
index 446fb07..898d584 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,4 @@
 /bazel-oauth
 /bazel-out
 /bazel-testlogs
+/.idea
diff --git a/src/main/java/com/googlesource/gerrit/plugins/oauth/CasApi.java b/src/main/java/com/googlesource/gerrit/plugins/oauth/CasApi.java
index 3ae65dc..76d4011 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/oauth/CasApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/oauth/CasApi.java
@@ -16,12 +16,7 @@
 
 import org.scribe.builder.api.DefaultApi20;
 import org.scribe.model.OAuthConfig;
-import org.scribe.model.OAuthConstants;
-import org.scribe.model.OAuthRequest;
-import org.scribe.model.Response;
-import org.scribe.model.Token;
 import org.scribe.model.Verb;
-import org.scribe.model.Verifier;
 import org.scribe.oauth.OAuthService;
 import org.scribe.utils.OAuthEncoder;
 
@@ -53,54 +48,6 @@
 
   @Override
   public OAuthService createService(OAuthConfig config) {
-    return new CasOAuthService(this, config);
-  }
-
-  private static final class CasOAuthService implements OAuthService {
-    private static final String VERSION = "2.0";
-    private static final String GRANT_TYPE = "grant_type";
-    private static final String GRANT_TYPE_VALUE = "authorization_code";
-
-    private final DefaultApi20 api;
-    private final OAuthConfig config;
-
-    private CasOAuthService(DefaultApi20 api, OAuthConfig config) {
-      this.config = config;
-      this.api = api;
-    }
-
-    @Override
-    public Token getAccessToken(Token token, Verifier verifier) {
-      OAuthRequest request =
-          new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint());
-      request.addBodyParameter(GRANT_TYPE, GRANT_TYPE_VALUE);
-      request.addBodyParameter(OAuthConstants.CLIENT_ID, config.getApiKey());
-      request.addBodyParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret());
-      request.addBodyParameter(OAuthConstants.CODE, verifier.getValue());
-      request.addBodyParameter(OAuthConstants.REDIRECT_URI, config.getCallback());
-      Response response = request.send();
-      return api.getAccessTokenExtractor().extract(response.getBody());
-    }
-
-    @Override
-    public Token getRequestToken() {
-      throw new UnsupportedOperationException(
-          "Unsupported operation, please use 'getAuthorizationUrl' and redirect your users there");
-    }
-
-    @Override
-    public String getVersion() {
-      return VERSION;
-    }
-
-    @Override
-    public void signRequest(Token token, OAuthRequest request) {
-      request.addQuerystringParameter(OAuthConstants.ACCESS_TOKEN, token.getToken());
-    }
-
-    @Override
-    public String getAuthorizationUrl(Token token) {
-      return api.getAuthorizationUrl(config);
-    }
+    return new OAuth20ServiceImpl(this, config);
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/oauth/DexApi.java b/src/main/java/com/googlesource/gerrit/plugins/oauth/DexApi.java
index 389dd8e..2386e24 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/oauth/DexApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/oauth/DexApi.java
@@ -18,12 +18,7 @@
 import org.scribe.extractors.AccessTokenExtractor;
 import org.scribe.extractors.JsonTokenExtractor;
 import org.scribe.model.OAuthConfig;
-import org.scribe.model.OAuthConstants;
-import org.scribe.model.OAuthRequest;
-import org.scribe.model.Response;
-import org.scribe.model.Token;
 import org.scribe.model.Verb;
-import org.scribe.model.Verifier;
 import org.scribe.oauth.OAuthService;
 import org.scribe.utils.OAuthEncoder;
 
@@ -60,77 +55,11 @@
 
   @Override
   public OAuthService createService(OAuthConfig config) {
-    // TODO can't use this until updating to newer scribe lib
-    // return new OAuth20ServiceImpl(this,config);
-    return new DexOAuthService(this, config);
+    return new OAuth20ServiceImpl(this, config);
   }
 
   @Override
   public AccessTokenExtractor getAccessTokenExtractor() {
     return new JsonTokenExtractor();
   }
-
-  private static final class DexOAuthService implements OAuthService {
-
-    private static final String VERSION = "2.0";
-
-    private static final String GRANT_TYPE = "grant_type";
-    private static final String GRANT_TYPE_VALUE = "authorization_code";
-
-    private final DefaultApi20 api;
-    private final OAuthConfig config;
-
-    /**
-     * Default constructor
-     *
-     * @param api OAuth2.0 api information
-     * @param config OAuth 2.0 configuration param object
-     */
-    public DexOAuthService(DefaultApi20 api, OAuthConfig config) {
-      this.api = api;
-      this.config = config;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Token getAccessToken(Token requestToken, Verifier verifier) {
-      OAuthRequest request =
-          new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint());
-      request.addBodyParameter(OAuthConstants.CLIENT_ID, config.getApiKey());
-      request.addBodyParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret());
-      request.addBodyParameter(OAuthConstants.CODE, verifier.getValue());
-      request.addBodyParameter(OAuthConstants.REDIRECT_URI, config.getCallback());
-      if (config.hasScope()) {
-        request.addBodyParameter(OAuthConstants.SCOPE, config.getScope());
-      }
-      request.addBodyParameter(GRANT_TYPE, GRANT_TYPE_VALUE);
-      Response response = request.send();
-      return api.getAccessTokenExtractor().extract(response.getBody());
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Token getRequestToken() {
-      throw new UnsupportedOperationException(
-          "Unsupported operation, please use 'getAuthorizationUrl' and redirect your users there");
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String getVersion() {
-      return VERSION;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void signRequest(Token accessToken, OAuthRequest request) {
-      request.addQuerystringParameter(OAuthConstants.ACCESS_TOKEN, accessToken.getToken());
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String getAuthorizationUrl(Token requestToken) {
-      return api.getAuthorizationUrl(config);
-    }
-  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/oauth/GitLabApi.java b/src/main/java/com/googlesource/gerrit/plugins/oauth/GitLabApi.java
index 898fbcc..2c27f35 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/oauth/GitLabApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/oauth/GitLabApi.java
@@ -20,12 +20,8 @@
 import org.scribe.exceptions.OAuthException;
 import org.scribe.extractors.AccessTokenExtractor;
 import org.scribe.model.OAuthConfig;
-import org.scribe.model.OAuthConstants;
-import org.scribe.model.OAuthRequest;
-import org.scribe.model.Response;
 import org.scribe.model.Token;
 import org.scribe.model.Verb;
-import org.scribe.model.Verifier;
 import org.scribe.oauth.OAuthService;
 import org.scribe.utils.Preconditions;
 
@@ -56,7 +52,7 @@
 
   @Override
   public OAuthService createService(OAuthConfig config) {
-    return new GitLabOAuthService(this, config);
+    return new OAuth20ServiceImpl(this, config);
   }
 
   @Override
@@ -64,69 +60,6 @@
     return new GitLabJsonTokenExtractor();
   }
 
-  private static final class GitLabOAuthService implements OAuthService {
-    private static final String VERSION = "2.0";
-
-    private static final String GRANT_TYPE = "grant_type";
-    private static final String GRANT_TYPE_VALUE = "authorization_code";
-
-    private final DefaultApi20 api;
-    private final OAuthConfig config;
-
-    /**
-     * Default constructor
-     *
-     * @param api OAuth2.0 api information
-     * @param config OAuth 2.0 configuration param object
-     */
-    public GitLabOAuthService(DefaultApi20 api, OAuthConfig config) {
-      this.api = api;
-      this.config = config;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Token getAccessToken(Token requestToken, Verifier verifier) {
-      OAuthRequest request =
-          new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint());
-      request.addBodyParameter(OAuthConstants.CLIENT_ID, config.getApiKey());
-      request.addBodyParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret());
-      request.addBodyParameter(OAuthConstants.CODE, verifier.getValue());
-      request.addBodyParameter(OAuthConstants.REDIRECT_URI, config.getCallback());
-      if (config.hasScope()) {
-        request.addBodyParameter(OAuthConstants.SCOPE, config.getScope());
-      }
-      request.addBodyParameter(GRANT_TYPE, GRANT_TYPE_VALUE);
-      Response response = request.send();
-      return api.getAccessTokenExtractor().extract(response.getBody());
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Token getRequestToken() {
-      throw new UnsupportedOperationException(
-          "Unsupported operation, please use 'getAuthorizationUrl' and redirect your users there");
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String getVersion() {
-      return VERSION;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void signRequest(Token accessToken, OAuthRequest request) {
-      request.addQuerystringParameter(OAuthConstants.ACCESS_TOKEN, accessToken.getToken());
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String getAuthorizationUrl(Token requestToken) {
-      return api.getAuthorizationUrl(config);
-    }
-  }
-
   private static final class GitLabJsonTokenExtractor implements AccessTokenExtractor {
     private Pattern accessTokenPattern = Pattern.compile("\"access_token\"\\s*:\\s*\"(\\S*?)\"");
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/oauth/Google2Api.java b/src/main/java/com/googlesource/gerrit/plugins/oauth/Google2Api.java
index 3db9dbf..ed48549 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/oauth/Google2Api.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/oauth/Google2Api.java
@@ -22,12 +22,8 @@
 import org.scribe.exceptions.OAuthException;
 import org.scribe.extractors.AccessTokenExtractor;
 import org.scribe.model.OAuthConfig;
-import org.scribe.model.OAuthConstants;
-import org.scribe.model.OAuthRequest;
-import org.scribe.model.Response;
 import org.scribe.model.Token;
 import org.scribe.model.Verb;
-import org.scribe.model.Verifier;
 import org.scribe.oauth.OAuthService;
 import org.scribe.utils.Preconditions;
 
@@ -61,7 +57,7 @@
 
   @Override
   public OAuthService createService(OAuthConfig config) {
-    return new GoogleOAuthService(this, config);
+    return new OAuth20ServiceImpl(this, config);
   }
 
   @Override
@@ -69,67 +65,6 @@
     return new GoogleJsonTokenExtractor();
   }
 
-  private static final class GoogleOAuthService implements OAuthService {
-    private static final String VERSION = "2.0";
-
-    private static final String GRANT_TYPE = "grant_type";
-    private static final String GRANT_TYPE_VALUE = "authorization_code";
-
-    private final DefaultApi20 api;
-    private final OAuthConfig config;
-
-    /**
-     * Default constructor
-     *
-     * @param api OAuth2.0 api information
-     * @param config OAuth 2.0 configuration param object
-     */
-    public GoogleOAuthService(DefaultApi20 api, OAuthConfig config) {
-      this.api = api;
-      this.config = config;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Token getAccessToken(Token requestToken, Verifier verifier) {
-      OAuthRequest request =
-          new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint());
-      request.addBodyParameter(OAuthConstants.CLIENT_ID, config.getApiKey());
-      request.addBodyParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret());
-      request.addBodyParameter(OAuthConstants.CODE, verifier.getValue());
-      request.addBodyParameter(OAuthConstants.REDIRECT_URI, config.getCallback());
-      if (config.hasScope()) request.addBodyParameter(OAuthConstants.SCOPE, config.getScope());
-      request.addBodyParameter(GRANT_TYPE, GRANT_TYPE_VALUE);
-      Response response = request.send();
-      return api.getAccessTokenExtractor().extract(response.getBody());
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Token getRequestToken() {
-      throw new UnsupportedOperationException(
-          "Unsupported operation, please use 'getAuthorizationUrl' and redirect your users there");
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String getVersion() {
-      return VERSION;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void signRequest(Token accessToken, OAuthRequest request) {
-      request.addQuerystringParameter(OAuthConstants.ACCESS_TOKEN, accessToken.getToken());
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String getAuthorizationUrl(Token requestToken) {
-      return api.getAuthorizationUrl(config);
-    }
-  }
-
   private static final class GoogleJsonTokenExtractor implements AccessTokenExtractor {
     private Pattern accessTokenPattern = Pattern.compile("\"access_token\"\\s*:\\s*\"(\\S*?)\"");
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/oauth/OAuth20ServiceImpl.java b/src/main/java/com/googlesource/gerrit/plugins/oauth/OAuth20ServiceImpl.java
new file mode 100644
index 0000000..a9eaddb
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/oauth/OAuth20ServiceImpl.java
@@ -0,0 +1,83 @@
+// Copyright (C) 2017 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.oauth;
+
+import org.scribe.builder.api.DefaultApi20;
+import org.scribe.model.OAuthConfig;
+import org.scribe.model.OAuthConstants;
+import org.scribe.model.OAuthRequest;
+import org.scribe.model.Response;
+import org.scribe.model.Token;
+import org.scribe.model.Verifier;
+import org.scribe.oauth.OAuthService;
+
+/** TODO(gildur): remove when updating to newer scribe lib */
+final class OAuth20ServiceImpl implements OAuthService {
+
+  private static final String VERSION = "2.0";
+
+  private static final String GRANT_TYPE = "grant_type";
+  private static final String GRANT_TYPE_VALUE = "authorization_code";
+
+  private final DefaultApi20 api;
+  private final OAuthConfig config;
+
+  /**
+   * Default constructor
+   *
+   * @param api OAuth2.0 api information
+   * @param config OAuth 2.0 configuration param object
+   */
+  public OAuth20ServiceImpl(DefaultApi20 api, OAuthConfig config) {
+    this.api = api;
+    this.config = config;
+  }
+
+  @Override
+  public Token getAccessToken(Token requestToken, Verifier verifier) {
+    OAuthRequest request = new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint());
+    request.addBodyParameter(OAuthConstants.CLIENT_ID, config.getApiKey());
+    request.addBodyParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret());
+    request.addBodyParameter(OAuthConstants.CODE, verifier.getValue());
+    request.addBodyParameter(OAuthConstants.REDIRECT_URI, config.getCallback());
+    if (config.hasScope()) {
+      request.addBodyParameter(OAuthConstants.SCOPE, config.getScope());
+    }
+    request.addBodyParameter(GRANT_TYPE, GRANT_TYPE_VALUE);
+    Response response = request.send();
+    return api.getAccessTokenExtractor().extract(response.getBody());
+  }
+
+  @Override
+  public Token getRequestToken() {
+    throw new UnsupportedOperationException(
+        "Unsupported operation, please use 'getAuthorizationUrl' and redirect your users there");
+  }
+
+  @Override
+  public String getVersion() {
+    return VERSION;
+  }
+
+  @Override
+  public void signRequest(Token accessToken, OAuthRequest request) {
+    request.addQuerystringParameter(OAuthConstants.ACCESS_TOKEN, accessToken.getToken());
+  }
+
+  @Override
+  public String getAuthorizationUrl(Token requestToken) {
+    return api.getAuthorizationUrl(config);
+  }
+}
