diff --git a/src/Controller/UwDownloadCsvController.php b/src/Controller/UwDownloadCsvController.php
new file mode 100644
index 0000000000000000000000000000000000000000..8cb5a23e008a0348e19b52036b33c23b8bae2294
--- /dev/null
+++ b/src/Controller/UwDownloadCsvController.php
@@ -0,0 +1,121 @@
+<?php
+
+namespace Drupal\uw_cfg_common\Controller;
+
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\path_alias\AliasManager;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Provides CSV files for specific UW sites.
+ */
+class UwDownloadCsvController extends ControllerBase{
+
+  /**
+   * Entity type manager from the core.
+   *
+   * @var Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * @var \Drupal\path_alias\AliasManager
+   *   The path alias.
+   */
+  protected $pathAlias;
+
+  /**
+   * CSV Report constructor.
+   *
+   * @param Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
+   *   The entity type manager.
+   * @param Drupal\path_alias\AliasManager $pathAlias
+   *   The path alias.
+   */
+  public function __construct(
+    EntityTypeManagerInterface $entityTypeManager,
+    AliasManager $pathAlias
+  ) {
+    $this->entityTypeManager = $entityTypeManager;
+    $this->pathAlias = $pathAlias;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('entity_type.manager'),
+      $container->get('path_alias.manager')
+    );
+  }
+
+  /**
+   * Provides a CSV file for content on a site.
+   *
+   * @return Response
+   *   The page response.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
+   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
+   */
+  public function uwContentReport() {
+
+    // Get all the nodes.
+    $nodes = $this->entityTypeManager->getStorage('node')->loadMultiple();
+
+    // Just in case there are no nodes, there should always
+    // be a home page though, this is just to ensure no errors.
+    $response = NULL;
+
+    if ($nodes) {
+
+      // The header of the CSV.
+      $data = [
+        $this->t('Node ID'),
+        $this->t('Title'),
+        $this->t('Content type'),
+        $this->t('Path'),
+        $this->t('Published'),
+        $this->t('Created'),
+        $this->t('Last updated'),
+      ];
+
+      // Put header for CSV into format to be used in CSV.
+      $rows[] = implode(',', $data);
+
+      // Step through each of the nodes and get the info.
+      foreach ($nodes as $node) {
+
+        // Pull out the info about the node.
+        $data = [
+          'nid' => $node->id(),
+          'title' => '"' . $node->getTitle() . '"',
+          'type' => $node->type->entity->label(),
+          'path' => $this->pathAlias->getAliasByPath('/node/' . $node->id()),
+          'published' => $node->status->value,
+          'created' => date('Y-d-m G:i', $node->getCreatedTime()),
+          'updated' => date('Y-d-m G:i', $node->getChangedTime()),
+        ];
+
+        // Store the node info for use later in the CSV.
+        $rows[] = implode(',', $data);
+      }
+
+      // Put the info into a large CSV format.
+      $content = implode("\n", $rows);
+
+      // Create the response for the CSV page.
+      $response = new Response($content);
+
+      // Set the headers for the CSV.
+      $response->headers->set('Content-Type', 'text/csv');
+      $response->headers->set('Content-Disposition', 'attachment; filename="content_report.csv"');
+    }
+
+    return $response;
+  }
+
+}
diff --git a/uw_cfg_common.routing.yml b/uw_cfg_common.routing.yml
index 28c3b4ca13ae22f53f9bcd0a1a28276cfc422290..ebab60655947fc3177c6738f777bc8b1086e3238 100644
--- a/uw_cfg_common.routing.yml
+++ b/uw_cfg_common.routing.yml
@@ -34,3 +34,11 @@ uw_cfg_common.content_type_usage_page:
     _title: 'Content type Use'
   requirements:
     _permission: 'access content'
+uw_cfg_common.uw_content_report_csv:
+  path: '/admin/reports/uw_content_report_csv'
+  defaults:
+    _title: 'Download Customers'
+    _controller: \Drupal\uw_cfg_common\Controller\UwDownloadCsvController::uwContentReport
+  requirements:
+    _permission: 'access content'
+