diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java
index 9f71e9d..8c17842 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java
@@ -71,15 +71,15 @@
       throws AuthException, ResourceConflictException, RepositoryNotFoundException, IOException,
           ResourceNotFoundException, PermissionBackendException {
 
-    if (!permissionBackend.user(self).ref(rsrc.getBranchKey()).testOrFalse(RefPermission.DELETE)) {
+    if (!permissionBackend.currentUser().ref(rsrc.getBranchKey()).testOrFalse(RefPermission.DELETE)) {
       permissionBackend
-          .user(self)
+          .currentUser()
           .test(new PluginPermission(pluginName, DeleteOwnImagesCapability.DELETE_OWN_IMAGES));
     }
 
     try (Repository r = repoManager.openRepository(rsrc.getProject())) {
       if (!permissionBackend
-          .user(self)
+          .currentUser()
           .ref(rsrc.getBranchKey())
           .testOrFalse(RefPermission.DELETE)) {
         validateOwnImage(r, rsrc.getRef());
@@ -101,7 +101,7 @@
         case NO_CHANGE:
         case FAST_FORWARD:
         case FORCED:
-          referenceUpdated.fire(rsrc.getProject(), u, self.get().getAccount());
+          referenceUpdated.fire(rsrc.getProject(), u, self.get().state());
           break;
 
         case REJECTED_CURRENT_BRANCH:
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/GetPreference.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/GetPreference.java
index 4c5041b..e69b27d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/GetPreference.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/GetPreference.java
@@ -60,10 +60,10 @@
   @Override
   public ConfigInfo apply(AccountResource rsrc) throws AuthException, PermissionBackendException {
     if (self.get() != rsrc.getUser()) {
-      permissionBackend.user(self).check(ADMINISTRATE_SERVER);
+      permissionBackend.currentUser().check(ADMINISTRATE_SERVER);
     }
 
-    String username = self.get().getUserName();
+    String username = self.get().getUserName().get();
 
     ConfigInfo globalCfg = getConfig.get().apply(new ConfigResource());
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageResource.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageResource.java
index 131ae51..4fab002 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageResource.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageResource.java
@@ -18,32 +18,28 @@
 import com.google.gerrit.extensions.restapi.RestView;
 import com.google.gerrit.reviewdb.client.Branch;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.project.RefControl;
+
 import com.google.inject.TypeLiteral;
 
 public class ImageResource implements RestResource {
   public static final TypeLiteral<RestView<ImageResource>> IMAGE_KIND =
       new TypeLiteral<RestView<ImageResource>>() {};
 
-  private final RefControl refControl;
+  private Branch.NameKey branchName;
 
-  ImageResource(RefControl refControl) {
-    this.refControl = refControl;
-  }
-
-  public RefControl getControl() {
-    return refControl;
+  ImageResource(Branch.NameKey branchName) {
+    this.branchName = branchName;
   }
 
   public Project.NameKey getProject() {
-    return refControl.getProjectControl().getProject().getNameKey();
+    return branchName.getParentKey();
   }
 
   public String getRef() {
-    return refControl.getRefName();
+    return branchName.get();
   }
 
   public Branch.NameKey getBranchKey() {
-    return new Branch.NameKey(getProject(), getRef());
+    return branchName;
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java
index 6c52b46..f05d7e7 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java
@@ -31,14 +31,13 @@
 import com.google.gerrit.server.permissions.PermissionBackend;
 import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.project.CommitsCollection;
-import com.google.gerrit.server.project.GetHead;
+import com.google.gerrit.server.restapi.project.CommitsCollection;
+import com.google.gerrit.server.restapi.project.GetHead;
 import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectControl;
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.gerrit.server.project.ProjectState;
-import com.google.gwtexpui.server.CacheHeaders;
+import com.google.gerrit.util.http.CacheHeaders;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
@@ -67,7 +66,6 @@
   public static final String PATH_PREFIX = "/project/";
 
   private final String pluginName;
-  private final ProjectControl.Factory projectControlFactory;
   private final ProjectCache projectCache;
   private final Provider<GetHead> getHead;
   private final GitRepositoryManager repoManager;
@@ -79,7 +77,6 @@
   @Inject
   ImageServlet(
       @PluginName String pluginName,
-      ProjectControl.Factory projectControlFactory,
       ProjectCache projectCache,
       Provider<GetHead> getHead,
       GitRepositoryManager repoManager,
@@ -88,7 +85,6 @@
       Provider<CurrentUser> self,
       PermissionBackend permissionBackend) {
     this.pluginName = pluginName;
-    this.projectControlFactory = projectControlFactory;
     this.projectCache = projectCache;
     this.getHead = getHead;
     this.repoManager = repoManager;
@@ -120,16 +116,16 @@
     }
 
     try {
-      ProjectControl projectControl = projectControlFactory.controlFor(key.project);
+      ProjectState projectState = projectCache.get(key.project);
       String rev = key.revision;
       if (rev == null || Constants.HEAD.equals(rev)) {
-        rev = getHead.get().apply(new ProjectResource(projectControl));
+        rev = getHead.get().apply(new ProjectResource(projectState, self.get()));
       } else {
         if (!ObjectId.isId(rev)) {
           if (!rev.startsWith(Constants.R_REFS)) {
             rev = Constants.R_HEADS + rev;
           }
-          PermissionBackend.ForProject perm = permissionBackend.user(self).project(key.project);
+          PermissionBackend.ForProject perm = permissionBackend.currentUser().project(key.project);
           try {
             perm.ref(rev).check(RefPermission.READ);
           } catch (AuthException e) {
@@ -203,7 +199,6 @@
         }
       }
     } catch (RepositoryNotFoundException
-        | NoSuchProjectException
         | ResourceNotFoundException
         | AuthException
         | RevisionSyntaxException
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagesCollection.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagesCollection.java
index 2edaae3..47aea1c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagesCollection.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagesCollection.java
@@ -15,7 +15,6 @@
 package com.googlesource.gerrit.plugins.imagare;
 
 import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsPost;
 import com.google.gerrit.extensions.restapi.ChildCollection;
 import com.google.gerrit.extensions.restapi.IdString;
 import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
@@ -29,7 +28,7 @@
 import com.google.inject.Provider;
 
 public class ImagesCollection
-    implements ChildCollection<ProjectResource, ImageResource>, AcceptsPost<ProjectResource> {
+    implements ChildCollection<ProjectResource, ImageResource> {
   private final DynamicMap<RestView<ImageResource>> views;
   private final Provider<PostImage> createImage;
   private final PermissionBackend permissionBackend;
@@ -53,10 +52,10 @@
   public ImageResource parse(ProjectResource parent, IdString id) throws ResourceNotFoundException {
     Branch.NameKey branchName = new Branch.NameKey(parent.getNameKey(), id.get());
     if (permissionBackend
-        .user(parent.getControl().getUser())
+        .user(parent.getUser())
         .ref(branchName)
         .testOrFalse(RefPermission.READ)) {
-      return new ImageResource(parent.getControl().controlForRef(branchName));
+      return new ImageResource(branchName);
     }
     throw new ResourceNotFoundException(id);
   }
@@ -65,9 +64,4 @@
   public DynamicMap<RestView<ImageResource>> views() {
     return views;
   }
-
-  @Override
-  public PostImage post(ProjectResource parent) throws RestApiException {
-    return createImage.get();
-  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/Module.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/Module.java
index b9ecf0a..c6aade0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/Module.java
@@ -55,6 +55,7 @@
               bind(ImagesCollection.class);
               child(PROJECT_KIND, "images").to(ImagesCollection.class);
               delete(IMAGE_KIND).to(DeleteImage.class);
+              post(PROJECT_KIND, "images").to(PostImage.class);
             }
           });
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
index f1b54d3..0a330f1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
@@ -34,10 +34,11 @@
 import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gerrit.server.project.CreateRefControl;
 import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectControl;
 import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.imagare.PostImage.Input;
 import eu.medsea.mimeutil.MimeType;
 import java.io.IOException;
@@ -56,8 +57,8 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.util.Base64;
 
+@Singleton
 public class PostImage implements RestModifyView<ProjectResource, Input> {
-
   public static class Input {
     public String imageData;
     public String fileName;
@@ -102,14 +103,14 @@
     }
     ImageInfo info;
     if (input.imageData != null) {
-      info = storeImage(rsrc.getControl(), input.imageData, input.fileName);
+      info = storeImage(rsrc.getProjectState(), input.imageData, input.fileName);
     } else {
       throw new BadRequestException("no image data");
     }
     return Response.created(info);
   }
 
-  private ImageInfo storeImage(ProjectControl pc, String imageData, String fileName)
+  private ImageInfo storeImage(ProjectState ps, String imageData, String fileName)
       throws RestApiException, IOException, PermissionBackendException, NoSuchProjectException {
     Matcher m = imageDataPattern.matcher(imageData);
     if (m.matches()) {
@@ -135,17 +136,17 @@
         if (!receivedMimeType.equals(mimeType.toString())) {
           throw new BadRequestException("incorrect mime type");
         }
-        return new ImageInfo(storeImage(pc, content, fileName));
+        return new ImageInfo(storeImage(ps, content, fileName));
       }
       throw new MethodNotAllowedException("unsupported encoding");
     }
     throw new BadRequestException("invalid image data");
   }
 
-  private String storeImage(ProjectControl pc, byte[] content, String fileName)
+  private String storeImage(ProjectState ps, byte[] content, String fileName)
       throws AuthException, IOException, ResourceConflictException, PermissionBackendException,
           NoSuchProjectException {
-    long maxSize = pc.getProjectState().getEffectiveMaxObjectSizeLimit().value;
+    long maxSize = ps.getEffectiveMaxObjectSizeLimit().value;
     // maxSize == 0 means that there is no limit
     if (maxSize > 0 && content.length > maxSize) {
       throw new ResourceConflictException("image too large");
@@ -153,11 +154,11 @@
 
     String ref = getRef(content, fileName);
 
-    try (Repository repo = repoManager.openRepository(pc.getProject().getNameKey())) {
+    try (Repository repo = repoManager.openRepository(ps.getProject().getNameKey())) {
       ObjectId commitId = repo.resolve(ref);
       if (commitId != null) {
         // this image exists already
-        return getUrl(pc.getProject().getNameKey(), ref, fileName);
+        return getUrl(ps.getProject().getNameKey(), ref, fileName);
       }
 
       try (RevWalk rw = new RevWalk(repo);
@@ -185,11 +186,11 @@
           createRefControl.checkCreateRef(
               self,
               repo,
-              new Branch.NameKey(pc.getProject().getNameKey(), ref),
+              new Branch.NameKey(ps.getProject().getNameKey(), ref),
               rw.parseCommit(commitId));
         } catch (AuthException e) {
           throw new AuthException(
-              String.format("Project %s doesn't allow image upload.", pc.getProject().getName()));
+              String.format("Project %s doesn't allow image upload.", ps.getProject().getName()));
         }
 
         RefUpdate ru = repo.updateRef(ref);
@@ -197,15 +198,15 @@
         ru.setNewObjectId(commitId);
         ru.disableRefLog();
         if (ru.update(rw) == RefUpdate.Result.NEW) {
-          referenceUpdated.fire(pc.getProject().getNameKey(), ru, self.get().getAccount());
+          referenceUpdated.fire(ps.getProject().getNameKey(), ru, self.get().state());
         } else {
           throw new IOException(
               String.format(
                   "Failed to create ref %s in %s: %s",
-                  ref, pc.getProject().getName(), ru.getResult()));
+                  ref, ps.getProject().getName(), ru.getResult()));
         }
 
-        return getUrl(pc.getProject().getNameKey(), ref, fileName);
+        return getUrl(ps.getProject().getNameKey(), ref, fileName);
       }
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/PutPreference.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/PutPreference.java
index 025475a..ffd00d4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/PutPreference.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/PutPreference.java
@@ -29,11 +29,11 @@
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.account.AccountResource;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectLevelConfig;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
 import com.google.gerrit.server.permissions.PermissionBackend;
 import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectLevelConfig;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.googlesource.gerrit.plugins.imagare.PutConfig.Input;
@@ -67,13 +67,13 @@
       throws AuthException, RepositoryNotFoundException, IOException, UnprocessableEntityException,
           PermissionBackendException {
     if (self.get() != rsrc.getUser()) {
-      permissionBackend.user(self).check(ADMINISTRATE_SERVER);
+      permissionBackend.currentUser().check(ADMINISTRATE_SERVER);
     }
     if (input == null) {
       input = new Input();
     }
 
-    String username = self.get().getUserName();
+    String username = self.get().getUserName().get();
 
     ProjectLevelConfig storage = projectCache.getAllProjects().getConfig(pluginName + ".config");
     Config db = storage.get();
