diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocLoader.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocLoader.java
index 5b05218..c4036d0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocLoader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocLoader.java
@@ -109,38 +109,30 @@
   @Override
   public Resource load(String strKey) throws Exception {
     XDocResourceKey key = XDocResourceKey.fromString(strKey);
-    try {
+    try (Repository repo = repoManager.openRepository(key.getProject())) {
       FormatterProvider formatter = getFormatter(key.getFormatter());
-      Repository repo = repoManager.openRepository(key.getProject());
-      try {
-        RevWalk rw = new RevWalk(repo);
-        try {
-          String html = null;
-          if (key.getRevId() != null) {
-            html = loadHtml(formatter, repo, rw, key, key.getRevId());
-          }
-
-          if (key.getDiffMode() != DiffMode.NO_DIFF) {
-            String htmlB =
-                loadHtml(formatter, repo, rw, key, checkRevId(key.getRevIdB()));
-            if (html == null && htmlB == null) {
-              throw new ResourceNotFoundException();
-            }
-            html = diffHtml(html, htmlB, key.getDiffMode());
-          } else {
-            if (html == null) {
-              throw new ResourceNotFoundException();
-            }
-          }
-
-          RevCommit commit = rw.parseCommit(
-              MoreObjects.firstNonNull(key.getRevIdB(), key.getRevId()));
-          return getAsHtmlResource(html, commit.getCommitTime());
-        } finally {
-          rw.release();
+      try (RevWalk rw = new RevWalk(repo)) {
+        String html = null;
+        if (key.getRevId() != null) {
+          html = loadHtml(formatter, repo, rw, key, key.getRevId());
         }
-      } finally {
-        repo.close();
+
+        if (key.getDiffMode() != DiffMode.NO_DIFF) {
+          String htmlB =
+              loadHtml(formatter, repo, rw, key, checkRevId(key.getRevIdB()));
+          if (html == null && htmlB == null) {
+            throw new ResourceNotFoundException();
+          }
+          html = diffHtml(html, htmlB, key.getDiffMode());
+        } else {
+          if (html == null) {
+            throw new ResourceNotFoundException();
+          }
+        }
+
+        RevCommit commit = rw.parseCommit(
+            MoreObjects.firstNonNull(key.getRevIdB(), key.getRevId()));
+        return getAsHtmlResource(html, commit.getCommitTime());
       }
     } catch (ResourceNotFoundException e) {
       return Resource.NOT_FOUND;
@@ -171,8 +163,7 @@
       ResourceNotFoundException, MethodNotAllowedException, GitAPIException {
     RevCommit commit = rw.parseCommit(revId);
     RevTree tree = commit.getTree();
-    TreeWalk tw = new TreeWalk(repo);
-    try {
+    try (TreeWalk tw = new TreeWalk(repo)) {
       tw.addTree(tree);
       tw.setRecursive(true);
       tw.setFilter(PathFilter.create(key.getResource()));
@@ -183,8 +174,6 @@
       ObjectLoader loader = repo.open(objectId);
       return getHtml(formatter, repo, loader, key.getProject(),
           key.getResource(), revId);
-    } finally {
-      tw.release();
     }
   }
 
@@ -314,11 +303,8 @@
 
   private static String getAbbrRevId(Repository repo, ObjectId revId)
       throws IOException {
-    ObjectReader reader = repo.newObjectReader();
-    try {
+    try (ObjectReader reader = repo.newObjectReader()) {
       return reader.abbreviate(revId).name();
-    } finally {
-      reader.release();
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
index 3863da9..f62389b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
@@ -198,12 +198,10 @@
     ObjectId id = diffMode == DiffMode.NO_DIFF || diffMode == DiffMode.SIDEBYSIDE_A
         ? revId
         : revIdB;
-    RevWalk rw = new RevWalk(repo);
-    try {
+    try (RevWalk rw = new RevWalk(repo)) {
       RevCommit commit = rw.parseCommit(id);
       RevTree tree = commit.getTree();
-      TreeWalk tw = new TreeWalk(repo);
-      try {
+      try (TreeWalk tw = new TreeWalk(repo)) {
         tw.addTree(tree);
         tw.setRecursive(true);
         tw.setFilter(PathFilter.create(file));
@@ -222,13 +220,9 @@
             .setContentType(mimeType.toString())
             .setCharacterEncoding(UTF_8.name())
             .setLastModified(commit.getCommitTime());
-      } finally {
-        tw.release();
       }
     } catch (IOException e) {
       return Resource.NOT_FOUND;
-    } finally {
-      rw.release();
     }
   }
 
@@ -329,14 +323,11 @@
   private void validateCanReadCommit(Repository repo,
       ProjectControl projectControl, ObjectId revId)
       throws ResourceNotFoundException, IOException {
-    RevWalk rw = new RevWalk(repo);
-    try {
+    try (RevWalk rw = new RevWalk(repo)) {
       RevCommit commit = rw.parseCommit(revId);
       if (!projectControl.canReadCommit(db.get(), rw, commit)) {
         throw new ResourceNotFoundException();
       }
-    } finally {
-      rw.release();
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/FormatterUtil.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/FormatterUtil.java
index 514a51b..4e2993b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/FormatterUtil.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/FormatterUtil.java
@@ -304,38 +304,27 @@
    * @return the file content, <code>null</code> if the file doesn't exist
    */
   public String getMetaConfigFile(String projectName, String fileName) {
-    try {
-      Repository repo =
-          repoManager.openRepository(new Project.NameKey(projectName));
-      try {
-        RevWalk rw = new RevWalk(repo);
-        try {
-          ObjectId id = repo.resolve(RefNames.REFS_CONFIG);
-          if (id == null) {
+    try (Repository repo = repoManager.openRepository(
+        new Project.NameKey(projectName))) {
+      try (RevWalk rw = new RevWalk(repo)) {
+        ObjectId id = repo.resolve(RefNames.REFS_CONFIG);
+        if (id == null) {
+          return null;
+        }
+        RevCommit commit = rw.parseCommit(id);
+        RevTree tree = commit.getTree();
+        try (TreeWalk tw = new TreeWalk(repo)) {
+          tw.addTree(tree);
+          tw.setRecursive(true);
+          tw.setFilter(PathFilter.create(pluginName + "/" + fileName));
+          if (!tw.next()) {
             return null;
           }
-          RevCommit commit = rw.parseCommit(id);
-          RevTree tree = commit.getTree();
-          TreeWalk tw = new TreeWalk(repo);
-          try {
-            tw.addTree(tree);
-            tw.setRecursive(true);
-            tw.setFilter(PathFilter.create(pluginName + "/" + fileName));
-            if (!tw.next()) {
-              return null;
-            }
-            ObjectId objectId = tw.getObjectId(0);
-            ObjectLoader loader = repo.open(objectId);
-            byte[] raw = loader.getBytes(Integer.MAX_VALUE);
-            return new String(raw, UTF_8);
-          } finally {
-            tw.release();
-          }
-        } finally {
-          rw.release();
+          ObjectId objectId = tw.getObjectId(0);
+          ObjectLoader loader = repo.open(objectId);
+          byte[] raw = loader.getBytes(Integer.MAX_VALUE);
+          return new String(raw, UTF_8);
         }
-      } finally {
-        repo.close();
       }
     } catch (IOException e) {
       return null;
