diff --git a/upgrade_assist/upgrade_assist.module b/upgrade_assist/upgrade_assist.module
index 145515e..26efe4b 100644
--- a/upgrade_assist/upgrade_assist.module
+++ b/upgrade_assist/upgrade_assist.module
@@ -238,16 +238,17 @@ function upgrade_assist_states($item_list = FALSE) {
     'href' => 'upgrade/assist/upgrade_assist_download_projects',
   );
 
-  // @todo Demo module is not as smart as Upgrade Assist ;)
+  // Auto-enable Demo module.
   if ($module_files_upgraded && !module_exists('demo')) {
-    system_rebuild_module_data();
     switch ($core) {
       case 7:
-        $demo_info = db_query('SELECT info FROM {system} WHERE name = :name', array(':name' => 'demo'))->fetchField();
-        $demo_info = unserialize($demo_info);
+        $modules = system_rebuild_module_data();
+        if (isset($modules['demo'])) {
+          $demo_info = $modules['demo']->info;
+        }
         break;
     }
-    if ($demo_info['core'] == DRUPAL_CORE_COMPATIBILITY) {
+    if (isset($demo_info['core']) && $demo_info['core'] == DRUPAL_CORE_COMPATIBILITY) {
       module_enable(array('demo'));
       drupal_flush_all_caches();
     }
@@ -280,6 +281,19 @@ function upgrade_assist_states($item_list = FALSE) {
     'href' => 'upgrade/assist/upgrade_assist_enable_modules',
   );
 
+  $states['backup-post-upgrade-modules'] = array(
+    'title' => t('Backup current site'),
+    'phase' => 'post-upgrade',
+    'status' => NULL,
+  );
+  if (module_exists('demo')) {
+    // @todo Add drupal_alter() and move into Demo module.
+    module_load_include('inc', 'demo', 'demo.admin');
+    $fileconfig = demo_get_fileconfig('post-upgrade-modules');
+    $states['backup-pre-upgrade-modules']['status'] = file_exists($fileconfig['sqlfile']);
+    $states['backup-pre-upgrade-modules']['href'] = 'upgrade/assist/upgrade_assist_backup_current/post-upgrade-modules';
+  }
+
   $status = FALSE;
   if ($modules_upgraded === TRUE) {
     // Don't perform duplicate checks on admin/reports/status.
@@ -381,7 +395,7 @@ function upgrade_assist_block_list() {
     'info' => t('Upgrade tasks'),
     'region' => 'left',
     'status' => 1,
-    'weight' => -10,
+    'weight' => -50,
   );
   return $blocks;
 }
@@ -504,17 +518,13 @@ function upgrade_assist_disable_modules() {
     }
     // Only enabled modules can be disabled.
     if ($module->status) {
-      $form['#modules'][$module->name] = array(
-        'name' => $module->info['name'],
-        'project' => $module->info['project'],
-      );
+      $form['#modules'][$module->name]['name'] = $module->info['name'];
       // @todo Make use of Upgrade Status information, if available. We are only
       //   interested in projects that are actually available for the new
       //   version. Thus, add project title + recommended release info.
       if (isset($module->info['project'])) {
-        $form['#projects'][$module->name] = array(
-          'project' => $module->info['project'],
-        );
+        $form['#modules'][$module->name]['project'] = $module->info['project'];
+        $form['#projects'][$module->name]['project'] = $module->info['project'];
       }
       // Skip Upgrade Assist and its dependencies. We need their module and
       // project info though.
@@ -611,13 +621,7 @@ function upgrade_assist_download_projects() {
 
   $projects = variable_get('upgrade_assist_projects', array());
 
-  /* @todo Does drush have a maximum arguments limit?
-  $drush = '';
-  foreach (array_chunk($projects, 6) as $drush_args) {
-    $drush .= 'drush dl ' . implode(' ', $drush_args) . "\n";
-  }
-  */
-  $drush = 'drush dl --delete ' . implode(' ', array_keys($projects));
+  $drush = 'drush dl ' . implode(' ', array_keys($projects));
 
   $project_links = array();
   foreach ($projects as $name => $project) {
@@ -642,7 +646,7 @@ function upgrade_assist_download_projects() {
 <pre class="command">
 @drush-commands
 </pre>
-The <code>--delete</code> option may not be supported yet. In that case, you have to delete directories manually, but <strong>only</strong> those that will be replaced.', array(
+', array(
         '!drush' => l('Drush', 'http://drupal.org/project/drush', array('attributes' => array('target' => '_blank'))),
         '@drush-commands' => $drush,
       )),
@@ -664,9 +668,13 @@ function upgrade_assist_enable_modules() {
 
   $disabled_modules = variable_get('upgrade_assist_modules_disabled', array());
 
-  $options = array();
-  $all_modules = db_query("SELECT * FROM {system} WHERE type = 'module'")->fetchAllAssoc('name');
-  foreach ($all_modules as $module) {
+  $form['enable'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Modules to re-enable'),
+    '#options' => array(),
+  );
+  $all_modules = system_rebuild_module_data();
+  foreach ($all_modules as $name => $module) {
     $module->info = unserialize($module->info);
     // Skip required core modules and hidden modules.
     if (!empty($module->info['required']) || !empty($module->info['hidden'])) {
@@ -681,34 +689,36 @@ function upgrade_assist_enable_modules() {
       continue;
     }
     // Skip already enabled modules and not previously disabled modules.
-    if ($module->status || !isset($disabled_modules[$module->name])) {
+    if ($module->status || !isset($disabled_modules[$name])) {
       continue;
     }
-    // Dependencies need to exist.
-    $dependencies = TRUE;
-    if (isset($module->info['dependencies'])) {
-      foreach ($module->info['dependencies'] as $required) {
-        if (!isset($all_modules[$required])) {
-          $dependencies = FALSE;
-          break;
-        }
+    $form['enable']['#options'][$module->name] = t('@project: @name', array(
+      '@project' => isset($module->info['project']) ? $module->info['project'] : t('Unknown'),
+      '@name' => $module->info['name'],
+    ));
+    // Add "Required by" information to dependents.
+    if (!empty($module->required_by)) {
+      $form['enable']['#options'][$module->name]['#description'] = t('Required by: %module-list', array(
+        '%module-list' => implode(', ', $module->required_by),
+      ));
+    }
+    // Dependencies need to exist and be enabled.
+    $dependencies_exist = TRUE;
+    foreach ($module->requires as $required) {
+      if (!isset($all_modules[$required]) || empty($all_modules[$required]->status)) {
+        $dependencies_exist = FALSE;
+        break;
       }
     }
-    if ($dependencies) {
-      $options[$module->name] = t('@project: @name', array(
-        '@project' => isset($module->info['project']) ? $module->info['project'] : t('Unknown'),
-        '@name' => $module->info['name'],
-      ));
+    if (!$dependencies_exist) {
+      $form['enable']['#options'][$module->name]['#disabled'] = TRUE;
     }
   }
-  // Sort options by label.
-  asort($options);
-  $form['enable'] = array(
-    '#type' => 'checkboxes',
-    '#title' => t('Modules to re-enable'),
-    '#options' => $options,
-  );
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Re-enable'));
+  // Sort options by label (project names first, module names second).
+  asort($form['enable']['#options']);
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Re-enable'));
   return $form;
 }
 
@@ -729,6 +739,8 @@ function upgrade_assist_enable_modules_validate($form, &$form_state) {
       variable_set('upgrade_assist_modules_disabled', $module_info);
 
       drupal_set_message(t('The selected modules have been re-enabled.'));
+      // Allow to move on to status report.
+      variable_set('upgrade_assist_modules_enabled', TRUE);
     }
     else {
       form_set_error('enable', t('The selected modules could not be re-enabled.'));
