Merge branch 'stable-2.11'

* stable-2.11:
  ConfigureProjectStep: Use Provider for MetaDataUpdate.User
  Build with API version 2.11.7
  Remove VERSION

Change-Id: Ib7c7d715437659dd180880d5b7bce1d184ddd1b6
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/BUCK b/BUCK
index e37deb4..11c5585 100644
--- a/BUCK
+++ b/BUCK
@@ -15,7 +15,7 @@
   manifest_entries = [
     'Gerrit-PluginName: importer',
     'Gerrit-ApiType: plugin',
-    'Gerrit-ApiVersion: 2.11.2',
+    'Gerrit-ApiVersion: 2.12-SNAPSHOT',
     'Gerrit-Module: com.googlesource.gerrit.plugins.importer.Module',
     'Gerrit-SshModule: com.googlesource.gerrit.plugins.importer.SshModule',
     'Gerrit-HttpModule: com.googlesource.gerrit.plugins.importer.HttpModule',
diff --git a/lib/gerrit/BUCK b/lib/gerrit/BUCK
index e48e352..f1ab768 100644
--- a/lib/gerrit/BUCK
+++ b/lib/gerrit/BUCK
@@ -1,12 +1,12 @@
 include_defs('//bucklets/maven_jar.bucklet')
 
-VER = '2.11.7'
+VER = '2.12'
 REPO = MAVEN_CENTRAL
 
 maven_jar(
   name = 'plugin-api',
   id = 'com.google.gerrit:gerrit-plugin-api:' + VER,
-  sha1 = 'e49e930c5c4ce74fc2c4c1cde1ddfb3ff77d0d63',
+  sha1 = '8ce1f6e65078bbcf03a1758f96b3ebca19b7fe3c',
   attach_source = False,
   repository = REPO,
   license = 'Apache2.0',
@@ -15,7 +15,7 @@
 maven_jar(
   name = 'gwtui-api',
   id = 'com.google.gerrit:gerrit-plugin-gwtui:' + VER,
-  sha1 = '1dc70f829c0b5310141dd9bd12e1bafcda48724f',
+  sha1 = 'a7e7d82746b847678022242ec9eb44d1f16e8639',
   attach_source = False,
   repository = REPO,
   license = 'Apache2.0',
diff --git a/pom.xml b/pom.xml
deleted file mode 100644
index 5b305a4..0000000
--- a/pom.xml
+++ /dev/null
@@ -1,139 +0,0 @@
-<!--
-Copyright (C) 2015 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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <groupId>com.googlesource.gerrit.plugins.importer</groupId>
-  <artifactId>importer</artifactId>
-  <packaging>jar</packaging>
-  <version>2.11.7</version>
-  <name>importer</name>
-
-  <properties>
-    <Gerrit-ApiType>plugin</Gerrit-ApiType>
-    <Gerrit-ApiVersion>${project.version}</Gerrit-ApiVersion>
-  </properties>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <version>2.4</version>
-        <configuration>
-          <archive>
-            <manifestEntries>
-              <Gerrit-PluginName>importer</Gerrit-PluginName>
-              <Gerrit-Module>com.googlesource.gerrit.plugins.importer.Module</Gerrit-Module>
-              <Gerrit-SshModule>com.googlesource.gerrit.plugins.importer.SshModule</Gerrit-SshModule>
-              <Gerrit-HttpModule>com.googlesource.gerrit.plugins.importer.HttpModule</Gerrit-HttpModule>
-
-              <Implementation-Vendor>Gerrit Code Review</Implementation-Vendor>
-              <Implementation-URL>http://code.google.com/p/gerrit/</Implementation-URL>
-
-              <Implementation-Title>${Gerrit-ApiType} ${project.artifactId}</Implementation-Title>
-              <Implementation-Version>${project.version}</Implementation-Version>
-
-              <Gerrit-ApiType>${Gerrit-ApiType}</Gerrit-ApiType>
-              <Gerrit-ApiVersion>${Gerrit-ApiVersion}</Gerrit-ApiVersion>
-            </manifestEntries>
-          </archive>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>2.3.2</version>
-        <configuration>
-          <source>1.7</source>
-          <target>1.7</target>
-          <encoding>UTF-8</encoding>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>gwt-maven-plugin</artifactId>
-        <version>2.7.0</version>
-        <configuration>
-          <module>com.googlesource.gerrit.plugins.importer.Importer</module>
-          <disableClassMetadata>true</disableClassMetadata>
-          <disableCastChecking>true</disableCastChecking>
-          <webappDirectory>${project.build.directory}/classes/static</webappDirectory>
-        </configuration>
-        <executions>
-          <execution>
-            <goals>
-              <goal>compile</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-shade-plugin</artifactId>
-        <version>2.3</version>
-        <configuration>
-          <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-          <createDependencyReducedPom>false</createDependencyReducedPom>
-        </configuration>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>shade</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>com.google.gerrit</groupId>
-      <artifactId>gerrit-${Gerrit-ApiType}-api</artifactId>
-      <version>${Gerrit-ApiVersion}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.google.gerrit</groupId>
-      <artifactId>gerrit-plugin-gwtui</artifactId>
-      <version>${Gerrit-ApiVersion}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.google.gwt</groupId>
-      <artifactId>gwt-user</artifactId>
-      <version>2.7.0</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>4.3.4</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpcore</artifactId>
-      <version>4.3.2</version>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
index e87ec1d..90147a0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
@@ -15,20 +15,16 @@
 package com.googlesource.gerrit.plugins.importer;
 
 import com.google.gerrit.common.errors.NoSuchAccountException;
+import com.google.gerrit.extensions.api.groups.GroupApi;
 import com.google.gerrit.extensions.common.AccountInfo;
 import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
 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.AccountGroup;
-import com.google.gerrit.reviewdb.client.AccountGroupMember;
-import com.google.gerrit.reviewdb.client.AccountGroupName;
 import com.google.gerrit.reviewdb.client.AccountSshKey;
 import com.google.gerrit.reviewdb.client.AuthType;
 import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.account.AccountCache;
 import com.google.gerrit.server.account.AccountException;
 import com.google.gerrit.server.account.AccountManager;
@@ -36,21 +32,17 @@
 import com.google.gerrit.server.account.AuthRequest;
 import com.google.gerrit.server.account.CreateAccount;
 import com.google.gerrit.server.account.GetSshKeys.SshKeyInfo;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.account.GroupUUID;
 import com.google.gerrit.server.config.AuthConfig;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
 
-import org.eclipse.jgit.lib.PersonIdent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
@@ -60,15 +52,11 @@
   private static Logger log = LoggerFactory.getLogger(AccountUtil.class);
 
   private static final String IMPORTED_USERS = "Imported Users";
-  private static final AccountGroup.NameKey IMPORTED_USERS_NAME =
-      new AccountGroup.NameKey(IMPORTED_USERS);
 
   private final AccountCache accountCache;
   private final AccountManager accountManager;
   private final AuthType authType;
-  private final IdentifiedUser currentUser;
-  private final GroupCache groupCache;
-  private final PersonIdent serverIdent;
+  private final com.google.gerrit.extensions.api.GerritApi gApi;
   private final Provider<ReviewDb> db;
 
   @Inject
@@ -79,22 +67,18 @@
       AccountCache accountCache,
       AccountManager accountManager,
       AuthConfig authConfig,
-      GroupCache groupCache,
-      IdentifiedUser currentUser,
-      @GerritPersonIdent PersonIdent serverIdent,
+      com.google.gerrit.extensions.api.GerritApi gApi,
       Provider<ReviewDb> db) {
     this.accountCache = accountCache;
     this.accountManager = accountManager;
     this.authType = authConfig.getAuthType();
-    this.currentUser = currentUser;
     this.db = db;
-    this.groupCache = groupCache;
-    this.serverIdent = serverIdent;
+    this.gApi = gApi;
   }
 
   Account.Id resolveUser(GerritApi api, AccountInfo acc)
-      throws NoSuchAccountException, BadRequestException, IOException,
-      OrmException, ResourceConflictException, UnprocessableEntityException {
+      throws NoSuchAccountException, IOException, OrmException,
+      RestApiException {
     if (acc.username == null) {
       throw new NoSuchAccountException(String.format(
           "User %s <%s> (%s) doesn't have a username and cannot be looked up.",
@@ -121,9 +105,8 @@
   }
 
   private Account.Id createAccountByLdapAndAddSshKeys(GerritApi api,
-      AccountInfo acc) throws NoSuchAccountException, BadRequestException,
-      IOException, OrmException, ResourceConflictException,
-      UnprocessableEntityException {
+      AccountInfo acc) throws NoSuchAccountException, IOException,
+      OrmException, RestApiException {
     if (!acc.username.matches(Account.USER_NAME_PATTERN)) {
       throw new NoSuchAccountException(String.format("User %s not found",
           acc.username));
@@ -160,8 +143,7 @@
   }
 
   private Account.Id createLocalUser(AccountInfo acc)
-      throws BadRequestException, ResourceConflictException,
-      UnprocessableEntityException, OrmException {
+      throws OrmException, RestApiException {
     CreateAccount.Input input = new CreateAccount.Input();
     log.info(String.format("User '%s' not found", acc.username));
     String username = acc.username;
@@ -176,42 +158,19 @@
 
     Account.Id userId = new Account.Id(accInfo._accountId);
     Account account = accountCache.get(userId).getAccount();
-    account.setActive(false);
     addToImportedUsersGroup(userId);
+    account.setActive(false);
     accountCache.evict(userId);
     return userId;
   }
 
-  private void addToImportedUsersGroup(Account.Id id) throws OrmException {
-    AccountGroup group = getImportedUsersGroup();
-    AccountGroupMember member =
-        new AccountGroupMember(new AccountGroupMember.Key(id, group.getId()));
-    db.get().accountGroupMembers().insert(Collections.singleton(member));
-  }
-
-  private AccountGroup getImportedUsersGroup() throws OrmException {
-    AccountGroup accGroup = groupCache.get(IMPORTED_USERS_NAME);
-    if (accGroup == null) {
-      accGroup = createImportedUsersGroup();
+  private void addToImportedUsersGroup(Account.Id id) throws RestApiException {
+    GroupApi importedUsers;
+    try {
+      importedUsers = gApi.groups().id(IMPORTED_USERS);
+    } catch (ResourceNotFoundException e) {
+      importedUsers = gApi.groups().create(IMPORTED_USERS);
     }
-    return accGroup;
-  }
-
-  private AccountGroup createImportedUsersGroup() throws OrmException {
-    AccountGroup.Id groupId = new AccountGroup.Id(db.get().nextAccountGroupId());
-    AccountGroup.UUID uuid =
-        GroupUUID.make(
-            IMPORTED_USERS,
-            currentUser.newCommitterIdent(
-                serverIdent.getWhen(),
-                serverIdent.getTimeZone()));
-    AccountGroup group = new AccountGroup(IMPORTED_USERS_NAME, groupId, uuid);
-    group.setDescription(IMPORTED_USERS);
-
-    db.get().accountGroupNames()
-        .insert(Collections.singleton(new AccountGroupName(group)));
-    db.get().accountGroups().insert(Collections.singleton(group));
-    groupCache.onCreateGroup(IMPORTED_USERS_NAME);
-    return group;
+    importedUsers.addMembers(Integer.toString(id.get()));
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
index a9eb69b..4477031 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
@@ -22,9 +22,7 @@
 import com.google.gerrit.extensions.common.ApprovalInfo;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.common.LabelInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.PatchSetApproval;
@@ -83,8 +81,7 @@
   }
 
   void add(GerritApi api) throws OrmException, NoSuchChangeException, IOException,
-      NoSuchAccountException, BadRequestException, ResourceConflictException,
-      UnprocessableEntityException{
+      NoSuchAccountException, RestApiException{
     if (resume) {
       db.patchSetApprovals().delete(
           db.patchSetApprovals().byChange(change.getId()));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
index cf91b66..a8de4a2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
@@ -14,24 +14,28 @@
 
 package com.googlesource.gerrit.plugins.importer;
 
+import com.google.gerrit.common.TimeUtil;
 import com.google.gerrit.extensions.api.changes.HashtagsInput;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.change.ChangeTriplet;
-import com.google.gerrit.server.change.HashtagsUtil;
+import com.google.gerrit.server.change.SetHashtagsOp;
+import com.google.gerrit.server.git.BatchUpdate;
+import com.google.gerrit.server.git.UpdateException;
 import com.google.gerrit.server.project.ChangeControl;
 import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.validators.ValidationException;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
+import com.google.inject.Provider;
 import com.google.inject.assistedinject.Assisted;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
 import java.util.HashSet;
 
 class AddHashtagsStep {
@@ -43,42 +47,58 @@
   private static final Logger log = LoggerFactory
       .getLogger(AddHashtagsStep.class);
 
-  private final HashtagsUtil hashtagsUtil;
   private final CurrentUser currentUser;
   private final ChangeControl.GenericFactory changeControlFactory;
   private final Change change;
   private final ChangeInfo changeInfo;
   private final boolean resume;
+  private final Provider<ReviewDb> db;
+  private final BatchUpdate.Factory batchUpdateFactory;
+  private final SetHashtagsOp.Factory hashtagsFactory;
 
   @Inject
-  AddHashtagsStep(HashtagsUtil hashtagsUtil,
-      CurrentUser currentUser,
+  AddHashtagsStep(CurrentUser currentUser,
       ChangeControl.GenericFactory changeControlFactory,
+      Provider<ReviewDb> db,
+      BatchUpdate.Factory batchUpdateFactory,
+      SetHashtagsOp.Factory hashtagsFactory,
       @Assisted Change change,
       @Assisted ChangeInfo changeInfo,
       @Assisted boolean resume) {
-    this.hashtagsUtil = hashtagsUtil;
     this.currentUser = currentUser;
     this.changeControlFactory = changeControlFactory;
+    this.db = db;
+    this.batchUpdateFactory = batchUpdateFactory;
+    this.hashtagsFactory = hashtagsFactory;
     this.change = change;
     this.changeInfo = changeInfo;
     this.resume = resume;
   }
 
-  void add() throws IllegalArgumentException, IOException,
-      ValidationException, OrmException, NoSuchChangeException {
+  void add() throws IllegalArgumentException, OrmException,
+      NoSuchChangeException, UpdateException, RestApiException {
     ChangeControl ctrl = changeControlFactory.controlFor(change, currentUser);
 
     try {
       if (resume) {
         HashtagsInput input = new HashtagsInput();
         input.remove = ctrl.getNotes().load().getHashtags();
-        hashtagsUtil.setHashtags(ctrl, input, false, false);
+        try (BatchUpdate bu = batchUpdateFactory.create(db.get(),
+            change.getProject(), currentUser, TimeUtil.nowTs())) {
+                  SetHashtagsOp op = hashtagsFactory.create(input);
+                  bu.addOp(change.getId(), op);
+                  bu.execute();
+        }
       }
 
       HashtagsInput input = new HashtagsInput();
       input.add = new HashSet<>(changeInfo.hashtags);
-      hashtagsUtil.setHashtags(ctrl, input, false, false);
+      try (BatchUpdate bu = batchUpdateFactory.create(db.get(),
+          change.getProject(), currentUser, TimeUtil.nowTs())) {
+                SetHashtagsOp op = hashtagsFactory.create(input);
+                bu.addOp(change.getId(), op);
+                bu.execute();
+      }
     } catch (AuthException e) {
       log.warn(String.format(
           "Hashtags cannot be set on change %s because the importing"
@@ -88,4 +108,4 @@
           ChangeTriplet.format(change), currentUser.getUserName()));
     }
   }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ConfigureRepositoryStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ConfigureRepositoryStep.java
index 7a93521..f15a3ec 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ConfigureRepositoryStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ConfigureRepositoryStep.java
@@ -27,7 +27,9 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.StoredConfig;
 
-import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
 import java.io.IOException;
 
 @Singleton
@@ -35,7 +37,7 @@
 
   static final String R_IMPORTS = "refs/imports/";
 
-  private final File gitDir;
+  private final Path gitDir;
 
   @Inject
   ConfigureRepositoryStep(
@@ -54,7 +56,7 @@
           .concat(name.get()));
     } else {
       config.setString("remote", "origin", "url",
-          new File(gitDir, name.get() + ".git").getCanonicalPath());
+          this.gitDir.resolve(name.get() + ".git").toString());
 
     }
     config.setString("remote", "origin", "fetch", "+refs/*:" + R_IMPORTS + "*");
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProject.java b/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProject.java
index 1f6a641..6598f30 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProject.java
@@ -26,6 +26,7 @@
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.account.CapabilityControl;
 import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.git.UpdateException;
 import com.google.gerrit.server.project.NoSuchChangeException;
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.gerrit.server.validators.ValidationException;
@@ -69,7 +70,8 @@
   @Override
   public ImportStatistic apply(ProjectResource rsrc, Input input)
       throws RestApiException, OrmException, IOException, ValidationException,
-      GitAPIException, NoSuchChangeException, NoSuchAccountException {
+      GitAPIException, NoSuchChangeException, NoSuchAccountException,
+      UpdateException {
     if (Strings.isNullOrEmpty(input.name)) {
       throw new BadRequestException("name is required");
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/GerritApi.java b/src/main/java/com/googlesource/gerrit/plugins/importer/GerritApi.java
index f4d3bda..7d47c79 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/GerritApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/GerritApi.java
@@ -17,10 +17,10 @@
 import com.google.common.base.Objects;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
 import com.google.gerrit.extensions.common.ProjectInfo;
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.server.account.GetSshKeys.SshKeyInfo;
-import com.google.gerrit.server.group.GroupJson.GroupInfo;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/HttpResponse.java b/src/main/java/com/googlesource/gerrit/plugins/importer/HttpResponse.java
old mode 100755
new mode 100644
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/HttpSession.java b/src/main/java/com/googlesource/gerrit/plugins/importer/HttpSession.java
old mode 100755
new mode 100644
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
index f94d734..7825d97 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
@@ -19,14 +19,15 @@
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.annotations.RequiresCapability;
 import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
 import com.google.gerrit.extensions.restapi.PreconditionFailedException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.AccountGroup;
 import com.google.gerrit.reviewdb.client.AccountGroupById;
@@ -39,7 +40,6 @@
 import com.google.gerrit.server.account.GroupIncludeCache;
 import com.google.gerrit.server.config.ConfigResource;
 import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.group.GroupJson.GroupInfo;
 import com.google.gerrit.server.validators.GroupCreationValidationListener;
 import com.google.gerrit.server.validators.ValidationException;
 import com.google.gwtorm.server.OrmDuplicateKeyException;
@@ -114,9 +114,8 @@
 
   @Override
   public Response<String> apply(ConfigResource rsrc, Input input)
-      throws ResourceConflictException, PreconditionFailedException,
-      BadRequestException, NoSuchAccountException, OrmException, IOException,
-      MethodNotAllowedException, UnprocessableEntityException {
+      throws NoSuchAccountException, OrmException, IOException,
+      RestApiException {
     GroupInfo groupInfo;
     this.api = apiFactory.create(input.from, input.user, input.pass);
     groupInfo = api.getGroup(group.get());
@@ -127,9 +126,8 @@
   }
 
   private void validate(Input input, GroupInfo groupInfo)
-      throws ResourceConflictException, PreconditionFailedException,
-      BadRequestException, IOException, OrmException, NoSuchAccountException,
-      MethodNotAllowedException, UnprocessableEntityException {
+      throws IOException, OrmException, NoSuchAccountException,
+      RestApiException {
     if (!isInternalGroup(new AccountGroup.UUID(groupInfo.id))) {
       throw new MethodNotAllowedException(String.format(
           "Group with name %s is not an internal group and cannot be imported",
@@ -184,9 +182,7 @@
   }
 
   private CreateGroupArgs toCreateGroupArgs(GroupInfo groupInfo)
-      throws IOException, OrmException, BadRequestException,
-      NoSuchAccountException, ResourceConflictException,
-      UnprocessableEntityException {
+      throws IOException, OrmException, NoSuchAccountException, RestApiException {
     CreateGroupArgs args = new CreateGroupArgs();
     args.setGroupName(groupInfo.name);
     args.groupDescription = groupInfo.description;
@@ -199,18 +195,11 @@
       initialMembers.add(accountUtil.resolveUser(api, member));
     }
     args.initialMembers = initialMembers;
-    Set<AccountGroup.UUID> initialGroups = new HashSet<>();
-    for (GroupInfo member : groupInfo.includes) {
-      initialGroups.add(new AccountGroup.UUID(member.id));
-    }
-    args.initialGroups = initialGroups;
     return args;
   }
 
   private AccountGroup createGroup(Input input, GroupInfo info) throws OrmException,
-      ResourceConflictException, NoSuchAccountException, BadRequestException,
-      IOException, PreconditionFailedException, MethodNotAllowedException,
-      UnprocessableEntityException {
+      NoSuchAccountException, IOException, RestApiException {
     String uniqueName = getUniqueGroupName(info.name);
     if (!info.name.equals(uniqueName)) {
       log.warn(String.format("Group %s with UUID %s is imported with name %s",
@@ -288,8 +277,7 @@
   }
 
   private void addMembers(AccountGroup.Id groupId, List<AccountInfo> members)
-      throws OrmException, NoSuchAccountException, BadRequestException,
-      IOException, ResourceConflictException, UnprocessableEntityException {
+      throws OrmException, NoSuchAccountException, IOException, RestApiException {
     List<AccountGroupMember> memberships = new ArrayList<>();
     for (AccountInfo member : members) {
       Account.Id userId = accountUtil.resolveUser(api, member);
@@ -306,9 +294,8 @@
 
   private void addGroups(Input input, AccountGroup.Id groupId,
       String groupName, List<GroupInfo> includedGroups)
-      throws BadRequestException, ResourceConflictException,
-      PreconditionFailedException, NoSuchAccountException, OrmException,
-      IOException, MethodNotAllowedException, UnprocessableEntityException {
+      throws NoSuchAccountException, OrmException,
+      IOException, RestApiException {
     List<AccountGroupById> includeList = new ArrayList<>();
     for (GroupInfo includedGroup : includedGroups) {
       if (isInternalGroup(new AccountGroup.UUID(includedGroup.id))) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
index c55971c..bae0813 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
@@ -17,11 +17,9 @@
 import static com.google.gerrit.reviewdb.client.AccountGroup.isInternalGroup;
 
 import com.google.gerrit.common.errors.NoSuchAccountException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.PreconditionFailedException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.AccountGroup;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.account.GroupCache;
@@ -77,9 +75,8 @@
     this.pm = pm;
   }
 
-  void importGroups() throws PreconditionFailedException, BadRequestException,
-      NoSuchAccountException, OrmException, IOException,
-      UnprocessableEntityException {
+  void importGroups() throws NoSuchAccountException, OrmException, IOException,
+      RestApiException {
     ProjectConfig projectConfig = projectCache.get(project).getConfig();
     Set<AccountGroup.UUID> groupUUIDs = projectConfig.getAllGroupUUIDs();
     pm.beginTask("Import Groups", groupUUIDs.size());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLog.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLog.java
index 46b0cbb..38e0f8b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLog.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportLog.java
@@ -19,23 +19,22 @@
 import com.google.gerrit.audit.AuditEvent;
 import com.google.gerrit.audit.AuditService;
 import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.extensions.systemstatus.ServerInformation;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.util.PluginLogFile;
 import com.google.gerrit.server.util.SystemLog;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 
-import org.apache.log4j.AsyncAppender;
 import org.apache.log4j.Level;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.apache.log4j.spi.LoggingEvent;
 
 @Singleton
-class ImportLog implements LifecycleListener {
+class ImportLog extends PluginLogFile {
   private static final String IMPORT_LOG_NAME = "import_log";
   private static final Logger log = LogManager.getLogger(IMPORT_LOG_NAME);
 
@@ -46,19 +45,15 @@
   public static String TARGET_PROJECT_NAME = "targetProjectName";
   public static String ERROR = "error";
 
-  private final SystemLog systemLog;
-  private final ServerInformation serverInfo;
   private final AuditService auditService;
   private final String canonicalWebUrl;
-  private boolean started;
 
   @Inject
   public ImportLog(SystemLog systemLog,
       ServerInformation serverInfo,
       AuditService auditService,
       @CanonicalWebUrl String canonicalWebUrl) {
-    this.systemLog = systemLog;
-    this.serverInfo = serverInfo;
+    super(systemLog, serverInfo, IMPORT_LOG_NAME, new ImportLogLayout());
     this.auditService = auditService;
     this.canonicalWebUrl = canonicalWebUrl;
   }
@@ -130,31 +125,4 @@
                 : "OK"
         ));
   }
-
-  @Override
-  public void start() {
-    if (!started) {
-      Logger importLogger = LogManager.getLogger(IMPORT_LOG_NAME);
-      String loggerName = importLogger.getName();
-      AsyncAppender asyncAppender = systemLog.createAsyncAppender(
-          loggerName, new ImportLogLayout());
-      importLogger.removeAppender(loggerName);
-      importLogger.addAppender(asyncAppender);
-      importLogger.setAdditivity(false);
-      started = true;
-    }
-  }
-
-  @Override
-  public void stop() {
-    // stop() is called when the plugin is unloaded or when the server is
-    // shutdown. Only clean up when the server is shutting down to prevent
-    // issues when the plugin is reloaded. Otherwise when Gerrit loads the new
-    // plugin and then unloads the old one, the unload of the old plugin would
-    // remove the appenders that were just created by the new plugin. This is
-    // because the logger is static.
-    if (serverInfo.getState() == ServerInformation.State.SHUTDOWN) {
-      LogManager.getLogger(log.getName()).removeAllAppenders();
-    }
-  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
index 4e90374..39d1868 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
@@ -28,6 +28,7 @@
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.git.UpdateException;
 import com.google.gerrit.server.project.NoSuchChangeException;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.project.ProjectState;
@@ -164,7 +165,8 @@
   @Override
   public ImportStatistic apply(ConfigResource rsrc, Input input)
       throws RestApiException, OrmException, IOException, ValidationException,
-      GitAPIException, NoSuchChangeException, NoSuchAccountException {
+      GitAPIException, NoSuchChangeException, NoSuchAccountException,
+      UpdateException {
     if (input == null) {
       input = new Input();
     }
@@ -179,8 +181,8 @@
 
   public ResumeImportStatistic resume(String user, String pass, boolean force,
       File importStatus) throws RestApiException, OrmException, IOException,
-      ValidationException, GitAPIException, NoSuchChangeException,
-      NoSuchAccountException {
+      GitAPIException, NoSuchChangeException, NoSuchAccountException,
+      UpdateException {
     LockFile lockFile = lockForImport();
     try {
       ImportProjectInfo info = ImportJson.parse(importStatus);
@@ -202,8 +204,8 @@
 
   private ResumeImportStatistic apply(LockFile lockFile, Input input,
       ImportProjectInfo info) throws RestApiException, OrmException,
-      IOException, ValidationException, GitAPIException, NoSuchChangeException,
-      NoSuchAccountException {
+      IOException, GitAPIException, NoSuchChangeException,
+      NoSuchAccountException, UpdateException {
     boolean resume = info != null;
     api = apiFactory.create(input.from, input.user, input.pass);
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/LocalApi.java b/src/main/java/com/googlesource/gerrit/plugins/importer/LocalApi.java
index f214b74..c9ec59f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/LocalApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/LocalApi.java
@@ -19,6 +19,7 @@
 import com.google.gerrit.extensions.client.ListChangesOption;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
 import com.google.gerrit.extensions.common.ProjectInfo;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.BadRequestException;
@@ -26,21 +27,10 @@
 import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
 import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.server.account.AccountResource;
 import com.google.gerrit.server.account.AccountsCollection;
 import com.google.gerrit.server.account.GetSshKeys;
 import com.google.gerrit.server.account.GetSshKeys.SshKeyInfo;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.change.ChangesCollection;
-import com.google.gerrit.server.change.ListComments;
-import com.google.gerrit.server.change.RevisionResource;
-import com.google.gerrit.server.change.Revisions;
-import com.google.gerrit.server.group.GroupJson;
-import com.google.gerrit.server.group.GroupJson.GroupInfo;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 
@@ -50,33 +40,15 @@
 
 public class LocalApi implements GerritApi {
   private final com.google.gerrit.extensions.api.GerritApi gApi;
-  private final GroupCache groupCache;
-  private final GroupJson groupJson;
-  private final GroupControl.Factory groupControlFactory;
-  private final ChangesCollection changes;
-  private final Revisions revisions;
-  private final ListComments listComments;
   private final AccountsCollection accounts;
   private final GetSshKeys getSshKeys;
 
   @Inject
   LocalApi(
       com.google.gerrit.extensions.api.GerritApi gApi,
-      GroupCache groupCache,
-      GroupJson groupJson,
-      GroupControl.Factory groupControlFactory,
-      ChangesCollection changes,
-      Revisions revisions,
-      ListComments listComments,
       AccountsCollection accounts,
       GetSshKeys getSshKeys) {
     this.gApi = gApi;
-    this.groupCache = groupCache;
-    this.groupJson = groupJson;
-    this.groupControlFactory = groupControlFactory;
-    this.changes = changes;
-    this.revisions = revisions;
-    this.listComments = listComments;
     this.accounts = accounts;
     this.getSshKeys = getSshKeys;
   }
@@ -120,23 +92,19 @@
   @Override
   public GroupInfo getGroup(String groupName) throws IOException,
       BadRequestException, OrmException {
-    AccountGroup group = groupCache.get(new AccountGroup.NameKey(groupName));
-    GroupControl groupControl = groupControlFactory.controlFor(group);
-    if (group == null || !groupControl.isVisible()) {
-      throw new BadRequestException(String.format("Group %s not found.",
-          groupName));
+    try {
+      return gApi.groups().id(groupName).get();
+    } catch (RestApiException e) {
+      throw new BadRequestException(e.getMessage());
     }
-    return groupJson.format(groupControl.getGroup());
   }
 
   @Override
   public Iterable<CommentInfo> getComments(int changeId, String rev)
       throws IOException, OrmException, BadRequestException {
     try {
-      ChangeResource changeRsrc = changes.parse(new Change.Id(changeId));
-      RevisionResource revRsrc =
-          revisions.parse(changeRsrc, IdString.fromDecoded(rev));
-      Map<String, List<CommentInfo>> result = listComments.apply(revRsrc);
+      Map<String, List<CommentInfo>> result =
+          gApi.changes().id(changeId).revision(rev).comments();
 
       for (Map.Entry<String, List<CommentInfo>> e : result.entrySet()) {
         for (CommentInfo i : e.getValue()) {
@@ -145,9 +113,7 @@
       }
 
       return Iterables.concat(result.values());
-    } catch (ResourceNotFoundException e) {
-      return null;
-    } catch (AuthException e) {
+    } catch (RestApiException e) {
       throw new BadRequestException(e.getMessage());
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/Module.java b/src/main/java/com/googlesource/gerrit/plugins/importer/Module.java
index dcf4099..1cad41f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/Module.java
@@ -21,12 +21,12 @@
 
 import com.google.gerrit.extensions.annotations.Exports;
 import com.google.gerrit.extensions.config.CapabilityDefinition;
+import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.extensions.registration.DynamicMap;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.extensions.restapi.RestApiModule;
 import com.google.gerrit.extensions.webui.TopMenu;
-import com.google.gerrit.server.config.FactoryModule;
 import com.google.inject.internal.UniqueAnnotations;
 
 class Module extends FactoryModule {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectCommand.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectCommand.java
index e041fb8..f31e160 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectCommand.java
@@ -20,6 +20,7 @@
 import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.git.UpdateException;
 import com.google.gerrit.server.project.NoSuchChangeException;
 import com.google.gerrit.server.validators.ValidationException;
 import com.google.gerrit.sshd.CommandMetaData;
@@ -70,7 +71,7 @@
   @Override
   protected void run() throws OrmException, IOException, UnloggedFailure,
       ValidationException, GitAPIException, NoSuchChangeException,
-      NoSuchAccountException {
+      NoSuchAccountException, UpdateException {
     ImportProject.Input input = new ImportProject.Input();
     input.from = url;
     input.name = name;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java b/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java
old mode 100755
new mode 100644
index 05e757e..5ee6f06
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java
@@ -20,12 +20,12 @@
 import com.google.gerrit.extensions.client.ListChangesOption;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
 import com.google.gerrit.extensions.common.ProjectInfo;
 import com.google.gerrit.extensions.common.RevisionInfo;
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.server.OutputFormat;
 import com.google.gerrit.server.account.GetSshKeys.SshKeyInfo;
-import com.google.gerrit.server.group.GroupJson.GroupInfo;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
index 2630429..3322dfc 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
@@ -20,20 +20,17 @@
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.client.ChangeStatus;
 import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.extensions.restapi.Url;
 import com.google.gerrit.reviewdb.client.Branch;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.git.UpdateException;
 import com.google.gerrit.server.index.ChangeIndexer;
 import com.google.gerrit.server.project.NoSuchChangeException;
 import com.google.gerrit.server.query.change.ChangeData;
 import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.server.validators.ValidationException;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
@@ -131,7 +128,7 @@
 
   void replay() throws IOException, OrmException,
       NoSuchAccountException, NoSuchChangeException, RestApiException,
-      ValidationException {
+      UpdateException {
     int start = 0;
     int limit = GlobalCapability.DEFAULT_MAX_QUERY_LIMIT;
     pm.beginTask("Replay Changes", ProgressMonitor.UNKNOWN);
@@ -165,7 +162,7 @@
 
   private void replayChange(RevWalk rw, ChangeInfo c)
       throws IOException, OrmException, NoSuchAccountException,
-      NoSuchChangeException, RestApiException, ValidationException {
+      NoSuchChangeException, RestApiException, IllegalArgumentException, UpdateException {
     if (c.status == ChangeStatus.DRAFT) {
       // no import of draft changes
       return;
@@ -222,8 +219,7 @@
   }
 
   private Change createChange(ChangeInfo c) throws OrmException,
-      NoSuchAccountException, BadRequestException, IOException,
-      ResourceConflictException, UnprocessableEntityException {
+      NoSuchAccountException, IOException, RestApiException {
     Change.Id changeId = new Change.Id(db.nextChangeId());
 
     Change change =
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayInlineCommentsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayInlineCommentsStep.java
index 0dda6e6..0df6a89 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayInlineCommentsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayInlineCommentsStep.java
@@ -211,7 +211,7 @@
       PatchSet ps) throws OrmException {
     Map<String, PatchLineComment> drafts = Maps.newHashMap();
     for (PatchLineComment c : plcUtil.draftByPatchSetAuthor(db, ps.getId(),
-        ((IdentifiedUser) ctrl.getCurrentUser()).getAccountId(),
+        ((IdentifiedUser) ctrl.getUser()).getAccountId(),
         ctrl.getNotes())) {
       drafts.put(c.getKey().get(), c);
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
index ad29c03..c5ee3c5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
@@ -17,9 +17,7 @@
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.ChangeMessage;
@@ -77,8 +75,7 @@
   }
 
   void replay(GerritApi api) throws NoSuchAccountException, NoSuchChangeException,
-      OrmException, IOException, BadRequestException, ResourceConflictException,
-      UnprocessableEntityException {
+      OrmException, IOException, RestApiException {
     for (ChangeMessageInfo msg : changeInfo.messages) {
       ChangeMessage.Key msgKey = new ChangeMessage.Key(change.getId(), msg.id);
       if (resume && db.changeMessages().get(msgKey) != null) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
index 9bce9e1..5adf74f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
@@ -17,9 +17,7 @@
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.PatchSet;
 import com.google.gerrit.reviewdb.client.PatchSetInfo;
@@ -81,8 +79,8 @@
     this.changeInfo = changeInfo;
   }
 
-  void replay(GerritApi api) throws IOException, OrmException, NoSuchAccountException,
-      BadRequestException, ResourceConflictException, UnprocessableEntityException {
+  void replay(GerritApi api) throws IOException, OrmException,
+      NoSuchAccountException, RestApiException {
     List<RevisionInfo> revisions = new ArrayList<>(changeInfo.revisions.values());
     sortRevisionInfoByNumber(revisions);
     List<PatchSet> patchSets = new ArrayList<>();
@@ -127,13 +125,11 @@
         ps.setRevision(new RevId(commit.name()));
         ps.setDraft(r.draft != null && r.draft);
 
-        info = patchSetInfoFactory.get(commit, ps.getId());
+        info = patchSetInfoFactory.get(rw, commit, ps.getId());
         if (info.getRevId().equals(changeInfo.currentRevision)) {
           change.setCurrentPatchSet(info);
         }
 
-        ChangeUtil.insertAncestors(db, ps.getId(), commit);
-
         updateRef(repo, ps);
       }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/RestResponse.java b/src/main/java/com/googlesource/gerrit/plugins/importer/RestResponse.java
old mode 100755
new mode 100644
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/RestSession.java b/src/main/java/com/googlesource/gerrit/plugins/importer/RestSession.java
old mode 100755
new mode 100644
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyProject.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyProject.java
index d0fbc85..e040133 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyProject.java
@@ -26,6 +26,7 @@
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.account.CapabilityControl;
 import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.git.UpdateException;
 import com.google.gerrit.server.project.NoSuchChangeException;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.project.ProjectResource;
@@ -78,7 +79,8 @@
   @Override
   public ResumeImportStatistic apply(ProjectResource rsrc, Input input)
       throws RestApiException, IOException, OrmException, ValidationException,
-      GitAPIException, NoSuchChangeException, NoSuchAccountException {
+      GitAPIException, NoSuchChangeException, NoSuchAccountException,
+      UpdateException {
     ImportProjectResource projectResource =
         projectsCollection.parse(new ConfigResource(),
             IdString.fromDecoded(rsrc.getName()));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectImport.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectImport.java
index 457d8f1..b5793b5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectImport.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectImport.java
@@ -27,6 +27,7 @@
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.account.CapabilityControl;
 import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.git.UpdateException;
 import com.google.gerrit.server.project.NoSuchChangeException;
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.gerrit.server.validators.ValidationException;
@@ -92,7 +93,8 @@
   @Override
   public ResumeImportStatistic apply(ImportProjectResource rsrc, Input input)
       throws RestApiException, IOException, OrmException, ValidationException,
-      GitAPIException, NoSuchChangeException, NoSuchAccountException {
+      GitAPIException, NoSuchChangeException, NoSuchAccountException,
+      UpdateException {
     if (copy) {
       input.validateResumeCopy();
     } else {
@@ -129,7 +131,7 @@
     public ResumeImportStatistic apply(ProjectResource rsrc, Input input)
         throws RestApiException, IOException, OrmException,
         ValidationException, GitAPIException, NoSuchChangeException,
-        NoSuchAccountException {
+        NoSuchAccountException, UpdateException {
       ImportProjectResource projectResource =
           projectsCollection.parse(new ConfigResource(),
               IdString.fromDecoded(rsrc.getName()));
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md
index f726c6e..a96e116 100644
--- a/src/main/resources/Documentation/build.md
+++ b/src/main/resources/Documentation/build.md
@@ -1,7 +1,7 @@
 Build
 =====
 
-This plugin can be built with Buck or Maven.
+This plugin can be built with Buck.
 
 Buck
 ----
@@ -69,15 +69,3 @@
   ./tools/eclipse/project.py
 ```
 
-Maven
------
-
-Note that the Maven build is provided for compatibility reasons, but
-it is considered to be deprecated and will be removed in a future
-version of this plugin.
-
-To build with Maven, run
-
-```
-mvn clean package
-```