diff --git a/delta_performer.cc b/delta_performer.cc
index e6441fe..0544e12 100644
--- a/delta_performer.cc
+++ b/delta_performer.cc
@@ -486,7 +486,6 @@
   return kMetadataParseSuccess;
 }
 
-
 // Wrapper around write. Returns true if all requested bytes
 // were written, or false on any error, regardless of progress
 // and stores an action exit code in |error|.
@@ -734,16 +733,12 @@
     ssize_t bytes_read_this_iteration = 0;
     const Extent& extent = operation.src_extents(i);
     const size_t bytes = extent.num_blocks() * block_size_;
-    if (extent.start_block() == kSparseHole) {
-      bytes_read_this_iteration = bytes;
-      memset(&buf[bytes_read], 0, bytes);
-    } else {
-      TEST_AND_RETURN_FALSE(utils::PReadAll(fd,
-                                            &buf[bytes_read],
-                                            bytes,
-                                            extent.start_block() * block_size_,
-                                            &bytes_read_this_iteration));
-    }
+    TEST_AND_RETURN_FALSE(extent.start_block() != kSparseHole);
+    TEST_AND_RETURN_FALSE(utils::PReadAll(fd,
+                                          &buf[bytes_read],
+                                          bytes,
+                                          extent.start_block() * block_size_,
+                                          &bytes_read_this_iteration));
     TEST_AND_RETURN_FALSE(
         bytes_read_this_iteration == static_cast<ssize_t>(bytes));
     bytes_read += bytes_read_this_iteration;
@@ -762,18 +757,11 @@
   for (int i = 0; i < operation.dst_extents_size(); i++) {
     const Extent& extent = operation.dst_extents(i);
     const size_t bytes = extent.num_blocks() * block_size_;
-    if (extent.start_block() == kSparseHole) {
-      DCHECK(buf.begin() + bytes_written ==
-             std::search_n(buf.begin() + bytes_written,
-                           buf.begin() + bytes_written + bytes,
-                           bytes, 0));
-    } else {
-      TEST_AND_RETURN_FALSE(
-          utils::PWriteAll(fd,
-                           &buf[bytes_written],
-                           bytes,
-                           extent.start_block() * block_size_));
-    }
+    TEST_AND_RETURN_FALSE(extent.start_block() != kSparseHole);
+    TEST_AND_RETURN_FALSE(utils::PWriteAll(fd,
+                                           &buf[bytes_written],
+                                           bytes,
+                                           extent.start_block() * block_size_));
     bytes_written += bytes;
   }
   DCHECK_EQ(bytes_written, bytes_read);
@@ -790,13 +778,9 @@
   uint64_t length = 0;
   for (int i = 0; i < extents.size(); i++) {
     Extent extent = extents.Get(i);
-    int64_t start = extent.start_block();
+    int64_t start = extent.start_block() * block_size;
     uint64_t this_length = min(full_length - length,
                                extent.num_blocks() * block_size);
-    if (start == static_cast<int64_t>(kSparseHole))
-      start = -1;
-    else
-      start *= block_size;
     ret += base::StringPrintf("%" PRIi64 ":%" PRIu64 ",", start, this_length);
     length += this_length;
   }
diff --git a/delta_performer_unittest.cc b/delta_performer_unittest.cc
index e0bd95d..2b0bc45 100644
--- a/delta_performer_unittest.cc
+++ b/delta_performer_unittest.cc
@@ -1029,10 +1029,10 @@
 }
 
 TEST(DeltaPerformerTest, ExtentsToByteStringTest) {
-  uint64_t test[] = {1, 1, 4, 2, kSparseHole, 1, 0, 1};
+  uint64_t test[] = {1, 1, 4, 2, 0, 1};
   COMPILE_ASSERT(arraysize(test) % 2 == 0, array_size_uneven);
   const uint64_t block_size = 4096;
-  const uint64_t file_length = 5 * block_size - 13;
+  const uint64_t file_length = 4 * block_size - 13;
 
   google::protobuf::RepeatedPtrField<Extent> extents;
   for (size_t i = 0; i < arraysize(test); i += 2) {
@@ -1041,7 +1041,7 @@
     extent->set_num_blocks(test[i + 1]);
   }
 
-  string expected_output = "4096:4096,16384:8192,-1:4096,0:4083";
+  string expected_output = "4096:4096,16384:8192,0:4083";
   string actual_output;
   EXPECT_TRUE(DeltaPerformer::ExtentsToBsdiffPositionsString(extents,
                                                              block_size,
diff --git a/payload_generator/delta_diff_generator.cc b/payload_generator/delta_diff_generator.cc
index 725442a..70e680e 100644
--- a/payload_generator/delta_diff_generator.cc
+++ b/payload_generator/delta_diff_generator.cc
@@ -93,6 +93,10 @@
 
 namespace {
 
+bool IsSparseHole(const Extent &extent) {
+  return (extent.start_block() == kSparseHole);
+}
+
 // Stores all the extents of |path| into |extents|. Returns true on success.
 bool GatherExtents(const string& path,
                    off_t chunk_offset,
@@ -100,8 +104,7 @@
                    vector<Extent>* extents) {
   extents->clear();
   TEST_AND_RETURN_FALSE(
-      get_extents_with_chunk_func(
-          path, chunk_offset, chunk_size, extents));
+      get_extents_with_chunk_func(path, chunk_offset, chunk_size, extents));
   return true;
 }
 
@@ -299,6 +302,8 @@
 
 bool DeltaDiffGenerator::DeltaReadFiles(Graph* graph,
                                         vector<Block>* blocks,
+                                        const string& old_part,
+                                        const string& new_part,
                                         const string& old_root,
                                         const string& new_root,
                                         off_t chunk_size,
@@ -353,6 +358,8 @@
           graph,
           Vertex::kInvalidIndex,
           blocks,
+          old_part,
+          new_part,
           (should_diff_from_source ? old_root : kEmptyPath),
           new_root,
           fs_iter.GetPartialPath(),
@@ -369,6 +376,8 @@
 bool DeltaDiffGenerator::DeltaReadFile(Graph* graph,
                                        Vertex::Index existing_vertex,
                                        vector<Block>* blocks,
+                                       const string& old_part,
+                                       const string& new_part,
                                        const string& old_root,
                                        const string& new_root,
                                        const string& path,  // within new_root
@@ -380,9 +389,6 @@
   chromeos::Blob data;
   DeltaArchiveManifest_InstallOperation operation;
 
-  string old_path = (old_root == kEmptyPath) ? kEmptyPath :
-      old_root + path;
-
   // If bsdiff breaks again, blacklist the problem file by using:
   //   bsdiff_allowed = (path != "/foo/bar")
   //
@@ -395,15 +401,19 @@
   if (!bsdiff_allowed)
     LOG(INFO) << "bsdiff blacklisting: " << path;
 
-  TEST_AND_RETURN_FALSE(DeltaDiffGenerator::ReadFileToDiff(old_path,
-                                                           new_root + path,
+  string old_filename = (old_root == kEmptyPath) ? kEmptyPath : old_root + path;
+
+  TEST_AND_RETURN_FALSE(DeltaDiffGenerator::ReadFileToDiff(old_part,
+                                                           new_part,
                                                            chunk_offset,
                                                            chunk_size,
                                                            bsdiff_allowed,
                                                            &data,
                                                            &operation,
                                                            true,
-                                                           src_ops_allowed));
+                                                           src_ops_allowed,
+                                                           old_filename,
+                                                           new_root + path));
 
   // Check if the operation writes nothing.
   if (operation.dst_extents_size() == 0) {
@@ -450,41 +460,17 @@
 }
 
 bool DeltaDiffGenerator::ReadFileToDiff(
-    const string& old_filename,
-    const string& new_filename,
+    const string& old_part,
+    const string& new_part,
     off_t chunk_offset,
     off_t chunk_size,
     bool bsdiff_allowed,
     chromeos::Blob* out_data,
     DeltaArchiveManifest_InstallOperation* out_op,
     bool gather_extents,
-    bool src_ops_allowed) {
-  // Read new data in
-  chromeos::Blob new_data;
-  TEST_AND_RETURN_FALSE(
-      utils::ReadFileChunk(new_filename, chunk_offset, chunk_size, &new_data));
-
-  TEST_AND_RETURN_FALSE(!new_data.empty());
-  TEST_AND_RETURN_FALSE(chunk_size == -1 ||
-                        static_cast<off_t>(new_data.size()) <= chunk_size);
-
-  chromeos::Blob new_data_bz;
-  TEST_AND_RETURN_FALSE(BzipCompress(new_data, &new_data_bz));
-  CHECK(!new_data_bz.empty());
-
-  chromeos::Blob data;  // Data blob that will be written to delta file.
-
-  DeltaArchiveManifest_InstallOperation operation;
-  size_t current_best_size = 0;
-  if (new_data.size() <= new_data_bz.size()) {
-    operation.set_type(DeltaArchiveManifest_InstallOperation_Type_REPLACE);
-    current_best_size = new_data.size();
-    data = new_data;
-  } else {
-    operation.set_type(DeltaArchiveManifest_InstallOperation_Type_REPLACE_BZ);
-    current_best_size = new_data_bz.size();
-    data = new_data_bz;
-  }
+    bool src_ops_allowed,
+    const string& old_filename,
+    const string& new_filename) {
 
   // Do we have an original file to consider?
   off_t old_size = 0;
@@ -495,12 +481,92 @@
     original = false;
   }
 
+  DeltaArchiveManifest_InstallOperation operation;
+  vector<Extent> src_extents, dst_extents;
+  // Gather source extents if we have an original file.
+  if (original) {
+    if (gather_extents) {
+      TEST_AND_RETURN_FALSE(
+          GatherExtents(old_filename, chunk_offset, chunk_size, &src_extents));
+      ClearSparseHoles(&src_extents);
+      if (src_extents.size() == 0) {
+        // Reading from sparse hole, do nothing.
+        operation.set_type(DeltaArchiveManifest_InstallOperation_Type_MOVE);
+        *out_op = operation;
+        return true;
+      }
+    } else {
+      // We have a kernel, so make one extent to cover it all.
+      Extent* src_extent = operation.add_src_extents();
+      src_extent->set_start_block(0);
+      src_extent->set_num_blocks(
+          (utils::FileSize(old_filename) + (kBlockSize - 1)) / kBlockSize);
+      src_extents.push_back(*src_extent);
+    }
+  }
+
+  // Gather destination extents.
+  if (gather_extents) {
+    TEST_AND_RETURN_FALSE(
+        GatherExtents(new_filename, chunk_offset, chunk_size, &dst_extents));
+    ClearSparseHoles(&dst_extents);
+    if (dst_extents.size() == 0) {
+      // Make an empty move operation.
+      operation.set_type(DeltaArchiveManifest_InstallOperation_Type_MOVE);
+      *out_op = operation;
+      return true;
+    }
+  } else {
+    Extent* dst_extent = operation.add_dst_extents();
+    dst_extent->set_start_block(0);
+    dst_extent->set_num_blocks(
+        (utils::FileSize(new_filename) + (kBlockSize - 1)) / kBlockSize);
+    dst_extents.push_back(*dst_extent);
+  }
+
+  // Figure out how many blocks we need to write to dst_extents.
+  uint64_t blocks_to_write = 0;
+  for (uint32_t i = 0; i < dst_extents.size(); i++)
+    blocks_to_write += dst_extents[i].num_blocks();
+
+  // Figure out how many blocks we need to read to src_extents.
+  uint64_t blocks_to_read = 0;
+  for (uint32_t i = 0; i < src_extents.size(); i++)
+    blocks_to_read += src_extents[i].num_blocks();
+
+  // Read in bytes from new data.
+  chromeos::Blob new_data;
+  TEST_AND_RETURN_FALSE(utils::ReadExtents(new_part,
+                                           &dst_extents,
+                                           &new_data,
+                                           kBlockSize * blocks_to_write,
+                                           kBlockSize));
+
+  TEST_AND_RETURN_FALSE(!new_data.empty());
+  TEST_AND_RETURN_FALSE(chunk_size == -1 ||
+                        static_cast<off_t>(new_data.size()) <= chunk_size);
+
+  chromeos::Blob new_data_bz;
+  TEST_AND_RETURN_FALSE(BzipCompress(new_data, &new_data_bz));
+  CHECK(!new_data_bz.empty());
+  chromeos::Blob data;  // Data blob that will be written to delta file.
+
+  size_t current_best_size = 0;
+  if (new_data.size() <= new_data_bz.size()) {
+    operation.set_type(DeltaArchiveManifest_InstallOperation_Type_REPLACE);
+    current_best_size = new_data.size();
+    data = new_data;
+  } else {
+    operation.set_type(DeltaArchiveManifest_InstallOperation_Type_REPLACE_BZ);
+    current_best_size = new_data_bz.size();
+    data = new_data_bz;
+  }
   chromeos::Blob old_data;
   if (original) {
-    // Read old data
+    // Read old data.
     TEST_AND_RETURN_FALSE(
-        utils::ReadFileChunk(
-            old_filename, chunk_offset, chunk_size, &old_data));
+        utils::ReadExtents(old_part, &src_extents, &old_data,
+                           kBlockSize * blocks_to_read, kBlockSize));
     if (old_data == new_data) {
       // No change in data.
       if (src_ops_allowed) {
@@ -544,43 +610,12 @@
     }
   }
 
+  operation.set_src_length(utils::FileSize(old_filename));
+  operation.set_dst_length(utils::FileSize(new_filename));
+
   // Set parameters of the operations
   CHECK_EQ(data.size(), current_best_size);
 
-  vector<Extent> src_extents, dst_extents;
-  if (operation.type() == DeltaArchiveManifest_InstallOperation_Type_MOVE ||
-      operation.type() == DeltaArchiveManifest_InstallOperation_Type_BSDIFF ||
-      operation.type() ==
-          DeltaArchiveManifest_InstallOperation_Type_SOURCE_COPY ||
-      operation.type() ==
-          DeltaArchiveManifest_InstallOperation_Type_SOURCE_BSDIFF) {
-    if (gather_extents) {
-      TEST_AND_RETURN_FALSE(
-          GatherExtents(old_filename,
-                        chunk_offset,
-                        chunk_size,
-                        &src_extents));
-    } else {
-      Extent* src_extent = operation.add_src_extents();
-      src_extent->set_start_block(0);
-      src_extent->set_num_blocks((old_size + kBlockSize - 1) / kBlockSize);
-    }
-    operation.set_src_length(old_data.size());
-  }
-
-  if (gather_extents) {
-    TEST_AND_RETURN_FALSE(
-        GatherExtents(new_filename,
-                      chunk_offset,
-                      chunk_size,
-                      &dst_extents));
-  } else {
-    Extent* dst_extent = operation.add_dst_extents();
-    dst_extent->set_start_block(0);
-    dst_extent->set_num_blocks((new_data.size() + kBlockSize - 1) / kBlockSize);
-  }
-  operation.set_dst_length(new_data.size());
-
   if (gather_extents) {
     // Remove identical src/dst block ranges in MOVE operations.
     if (operation.type() == DeltaArchiveManifest_InstallOperation_Type_MOVE) {
@@ -599,6 +634,14 @@
     StoreExtents(dst_extents, operation.mutable_dst_extents());
   }
 
+  // Replace operations should not have source extents.
+  if (operation.type() == DeltaArchiveManifest_InstallOperation_Type_REPLACE ||
+      operation.type() ==
+          DeltaArchiveManifest_InstallOperation_Type_REPLACE_BZ) {
+    operation.clear_src_extents();
+    operation.clear_src_length();
+  }
+
   out_data->swap(data);
   *out_op = operation;
 
@@ -625,8 +668,10 @@
                      true,  // bsdiff_allowed
                      &data,
                      &op,
-                     false,
-                     src_ops_allowed));
+                     false,  // gather_extents
+                     src_ops_allowed,
+                     old_kernel_part,  // Doesn't matter, kernel has no files.
+                     new_kernel_part));
 
   // Check if the operation writes nothing.
   if (op.dst_extents_size() == 0) {
@@ -951,6 +996,8 @@
   Graph graph;
   TEST_AND_RETURN_FALSE(DeltaReadFiles(&graph,
                                        &blocks,
+                                       config.source.rootfs_part,
+                                       config.target.rootfs_part,
                                        config.source.rootfs_mountpt,
                                        config.target.rootfs_mountpt,
                                        config.chunk_size,
@@ -1253,4 +1300,9 @@
                                kBlockSize);
 }
 
+void DeltaDiffGenerator::ClearSparseHoles(vector<Extent>* extents) {
+  extents->erase(std::remove_if(extents->begin(), extents->end(), IsSparseHole),
+                 extents->end());
+}
+
 };  // namespace chromeos_update_engine
diff --git a/payload_generator/delta_diff_generator.h b/payload_generator/delta_diff_generator.h
index 6004d31..9a35a61 100644
--- a/payload_generator/delta_diff_generator.h
+++ b/payload_generator/delta_diff_generator.h
@@ -75,6 +75,8 @@
   // and writes any necessary data to the end of data_fd.
   static bool DeltaReadFiles(Graph* graph,
                              std::vector<Block>* blocks,
+                             const std::string& old_part,
+                             const std::string& new_part,
                              const std::string& old_root,
                              const std::string& new_root,
                              off_t chunk_size,
@@ -93,6 +95,8 @@
   static bool DeltaReadFile(Graph* graph,
                             Vertex::Index existing_vertex,
                             std::vector<Block>* blocks,
+                            const std::string& old_part,
+                            const std::string& new_part,
                             const std::string& old_root,
                             const std::string& new_root,
                             const std::string& path,
@@ -103,9 +107,9 @@
                             bool src_ops_allowed);
 
   // Reads old_filename (if it exists) and a new_filename and determines
-  // the smallest way to encode this file for the diff. It stores
-  // necessary data in out_data and fills in out_op.
-  // If there's no change in old and new files, it creates a MOVE
+  // the smallest way to encode this file for the diff. It reads extents from
+  // |old_part| and |new_part|. It stores necessary data in out_data and fills
+  // in out_op. If there's no change in old and new files, it creates a MOVE
   // operation. If there is a change, or the old file doesn't exist,
   // the smallest of REPLACE, REPLACE_BZ, or BSDIFF wins.
   // new_filename must contain at least one byte.
@@ -114,15 +118,17 @@
   // If |src_ops_allowed| is true, it will emit SOURCE_COPY and SOURCE_BSDIFF
   // operations instead of MOVE and BSDIFF, respectively.
   // Returns true on success.
-  static bool ReadFileToDiff(const std::string& old_filename,
-                             const std::string& new_filename,
+  static bool ReadFileToDiff(const std::string& old_part,
+                             const std::string& new_part,
                              off_t chunk_offset,
                              off_t chunk_size,
                              bool bsdiff_allowed,
                              chromeos::Blob* out_data,
                              DeltaArchiveManifest_InstallOperation* out_op,
                              bool gather_extents,
-                             bool src_ops_allowed);
+                             bool src_ops_allowed,
+                             const std::string& old_filename,
+                             const std::string& new_filename);
 
   // Delta compresses a kernel partition |new_kernel_part| with knowledge of the
   // old kernel partition |old_kernel_part|. If |old_kernel_part| is an empty
@@ -217,6 +223,9 @@
     return ret;
   }
 
+  // Takes a vector of extents and removes extents that begin in a sparse hole.
+  static void ClearSparseHoles(std::vector<Extent>* extents);
+
  private:
   DISALLOW_COPY_AND_ASSIGN(DeltaDiffGenerator);
 };
diff --git a/payload_generator/delta_diff_generator_unittest.cc b/payload_generator/delta_diff_generator_unittest.cc
index 22d9c12..30ef200 100644
--- a/payload_generator/delta_diff_generator_unittest.cc
+++ b/payload_generator/delta_diff_generator_unittest.cc
@@ -9,6 +9,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#include <algorithm>
 #include <map>
 #include <set>
 #include <sstream>
@@ -75,6 +76,39 @@
   }
 }
 
+// Inserts |data| at block |offset| in |result|. Fills in the remaining blocks
+// so that there are |num_blocks| blocks in |result|.
+bool MakePartition(uint64_t num_blocks, const string& data, off_t offset,
+                   chromeos::Blob* result) {
+  TEST_AND_RETURN_FALSE(
+      static_cast<uint64_t>((kBlockSize * offset) + data.size()) <=
+                            kBlockSize * num_blocks);
+  chromeos::Blob out(kBlockSize * num_blocks, 0);
+  chromeos::Blob::iterator start = out.begin() + (kBlockSize * offset);
+  copy(data.begin(), data.end(), start);
+  *result = out;
+  return true;
+}
+
+// Copies from |target| to |result|. Gets the substring of |target| starting
+// at block |start_block| of length |num_blocks| blocks and inserts it at block
+// |block_offset| in |result|.
+void UpdatePartition(const string& target, uint64_t start_block,
+                     uint64_t num_blocks, off_t block_offset,
+                     chromeos::Blob* result) {
+  uint64_t num_insert = num_blocks * kBlockSize;
+  off_t target_offset = block_offset * kBlockSize;
+
+  const string target_substr = target.substr(kBlockSize * start_block,
+                                             num_insert);
+  ASSERT_EQ(target_substr.size(), num_insert);
+
+  for (uint64_t i = 0; i < num_insert; i++) {
+    result->at(target_offset + i) =
+        static_cast<unsigned char>(target_substr[i]);
+  }
+}
+
 }  // namespace
 
 class DeltaDiffGeneratorTest : public ::testing::Test {
@@ -84,6 +118,13 @@
                                     &old_path_, nullptr));
     ASSERT_TRUE(utils::MakeTempFile("DeltaDiffGeneratorTest-new_path-XXXXXX",
                                     &new_path_, nullptr));
+    ASSERT_TRUE(utils::MakeTempFile(
+        "DeltaDiffGeneratorTest-old_part_path-XXXXXX",
+        &old_part_path_, nullptr));
+    ASSERT_TRUE(utils::MakeTempFile(
+        "DeltaDiffGeneratorTest-new_part_path-XXXXXX",
+        &new_part_path_, nullptr));
+
     // Mock out the extent gathering function.
     orig_get_extents_with_chunk_func_ = get_extents_with_chunk_func;
     get_extents_with_chunk_func = FakeGetExtents;
@@ -94,6 +135,8 @@
   void TearDown() override {
     unlink(old_path_.c_str());
     unlink(new_path_.c_str());
+    unlink(old_part_path_.c_str());
+    unlink(new_part_path_.c_str());
     get_extents_with_chunk_func = orig_get_extents_with_chunk_func_;
   }
 
@@ -127,6 +170,10 @@
   string old_path_;
   string new_path_;
 
+  // Paths to old and new temporary filesystems used in the tests.
+  string old_part_path_;
+  string new_part_path_;
+
   GetExtentsWithChunk orig_get_extents_with_chunk_func_;
 };
 
@@ -139,27 +186,43 @@
 }
 
 TEST_F(DeltaDiffGeneratorTest, MoveSmallTest) {
+  const string random_string(reinterpret_cast<const char*>(kRandomString),
+                             sizeof(kRandomString));
   EXPECT_TRUE(utils::WriteFile(old_path_.c_str(),
-                               reinterpret_cast<const char*>(kRandomString),
-                               sizeof(kRandomString)));
+                               random_string.c_str(),
+                               random_string.size()));
   EXPECT_TRUE(utils::WriteFile(new_path_.c_str(),
-                               reinterpret_cast<const char*>(kRandomString),
-                               sizeof(kRandomString)));
+                               random_string.c_str(),
+                               random_string.size()));
+
+  chromeos::Blob old_part;
+  chromeos::Blob new_part;
+  EXPECT_TRUE(MakePartition(11, random_string, 10, &old_part));
+  EXPECT_TRUE(MakePartition(1, random_string, 0, &new_part));
+
+  EXPECT_TRUE(utils::WriteFile(old_part_path_.c_str(),
+                               old_part.data(), old_part.size()));
+  EXPECT_TRUE(utils::WriteFile(new_part_path_.c_str(),
+                               new_part.data(), new_part.size()));
+
   // Force the old file to be on a different block.
   UpdateFakeFileExtents(old_path_, kBlockSize, 10);
   UpdateFakeFileExtents(new_path_, kBlockSize);
 
   chromeos::Blob data;
   DeltaArchiveManifest_InstallOperation op;
-  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path_,
-                                                 new_path_,
+
+  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_part_path_,
+                                                 new_part_path_,
                                                  0,  // chunk_offset
                                                  -1,  // chunk_size
                                                  true,  // bsdiff_allowed
                                                  &data,
                                                  &op,
                                                  true,  // gather_extents
-                                                 false));  // src_ops_allowed
+                                                 false,  // src_ops_allowed
+                                                 old_path_,
+                                                 new_path_));
   EXPECT_TRUE(data.empty());
 
   EXPECT_TRUE(op.has_type());
@@ -207,24 +270,49 @@
   string random_data;
   while (random_data.size() < file_len)
     random_data += random_string;
-  if (random_data.size() > file_len)
+  if (random_data.size() > file_len) {
     random_data.erase(file_len);
+    random_data.insert(random_data.end(), (4096 - 3333), 0);
+  }
+
   EXPECT_TRUE(utils::WriteFile(old_path_.c_str(),
                                random_data.c_str(), file_len));
   EXPECT_TRUE(utils::WriteFile(new_path_.c_str(),
                                random_data.c_str(), file_len));
 
+  // Make partitions that match the extents and random_data.
+  chromeos::Blob old_part;
+  chromeos::Blob new_part;
+  EXPECT_TRUE(MakePartition(30, "", 0, &old_part));
+  EXPECT_TRUE(MakePartition(30, "", 0, &new_part));
+
+  UpdatePartition(random_data, 0, 6, 20, &old_part);
+  UpdatePartition(random_data, 6, 2, 28, &old_part);
+
+  UpdatePartition(random_data, 0, 1, 18, &new_part);
+  UpdatePartition(random_data, 1, 2, 21, &new_part);
+  UpdatePartition(random_data, 3, 1, 20, &new_part);
+  UpdatePartition(random_data, 4, 3, 24, &new_part);
+  UpdatePartition(random_data, 7, 1, 29, &new_part);
+
+  EXPECT_TRUE(utils::WriteFile(old_part_path_.c_str(),
+                               old_part.data(), old_part.size()));
+  EXPECT_TRUE(utils::WriteFile(new_part_path_.c_str(),
+                               new_part.data(), new_part.size()));
+
   chromeos::Blob data;
   DeltaArchiveManifest_InstallOperation op;
-  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path_,
-                                                 new_path_,
+  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_part_path_,
+                                                 new_part_path_,
                                                  0,  // chunk_offset
                                                  -1,  // chunk_size
                                                  true,  // bsdiff_allowed
                                                  &data,
                                                  &op,
                                                  true,  // gather_extents
-                                                 false));  // src_ops_allowed
+                                                 false,  // src_ops_allowed
+                                                 old_path_,
+                                                 new_path_));
 
   // Adjust the old/new extents to remove duplicates.
   old_extents[0].set_num_blocks(1);
@@ -269,25 +357,41 @@
 }
 
 TEST_F(DeltaDiffGeneratorTest, BsdiffSmallTest) {
+  const string random_string(reinterpret_cast<const char*>(kRandomString),
+                             sizeof(kRandomString));
   EXPECT_TRUE(utils::WriteFile(old_path_.c_str(),
-                               reinterpret_cast<const char*>(kRandomString),
-                               sizeof(kRandomString) - 1));
+                               random_string.c_str(),
+                               random_string.size() - 1));
   EXPECT_TRUE(utils::WriteFile(new_path_.c_str(),
-                               reinterpret_cast<const char*>(kRandomString),
-                               sizeof(kRandomString)));
+                               random_string.c_str(),
+                               random_string.size()));
   UpdateFakeExtents();
 
+  chromeos::Blob old_part;
+  chromeos::Blob new_part;
+  EXPECT_TRUE(MakePartition(
+      1, random_string.substr(0, random_string.size() - 1),  0, &old_part));
+  EXPECT_TRUE(MakePartition(1, random_string, 0, &new_part));
+
+  EXPECT_TRUE(utils::WriteFile(old_part_path_.c_str(),
+                               old_part.data(), old_part.size()));
+  EXPECT_TRUE(utils::WriteFile(new_part_path_.c_str(),
+                               new_part.data(), new_part.size()));
+
   chromeos::Blob data;
   DeltaArchiveManifest_InstallOperation op;
-  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path_,
-                                                 new_path_,
+  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_part_path_,
+                                                 new_part_path_,
                                                  0,  // chunk_offset
                                                  -1,  // chunk_size
                                                  true,  // bsdiff_allowed
                                                  &data,
                                                  &op,
                                                  true,  // gather_extents
-                                                 false));  // src_ops_allowed
+                                                 false,  // src_ops_allowed
+                                                 old_path_,
+                                                 new_path_));
+
   EXPECT_FALSE(data.empty());
 
   EXPECT_TRUE(op.has_type());
@@ -304,26 +408,42 @@
 }
 
 TEST_F(DeltaDiffGeneratorTest, BsdiffNotAllowedTest) {
+  const string random_string(reinterpret_cast<const char*>(kRandomString),
+                             sizeof(kRandomString));
   EXPECT_TRUE(utils::WriteFile(old_path_.c_str(),
-                               reinterpret_cast<const char*>(kRandomString),
-                               sizeof(kRandomString) - 1));
+                               random_string.c_str(),
+                               random_string.size() - 1));
   EXPECT_TRUE(utils::WriteFile(new_path_.c_str(),
-                               reinterpret_cast<const char*>(kRandomString),
-                               sizeof(kRandomString)));
+                               random_string.c_str(),
+                               random_string.size()));
   UpdateFakeExtents();
 
+  chromeos::Blob old_part;
+  chromeos::Blob new_part;
+  EXPECT_TRUE(MakePartition(
+      1, random_string.substr(0, random_string.size() - 1),  0, &old_part));
+  EXPECT_TRUE(MakePartition(1, random_string, 0, &new_part));
+
+  EXPECT_TRUE(utils::WriteFile(old_part_path_.c_str(),
+                               old_part.data(), old_part.size()));
+  EXPECT_TRUE(utils::WriteFile(new_part_path_.c_str(),
+                               new_part.data(), new_part.size()));
+
   chromeos::Blob data;
   DeltaArchiveManifest_InstallOperation op;
 
-  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path_,
-                                                 new_path_,
+  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_part_path_,
+                                                 new_part_path_,
                                                  0,  // chunk_offset
                                                  -1,  // chunk_size
                                                  false,  // bsdiff_allowed
                                                  &data,
                                                  &op,
                                                  true,  // gather_extents
-                                                 false));  // src_ops_allowed
+                                                 false,  // src_ops_allowed
+                                                 old_path_,
+                                                 new_path_));
+
   EXPECT_FALSE(data.empty());
 
   // The point of this test is that we don't use BSDIFF the way the above
@@ -333,26 +453,41 @@
 }
 
 TEST_F(DeltaDiffGeneratorTest, BsdiffNotAllowedMoveTest) {
+  const string random_string(reinterpret_cast<const char*>(kRandomString),
+                             sizeof(kRandomString));
   EXPECT_TRUE(utils::WriteFile(old_path_.c_str(),
-                               reinterpret_cast<const char*>(kRandomString),
-                               sizeof(kRandomString)));
+                               random_string.c_str(),
+                               random_string.size()));
   EXPECT_TRUE(utils::WriteFile(new_path_.c_str(),
-                               reinterpret_cast<const char*>(kRandomString),
-                               sizeof(kRandomString)));
+                               random_string.c_str(),
+                               random_string.size()));
   UpdateFakeExtents();
 
+  chromeos::Blob old_part;
+  chromeos::Blob new_part;
+  EXPECT_TRUE(MakePartition(1, random_string,  0, &old_part));
+  EXPECT_TRUE(MakePartition(1, random_string, 0, &new_part));
+
+  EXPECT_TRUE(utils::WriteFile(old_part_path_.c_str(),
+                               old_part.data(), old_part.size()));
+  EXPECT_TRUE(utils::WriteFile(new_part_path_.c_str(),
+                               new_part.data(), new_part.size()));
+
   chromeos::Blob data;
   DeltaArchiveManifest_InstallOperation op;
 
-  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path_,
-                                                 new_path_,
+  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_part_path_,
+                                                 new_part_path_,
                                                  0,  // chunk_offset
                                                  -1,  // chunk_size
                                                  false,  // bsdiff_allowed
                                                  &data,
                                                  &op,
                                                  true,  // gather_extents
-                                                 false));  // src_ops_allowed
+                                                 false,  // src_ops_allowed
+                                                 old_path_,
+                                                 new_path_));
+
   EXPECT_TRUE(data.empty());
 
   // The point of this test is that we can still use a MOVE for a file
@@ -362,26 +497,54 @@
 }
 
 TEST_F(DeltaDiffGeneratorTest, ReplaceSmallTest) {
-  chromeos::Blob new_data;
+  chromeos::Blob new_part;
+
+  chromeos::Blob old_part(kBlockSize, 0);
+  EXPECT_TRUE(utils::WriteFile(old_part_path_.c_str(),
+                               old_part.data(), old_part.size()));
+
+  // Fill old_path with zeroes.
+  chromeos::Blob old_data(kBlockSize, 0);
+  EXPECT_TRUE(utils::WriteFile(old_path_.c_str(),
+                               old_data.data(),
+                               old_data.size()));
+
+  chromeos::Blob random_data;
+  // Make a blob with random data that won't compress well.
+  std::mt19937 gen(12345);
+  std::uniform_int_distribution<uint8_t> dis(0, 255);
+  for (uint32_t i = 0; i < kBlockSize; i++) {
+    random_data.push_back(dis(gen));
+  }
+
+  // Make a blob that's just 1's that will compress well.
+  chromeos::Blob ones(kBlockSize, 1);
+
   for (int i = 0; i < 2; i++) {
-    new_data.insert(new_data.end(),
-                    std::begin(kRandomString), std::end(kRandomString));
+    chromeos::Blob data_to_test = i == 0 ? random_data : ones;
     EXPECT_TRUE(utils::WriteFile(new_path_.c_str(),
-                                 new_data.data(),
-                                 new_data.size()));
+                                 data_to_test.data(),
+                                 data_to_test.size()));
     UpdateFakeExtents();
 
+    string data_str(data_to_test.begin(), data_to_test.end());
+    EXPECT_TRUE(MakePartition(1, data_str, 0, &new_part));
+    EXPECT_TRUE(utils::WriteFile(new_part_path_.c_str(),
+                                 new_part.data(), new_part.size()));
+
     chromeos::Blob data;
     DeltaArchiveManifest_InstallOperation op;
-    EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path_,
-                                                   new_path_,
+    EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_part_path_,
+                                                   new_part_path_,
                                                    0,  // chunk_offset
                                                    -1,  // chunk_size
                                                    true,  // bsdiff_allowed
                                                    &data,
                                                    &op,
                                                    true,  // gather_extents
-                                                   false));  // src_ops_allowed
+                                                   false,  // src_ops_allowed
+                                                   old_path_,
+                                                   new_path_));
     EXPECT_FALSE(data.empty());
 
     EXPECT_TRUE(op.has_type());
@@ -394,29 +557,45 @@
     EXPECT_EQ(0, op.src_extents_size());
     EXPECT_FALSE(op.has_src_length());
     EXPECT_EQ(1, op.dst_extents_size());
-    EXPECT_EQ(new_data.size(), op.dst_length());
+    EXPECT_EQ(data_to_test.size(), op.dst_length());
     EXPECT_EQ(1, BlocksInExtents(op.dst_extents()));
   }
 }
 
 TEST_F(DeltaDiffGeneratorTest, BsdiffNoGatherExtentsSmallTest) {
+  const string random_string(reinterpret_cast<const char*>(kRandomString),
+                             sizeof(kRandomString));
   EXPECT_TRUE(utils::WriteFile(old_path_.c_str(),
-                               reinterpret_cast<const char*>(kRandomString),
-                               sizeof(kRandomString) - 1));
+                               random_string.data(),
+                               random_string.size() - 1));
   EXPECT_TRUE(utils::WriteFile(new_path_.c_str(),
-                               reinterpret_cast<const char*>(kRandomString),
-                               sizeof(kRandomString)));
+                               random_string.c_str(),
+                               random_string.size()));
+
+  chromeos::Blob old_part;
+  chromeos::Blob new_part;
+  EXPECT_TRUE(MakePartition(
+      1, random_string.substr(0, random_string.size() - 1),  0, &old_part));
+  EXPECT_TRUE(MakePartition(1, random_string, 0, &new_part));
+
+  EXPECT_TRUE(utils::WriteFile(old_part_path_.c_str(),
+                               old_part.data(), old_part.size()));
+  EXPECT_TRUE(utils::WriteFile(new_part_path_.c_str(),
+                               new_part.data(), new_part.size()));
   chromeos::Blob data;
   DeltaArchiveManifest_InstallOperation op;
-  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path_,
-                                                 new_path_,
+
+  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_part_path_,
+                                                 new_part_path_,
                                                  0,  // chunk_offset
                                                  -1,  // chunk_size
                                                  true,  // bsdiff_allowed
                                                  &data,
                                                  &op,
                                                  false,  // gather_extents
-                                                 false));  // src_ops_allowed
+                                                 false,  // src_ops_allowed
+                                                 old_path_,
+                                                 new_path_));
   EXPECT_FALSE(data.empty());
 
   EXPECT_TRUE(op.has_type());
@@ -437,25 +616,40 @@
   // Makes sure SOURCE_COPY operations are emitted whenever src_ops_allowed
   // is true. It is the same setup as MoveSmallTest, which checks that
   // the operation is well-formed.
+  const string random_string(reinterpret_cast<const char*>(kRandomString),
+                             sizeof(kRandomString));
   EXPECT_TRUE(utils::WriteFile(old_path_.c_str(),
-                               reinterpret_cast<const char*>(kRandomString),
-                               sizeof(kRandomString)));
+                               random_string.data(),
+                               random_string.size()));
   EXPECT_TRUE(utils::WriteFile(new_path_.c_str(),
-                               reinterpret_cast<const char*>(kRandomString),
-                               sizeof(kRandomString)));
+                               random_string.c_str(),
+                               random_string.size()));
   UpdateFakeExtents();
 
   chromeos::Blob data;
   DeltaArchiveManifest_InstallOperation op;
-  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path_,
-                                                 new_path_,
+
+  chromeos::Blob old_part;
+  chromeos::Blob new_part;
+  EXPECT_TRUE(MakePartition(1, random_string,  0, &old_part));
+  EXPECT_TRUE(MakePartition(1, random_string, 0, &new_part));
+
+  EXPECT_TRUE(utils::WriteFile(old_part_path_.c_str(),
+                               old_part.data(), old_part.size()));
+  EXPECT_TRUE(utils::WriteFile(new_part_path_.c_str(),
+                               new_part.data(), new_part.size()));
+
+  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_part_path_,
+                                                 new_part_path_,
                                                  0,  // chunk_offset
                                                  -1,  // chunk_size
                                                  true,  // bsdiff_allowed
                                                  &data,
                                                  &op,
                                                  true,  // gather_extents
-                                                 true));  // src_ops_allowed
+                                                 true,  // src_ops_allowed
+                                                 old_path_,
+                                                 new_path_));
   EXPECT_TRUE(data.empty());
 
   EXPECT_TRUE(op.has_type());
@@ -466,25 +660,42 @@
   // Makes sure SOURCE_BSDIFF operations are emitted whenever src_ops_allowed
   // is true. It is the same setup as BsdiffSmallTest, which checks
   // that the operation is well-formed.
+  const string random_string(reinterpret_cast<const char*>(kRandomString),
+                             sizeof(kRandomString));
   EXPECT_TRUE(utils::WriteFile(old_path_.c_str(),
-                               reinterpret_cast<const char*>(kRandomString),
-                               sizeof(kRandomString) - 1));
+                               random_string.data(),
+                               random_string.size() - 1));
   EXPECT_TRUE(utils::WriteFile(new_path_.c_str(),
-                               reinterpret_cast<const char*>(kRandomString),
-                               sizeof(kRandomString)));
+                               random_string.c_str(),
+                               random_string.size()));
   UpdateFakeExtents();
 
+  chromeos::Blob old_part;
+  chromeos::Blob new_part;
+  EXPECT_TRUE(MakePartition(
+      1, random_string.substr(0, random_string.size() - 1),  0, &old_part));
+  EXPECT_TRUE(MakePartition(1, random_string, 0, &new_part));
+
+  EXPECT_TRUE(utils::WriteFile(old_part_path_.c_str(),
+                               old_part.data(), old_part.size()));
+  EXPECT_TRUE(utils::WriteFile(new_part_path_.c_str(),
+                               new_part.data(), new_part.size()));
+
   chromeos::Blob data;
   DeltaArchiveManifest_InstallOperation op;
-  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path_,
-                                                 new_path_,
+
+  EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_part_path_,
+                                                 new_part_path_,
                                                  0,  // chunk_offset
                                                  -1,  // chunk_size
                                                  true,  // bsdiff_allowed
                                                  &data,
                                                  &op,
                                                  true,  // gather_extents
-                                                 true));  // src_ops_allowed
+                                                 true,  // src_ops_allowed
+                                                 old_path_,
+                                                 new_path_));
+
   EXPECT_FALSE(data.empty());
   EXPECT_TRUE(op.has_type());
   EXPECT_EQ(DeltaArchiveManifest_InstallOperation_Type_SOURCE_BSDIFF,
@@ -546,10 +757,6 @@
   *(op.add_dst_extents()) = ExtentForRange(20, 1);
   *(op.add_dst_extents()) = ExtentForRange(21, 1);
   EXPECT_TRUE(DeltaDiffGenerator::IsNoopOperation(op));
-  *(op.add_src_extents()) = ExtentForRange(kSparseHole, 2);
-  *(op.add_src_extents()) = ExtentForRange(kSparseHole, 1);
-  *(op.add_dst_extents()) = ExtentForRange(kSparseHole, 3);
-  EXPECT_TRUE(DeltaDiffGenerator::IsNoopOperation(op));
   *(op.add_src_extents()) = ExtentForRange(24, 1);
   *(op.add_dst_extents()) = ExtentForRange(25, 1);
   EXPECT_FALSE(DeltaDiffGenerator::IsNoopOperation(op));
@@ -577,4 +784,18 @@
   EXPECT_EQ("aop2", ops[1].name);
 }
 
+TEST_F(DeltaDiffGeneratorTest, SparseHolesFilteredTest) {
+  // Test to see that extents starting with a sparse hole are filtered out by
+  // ClearSparseHoles.
+  vector<Extent> extents;
+  AddExtent(kSparseHole, 1, &extents);
+  AddExtent(21, 2, &extents);
+  AddExtent(kSparseHole, 3, &extents);
+  AddExtent(29, 1, &extents);
+  DeltaDiffGenerator::ClearSparseHoles(&extents);
+  EXPECT_EQ(extents.size(), 2);
+  EXPECT_EQ(extents[0], ExtentForRange(21, 2));
+  EXPECT_EQ(extents[1], ExtentForRange(29, 1));
+}
+
 }  // namespace chromeos_update_engine
diff --git a/payload_generator/inplace_generator.cc b/payload_generator/inplace_generator.cc
index 0e3284c..23617f3 100644
--- a/payload_generator/inplace_generator.cc
+++ b/payload_generator/inplace_generator.cc
@@ -269,8 +269,6 @@
     Extent extent = graph_utils::GetElement(extents, i);
     uint64_t start = extent.start_block();
     uint64_t num = extent.num_blocks();
-    if (start == kSparseHole)
-      continue;
     if (start >= kTempBlockStart || (start + num) >= kTempBlockStart) {
       LOG(ERROR) << "temp block!";
       LOG(ERROR) << "start: " << start << ", num: " << num;
@@ -291,6 +289,7 @@
 bool ConvertCutsToFull(
     Graph* graph,
     const string& new_root,
+    const string& new_part,
     int data_fd,
     off_t* data_file_size,
     vector<Vertex::Index>* op_indexes,
@@ -302,6 +301,7 @@
     TEST_AND_RETURN_FALSE(InplaceGenerator::ConvertCutToFullOp(
         graph,
         cut,
+        new_part,
         new_root,
         data_fd,
         data_file_size));
@@ -331,6 +331,7 @@
 bool AssignBlockForAdjoiningCuts(
     Graph* graph,
     const string& new_root,
+    const string& new_part,
     int data_fd,
     off_t* data_file_size,
     vector<Vertex::Index>* op_indexes,
@@ -395,6 +396,7 @@
     LOG(INFO) << "Unable to find sufficient scratch";
     TEST_AND_RETURN_FALSE(ConvertCutsToFull(graph,
                                             new_root,
+                                            new_part,
                                             data_fd,
                                             data_file_size,
                                             op_indexes,
@@ -441,6 +443,7 @@
 bool InplaceGenerator::AssignTempBlocks(
     Graph* graph,
     const string& new_root,
+    const string& new_part,
     int data_fd,
     off_t* data_file_size,
     vector<Vertex::Index>* op_indexes,
@@ -464,6 +467,7 @@
       CHECK(!cuts_group.empty());
       TEST_AND_RETURN_FALSE(AssignBlockForAdjoiningCuts(graph,
                                                         new_root,
+                                                        new_part,
                                                         data_fd,
                                                         data_file_size,
                                                         op_indexes,
@@ -481,6 +485,7 @@
   CHECK(!cuts_group.empty());
   TEST_AND_RETURN_FALSE(AssignBlockForAdjoiningCuts(graph,
                                                     new_root,
+                                                    new_part,
                                                     data_fd,
                                                     data_file_size,
                                                     op_indexes,
@@ -518,6 +523,7 @@
 
 bool InplaceGenerator::ConvertCutToFullOp(Graph* graph,
                                           const CutEdgeVertexes& cut,
+                                          const string& new_part,
                                           const string& new_root,
                                           int data_fd,
                                           off_t* data_file_size) {
@@ -535,6 +541,8 @@
         graph,
         cut.old_dst,
         nullptr,
+        kEmptyPath,  // old_part
+        new_part,
         kEmptyPath,
         new_root,
         (*graph)[cut.old_dst].file_name,
@@ -561,6 +569,7 @@
 }
 
 bool InplaceGenerator::ConvertGraphToDag(Graph* graph,
+                                        const string& new_part,
                                         const string& new_root,
                                         int fd,
                                         off_t* data_file_size,
@@ -598,6 +607,7 @@
 
   if (!cuts.empty())
     TEST_AND_RETURN_FALSE(AssignTempBlocks(graph,
+                                           new_part,
                                            new_root,
                                            fd,
                                            data_file_size,
@@ -654,10 +664,6 @@
 
     for (int i = 0; i < extents_size; i++) {
       const Extent& extent = extents.Get(i);
-      if (extent.start_block() == kSparseHole) {
-        // Hole in sparse file. skip
-        continue;
-      }
       for (uint64_t block = extent.start_block();
            block < (extent.start_block() + extent.num_blocks()); block++) {
         if ((*blocks)[block].*access_type != Vertex::kInvalidIndex) {
@@ -688,6 +694,8 @@
   TEST_AND_RETURN_FALSE(
       DeltaDiffGenerator::DeltaReadFiles(&graph,
                                          &blocks,
+                                         config.source.rootfs_part,
+                                         config.target.rootfs_part,
                                          config.source.rootfs_mountpt,
                                          config.target.rootfs_mountpt,
                                          config.chunk_size,
@@ -753,6 +761,7 @@
   vector<Vertex::Index> final_order;
   TEST_AND_RETURN_FALSE(ConvertGraphToDag(
       &graph,
+      config.target.rootfs_part,
       config.target.rootfs_mountpt,
       data_file_fd,
       data_file_size,
diff --git a/payload_generator/inplace_generator.h b/payload_generator/inplace_generator.h
index 5799c0b..9d10548 100644
--- a/payload_generator/inplace_generator.h
+++ b/payload_generator/inplace_generator.h
@@ -103,6 +103,7 @@
   // success.
   static bool AssignTempBlocks(
       Graph* graph,
+      const std::string& new_part,
       const std::string& new_root,
       int data_fd,
       off_t* data_file_size,
@@ -119,6 +120,7 @@
   // A->B. Now, A is a full operation.
   static bool ConvertCutToFullOp(Graph* graph,
                                  const CutEdgeVertexes& cut,
+                                 const std::string& new_part,
                                  const std::string& new_root,
                                  int data_fd,
                                  off_t* data_file_size);
@@ -133,6 +135,7 @@
   // |final_order| before returning.
   // Returns true on success.
   static bool ConvertGraphToDag(Graph* graph,
+                                const std::string& new_part,
                                 const std::string& new_root,
                                 int fd,
                                 off_t* data_file_size,
diff --git a/payload_generator/inplace_generator_unittest.cc b/payload_generator/inplace_generator_unittest.cc
index 051902f..fdf3aba 100644
--- a/payload_generator/inplace_generator_unittest.cc
+++ b/payload_generator/inplace_generator_unittest.cc
@@ -340,6 +340,7 @@
 
   EXPECT_TRUE(InplaceGenerator::AssignTempBlocks(&graph,
                                                  temp_dir,
+                                                 "/dev/zero",
                                                  fd,
                                                  &data_file_size,
                                                  &op_indexes,
@@ -436,9 +437,9 @@
   ScopedFdCloser fd_closer(&fd);
   off_t data_file_size = 0;
 
-
   EXPECT_TRUE(InplaceGenerator::ConvertGraphToDag(&graph,
                                                   temp_dir,
+                                                  "/dev/zero",
                                                   fd,
                                                   &data_file_size,
                                                   &final_order,
@@ -512,189 +513,6 @@
   }
 }
 
-// Test that sparse holes are not used as scratch. More specifically, test that
-// if all full operations write to sparse holes and there's no extra scratch
-// space, delta operations that need scratch are converted to full. See
-// crbug.com/238440.
-TEST_F(InplaceGeneratorTest, RunAsRootNoSparseAsTempTest) {
-  Graph graph(3);
-  const vector<Extent> kEmpty;
-  const string kFilename = "/foo";
-
-  // Make sure this sparse hole is not used as scratch.
-  GenVertex(&graph[0], kEmpty, VectOfExt(kSparseHole, 1), "", OP_REPLACE);
-
-  // Create a single-block cycle.
-  GenVertex(&graph[1], VectOfExt(0, 1), VectOfExt(1, 1), "", OP_BSDIFF);
-  graph[1].out_edges[2] = EdgeWithReadDep(VectOfExt(1, 1));
-  GenVertex(&graph[2], VectOfExt(1, 1), VectOfExt(0, 1), kFilename, OP_BSDIFF);
-  graph[2].out_edges[1] = EdgeWithReadDep(VectOfExt(0, 1));
-
-  graph_utils::DumpGraph(graph);
-
-  vector<Vertex::Index> final_order;
-
-  // Prepare the filesystem with the minimum required for this to work.
-  string temp_dir;
-  EXPECT_TRUE(utils::MakeTempDirectory("NoSparseAsTempTest.XXXXXX",
-                                       &temp_dir));
-  ScopedDirRemover temp_dir_remover(temp_dir);
-
-  chromeos::Blob temp_data(kBlockSize);
-  test_utils::FillWithData(&temp_data);
-  EXPECT_TRUE(test_utils::WriteFileVector(temp_dir + kFilename, temp_data));
-  ScopedPathUnlinker filename_unlinker(temp_dir + kFilename);
-
-  int fd = -1;
-  EXPECT_TRUE(utils::MakeTempFile("NoSparseAsTempTestData.XXXXXX",
-                                  nullptr,
-                                  &fd));
-  ScopedFdCloser fd_closer(&fd);
-  off_t data_file_size = 0;
-
-  EXPECT_TRUE(InplaceGenerator::ConvertGraphToDag(&graph,
-                                                  temp_dir,
-                                                  fd,
-                                                  &data_file_size,
-                                                  &final_order,
-                                                  Vertex::kInvalidIndex));
-
-  ASSERT_EQ(4, graph.size());
-
-  // The second BSDIFF operation must have been converted to a full operation
-  // (due to insufficient scratch space).
-  EXPECT_TRUE(graph[2].op.type() == OP_REPLACE ||
-              graph[2].op.type() == OP_REPLACE_BZ);
-
-  // The temporary node created for breaking the cycle must have been marked as
-  // invalid.
-  EXPECT_FALSE(graph[3].valid);
-}
-
-// Test that sparse holes are not used as scratch. More specifically, test that
-// if scratch space comes only from full operations writing to real blocks as
-// well as sparse holes, only the real blocks are utilized. See
-// crbug.com/238440.
-TEST_F(InplaceGeneratorTest, NoSparseAsTempTest) {
-  Graph graph;
-  vector<Block> blocks(4);
-
-  // Create nodes in |graph|.
-  {
-    graph.resize(graph.size() + 1);
-    graph.back().op.set_type(
-        DeltaArchiveManifest_InstallOperation_Type_REPLACE);
-
-    // Write to a sparse hole -- basically a no-op to ensure sparse holes are
-    // not used as scratch.
-    vector<Extent> extents;
-    graph_utils::AppendBlockToExtents(&extents, kSparseHole);
-    DeltaDiffGenerator::StoreExtents(extents,
-                                     graph.back().op.mutable_dst_extents());
-  }
-  {
-    graph.resize(graph.size() + 1);
-    graph.back().op.set_type(OP_REPLACE);
-
-    // Scratch space: write to block 0 with sparse holes around.
-    vector<Extent> extents;
-    graph_utils::AppendBlockToExtents(&extents, kSparseHole);
-    graph_utils::AppendBlockToExtents(&extents, 0);
-    graph_utils::AppendBlockToExtents(&extents, kSparseHole);
-    DeltaDiffGenerator::StoreExtents(extents,
-                                     graph.back().op.mutable_dst_extents());
-    blocks[0].writer = graph.size() - 1;
-  }
-  {
-    graph.resize(graph.size() + 1);
-    graph.back().op.set_type(OP_REPLACE);
-
-    // Write to a sparse hole.
-    vector<Extent> extents;
-    graph_utils::AppendBlockToExtents(&extents, kSparseHole);
-    DeltaDiffGenerator::StoreExtents(extents,
-                                     graph.back().op.mutable_dst_extents());
-  }
-  // Create a two-node cycle between (2, sparse, sparse) and (1, sparse, 3).
-  {
-    graph.resize(graph.size() + 1);
-    graph.back().op.set_type(OP_MOVE);
-    // Read from (2, sparse, sparse).
-    vector<Extent> extents;
-    graph_utils::AppendBlockToExtents(&extents, 2);
-    graph_utils::AppendBlockToExtents(&extents, kSparseHole);
-    graph_utils::AppendBlockToExtents(&extents, kSparseHole);
-    DeltaDiffGenerator::StoreExtents(extents,
-                                     graph.back().op.mutable_src_extents());
-    blocks[2].reader = graph.size() - 1;
-
-    // Write to (1, sparse, 3).
-    extents.clear();
-    graph_utils::AppendBlockToExtents(&extents, 1);
-    graph_utils::AppendBlockToExtents(&extents, kSparseHole);
-    graph_utils::AppendBlockToExtents(&extents, 3);
-    DeltaDiffGenerator::StoreExtents(extents,
-                                     graph.back().op.mutable_dst_extents());
-    blocks[1].writer = graph.size() - 1;
-    blocks[3].writer = graph.size() - 1;
-  }
-  {
-    graph.resize(graph.size() + 1);
-    graph.back().op.set_type(OP_MOVE);
-    // Read from (1, sparse, 3).
-    vector<Extent> extents;
-    graph_utils::AppendBlockToExtents(&extents, 1);
-    graph_utils::AppendBlockToExtents(&extents, kSparseHole);
-    graph_utils::AppendBlockToExtents(&extents, 3);
-    DeltaDiffGenerator::StoreExtents(extents,
-                                     graph.back().op.mutable_src_extents());
-    blocks[1].reader = graph.size() - 1;
-    blocks[3].reader = graph.size() - 1;
-
-    // Write to (2, sparse, sparse).
-    extents.clear();
-    graph_utils::AppendBlockToExtents(&extents, 2);
-    graph_utils::AppendBlockToExtents(&extents, kSparseHole);
-    graph_utils::AppendBlockToExtents(&extents, kSparseHole);
-    DeltaDiffGenerator::StoreExtents(extents,
-                                     graph.back().op.mutable_dst_extents());
-    blocks[2].writer = graph.size() - 1;
-  }
-
-  graph_utils::DumpGraph(graph);
-
-  // Create edges
-  InplaceGenerator::CreateEdges(&graph, blocks);
-
-  graph_utils::DumpGraph(graph);
-
-  vector<Vertex::Index> final_order;
-  off_t data_file_size = 0;
-  EXPECT_TRUE(InplaceGenerator::ConvertGraphToDag(&graph,
-                                                  "/non/existent/dir",
-                                                  -1,
-                                                  &data_file_size,
-                                                  &final_order,
-                                                  Vertex::kInvalidIndex));
-
-  // Check for a single temporary node writing to scratch.
-  ASSERT_EQ(6, graph.size());
-  EXPECT_EQ(DeltaArchiveManifest_InstallOperation_Type_MOVE,
-            graph[5].op.type());
-  EXPECT_EQ(1, graph[5].op.src_extents_size());
-  ASSERT_EQ(1, graph[5].op.dst_extents_size());
-  EXPECT_EQ(0, graph[5].op.dst_extents(0).start_block());
-  EXPECT_EQ(1, graph[5].op.dst_extents(0).num_blocks());
-
-  // Make sure the cycle nodes still read from and write to sparse holes.
-  for (int i = 3; i < 5; i++) {
-    ASSERT_GE(graph[i].op.src_extents_size(), 2);
-    EXPECT_EQ(kSparseHole, graph[i].op.src_extents(1).start_block());
-    ASSERT_GE(graph[i].op.dst_extents_size(), 2);
-    EXPECT_EQ(kSparseHole, graph[i].op.dst_extents(1).start_block());
-  }
-}
-
 TEST_F(InplaceGeneratorTest, CreateScratchNodeTest) {
   Vertex vertex;
   InplaceGenerator::CreateScratchNode(12, 34, &vertex);
diff --git a/utils.cc b/utils.cc
index c076682..31b25af 100644
--- a/utils.cc
+++ b/utils.cc
@@ -1691,6 +1691,32 @@
   return false;
 }
 
+bool ReadExtents(const std::string& path, vector<Extent>* extents,
+                 chromeos::Blob* out_data, ssize_t out_data_size,
+                 size_t block_size) {
+  chromeos::Blob data(out_data_size);
+  ssize_t bytes_read = 0;
+  int fd = open(path.c_str(), O_RDONLY);
+  TEST_AND_RETURN_FALSE_ERRNO(fd >= 0);
+  ScopedFdCloser fd_closer(&fd);
+
+  for (const Extent& extent : *extents) {
+    ssize_t bytes_read_this_iteration = 0;
+    ssize_t bytes = extent.num_blocks() * block_size;
+    TEST_AND_RETURN_FALSE(bytes_read + bytes <= out_data_size);
+    TEST_AND_RETURN_FALSE(utils::PReadAll(fd,
+                                          &data[bytes_read],
+                                          bytes,
+                                          extent.start_block() * block_size,
+                                          &bytes_read_this_iteration));
+    TEST_AND_RETURN_FALSE(bytes_read_this_iteration == bytes);
+    bytes_read += bytes_read_this_iteration;
+  }
+  TEST_AND_RETURN_FALSE(out_data_size == bytes_read);
+  *out_data = data;
+  return true;
+}
+
 }  // namespace utils
 
 }  // namespace chromeos_update_engine
diff --git a/utils.h b/utils.h
index 2374a94..6d8b373 100644
--- a/utils.h
+++ b/utils.h
@@ -28,6 +28,7 @@
 #include "update_engine/constants.h"
 #include "update_engine/file_descriptor.h"
 #include "update_engine/metrics.h"
+#include "update_engine/update_metadata.pb.h"
 
 namespace chromeos_update_engine {
 
@@ -468,6 +469,14 @@
 // value and setting it, and |false| otherwise.
 bool GetMinorVersion(base::FilePath path, uint32_t* minor_version);
 
+// This function reads the specified data in |extents| into |out_data|. The
+// extents are read from the file at |path|. |out_data_size| is the size of
+// |out_data|. Returns false if the number of bytes to read given in
+// |extents| does not equal |out_data_size|.
+bool ReadExtents(const std::string& path, std::vector<Extent>* extents,
+                 chromeos::Blob* out_data, ssize_t out_data_size,
+                 size_t block_size);
+
 }  // namespace utils
 
 
