diff --git a/src/Controller/BackupController.php b/src/Controller/BackupController.php
index b2bfade..2119058 100644
--- a/src/Controller/BackupController.php
+++ b/src/Controller/BackupController.php
@@ -91,22 +91,24 @@ class BackupController extends ControllerBase {
     $backup_migrate_destination_id,
     $count = NULL
   ) {
-    // Get a sorted list of files
-    $backups = $destination->queryFiles([], NULL, NULL, $count);
 
+    // Get a sorted list of files
     $rows = [];
     $header = array(
       array(
         'data' => $this->t('Name'),
-        'class' => array(RESPONSIVE_PRIORITY_MEDIUM)
+        'class' => array(RESPONSIVE_PRIORITY_MEDIUM),
+        'field' => 'name'
       ),
       array(
         'data' => $this->t('Date'),
-        'class' => array(RESPONSIVE_PRIORITY_MEDIUM)
+        'class' => array(RESPONSIVE_PRIORITY_MEDIUM),
+        'field' => 'datestamp', 'sort' => 'desc'
       ),
       array(
         'data' => $this->t('Size'),
-        'class' => array(RESPONSIVE_PRIORITY_MEDIUM)
+        'class' => array(RESPONSIVE_PRIORITY_MEDIUM),
+        'field' => 'filesize', 'sort' => 'desc'
       ),
       array(
         'data' => $this->t('Operations'),
@@ -114,6 +116,12 @@ class BackupController extends ControllerBase {
       ),
     );
 
+    $order = tablesort_get_order($header);
+    $sort = tablesort_get_sort($header);
+    $php_sort = $sort == 'desc' ? SORT_DESC : SORT_ASC;
+
+    $backups = $destination->queryFiles([], $order['sql'], $php_sort, $count);
+
     foreach ($backups as $backup_id => $backup) {
       $rows[] = [
         'data' => [
diff --git a/src/Destination/DrupalDirectoryDestination.php b/src/Destination/DrupalDirectoryDestination.php
index 1f847be..47f3708 100644
--- a/src/Destination/DrupalDirectoryDestination.php
+++ b/src/Destination/DrupalDirectoryDestination.php
@@ -7,6 +7,8 @@ use BackupMigrate\Core\Exception\BackupMigrateException;
 use BackupMigrate\Core\File\BackupFileReadableInterface;
 use Drupal\Core\File\FileSystem;
 use Drupal\Core\StreamWrapper\PrivateStream;
+use BackupMigrate\Core\File\ReadableStreamBackupFile;
+
 
 /**
  * Class DrupalDirectoryDestination
@@ -79,4 +81,62 @@ class DrupalDirectoryDestination extends DirectoryDestination {
 
     // @TODO: Warn if the realpath cannot be resolved (because we cannot determine if the file is publicly accessible)
   }
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public function queryFiles(
+    $filters = [],
+    $sort = 'datestamp',
+    $sort_direction = SORT_DESC,
+    $count = 100,
+    $start = 0
+  ) {
+
+    // Get the full list of files.
+    $out = $this->listFiles($count + $start);
+    foreach ($out as $key => $file) {
+      $out[$key] = $this->loadFileMetadata($file);
+    }
+
+    // Filter the output.
+    if ($filters) {
+      $out = array_filter($out, function($file) use ($filters) {
+        foreach ($filters as $key => $value) {
+          if ($file->getMeta($key) !== $value) {
+            return false;
+          }
+        }
+        return true;
+      });
+    }
+
+    // Sort the files.
+    if ($sort && $sort_direction) {
+      uasort($out, function ($a, $b) use ($sort, $sort_direction) {
+        if ($sort_direction == SORT_DESC) {
+          if($sort == 'name') {
+            return $a->getFullName() < $b->getFullName();
+          }
+          //@TODO: fix this in core
+          return $a->getMeta($sort) < $b->getMeta($sort);
+        }
+        else {
+          if($sort == 'name') {
+            return $a->getFullName() > $b->getFullName();
+          }
+          //@TODO: fix this in core
+          return $a->getMeta($sort) > $b->getMeta($sort);
+        }
+      });
+    }
+
+    // Slice the return array.
+    if ($count || $start) {
+      $out = array_slice($out, $start, $count);
+    }
+
+    return $out;
+  }
 }
