diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 2664a42..145c6b0 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -2140,6 +2140,10 @@ function _drupal_bootstrap_configuration() {
     // All Symfony-borrowed code lives in /core/vendor/Symfony.
     'Symfony' => DRUPAL_ROOT . '/core/vendor',
   ));
+  $loader->registerPrefixes(array(
+    // All PEAR-borrowed code lives in /core/vendor/PEAR.
+    'Archive_Tar' => DRUPAL_ROOT . '/core/vendor/PEAR',
+  ));
   // Register the Drupal namespace for classes in core as a fallback.
   // This allows to register additional namespaces within the Drupal namespace
   // (e.g., for modules) and avoids an additional file_exists() on the Drupal
diff --git a/core/includes/archiver.inc b/core/lib/Drupal/Component/Archiver/ArchiverInterface.php
similarity index 77%
rename from core/includes/archiver.inc
rename to core/lib/Drupal/Component/Archiver/ArchiverInterface.php
index 3ce1173..12752e4 100644
--- a/core/includes/archiver.inc
+++ b/core/lib/Drupal/Component/Archiver/ArchiverInterface.php
@@ -2,9 +2,11 @@
 
 /**
  * @file
- * Shared classes and interfaces for the archiver system.
+ * Definition of Drupal\Component\Archiver\ArchiverInterface.
  */
 
+namespace Drupal\Component\Archiver;
+
 /**
  * Defines the common interface for all Archiver classes.
  */
@@ -13,7 +15,7 @@ interface ArchiverInterface {
   /**
    * Constructs a new archiver instance.
    *
-   * @param $file_path
+   * @param string $file_path
    *   The full system path of the archive to manipulate. Only local files
    *   are supported. If the file does not yet exist, it will be created if
    *   appropriate.
@@ -23,11 +25,11 @@ interface ArchiverInterface {
   /**
    * Adds the specified file or directory to the archive.
    *
-   * @param $file_path
+   * @param string $file_path
    *   The full system path of the file or directory to add. Only local files
    *   and directories are supported.
    *
-   * @return ArchiverInterface
+   * @return Drupal\Component\Archiver\ArchiverInterface
    *   The called object.
    */
   public function add($file_path);
@@ -35,10 +37,10 @@ interface ArchiverInterface {
   /**
    * Removes the specified file from the archive.
    *
-   * @param $path
+   * @param string $path
    *   The file name relative to the root of the archive to remove.
    *
-   * @return ArchiverInterface
+   * @return Drupal\Component\Archiver\ArchiverInterface
    *   The called object.
    */
   public function remove($path);
@@ -46,14 +48,14 @@ interface ArchiverInterface {
   /**
    * Extracts multiple files in the archive to the specified path.
    *
-   * @param $path
+   * @param string $path
    *   A full system path of the directory to which to extract files.
-   * @param $files
+   * @param array $files
    *   Optionally specify a list of files to be extracted. Files are
    *   relative to the root of the archive. If not specified, all files
    *   in the archive will be extracted.
    *
-   * @return ArchiverInterface
+   * @return Drupal\Component\Archiver\ArchiverInterface
    *   The called object.
    */
   public function extract($path, array $files = array());
@@ -61,7 +63,7 @@ interface ArchiverInterface {
   /**
    * Lists all files in the archive.
    *
-   * @return
+   * @return array
    *   An array of file names relative to the root of the archive.
    */
   public function listContents();
diff --git a/core/lib/Drupal/Component/Archiver/Tar.php b/core/lib/Drupal/Component/Archiver/Tar.php
new file mode 100644
index 0000000..2543a89
--- /dev/null
+++ b/core/lib/Drupal/Component/Archiver/Tar.php
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Component\Archiver\Tar.
+ */
+
+namespace Drupal\Component\Archiver;
+
+use Archive_Tar;
+
+/**
+ * Defines a archiver implementation for .tar files.
+ */
+class Tar implements ArchiverInterface {
+
+  /**
+   * The underlying Archive_Tar instance that does the heavy lifting.
+   *
+   * @var PEAR\Archive_Tar\Archive_Tar
+   */
+  protected $tar;
+
+  /**
+   * Constructs a Tar object.
+   */
+  public function __construct($file_path) {
+    $this->tar = new Archive_Tar($file_path);
+  }
+
+  /**
+   * Implements Drupal\Component\Archiver\ArchiveInterface::add().
+   */
+  public function add($file_path) {
+    $this->tar->add($file_path);
+
+    return $this;
+  }
+
+  /**
+   * Implements Drupal\Component\Archiver\ArchiveInterface::remove().
+   */
+  public function remove($file_path) {
+    // @todo Archive_Tar doesn't have a remove operation
+    // so we'll have to simulate it somehow, probably by
+    // creating a new archive with everything but the removed
+    // file.
+
+    return $this;
+  }
+
+  /**
+   * Implements Drupal\Component\Archiver\ArchiveInterface::extract().
+   */
+  public function extract($path, array $files = array()) {
+    if ($files) {
+      $this->tar->extractList($files, $path);
+    }
+    else {
+      $this->tar->extract($path);
+    }
+
+    return $this;
+  }
+
+  /**
+   * Implements Drupal\Component\Archiver\ArchiveInterface::listContents().
+   */
+  public function listContents() {
+    $files = array();
+    foreach ($this->tar->listContent() as $file_data) {
+      $files[] = $file_data['filename'];
+    }
+    return $files;
+  }
+
+  /**
+   * Retrieves the tar engine itself.
+   *
+   * In some cases it may be necessary to directly access the underlying
+   * Archive_Tar object for implementation-specific logic. This is for advanced
+   * use only as it is not shared by other implementations of ArchiveInterface.
+   *
+   * @return Archive_Tar
+   *   The Archive_Tar object used by this object.
+   */
+  public function getArchive() {
+    return $this->tar;
+  }
+}
diff --git a/core/lib/Drupal/Component/Archiver/Zip.php b/core/lib/Drupal/Component/Archiver/Zip.php
new file mode 100644
index 0000000..7e9021d
--- /dev/null
+++ b/core/lib/Drupal/Component/Archiver/Zip.php
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Component\Archiver\Zip.
+ */
+
+namespace Drupal\Component\Archiver;
+
+use ZipArchive;
+
+/**
+ * Defines a archiver implementation for .zip files.
+ *
+ * @link http://php.net/zip
+ */
+class Zip implements ArchiverInterface {
+
+  /**
+   * The underlying ZipArchive instance that does the heavy lifting.
+   *
+   * @var ZipArchive
+   */
+  protected $zip;
+
+  /**
+   * Constructs a Tar object.
+   *
+   * @param string $file_path
+   *   The full system path of the archive to manipulate.
+   */
+  public function __construct($file_path) {
+    $this->zip = new ZipArchive();
+    if ($this->zip->open($file_path) !== TRUE) {
+      // @todo: This should be an interface-specific exception some day.
+      throw new Exception(t('Cannot open %file_path', array('%file_path' => $file_path)));
+    }
+  }
+
+  /**
+   * Implements Drupal\Component\Archiver\ArchiveInterface::add().
+   */
+  public function add($file_path) {
+    $this->zip->addFile($file_path);
+
+    return $this;
+  }
+
+  /**
+   * Implements Drupal\Component\Archiver\ArchiveInterface::remove().
+   */
+  public function remove($file_path) {
+    $this->zip->deleteName($file_path);
+
+    return $this;
+  }
+
+  /**
+   * Implements Drupal\Component\Archiver\ArchiveInterface::extract().
+   */
+  public function extract($path, array $files = array()) {
+    if ($files) {
+      $this->zip->extractTo($path, $files);
+    }
+    else {
+      $this->zip->extractTo($path);
+    }
+
+    return $this;
+  }
+
+  /**
+   * Implements Drupal\Component\Archiver\ArchiveInterface::listContents().
+   */
+  public function listContents() {
+    $files = array();
+    for ($i=0; $i < $this->zip->numFiles; $i++) {
+      $files[] = $this->zip->getNameIndex($i);
+    }
+    return $files;
+  }
+
+  /**
+   * Retrieves the zip engine itself.
+   *
+   * In some cases it may be necessary to directly access the underlying
+   * ZipArchive object for implementation-specific logic. This is for advanced
+   * use only as it is not shared by other implementations of ArchiveInterface.
+   *
+   * @return ZipArchive
+   *   The ZipArchive object used by this object.
+   */
+  public function getArchive() {
+    return $this->zip;
+  }
+}
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index e1d5298..81096ab 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -3493,7 +3493,7 @@ function hook_action_info_alter(&$actions) {
 function hook_archiver_info() {
   return array(
     'tar' => array(
-      'class' => 'ArchiverTar',
+      'class' => 'Drupal\Component\Archiver\Tar',
       'extensions' => array('tar', 'tar.gz', 'tar.bz2'),
     ),
   );
diff --git a/core/modules/system/system.archiver.inc b/core/modules/system/system.archiver.inc
deleted file mode 100644
index c37f07d..0000000
--- a/core/modules/system/system.archiver.inc
+++ /dev/null
@@ -1,139 +0,0 @@
-<?php
-
-/**
- * @file
- * Archiver implementations provided by the system module.
- */
-
-/**
- * Archiver for .tar files.
- */
-class ArchiverTar implements ArchiverInterface {
-
-  /**
-   * The underlying Archive_Tar instance that does the heavy lifting.
-   *
-   * @var Archive_Tar
-   */
-  protected $tar;
-
-  public function __construct($file_path) {
-    $this->tar = new Archive_Tar($file_path);
-  }
-
-  public function add($file_path) {
-    $this->tar->add($file_path);
-
-    return $this;
-  }
-
-  public function remove($file_path) {
-    // @todo Archive_Tar doesn't have a remove operation
-    // so we'll have to simulate it somehow, probably by
-    // creating a new archive with everything but the removed
-    // file.
-
-    return $this;
-  }
-
-  public function extract($path, Array $files = array()) {
-    if ($files) {
-      $this->tar->extractList($files, $path);
-    }
-    else {
-      $this->tar->extract($path);
-    }
-
-    return $this;
-  }
-
-  public function listContents() {
-    $files = array();
-    foreach ($this->tar->listContent() as $file_data) {
-      $files[] = $file_data['filename'];
-    }
-    return $files;
-  }
-
-  /**
-   * Retrieve the tar engine itself.
-   *
-   * In some cases it may be necessary to directly access the underlying
-   * Archive_Tar object for implementation-specific logic. This is for advanced
-   * use only as it is not shared by other implementations of ArchiveInterface.
-   *
-   * @return
-   *   The Archive_Tar object used by this object.
-   */
-  public function getArchive() {
-    return $this->tar;
-  }
-}
-
-/**
- * Archiver for .zip files.
- *
- * @link http://php.net/zip
- */
-class ArchiverZip implements ArchiverInterface {
-
-  /**
-   * The underlying ZipArchive instance that does the heavy lifting.
-   *
-   * @var ZipArchive
-   */
-  protected $zip;
-
-  public function __construct($file_path) {
-    $this->zip = new ZipArchive();
-    if ($this->zip->open($file_path) !== TRUE) {
-      // @todo: This should be an interface-specific exception some day.
-      throw new Exception(t('Cannot open %file_path', array('%file_path' => $file_path)));
-    }
-  }
-
-  public function add($file_path) {
-    $this->zip->addFile($file_path);
-
-    return $this;
-  }
-
-  public function remove($file_path) {
-    $this->zip->deleteName($file_path);
-
-    return $this;
-  }
-
-  public function extract($path, Array $files = array()) {
-    if ($files) {
-      $this->zip->extractTo($path, $files);
-    }
-    else {
-      $this->zip->extractTo($path);
-    }
-
-    return $this;
-  }
-
-  public function listContents() {
-    $files = array();
-    for ($i=0; $i < $this->zip->numFiles; $i++) {
-      $files[] = $this->zip->getNameIndex($i);
-    }
-    return $files;
-  }
-
-  /**
-   * Retrieve the zip engine itself.
-   *
-   * In some cases it may be necessary to directly access the underlying
-   * ZipArchive object for implementation-specific logic. This is for advanced
-   * use only as it is not shared by other implementations of ArchiveInterface.
-   *
-   * @return
-   *   The ZipArchive object used by this object.
-   */
-  public function getArchive() {
-    return $this->zip;
-  }
-}
diff --git a/core/modules/system/system.info b/core/modules/system/system.info
index d95d561..cb36339 100644
--- a/core/modules/system/system.info
+++ b/core/modules/system/system.info
@@ -3,10 +3,8 @@ description = Handles general site configuration for administrators.
 package = Core
 version = VERSION
 core = 8.x
-files[] = system.archiver.inc
 files[] = system.mail.inc
 files[] = system.queue.inc
-files[] = system.tar.inc
 files[] = system.test
 required = TRUE
 configure = admin/config/system
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 469f996..4546e05 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -3949,12 +3949,12 @@ function system_date_format_delete($dfid) {
  */
 function system_archiver_info() {
   $archivers['tar'] = array(
-    'class' => 'ArchiverTar',
+    'class' => 'Drupal\Component\Archiver\Tar',
     'extensions' => array('tar', 'tgz', 'tar.gz', 'tar.bz2'),
   );
   if (function_exists('zip_open')) {
     $archivers['zip'] = array(
-      'class' => 'ArchiverZip',
+      'class' => 'Drupal\Component\Archiver\Zip',
       'extensions' => array('zip'),
     );
   }
diff --git a/core/modules/update/tests/update_test.module b/core/modules/update/tests/update_test.module
index e7ee43e..312a6dd 100644
--- a/core/modules/update/tests/update_test.module
+++ b/core/modules/update/tests/update_test.module
@@ -121,7 +121,7 @@ function update_test_archiver_info() {
   return array(
     'update_test_archiver' => array(
       // This is bogus, we only care about the extensions for now.
-      'class' => 'ArchiverUpdateTest',
+      'class' => 'Drupal\Component\Archiver\UpdateTest',
       'extensions' => array('update-test-extension'),
     ),
   );
diff --git a/core/modules/system/system.tar.inc b/core/vendor/PEAR/Archive/Tar.php
similarity index 100%
rename from core/modules/system/system.tar.inc
rename to core/vendor/PEAR/Archive/Tar.php
