diff --git a/github-plugin/src/main/java/com/google/gerrit/server/account/AccountImpoter.java b/github-plugin/src/main/java/com/google/gerrit/server/account/AccountImpoter.java
index 6f643b9..2ff0137 100644
--- a/github-plugin/src/main/java/com/google/gerrit/server/account/AccountImpoter.java
+++ b/github-plugin/src/main/java/com/google/gerrit/server/account/AccountImpoter.java
@@ -14,41 +14,59 @@
 package com.google.gerrit.server.account;
 
 import java.io.IOException;
+import java.util.Arrays;
 
 import org.apache.http.HttpStatus;
 import org.kohsuke.github.GHUser;
 
+import com.google.common.base.Objects;
+import com.google.common.collect.Iterables;
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.Response;
 import com.google.gerrit.extensions.restapi.TopLevelResource;
 import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Account.Id;
+import com.google.gerrit.reviewdb.client.AccountExternalId;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.account.CreateAccount.Factory;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
+import com.google.inject.Provider;
 
 public class AccountImpoter {
-  private Factory createAccountFactory;
+  private final Factory createAccountFactory;
+  private final Provider<ReviewDb> schema;
 
   @Inject
-  public AccountImpoter(CreateAccount.Factory createAccountFactory) {
+  public AccountImpoter(final CreateAccount.Factory createAccountFactory,
+      final Provider<ReviewDb> schema) {
     this.createAccountFactory = createAccountFactory;
+    this.schema = schema;
   }
 
-  public Account.Id importAccount(String login, String name, String email) throws IOException,
-      BadRequestException, ResourceConflictException,
+  @SuppressWarnings("unchecked")
+  public Account.Id importAccount(String login, String name, String email)
+      throws IOException, BadRequestException, ResourceConflictException,
       UnprocessableEntityException, OrmException {
+    ReviewDb db = schema.get();
     CreateAccount createAccount = createAccountFactory.create(login);
     CreateAccount.Input accountInput = new CreateAccount.Input();
     accountInput.email = email;
-    accountInput.name = name;
     accountInput.username = login;
+    accountInput.name = Objects.firstNonNull(name, login);
     Response<AccountInfo> accountResponse =
         (Response<AccountInfo>) createAccount.apply(TopLevelResource.INSTANCE,
             accountInput);
     if (accountResponse.statusCode() == HttpStatus.SC_CREATED) {
-      return accountResponse.value()._id;
+      Id accountId = accountResponse.value()._id;
+      db.accountExternalIds().insert(
+          Arrays
+              .asList(new AccountExternalId(accountId,
+                  new AccountExternalId.Key(AccountExternalId.SCHEME_GERRIT,
+                      login))));
+      return accountId;
     } else {
       throw new IOException("Cannot import GitHub account " + login
           + ": HTTP Status " + accountResponse.statusCode());
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceHttpModule.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceHttpModule.java
index cc00a73..38ae784 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceHttpModule.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceHttpModule.java
@@ -19,7 +19,6 @@
 import com.google.inject.servlet.ServletModule;
 import com.googlesource.gerrit.plugins.github.filters.GitHubOAuthFilter;
 import com.googlesource.gerrit.plugins.github.oauth.GitHubHttpProvider;
-import com.googlesource.gerrit.plugins.github.pullsync.PullRequestsServlet;
 import com.googlesource.gerrit.plugins.github.replication.RemoteSiteUser;
 import com.googlesource.gerrit.plugins.github.velocity.VelocityStaticServlet;
 import com.googlesource.gerrit.plugins.github.velocity.VelocityViewServlet;
@@ -33,7 +32,6 @@
     install(new FactoryModuleBuilder().build(RemoteSiteUser.Factory.class));
 
     install(new GuiceModule());
-    serve("/").with(PullRequestsServlet.class);
     serve("*.css","*.js","*.png","*.jpg","*.woff","*.gif","*.ttf").with(VelocityStaticServlet.class);
     serve("*.html").with(VelocityViewServlet.class);
     serve("*.gh").with(VelocityControllerServlet.class);
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/pullsync/PullRequestsServlet.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/pullsync/PullRequestsServlet.java
deleted file mode 100644
index eb6f4f9..0000000
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/pullsync/PullRequestsServlet.java
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright (C) 2013 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.github.pullsync;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.List;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.exception.ParseErrorException;
-import org.apache.velocity.exception.ResourceNotFoundException;
-import org.apache.velocity.runtime.RuntimeInstance;
-import org.kohsuke.github.GHCommitPointer;
-import org.kohsuke.github.GHIssueState;
-import org.kohsuke.github.GHOrganization;
-import org.kohsuke.github.GHPullRequest;
-import org.kohsuke.github.GHRepository;
-import org.kohsuke.github.GitHub;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.gerrit.reviewdb.client.Project.NameKey;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import com.googlesource.gerrit.plugins.github.oauth.GitHubLogin;
-import com.googlesource.gerrit.plugins.github.replication.GitHubDestinations;
-
-@Singleton
-public class PullRequestsServlet extends HttpServlet {
-  private static final long serialVersionUID = 3635343057427548273L;
-  private static final Logger log = LoggerFactory
-      .getLogger(PullRequestsServlet.class);
-  private Provider<GitHubLogin> loginProvider;
-  private GitHubDestinations destinations;
-  private ProjectCache projects;
-  private RuntimeInstance velocityRuntime;
-
-  @Inject
-  public PullRequestsServlet(Provider<GitHubLogin> loginProvider,
-      GitHubDestinations destinations, ProjectCache projects,
-      @Named("PluginRuntimeInstance") RuntimeInstance velocityRuntime) {
-    this.loginProvider = loginProvider;
-    this.destinations = destinations;
-    this.projects = projects;
-    this.velocityRuntime = velocityRuntime;
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
-      throws ServletException, IOException {
-
-    PrintWriter out = null;
-    try {
-      GitHub hub = loginProvider.get().hub;
-      out = resp.getWriter();
-
-      for (String orgName : destinations.getOrganisations()) {
-        GHOrganization org = hub.getOrganization(orgName);
-        for (GHRepository repo : org.getRepositories().values()) {
-          String repoName = repo.getName();
-          ProjectState project = projects.get(new NameKey(repoName));
-          if (project == null) {
-            log.debug("GitHub repo " + orgName + "/" + repoName
-                + " does not have a correspondant Gerrit Project: skipped");
-            continue;
-          }
-
-          List<GHPullRequest> pullRequests =
-              repo.getPullRequests(GHIssueState.OPEN);
-          for (GHPullRequest pullRequest : pullRequests) {
-
-            GHCommitPointer pullHead = pullRequest.getHead();
-            GHCommitPointer pullBase = pullRequest.getBase();
-          }
-
-        }
-        org.getRepositories();
-      };
-    } catch (ResourceNotFoundException e) {
-      // TODO Auto-generated catch block
-      e.printStackTrace();
-    } catch (ParseErrorException e) {
-      // TODO Auto-generated catch block
-      e.printStackTrace();
-    } catch (Exception e) {
-      // TODO Auto-generated catch block
-      e.printStackTrace();
-    } finally {
-      if (out != null) {
-        out.close();
-      }
-    }
-  }
-}
