diff --git a/download_action.cc b/download_action.cc
index 9da925c..989625d 100644
--- a/download_action.cc
+++ b/download_action.cc
@@ -44,31 +44,10 @@
   if (writer_) {
     LOG(INFO) << "Using writer for test.";
   } else {
-    if (install_plan_.is_full_update) {
-      kernel_file_writer_.reset(new DirectFileWriter);
-      rootfs_file_writer_.reset(new DirectFileWriter);
-      kernel_buffered_file_writer_.reset(
-          new BufferedFileWriter(kernel_file_writer_.get(),
-                                 kFileWriterBufferSize));
-      rootfs_buffered_file_writer_.reset(
-          new BufferedFileWriter(rootfs_file_writer_.get(),
-                                 kFileWriterBufferSize));
-      split_file_writer_.reset(
-          new SplitFileWriter(kernel_buffered_file_writer_.get(),
-                              rootfs_buffered_file_writer_.get()));
-      split_file_writer_->SetFirstOpenArgs(
-          install_plan_.kernel_install_path.c_str(),
-          O_WRONLY | O_CREAT | O_TRUNC | O_LARGEFILE,
-          0644);
-      decompressing_file_writer_.reset(
-          new GzipDecompressingFileWriter(split_file_writer_.get()));
-      writer_ = decompressing_file_writer_.get();
-    } else {
-      delta_performer_.reset(new DeltaPerformer(prefs_));
-      delta_performer_->set_current_kernel_hash(install_plan_.kernel_hash);
-      delta_performer_->set_current_rootfs_hash(install_plan_.rootfs_hash);
-      writer_ = delta_performer_.get();
-    }
+    delta_performer_.reset(new DeltaPerformer(prefs_));
+    delta_performer_->set_current_kernel_hash(install_plan_.kernel_hash);
+    delta_performer_->set_current_rootfs_hash(install_plan_.rootfs_hash);
+    writer_ = delta_performer_.get();
   }
   int rc = writer_->Open(install_plan_.install_path.c_str(),
                          O_TRUNC | O_WRONLY | O_CREAT | O_LARGEFILE,
@@ -79,15 +58,14 @@
     processor_->ActionComplete(this, kActionCodeInstallDeviceOpenError);
     return;
   }
-  if (!install_plan_.is_full_update) {
-    if (!delta_performer_->OpenKernel(
-            install_plan_.kernel_install_path.c_str())) {
-      LOG(ERROR) << "Unable to open kernel file "
-                 << install_plan_.kernel_install_path.c_str();
-      writer_->Close();
-      processor_->ActionComplete(this, kActionCodeKernelDeviceOpenError);
-      return;
-    }
+  if (delta_performer_.get() &&
+      !delta_performer_->OpenKernel(
+          install_plan_.kernel_install_path.c_str())) {
+    LOG(ERROR) << "Unable to open kernel file "
+               << install_plan_.kernel_install_path.c_str();
+    writer_->Close();
+    processor_->ActionComplete(this, kActionCodeKernelDeviceOpenError);
+    return;
   }
   if (delegate_) {
     delegate_->SetDownloadStatus(true);  // Set to active.
@@ -127,10 +105,6 @@
     TerminateProcessing();
     return;
   }
-  // DeltaPerformer checks the hashes for delta updates.
-  if (install_plan_.is_full_update) {
-    omaha_hash_calculator_.Update(bytes, length);
-  }
 }
 
 namespace {
@@ -159,36 +133,20 @@
   }
   ActionExitCode code =
       successful ? kActionCodeSuccess : kActionCodeDownloadTransferError;
-  if (code == kActionCodeSuccess) {
-    if (!install_plan_.is_full_update) {
-      code = delta_performer_->VerifyPayload("",
-                                             install_plan_.download_hash,
-                                             install_plan_.size);
-      if (code != kActionCodeSuccess) {
-        LOG(ERROR) << "Download of " << install_plan_.download_url
-                   << " failed due to payload verification error.";
-      } else if (!delta_performer_->GetNewPartitionInfo(
-          &install_plan_.kernel_size,
-          &install_plan_.kernel_hash,
-          &install_plan_.rootfs_size,
-          &install_plan_.rootfs_hash)) {
-        LOG(ERROR) << "Unable to get new partition hash info.";
-        code = kActionCodeDownloadNewPartitionInfoError;
-      }
-    } else {
-      // Makes sure the hash and size are correct for an old-style full update.
-      omaha_hash_calculator_.Finalize();
-      if (omaha_hash_calculator_.hash() != install_plan_.download_hash) {
-        LOG(ERROR) << "Download of " << install_plan_.download_url
-                   << " failed. Expected hash " << install_plan_.download_hash
-                   << " but got hash " << omaha_hash_calculator_.hash();
-        code = kActionCodeDownloadHashMismatchError;
-      } else if (bytes_received_ != install_plan_.size) {
-        LOG(ERROR) << "Download of " << install_plan_.download_url
-                   << " failed. Expected size " << install_plan_.size
-                   << " but got size " << bytes_received_;
-        code = kActionCodeDownloadSizeMismatchError;
-      }
+  if (code == kActionCodeSuccess && delta_performer_.get()) {
+    code = delta_performer_->VerifyPayload("",
+                                           install_plan_.download_hash,
+                                           install_plan_.size);
+    if (code != kActionCodeSuccess) {
+      LOG(ERROR) << "Download of " << install_plan_.download_url
+                 << " failed due to payload verification error.";
+    } else if (!delta_performer_->GetNewPartitionInfo(
+        &install_plan_.kernel_size,
+        &install_plan_.kernel_hash,
+        &install_plan_.rootfs_size,
+        &install_plan_.rootfs_hash)) {
+      LOG(ERROR) << "Unable to get new partition hash info.";
+      code = kActionCodeDownloadNewPartitionInfoError;
     }
   }
 
