diff --git a/.gitignore b/.gitignore
index dddc43e56249358d48bf5b62b07a8f96887726c3..5d276348528b6f5f649fe26d5953d72ee3ff6095 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,9 @@
 config.json
 cashierd.conf
 tmp
+
 cashier
 cashierd
+
+signing_key
+http.log
diff --git a/README.md b/README.md
index 66dcbba52aeb31085aefc16d3d0fbde2f2292e2f..bf264588b4b1cc87e4c708b4f21b62be607e8d60 100644
--- a/README.md
+++ b/README.md
@@ -216,8 +216,9 @@ Supported options:
 |---------:|-------------:|----------------------------------------------------------------------------------------------------------------------------------------|
 | Google   |       domain | If this is unset then you must whitelist individual email addresses using `users_whitelist`.                                           |
 | Github   | organization | If this is unset then you must whitelist individual users using `users_whitelist`. The oauth client and secrets should be issued by the specified organization. |
-| Gitlab   | authurl | Required.  The auth url: `https://GITLAB_HOST/oauth/authorize` |
-| Gitlab   | tokenurl | Required.  The token url: `https://GITLAB_HOST/oauth/token` |
+| Gitlab   | baseurl | Optional. API url. Default: `https://gitlab.com/api/v3/` |
+| Gitlab   | authurl | Optional. Auth url. Default: `https://gitlab.com/oauth/authorize` |
+| Gitlab   | tokenurl | Optional. Token url. Default: `https://gitlab.com/oauth/token` |
 | Gitlab   | allusers | Allow all valid users to get signed keys. |
 | Gitlab   | group | If `allusers` and this are unset then you must whitelist individual users using `users_whitelist`. Otherwise the user must be a member of this group. |
 
diff --git a/server/auth/gitlab/gitlab.go b/server/auth/gitlab/gitlab.go
index 8b854c5fd99f8b9c9daf304f7bb83c9515e6c6ce..ac8d6f71fc6754dc120d1d4268590d23f2584ab8 100644
--- a/server/auth/gitlab/gitlab.go
+++ b/server/auth/gitlab/gitlab.go
@@ -2,6 +2,7 @@ package gitlab
 
 import (
 	"errors"
+	"fmt"
 	"net/http"
 	"time"
 
@@ -20,6 +21,7 @@ const (
 // Gitlab account.
 type Config struct {
 	config    *oauth2.Config
+	baseurl   string
 	group     string
 	whitelist map[string]bool
 	allusers  bool
@@ -32,14 +34,25 @@ func New(c *config.Auth) (auth.Provider, error) {
 		uw[u] = true
 	}
 	allUsers := false
+	fmt.Printf("Config: c.ProviderOpts[\"allusers\"] == \"%s\"\n",
+		c.ProviderOpts["allusers"])
 	if c.ProviderOpts["allusers"] == "true" {
 		allUsers = true
 	}
 	if !allUsers && c.ProviderOpts["group"] == "" && len(uw) == 0 {
 		return nil, errors.New("gitlab_opts group and the users whitelist must not be both empty if allusers isn't true")
 	}
-	if c.ProviderOpts["authurl"] == "" || c.ProviderOpts["tokenurl"] == "" {
-		return nil, errors.New("gitlab_opts authurl and tokenurl must be set")
+	authUrl := "https://gitlab.com/oauth/authorize"
+	if c.ProviderOpts["authurl"] != "" {
+		authUrl = c.ProviderOpts["authurl"]
+	}
+	tokenUrl := "https://gitlab.com/oauth/token"
+	if c.ProviderOpts["tokenurl"] != "" {
+		tokenUrl = c.ProviderOpts["tokenurl"]
+	}
+	baseUrl := "https://gitlab.com/api/v3/"
+	if c.ProviderOpts["baseurl"] != "" {
+		baseUrl = c.ProviderOpts["baseurl"]
 	}
 	return &Config{
 		config: &oauth2.Config{
@@ -47,8 +60,8 @@ func New(c *config.Auth) (auth.Provider, error) {
 			ClientSecret: c.OauthClientSecret,
 			RedirectURL:  c.OauthCallbackURL,
 			Endpoint: oauth2.Endpoint{
-				AuthURL:  c.ProviderOpts["authurl"],
-				TokenURL: c.ProviderOpts["tokenurl"],
+				AuthURL:  authUrl,
+				TokenURL: tokenUrl,
 			},
 			Scopes: []string{
 				"api",
@@ -57,6 +70,7 @@ func New(c *config.Auth) (auth.Provider, error) {
 		group:     c.ProviderOpts["group"],
 		whitelist: uw,
 		allusers:  allUsers,
+		baseurl:   baseUrl,
 	}, nil
 }
 
@@ -72,25 +86,32 @@ func (c *Config) Name() string {
 
 // Valid validates the oauth token.
 func (c *Config) Valid(token *oauth2.Token) bool {
+	fmt.Printf("In func Valid(%+v)\n", token)
+	if !token.Valid() {
+		fmt.Printf("Token not valid.\n")
+		return false
+	}
 	if c.allusers {
 		return true
 	}
+	fmt.Printf("  allusers == false\n")
 	if len(c.whitelist) > 0 && !c.whitelist[c.Username(token)] {
 		return false
 	}
-	if !token.Valid() {
-		return false
-	}
 	if c.group == "" {
 		// There's no group and token is valid.  Can only reach
 		// here if user whitelist is set and user is in whitelist.
 		return true
 	}
-	client := gitlabapi.NewClient(c.newClient(token), token.AccessToken)
+	fmt.Printf("  group == ''\n")
+	client := gitlabapi.NewOAuthClient(nil, token.AccessToken)
+	client.SetBaseURL(c.baseurl)
+	fmt.Printf("  client == '%+v'\n", client)
 	groups, _, err := client.Groups.ListGroups(nil)
 	if err != nil {
 		return false
 	}
+	fmt.Printf("  groups == '%+v'\n", groups)
 	for _, g := range groups {
 		if g.Name == c.group {
 			return true
@@ -129,10 +150,15 @@ func (c *Config) Exchange(code string) (*oauth2.Token, error) {
 
 // Username retrieves the username portion of the user's email address.
 func (c *Config) Username(token *oauth2.Token) string {
-	client := gitlabapi.NewClient(c.newClient(token), token.AccessToken)
+	fmt.Printf("Username AccessToken = '%s'\n", token.AccessToken)
+	client := gitlabapi.NewOAuthClient(nil, token.AccessToken)
+	client.SetBaseURL(c.baseurl)
+	fmt.Printf("Username client = '%+v'\n", client)
 	u, _, err := client.Users.CurrentUser()
 	if err != nil {
+		fmt.Printf("Username err = '%+v'\n", err)
 		return ""
 	}
+	fmt.Printf("Username u = '%+v'\n", u)
 	return u.Username
 }