diff --git a/core/modules/migrate_drupal_ui/src/Form/CredentialForm.php b/core/modules/migrate_drupal_ui/src/Form/CredentialForm.php
index cd767cc3d1..eafe50b32d 100644
--- a/core/modules/migrate_drupal_ui/src/Form/CredentialForm.php
+++ b/core/modules/migrate_drupal_ui/src/Form/CredentialForm.php
@@ -5,6 +5,8 @@
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\RendererInterface;
 use Drupal\Core\TempStore\PrivateTempStoreFactory;
+use GuzzleHttp\ClientInterface;
+use GuzzleHttp\Exception\TransferException;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -22,16 +24,26 @@ class CredentialForm extends MigrateUpgradeFormBase {
   protected $renderer;
 
   /**
+   * The HTTP client to fetch the feed data with.
+   *
+   * @var \GuzzleHttp\ClientInterface
+   */
+  protected $httpClient;
+
+  /**
    * CredentialForm constructor.
    *
    * @param \Drupal\Core\Render\RendererInterface $renderer
    *   The renderer service.
    * @param \Drupal\Core\TempStore\PrivateTempStoreFactory $tempstore_private
    *   The private tempstore factory.
+   * @param \GuzzleHttp\ClientInterface $http_client
+   *   A Guzzle client object.
    */
-  public function __construct(RendererInterface $renderer, PrivateTempStoreFactory $tempstore_private) {
+  public function __construct(RendererInterface $renderer, PrivateTempStoreFactory $tempstore_private, ClientInterface $http_client) {
     parent::__construct($tempstore_private);
     $this->renderer = $renderer;
+    $this->httpClient = $http_client;
   }
 
   /**
@@ -40,7 +52,8 @@ public function __construct(RendererInterface $renderer, PrivateTempStoreFactory
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('renderer'),
-      $container->get('tempstore.private')
+      $container->get('tempstore.private'),
+      $container->get('http_client')
     );
   }
 
@@ -75,6 +88,11 @@ public function buildForm(array $form, FormStateInterface $form_state) {
 
     $default_options = [];
 
+    $form['help'] = [
+      '#type' => 'item',
+      '#description' => $this->t('Provide the information to access the Drupal site you want to upgrade. Files can be imported into the upgraded site as well.  See the <a href=":url">Upgrade documentation for more detailed instructions</a>.', [':url' => 'https://www.drupal.org/upgrade/migrate']),
+    ];
+
     $form['version'] = [
       '#type' => 'radios',
       '#default_value' => 7,
@@ -177,7 +195,6 @@ public function buildForm(array $form, FormStateInterface $form_state) {
    * {@inheritdoc}
    */
   public function validateForm(array &$form, FormStateInterface $form_state) {
-
     // Retrieve the database driver from the form, use reflection to get the
     // namespace, and then construct a valid database array the same as in
     // settings.php.
@@ -191,25 +208,20 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
     $database['namespace'] = substr($install_namespace, 0, strrpos($install_namespace, '\\'));
     $database['driver'] = $driver;
 
-    // Validate the driver settings and just end here if we have any issues.
-    if ($errors = $drivers[$driver]->validateDatabaseSettings($database)) {
-      foreach ($errors as $name => $message) {
-        $form_state->setErrorByName($name, $message);
-      }
-      return;
-    }
+    $errors = $drivers[$driver]->validateDatabaseSettings($database);
 
     try {
       $connection = $this->getConnection($database);
       $version = (string) $this->getLegacyDrupalVersion($connection);
       if (!$version) {
-        $form_state->setErrorByName($database['driver'] . '][0', $this->t('Source database does not contain a recognizable Drupal version.'));
+        $errors[$database['driver'] . '][database'] = $this->t('Source database does not contain a recognizable Drupal version.');
       }
       elseif ($version !== (string) $form_state->getValue('version')) {
-        $form_state->setErrorByName($database['driver'] . '][0', $this->t('Source database is Drupal version @version but version @selected was selected.', [
-          '@version' => $version,
-          '@selected' => $form_state->getValue('version'),
-        ]));
+        $errors['version'] = $this->t('Source database is Drupal version @version but version @selected was selected.',
+          [
+            '@version' => $version,
+            '@selected' => $form_state->getValue('version'),
+          ]);
       }
       else {
         // Setup migrations and save form data to private store.
@@ -217,13 +229,65 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
       }
     }
     catch (\Exception $e) {
-      $error_message = [
-        '#title' => $this->t('Resolve the issue below to continue the upgrade.'),
-        '#theme' => 'item_list',
-        '#items' => [$e->getMessage()],
-      ];
-      $form_state->setErrorByName($database['driver'] . '][0', $this->renderer->renderPlain($error_message));
+      $errors[$driver] = $e->getMessage();
+    }
+
+    // Check that sources files are available.
+    if ($form_state->getValue('version') === '6') {
+      $sources['d6_source_base_path'] = $form_state->getValue('d6_source_base_path');
+    }
+    else {
+      $sources['source_base_path'] = $form_state->getValue('source_base_path');
+      $sources['source_private_file_path'] = $form_state->getValue('source_private_file_path');
     }
+
+    foreach ($sources as $key => $source) {
+      if ($source) {
+        $parsed_source = parse_url($source);
+        $title = $form['source'][$key]['#title'];
+        $msg = $this->t('Unable to read from @title.', ['@title' => $title]);
+        if (!isset($parsed_source['scheme'])) {
+          if (!file_exists($source) || (!is_dir($source)) || (!is_readable($source))) {
+            $errors[$key] = $msg;
+          }
+        }
+        else {
+          try {
+            $this->httpClient->head($source);
+          }
+          catch (TransferException $e) {
+            $errors[$key] = $msg . ' ' . $e->getMessage();
+          }
+        }
+      }
+    }
+    if ($errors) {
+      $this->buildErrorList($errors, $form_state);
+    }
+  }
+
+  /**
+   * Builds list of errors for display.
+   *
+   * @param array $errors
+   *   Associative array of errors keyed by element name.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The form state.
+   */
+  protected function buildErrorList(array $errors, FormStateInterface $form_state) {
+    $items = [];
+    foreach ($errors as $name => $message) {
+      $form_state->setErrorByName($name);
+      $items[] = $message;
+    }
+
+    $list = [
+      '#title' => $this->t('Resolve all issues below to continue the upgrade.'),
+      '#theme' => 'item_list',
+      '#items' => $items,
+    ];
+    $name = current(array_keys($errors));
+    $form_state->setErrorByName($name . '][0', $this->renderer->renderPlain($list));
   }
 
   /**
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php b/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php
index 6cb10e4f9b..fa880ecccb 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php
@@ -80,6 +80,25 @@ public function testMigrateUpgradeExecute() {
     // Uninstall the module causing the missing module error messages.
     $this->container->get('module_installer')->uninstall(['migration_provider_test'], TRUE);
 
+    // Test the file sources.
+    $this->drupalGet('/upgrade');
+    $this->drupalPostForm(NULL, [], t('Continue'));
+    if ($version == 6) {
+      $paths['d6_source_base_path'] = DRUPAL_ROOT . '/wrong-path';
+    }
+    else {
+      $paths['source_base_path'] = 'https://example.com/wrong-path';
+      $paths['source_private_file_path'] = DRUPAL_ROOT . '/wrong-path';
+    }
+    $this->drupalPostForm(NULL, $paths + $edits, t('Review upgrade'));
+    if ($version == 6) {
+      $session->responseContains('Unable to read from Files directory.');
+    }
+    else {
+      $session->responseContains('Unable to read from Public files directory.');
+      $session->responseContains('Unable to read from Private file directory.');
+    }
+
     // Restart the upgrade process.
     $this->drupalGet('/upgrade');
     $session->responseContains('Upgrade a site by importing its files and the data from its database into a clean and empty new install of Drupal 8.');
