diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackCompactor.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackCompactor.java
index 722c7ec..fbe641e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackCompactor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackCompactor.java
@@ -20,11 +20,11 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 import org.eclipse.jgit.annotations.Nullable;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
@@ -64,11 +64,8 @@
  */
 public class DfsPackCompactor {
 	private final DfsRepository repo;
-
-	private final List<DfsPackDescription> inputDescsPacks;
-
-	private final List<DfsPackDescription> inputDescsReftables;
-
+	private final List<DfsPackFile> srcPacks;
+	private final List<DfsReftable> srcReftables;
 	private final List<ObjectIdSet> exclude;
 
 	private final List<DfsPackDescription> prune;
@@ -146,8 +143,8 @@ public DfsPackCompactor setPreCommitHook(PreCommitHook hook) {
 	 */
 	public DfsPackCompactor(DfsRepository repository) {
 		repo = repository;
-		inputDescsPacks = new ArrayList<>();
-		inputDescsReftables = new ArrayList<>();
+		srcPacks = new ArrayList<>();
+		srcReftables = new ArrayList<>();
 		exclude = new ArrayList<>(4);
 		prune = new ArrayList<>();
 	}
@@ -178,7 +175,8 @@ public DfsPackCompactor setReftableConfig(ReftableConfig cfg) {
 	 * @return {@code this}
 	 */
 	public DfsPackCompactor add(DfsPackFile pack) {
-		return addPack(pack.getPackDescription());
+		srcPacks.add(pack);
+		return this;
 	}
 
 	/**
@@ -189,54 +187,7 @@ public DfsPackCompactor add(DfsPackFile pack) {
 	 * @return {@code this}
 	 */
 	public DfsPackCompactor add(DfsReftable table) {
-		return addReftable(table.getPackDescription());
-	}
-
-	/**
-	 * Add a pack to be compacted
-	 * <p>
-	 * This adds the objects in the pack to the compaction. If the description
-	 * has reftables, they are ignored. Caller must explicitely call
-	 * {@link #addReftable(DfsPackDescription)} with the same description to
-	 * include them.
-	 * <p>
-	 * This method creates DfsPackFile instances when needed and can close them
-	 * as soon as is done with them. This reduces the peak memory while
-	 * processing many files.
-	 *
-	 * @param desc
-	 *            a pack description to combine.
-	 * @return {@code this}
-	 * @since 7.7
-	 */
-	public DfsPackCompactor addPack(DfsPackDescription desc) {
-		if (!desc.hasFileExt(PACK)) {
-			throw new IllegalArgumentException(
-					"Adding for pack compaction a pack without data");
-		}
-		inputDescsPacks.add(desc);
-		return this;
-	}
-
-	/**
-	 * Add a reftable to be compacted.
-	 * <p>
-	 * This adds the reftables in the pack to the compaction. If the description
-	 * has pack data (objects), they are ignored. Caller must explicitely call
-	 * {@link #addPack(DfsPackDescription)} with the same description to include
-	 * them.
-	 *
-	 * @param desc
-	 *            a pack description to combine.
-	 * @return {@code this}
-	 * @since 7.7
-	 */
-	public DfsPackCompactor addReftable(DfsPackDescription desc) {
-		if (!desc.hasFileExt(REFTABLE)) {
-			throw new IllegalArgumentException(
-					"Adding for reftable compaction a pack without reftables");
-		}
-		inputDescsReftables.add(desc);
+		srcReftables.add(table);
 		return this;
 	}
 
@@ -297,7 +248,7 @@ public void compact(ProgressMonitor pm) throws IOException {
 
 		DfsObjDatabase objdb = repo.getObjectDatabase();
 		try (DfsReader ctx = objdb.newReader()) {
-			if (reftableConfig != null && !inputDescsReftables.isEmpty()) {
+			if (reftableConfig != null && !srcReftables.isEmpty()) {
 				compactReftables(ctx);
 			}
 			compactPacks(ctx, pm);
@@ -362,24 +313,18 @@ private long estimatePackSize() {
 		// Include the final pack file header and trailer size here and ignore
 		// the same from individual pack files.
 		long size = 32;
-		for (DfsPackDescription desc : inputDescsPacks) {
-			if (desc.hasFileExt(PACK)) {
-				size += desc.getFileSize(PACK) - 32;
-			}
+		for (DfsPackFile pack : srcPacks) {
+			size += pack.getPackDescription().getFileSize(PACK) - 32;
 		}
 		return size;
 	}
 
 	private void compactReftables(DfsReader ctx) throws IOException {
 		DfsObjDatabase objdb = repo.getObjectDatabase();
-		Collections.sort(inputDescsReftables,
-				DfsPackDescription.reftableComparator());
-		List<DfsReftable> tables = inputDescsReftables.stream()
-				.map(desc -> new DfsReftable(DfsBlockCache.getInstance(), desc))
-				.collect(Collectors.toList());
+		Collections.sort(srcReftables, objdb.reftableComparator());
 
 		initOutDesc(objdb);
-		try (DfsReftableStack stack = DfsReftableStack.open(ctx, tables);
+		try (DfsReftableStack stack = DfsReftableStack.open(ctx, srcReftables);
 		     DfsOutputStream out = objdb.writeFile(outDesc, REFTABLE)) {
 			ReftableCompactor compact = new ReftableCompactor(out);
 			compact.addAll(stack.readers());
@@ -403,11 +348,14 @@ private void initOutDesc(DfsObjDatabase objdb) throws IOException {
 	 * @return all of the source packs that fed into this compaction.
 	 */
 	public Collection<DfsPackDescription> getSourcePacks() {
-		HashSet<DfsPackDescription> all = new HashSet<>(
-				inputDescsPacks.size() + inputDescsReftables.size());
-		all.addAll(inputDescsPacks);
-		all.addAll(inputDescsReftables);
-		return all;
+		Set<DfsPackDescription> src = new HashSet<>();
+		for (DfsPackFile pack : srcPacks) {
+			src.add(pack.getPackDescription());
+		}
+		for (DfsReftable table : srcReftables) {
+			src.add(table.getPackDescription());
+		}
+		return src;
 	}
 
 	/**
@@ -435,8 +383,15 @@ public List<PackStatistics> getNewPackStatistics() {
 	}
 
 	private Set<DfsPackDescription> toPrune() {
-		Set<DfsPackDescription> packs = new HashSet<>(inputDescsPacks);
-		Set<DfsPackDescription> reftables = new HashSet<>(inputDescsReftables);
+		Set<DfsPackDescription> packs = new HashSet<>();
+		for (DfsPackFile pack : srcPacks) {
+			packs.add(pack.getPackDescription());
+		}
+
+		Set<DfsPackDescription> reftables = new HashSet<>();
+		for (DfsReftable table : srcReftables) {
+			reftables.add(table.getPackDescription());
+		}
 
 		for (Iterator<DfsPackDescription> i = packs.iterator(); i.hasNext();) {
 			DfsPackDescription d = i.next();
@@ -463,20 +418,49 @@ private Set<DfsPackDescription> toPrune() {
 	private void addObjectsToPack(PackWriter pw, DfsReader ctx,
 			ProgressMonitor pm) throws IOException,
 			IncorrectObjectTypeException {
+		// Sort packs by description ordering, this places newer packs before
+		// older packs, allowing the PackWriter to be handed newer objects
+		// first and older objects last.
+		Collections.sort(
+				srcPacks,
+				Comparator.comparing(
+						DfsPackFile::getPackDescription,
+						DfsPackDescription.objectLookupComparator()));
+
 		rw = new RevWalk(ctx);
 		added = rw.newFlag("ADDED"); //$NON-NLS-1$
 		isBase = rw.newFlag("IS_BASE"); //$NON-NLS-1$
 		List<RevObject> baseObjects = new BlockList<>();
 
 		pm.beginTask(JGitText.get().countingObjects, ProgressMonitor.UNKNOWN);
+		for (DfsPackFile src : srcPacks) {
+			List<ObjectIdWithOffset> want = toInclude(src, ctx);
+			if (want.isEmpty())
+				continue;
 
-		inputDescsPacks.sort(DfsPackDescription.objectLookupComparator());
-		for (DfsPackDescription desc : inputDescsPacks) {
-			DfsPackFile src = repo.getObjectDatabase()
-					.createDfsPackFile(DfsBlockCache.getInstance(), desc);
-			addObjectFromPack(pw, ctx, pm, src, baseObjects);
+			PackReverseIndex rev = src.getReverseIdx(ctx);
+			DfsObjectRepresentation rep = new DfsObjectRepresentation(src);
+			for (ObjectIdWithOffset id : want) {
+				int type = src.getObjectType(ctx, id.offset);
+				RevObject obj = rw.lookupAny(id, type);
+				if (obj.has(added))
+					continue;
+
+				pm.update(1);
+				pw.addObject(obj);
+				obj.add(added);
+
+				src.fillRepresentation(rep, id.offset, ctx, rev);
+				if (rep.getFormat() != PACK_DELTA)
+					continue;
+
+				RevObject base = rw.lookupAny(rep.getDeltaBase(), type);
+				if (!base.has(added) && !base.has(isBase)) {
+					baseObjects.add(base);
+					base.add(isBase);
+				}
+			}
 		}
-
 		for (RevObject obj : baseObjects) {
 			if (!obj.has(added)) {
 				pm.update(1);
@@ -487,37 +471,6 @@ private void addObjectsToPack(PackWriter pw, DfsReader ctx,
 		pm.endTask();
 	}
 
-	private void addObjectFromPack(PackWriter pw, DfsReader ctx,
-			ProgressMonitor pm, DfsPackFile src, List<RevObject> baseObjects)
-			throws IOException {
-		List<ObjectIdWithOffset> want = toInclude(src, ctx);
-		if (want.isEmpty())
-			return;
-
-		PackReverseIndex rev = src.getReverseIdx(ctx);
-		DfsObjectRepresentation rep = new DfsObjectRepresentation(src);
-		for (ObjectIdWithOffset id : want) {
-			int type = src.getObjectType(ctx, id.offset);
-			RevObject obj = rw.lookupAny(id, type);
-			if (obj.has(added))
-				continue;
-
-			pm.update(1);
-			pw.addObject(obj);
-			obj.add(added);
-
-			src.fillRepresentation(rep, id.offset, ctx, rev);
-			if (rep.getFormat() != PACK_DELTA)
-				continue;
-
-			RevObject base = rw.lookupAny(rep.getDeltaBase(), type);
-			if (!base.has(added) && !base.has(isBase)) {
-				baseObjects.add(base);
-				base.add(isBase);
-			}
-		}
-	}
-
 	private List<ObjectIdWithOffset> toInclude(DfsPackFile src, DfsReader ctx)
 			throws IOException {
 		PackIndex srcIdx = src.getPackIndex(ctx);
