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 cf0971c..502c1a6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocLoader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocLoader.java
@@ -33,8 +33,11 @@
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
 
+import com.googlesource.gerrit.plugins.xdocs.formatter.Formatter;
 import com.googlesource.gerrit.plugins.xdocs.formatter.Formatters;
 import com.googlesource.gerrit.plugins.xdocs.formatter.Formatters.FormatterProvider;
+import com.googlesource.gerrit.plugins.xdocs.formatter.StreamFormatter;
+import com.googlesource.gerrit.plugins.xdocs.formatter.StringFormatter;
 
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.errors.GitAPIException;
@@ -48,14 +51,19 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.treewalk.TreeWalk;
 import org.eclipse.jgit.treewalk.filter.PathFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 @Singleton
 public class XDocLoader extends CacheLoader<String, Resource> {
+  private static final Logger log = LoggerFactory.getLogger(XDocLoader.class);
+
   private static final String DEFAULT_HOST = "review.example.com";
 
   private final GitRepositoryManager repoManager;
@@ -107,21 +115,33 @@
           }
           ObjectId objectId = tw.getObjectId(0);
           ObjectLoader loader = repo.open(objectId);
-          byte[] bytes = loader.getBytes(Integer.MAX_VALUE);
-          boolean isBinary = RawText.isBinary(bytes);
-          if (formatter.getName().equals(Formatters.RAW_FORMATTER) && isBinary) {
-            return Resources.METHOD_NOT_ALLOWED;
-          }
           ObjectReader reader = repo.newObjectReader();
+          String abbrRevId = reader.abbreviate(revId).name();
           try {
-            String abbrRevId = reader.abbreviate(revId).name();
-            String raw = new String(bytes, UTF_8);
-            if (!isBinary) {
-              raw = replaceMacros(repo, key.getProject(), revId, abbrRevId, raw);
-            }
-            String html =
-                formatter.get().format(key.getProject().get(),
+            String html;
+            Formatter f = formatter.get();
+            if (f instanceof StringFormatter) {
+              byte[] bytes = loader.getBytes(Integer.MAX_VALUE);
+              boolean isBinary = RawText.isBinary(bytes);
+              if (formatter.getName().equals(Formatters.RAW_FORMATTER) && isBinary) {
+                return Resources.METHOD_NOT_ALLOWED;
+              }
+              String raw = new String(bytes, UTF_8);
+              if (!isBinary) {
+                raw = replaceMacros(repo, key.getProject(), revId, abbrRevId, raw);
+              }
+              html = ((StringFormatter) f).format(key.getProject().get(),
+                  abbrRevId, formatterCfg, raw);
+            } else if (f instanceof StreamFormatter) {
+              try (InputStream raw = loader.openStream()) {
+                html = ((StreamFormatter) f).format(key.getProject().get(),
                     abbrRevId, formatterCfg, raw);
+              }
+            } else {
+              log.error(String.format("Unsupported formatter: %s", formatter.getName()));
+              return Resource.NOT_FOUND;
+            }
+
             return getAsHtmlResource(html, commit.getCommitTime());
           } finally {
             reader.release();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/AsciidoctorFormatter.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/AsciidoctorFormatter.java
index fe57a90..200ac03 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/AsciidoctorFormatter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/AsciidoctorFormatter.java
@@ -49,7 +49,7 @@
 import java.util.Properties;
 
 @Singleton
-public class AsciidoctorFormatter implements Formatter {
+public class AsciidoctorFormatter implements StringFormatter {
   public static final String NAME = "ASCIIDOCTOR";
 
   private static final String BACKEND = "html5";
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatter.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatter.java
index c975147..d7c6549 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatter.java
@@ -16,25 +16,6 @@
 
 import com.google.gerrit.extensions.annotations.ExtensionPoint;
 
-import com.googlesource.gerrit.plugins.xdocs.ConfigSection;
-
-import java.io.IOException;
-
 @ExtensionPoint
 public interface Formatter {
-
-  /**
-   * Formats the given raw text as html.
-   *
-   * @param projectName the name of the project that contains the file to be
-   *        formatted
-   * @param revision the abbreviated revision from which the file is loaded
-   * @param cfg the global configuration for this formatter
-   * @param raw the raw text
-   * @return the given text formatted as html
-   * @throws IOException thrown if the formatting fails
-   */
-  public String format(String projectName, String revision, ConfigSection cfg,
-      String raw)
-      throws IOException;
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatters.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatters.java
index 4e3c359..95e412e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatters.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatters.java
@@ -201,10 +201,9 @@
 
   public static class FormatterProvider {
     private final String name;
-    private final Provider<Formatter> formatter;
+    private final Provider<? extends Formatter> formatter;
 
-    FormatterProvider(String name,
-        Provider<Formatter> formatter) {
+    FormatterProvider(String name, Provider<? extends Formatter> formatter) {
       this.name = name;
       this.formatter = formatter;
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/MarkdownFormatter.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/MarkdownFormatter.java
index f4aa3a8..d4150ea 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/MarkdownFormatter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/MarkdownFormatter.java
@@ -25,7 +25,7 @@
 
 import java.io.IOException;
 
-public class MarkdownFormatter implements Formatter {
+public class MarkdownFormatter implements StringFormatter {
   public final static String NAME = "MARKDOWN";
 
   private final FormatterUtil util;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/PlainTextFormatter.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/PlainTextFormatter.java
index 0c79bd5..6e36bba 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/PlainTextFormatter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/PlainTextFormatter.java
@@ -18,7 +18,7 @@
 
 import com.googlesource.gerrit.plugins.xdocs.ConfigSection;
 
-public class PlainTextFormatter implements Formatter {
+public class PlainTextFormatter implements StringFormatter {
   public final static String NAME = "PLAIN_TEXT";
 
   @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/StreamFormatter.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/StreamFormatter.java
new file mode 100644
index 0000000..c435b23
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/StreamFormatter.java
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 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.xdocs.formatter;
+
+import com.googlesource.gerrit.plugins.xdocs.ConfigSection;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public interface StreamFormatter extends Formatter {
+  /**
+   * Formats the given raw text as html.
+   *
+   * @param projectName the name of the project that contains the file to be
+   *        formatted
+   * @param revision the abbreviated revision from which the file is loaded
+   * @param cfg the global configuration for this formatter
+   * @param raw the raw stream
+   * @return the content from the given stream formatted as html
+   * @throws IOException thrown if the formatting fails
+   */
+  public String format(String projectName, String revision, ConfigSection cfg,
+      InputStream raw) throws IOException;
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/StringFormatter.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/StringFormatter.java
new file mode 100644
index 0000000..952794c
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/StringFormatter.java
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 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.xdocs.formatter;
+
+import com.googlesource.gerrit.plugins.xdocs.ConfigSection;
+
+import java.io.IOException;
+
+public interface StringFormatter extends Formatter {
+
+  /**
+   * Formats the given raw text as html.
+   *
+   * @param projectName the name of the project that contains the file to be
+   *        formatted
+   * @param revision the abbreviated revision from which the file is loaded
+   * @param cfg the global configuration for this formatter
+   * @param raw the raw text
+   * @return the given text formatted as html
+   * @throws IOException thrown if the formatting fails
+   */
+  public String format(String projectName, String revision, ConfigSection cfg,
+      String raw) throws IOException;
+}
