diff --git a/payload_consumer/vabc_partition_writer.cc b/payload_consumer/vabc_partition_writer.cc
index 2016af7..92f27a9 100644
--- a/payload_consumer/vabc_partition_writer.cc
+++ b/payload_consumer/vabc_partition_writer.cc
@@ -95,6 +95,8 @@
     }
     copy_blocks_.AddExtent(cow_op.dst_extent());
   }
+  LOG(INFO) << "Partition `" << partition_update.partition_name() << " has "
+            << copy_blocks_.blocks() << " copy blocks";
 }
 
 bool VABCPartitionWriter::DoesDeviceSupportsXor() {
@@ -273,11 +275,6 @@
   // we still want to verify that all blocks contain expected data.
   auto source_fd = verified_source_fd_.ChooseSourceFD(operation, error);
   TEST_AND_RETURN_FALSE(source_fd != nullptr);
-  // For devices not supporting XOR, sequence op is not supported, so all COPY
-  // operations are written up front in strict merge order.
-  if (!DoesDeviceSupportsXor()) {
-    return true;
-  }
   std::vector<CowOperation> converted;
 
   const auto& src_extents = operation.src_extents();
@@ -286,6 +283,9 @@
   BlockIterator it2{dst_extents};
   const bool userSnapshots = android::base::GetBoolProperty(
       "ro.virtual_ab.userspace.snapshots.enabled", false);
+  // For devices not supporting XOR, sequence op is not supported, so all COPY
+  // operations are written up front in strict merge order.
+  const auto sequence_op_supported = DoesDeviceSupportsXor();
   while (!it1.is_end() && !it2.is_end()) {
     const auto src_block = *it1;
     const auto dst_block = *it2;
@@ -295,7 +295,9 @@
       continue;
     }
     if (copy_blocks_.ContainsBlock(dst_block)) {
-      push_back(&converted, {CowOperation::CowCopy, src_block, dst_block, 1});
+      if (sequence_op_supported) {
+        push_back(&converted, {CowOperation::CowCopy, src_block, dst_block, 1});
+      }
     } else {
       push_back(&converted,
                 {CowOperation::CowReplace, src_block, dst_block, 1});
diff --git a/payload_consumer/vabc_partition_writer_unittest.cc b/payload_consumer/vabc_partition_writer_unittest.cc
index b053bbf..3cdf3bc 100644
--- a/payload_consumer/vabc_partition_writer_unittest.cc
+++ b/payload_consumer/vabc_partition_writer_unittest.cc
@@ -151,7 +151,21 @@
   if (xor_enabled) {
     ON_CALL(dynamic_control_, GetVirtualAbCompressionXorFeatureFlag())
         .WillByDefault(Return(FeatureFlag(FeatureFlag::Value::LAUNCH)));
+  } else {
+    ON_CALL(dynamic_control_, GetVirtualAbCompressionXorFeatureFlag())
+        .WillByDefault(Return(FeatureFlag(FeatureFlag::Value::NONE)));
   }
+  InstallOperation& install_op = *partition_update_.add_operations();
+  install_op.set_type(InstallOperation::SOURCE_COPY);
+  *install_op.add_src_extents() = ExtentForRange(5, 1);
+  *install_op.add_src_extents() = ExtentForRange(10, 1);
+  *install_op.add_src_extents() = ExtentForRange(15, 2);
+  *install_op.add_src_extents() = ExtentForRange(20, 2);
+
+  *install_op.add_dst_extents() = ExtentForRange(10, 1);
+  *install_op.add_dst_extents() = ExtentForRange(15, 1);
+  *install_op.add_dst_extents() = ExtentForRange(20, 2);
+  *install_op.add_dst_extents() = ExtentForRange(25, 2);
   AddMergeOp(&partition_update_, {5, 1}, {10, 1}, CowMergeOperation::COW_COPY);
   AddMergeOp(&partition_update_, {10, 1}, {15, 1}, CowMergeOperation::COW_COPY);
   AddMergeOp(&partition_update_, {15, 2}, {20, 2}, CowMergeOperation::COW_COPY);
@@ -178,6 +192,8 @@
           EXPECT_CALL(*cow_writer, EmitCopy(20, 15, 2));
 
           EXPECT_CALL(*cow_writer, EmitCopy(25, 20, 1));
+          EXPECT_CALL(*cow_writer, EmitRawBlocks(26, _, 4096))
+              .WillOnce(Return(true));
           EXPECT_CALL(*cow_writer, Finalize());
         } else {
           Sequence s;
@@ -187,24 +203,13 @@
           EXPECT_CALL(*cow_writer, EmitCopy(20, 15, 2)).InSequence(s);
 
           EXPECT_CALL(*cow_writer, EmitCopy(25, 20, 1)).InSequence(s);
+          EXPECT_CALL(*cow_writer, EmitRawBlocks(26, _, 4096))
+              .InSequence(s)
+              .WillOnce(Return(true));
         }
         return cow_writer;
       }));
   ASSERT_TRUE(writer_.Init(&install_plan_, true, 0));
-  if (!xor_enabled) {
-    return;
-  }
-  InstallOperation install_op;
-  install_op.set_type(InstallOperation::SOURCE_COPY);
-  *install_op.add_src_extents() = ExtentForRange(5, 1);
-  *install_op.add_src_extents() = ExtentForRange(10, 1);
-  *install_op.add_src_extents() = ExtentForRange(15, 2);
-  *install_op.add_src_extents() = ExtentForRange(20, 1);
-
-  *install_op.add_dst_extents() = ExtentForRange(10, 1);
-  *install_op.add_dst_extents() = ExtentForRange(15, 1);
-  *install_op.add_dst_extents() = ExtentForRange(20, 2);
-  *install_op.add_dst_extents() = ExtentForRange(25, 1);
   ErrorCode error{};
   ASSERT_TRUE(writer_.PerformSourceCopyOperation(install_op, &error));
 }
