diff --git a/2022/README.md b/2022/README.md
index 2398981145cea24518a7a15f1119aecb6d200520..214ea265648d75081dc354b27db91e075d228644 100644
--- a/2022/README.md
+++ b/2022/README.md
@@ -150,8 +150,15 @@ Why do I have the feeling that there'll be some version of
 
 ### Part 2
 
+The difference here is how we move multiple crates from one stack to another.
+
 ### Refactoring opportunity
 
+With the difference between the two problems occurring inside a nested loop, extracting the commonality into a helper
+method (more than I've already done) isn't going to work. Passing in a pointer function would do nicely, but doing the
+Java equivalent is a PITA for such a small payoff. I think I'll use a boolean to indicate which of two crate movement
+techniques should be used.
+
 ## Day 6
 
 (coming soon)
diff --git a/2022/src/main/java/edu/unl/cse/bohn/year2022/Day5.java b/2022/src/main/java/edu/unl/cse/bohn/year2022/Day5.java
index dfa5b323da06bd2d413062861fae78c2fae76f61..7fcadf17f0ed4970304832665a1a0b8840ea3f03 100644
--- a/2022/src/main/java/edu/unl/cse/bohn/year2022/Day5.java
+++ b/2022/src/main/java/edu/unl/cse/bohn/year2022/Day5.java
@@ -27,7 +27,7 @@ public class Day5 extends Puzzle {
     @Override
     public long computePart1(List<String> data) {
         List<Stack<Character>> stacks = createStacks(data);
-        rearrangeCrates(stacks, data);
+        rearrangeCrates(stacks, data, true);
         String topsOfStacks = getTopsOfStacks(stacks);
         System.out.println("Crates at the top of the stacks: " + topsOfStacks);
         return 0;
@@ -35,6 +35,10 @@ public class Day5 extends Puzzle {
 
     @Override
     public long computePart2(List<String> data) {
+        List<Stack<Character>> stacks = createStacks(data);
+        rearrangeCrates(stacks, data, false);
+        String topsOfStacks = getTopsOfStacks(stacks);
+        System.out.println("Crates at the top of the stacks: " + topsOfStacks);
         return 0;
     }
 
@@ -64,16 +68,28 @@ public class Day5 extends Puzzle {
         return Collections.unmodifiableList(stacks);
     }
 
-    private void rearrangeCrates(List<Stack<Character>> stacks, List<String> data) {
+    private void rearrangeCrates(List<Stack<Character>> stacks, List<String> data, boolean moveOneCrateAtATime) {
+        Stack<Character> crane = new Stack<>();
         for (String instruction : data) {
             if (instruction.startsWith("move")) {   // then it really is an instruction
                 String[] tokens = instruction.strip().split(" ");
                 int numberOfCratesToMove = Integer.parseInt(tokens[1]);
-                for (int i = 0; i < numberOfCratesToMove; i++) {
-                    int source = Integer.parseInt(tokens[3]) - 1;       // -1 because the original stacks were 1-indexed
-                    int destination = Integer.parseInt(tokens[5]) - 1;
-                    char crate = stacks.get(source).pop();
-                    stacks.get(destination).push(crate);
+                int source = Integer.parseInt(tokens[3]) - 1;       // -1 because the original stacks were 1-indexed
+                int destination = Integer.parseInt(tokens[5]) - 1;
+                if (moveOneCrateAtATime) {
+                    for (int i = 0; i < numberOfCratesToMove; i++) {
+                        char crate = stacks.get(source).pop();
+                        stacks.get(destination).push(crate);
+                    }
+                } else {
+                    for (int i = 0; i < numberOfCratesToMove; i++) {
+                        char crate = stacks.get(source).pop();
+                        crane.push(crate);
+                    }
+                    while (!crane.empty()) {
+                        char crate = crane.pop();
+                        stacks.get(destination).push(crate);
+                    }
                 }
             }
         }