diff --git a/modules/core/src/main/java/webindex/core/IndexClient.java b/modules/core/src/main/java/webindex/core/IndexClient.java
index ec7861f..f22a346 100644
--- a/modules/core/src/main/java/webindex/core/IndexClient.java
+++ b/modules/core/src/main/java/webindex/core/IndexClient.java
@@ -14,12 +14,11 @@
 
 package webindex.core;
 
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.function.Consumer;
 
 import com.google.gson.Gson;
 import org.apache.accumulo.core.client.Connector;
@@ -248,10 +247,10 @@
     return links;
   }
 
-  public static Collection<Mutation> genDomainMutations(DomainUpdate update, long seq) {
+  public static void genDomainMutations(DomainUpdate update, long seq, Consumer<Mutation> consumer) {
     Map<RowColumn, Bytes> oldData = genDomainData(update.getDomain(), update.getOldPageCount());
     Map<RowColumn, Bytes> newData = genDomainData(update.getDomain(), update.getNewPageCount());
-    return AccumuloExporter.generateMutations(seq, oldData, newData);
+    AccumuloExporter.generateMutations(seq, oldData, newData, consumer);
   }
 
   public static Map<RowColumn, Bytes> genDomainData(String domain, Long pageCount) {
@@ -262,37 +261,33 @@
         Bytes.of(pageCount + ""));
   }
 
-  public static Collection<Mutation> genPageMutations(PageUpdate update, long seq) {
-    int listSize = update.getAddedLinks().size() + update.getDeletedLinks().size() + 1;
-    ArrayList<Mutation> mutations = new ArrayList<>(listSize);
-
+  public static void genPageMutations(PageUpdate update, long seq, Consumer<Mutation> consumer) {
     Mutation jsonMutation = new Mutation("p:" + update.getUri());
     if (update.getJson().equals(Page.DELETE_JSON)) {
       jsonMutation.putDelete(Constants.PAGE, Constants.CUR, seq);
     } else {
       jsonMutation.put(Constants.PAGE, Constants.CUR, seq, update.getJson());
     }
-    mutations.add(jsonMutation);
+    consumer.accept(jsonMutation);
 
     // invert links on export
     for (Link link : update.getAddedLinks()) {
       Mutation m = new Mutation("p:" + link.getUri());
       m.put(Constants.INLINKS, update.getUri(), seq, link.getAnchorText());
-      mutations.add(m);
+      consumer.accept(m);
     }
 
     for (Link link : update.getDeletedLinks()) {
       Mutation m = new Mutation("p:" + link.getUri());
       m.putDelete(Constants.INLINKS, update.getUri(), seq);
-      mutations.add(m);
+      consumer.accept(m);
     }
-    return mutations;
   }
 
-  public static Collection<Mutation> genUriMutations(UriUpdate update, long seq) {
+  public static void genUriMutations(UriUpdate update, long seq, Consumer<Mutation> consumer) {
     Map<RowColumn, Bytes> oldData = genUriData(update.getUri(), update.getOldInfo());
     Map<RowColumn, Bytes> newData = genUriData(update.getUri(), update.getNewInfo());
-    return AccumuloExporter.generateMutations(seq, oldData, newData);
+    AccumuloExporter.generateMutations(seq, oldData, newData, consumer);
   }
 
   public static Map<RowColumn, Bytes> genUriData(String uri, UriInfo info) {
diff --git a/modules/data/src/main/java/webindex/data/fluo/IndexExporter.java b/modules/data/src/main/java/webindex/data/fluo/IndexExporter.java
index 7e05e35..13a517d 100644
--- a/modules/data/src/main/java/webindex/data/fluo/IndexExporter.java
+++ b/modules/data/src/main/java/webindex/data/fluo/IndexExporter.java
@@ -14,7 +14,7 @@
 
 package webindex.data.fluo;
 
-import java.util.Collection;
+import java.util.function.Consumer;
 
 import org.apache.accumulo.core.data.Mutation;
 import org.apache.fluo.api.metrics.Meter;
@@ -48,22 +48,23 @@
   }
 
   @Override
-  protected Collection<Mutation> translate(SequencedExport<String, IndexUpdate> export) {
+  protected void translate(SequencedExport<String, IndexUpdate> export, Consumer<Mutation> consumer) {
     if (export.getValue() instanceof DomainUpdate) {
       domainsExported.mark();
-      return IndexClient.genDomainMutations((DomainUpdate) export.getValue(), export.getSequence());
+      IndexClient.genDomainMutations((DomainUpdate) export.getValue(), export.getSequence(),
+          consumer);
     } else if (export.getValue() instanceof PageUpdate) {
       pagesExported.mark();
-      return IndexClient.genPageMutations((PageUpdate) export.getValue(), export.getSequence());
+      IndexClient.genPageMutations((PageUpdate) export.getValue(), export.getSequence(), consumer);
     } else if (export.getValue() instanceof UriUpdate) {
       linksExported.mark();
-      return IndexClient.genUriMutations((UriUpdate) export.getValue(), export.getSequence());
+      IndexClient.genUriMutations((UriUpdate) export.getValue(), export.getSequence(), consumer);
+    } else {
+      String msg =
+          "An object with an IndexUpdate class (" + export.getValue().getClass().toString()
+              + ") was placed on the export queue";
+      log.error(msg);
+      throw new IllegalStateException(msg);
     }
-
-    String msg =
-        "An object with an IndexUpdate class (" + export.getValue().getClass().toString()
-            + ") was placed on the export queue";
-    log.error(msg);
-    throw new IllegalStateException(msg);
   }
 }
