diff --git a/includes/index_entity.inc b/includes/index_entity.inc
index d36b2f8..3ee9d0e 100644
--- a/includes/index_entity.inc
+++ b/includes/index_entity.inc
@@ -760,7 +760,19 @@ class SearchApiIndex extends Entity {
     // Otherwise, we have to compute the result.
     if (empty($this->fields[$only_indexed][$get_additional])) {
       $fields = empty($this->options['fields']) ? array() : $this->options['fields'];
-      $wrapper = $this->entityWrapper();
+      // It might turn out that the module providing custom datasource
+      // controller was disabled, but the index still exists - in such a case
+      // we're going to get an exception here.
+      try {
+        $wrapper = $this->entityWrapper();
+      }
+      catch (SearchApiException $e) {
+        watchdog('search_api_views', 'Unable to create entity wrapper for index !index: !msg', array(
+          '!index' => $this->name,
+          '!msg' => $e->getMessage(),
+        ), WATCHDOG_ERROR);
+        return;
+      }
       $additional = array();
       $entity_types = entity_get_info();
 
diff --git a/search_api.admin.inc b/search_api.admin.inc
index 48e0aeb..6a0d754 100644
--- a/search_api.admin.inc
+++ b/search_api.admin.inc
@@ -731,8 +731,14 @@ function theme_search_api_index(array $variables) {
   $output .= '<dd>' . check_plain($machine_name) . '</dd>' . "\n";
 
   $output .= '<dt>' . t('Item type') . '</dt>' . "\n";
-  $type = search_api_get_item_type_info($item_type);
-  $type = $type['name'];
+  if ($type = search_api_get_item_type_info($item_type)) {
+    $type = $type['name'];
+  }
+  // Return at least the original item type machine name if the definition
+  // of item is not available (for example module providing it was disabled).
+  else {
+    $type = $item_type;
+  }
   $output .= '<dd>' . check_plain($type) . '</dd>' . "\n";
 
   if (!empty($description)) {
@@ -1500,98 +1506,100 @@ function search_api_admin_index_fields(array $form, array &$form_state, SearchAp
     $form['description']['#description'] .= '<p>' . t('Check the <a href="@server-url">' . "server's</a> service class description for details.",
         array('@server-url' => url('admin/config/search/search_api/server/' . $index->server))) . '</p>';
   }
-  foreach ($fields as $key => $info) {
-    $form['fields'][$key]['title']['#markup'] = check_plain($info['name']);
-    if (search_api_is_list_type($info['type'])) {
-      $form['fields'][$key]['title']['#markup'] .= ' <sup><a href="#note-multi-valued" class="note-ref">1</a></sup>';
-      $multi_valued_field_present = TRUE;
-    }
-    $form['fields'][$key]['machine_name']['#markup'] = check_plain($key);
-    if (isset($info['description'])) {
-      $form['fields'][$key]['description'] = array(
-        '#type' => 'value',
-        '#value' => $info['description'],
+  if (!empty($fields)) {
+    foreach ($fields as $key => $info) {
+      $form['fields'][$key]['title']['#markup'] = check_plain($info['name']);
+      if (search_api_is_list_type($info['type'])) {
+        $form['fields'][$key]['title']['#markup'] .= ' <sup><a href="#note-multi-valued" class="note-ref">1</a></sup>';
+        $multi_valued_field_present = TRUE;
+      }
+      $form['fields'][$key]['machine_name']['#markup'] = check_plain($key);
+      if (isset($info['description'])) {
+        $form['fields'][$key]['description'] = array(
+          '#type' => 'value',
+          '#value' => $info['description'],
+        );
+      }
+      $form['fields'][$key]['indexed'] = array(
+        '#type' => 'checkbox',
+        '#default_value' => $info['indexed'],
       );
-    }
-    $form['fields'][$key]['indexed'] = array(
-      '#type' => 'checkbox',
-      '#default_value' => $info['indexed'],
-    );
-    if (empty($info['entity_type'])) {
-      // Determine the correct type options (i.e., with the correct nesting level).
-      $level = search_api_list_nesting_level($info['type']);
-      if (empty($types[$level])) {
-        $type_prefix = str_repeat('list<', $level);
-        $type_suffix = str_repeat('>', $level);
-        $types[$level] = array();
-        foreach ($types[0] as $type => $name) {
-          // We use the singular name for list types, since the user usually doesn't care about the nesting level.
-          $types[$level][$type_prefix . $type . $type_suffix] = $name;
+      if (empty($info['entity_type'])) {
+        // Determine the correct type options (i.e., with the correct nesting level).
+        $level = search_api_list_nesting_level($info['type']);
+        if (empty($types[$level])) {
+          $type_prefix = str_repeat('list<', $level);
+          $type_suffix = str_repeat('>', $level);
+          $types[$level] = array();
+          foreach ($types[0] as $type => $name) {
+            // We use the singular name for list types, since the user usually doesn't care about the nesting level.
+            $types[$level][$type_prefix . $type . $type_suffix] = $name;
+          }
+          $fulltext_type[$level] = $type_prefix . 'text' . $type_suffix;
         }
-        $fulltext_type[$level] = $type_prefix . 'text' . $type_suffix;
-      }
-      $css_key = '#edit-fields-' . drupal_clean_css_identifier($key);
-      $form['fields'][$key]['type'] = array(
-        '#type' => 'select',
-        '#options' => $types[$level],
-        '#default_value' => isset($info['real_type']) ? $info['real_type'] : $info['type'],
-        '#states' => array(
-          'visible' => array(
-            $css_key . '-indexed' => array('checked' => TRUE),
+        $css_key = '#edit-fields-' . drupal_clean_css_identifier($key);
+        $form['fields'][$key]['type'] = array(
+          '#type' => 'select',
+          '#options' => $types[$level],
+          '#default_value' => isset($info['real_type']) ? $info['real_type'] : $info['type'],
+          '#states' => array(
+            'visible' => array(
+              $css_key . '-indexed' => array('checked' => TRUE),
+            ),
           ),
-        ),
-      );
-      $form['fields'][$key]['boost'] = array(
-        '#type' => 'select',
-        '#options' => $boosts,
-        '#default_value' => $info['boost'],
-        '#states' => array(
-          'visible' => array(
-            $css_key . '-indexed' => array('checked' => TRUE),
-            $css_key . '-type' => array('value' => $fulltext_type[$level]),
+        );
+        $form['fields'][$key]['boost'] = array(
+          '#type' => 'select',
+          '#options' => $boosts,
+          '#default_value' => $info['boost'],
+          '#states' => array(
+            'visible' => array(
+              $css_key . '-indexed' => array('checked' => TRUE),
+              $css_key . '-type' => array('value' => $fulltext_type[$level]),
+            ),
           ),
-        ),
-      );
-    }
-    else {
-      // This is an entity.
-      $label = $entity_types[$info['entity_type']]['label'];
-      if (!isset($entity_description_added)) {
-        $form['description']['#description'] .= '<p>' .
-            t('Note that indexing an entity-valued field (like %field, which has type %type) directly will only index the entity ID. ' .
-            'This will be used for filtering and also sorting (which might not be what you expect). ' .
-            'The entity label will usually be used when displaying the field, though. ' .
-            'Use the "Add related fields" option at the bottom for indexing other fields of related entities.',
-            array('%field' => $info['name'], '%type' => $label)) . '</p>';
-        $entity_description_added = TRUE;
+        );
+      }
+      else {
+        // This is an entity.
+        $label = $entity_types[$info['entity_type']]['label'];
+        if (!isset($entity_description_added)) {
+          $form['description']['#description'] .= '<p>' .
+              t('Note that indexing an entity-valued field (like %field, which has type %type) directly will only index the entity ID. ' .
+              'This will be used for filtering and also sorting (which might not be what you expect). ' .
+              'The entity label will usually be used when displaying the field, though. ' .
+              'Use the "Add related fields" option at the bottom for indexing other fields of related entities.',
+              array('%field' => $info['name'], '%type' => $label)) . '</p>';
+          $entity_description_added = TRUE;
+        }
+        $form['fields'][$key]['type'] = array(
+          '#type' => 'value',
+          '#value' => $info['type'],
+        );
+        $form['fields'][$key]['entity_type'] = array(
+          '#type' => 'value',
+          '#value' => $info['entity_type'],
+        );
+        $form['fields'][$key]['type_name'] = array(
+          '#markup' => check_plain($label),
+        );
+        $form['fields'][$key]['boost'] = array(
+          '#type' => 'value',
+          '#value' => $info['boost'],
+        );
+        $form['fields'][$key]['boost_text'] = array(
+          '#markup' => '&nbsp;',
+        );
+      }
+      if ($key == 'search_api_language') {
+        // Is treated specially to always index the language.
+        $form['fields'][$key]['type']['#default_value'] = 'string';
+        $form['fields'][$key]['type']['#disabled'] = TRUE;
+        $form['fields'][$key]['boost']['#default_value'] = '1.0';
+        $form['fields'][$key]['boost']['#disabled'] = TRUE;
+        $form['fields'][$key]['indexed']['#default_value'] = 1;
+        $form['fields'][$key]['indexed']['#disabled'] = TRUE;
       }
-      $form['fields'][$key]['type'] = array(
-        '#type' => 'value',
-        '#value' => $info['type'],
-      );
-      $form['fields'][$key]['entity_type'] = array(
-        '#type' => 'value',
-        '#value' => $info['entity_type'],
-      );
-      $form['fields'][$key]['type_name'] = array(
-        '#markup' => check_plain($label),
-      );
-      $form['fields'][$key]['boost'] = array(
-        '#type' => 'value',
-        '#value' => $info['boost'],
-      );
-      $form['fields'][$key]['boost_text'] = array(
-        '#markup' => '&nbsp;',
-      );
-    }
-    if ($key == 'search_api_language') {
-      // Is treated specially to always index the language.
-      $form['fields'][$key]['type']['#default_value'] = 'string';
-      $form['fields'][$key]['type']['#disabled'] = TRUE;
-      $form['fields'][$key]['boost']['#default_value'] = '1.0';
-      $form['fields'][$key]['boost']['#disabled'] = TRUE;
-      $form['fields'][$key]['indexed']['#default_value'] = 1;
-      $form['fields'][$key]['indexed']['#disabled'] = TRUE;
     }
   }
 
@@ -1757,33 +1765,38 @@ function _search_api_admin_get_fields(SearchApiIndex $index, EntityMetadataWrapp
  */
 function theme_search_api_admin_fields_table($variables) {
   $form = $variables['element'];
-  $header = array(t('Field'), t('Machine name'), t('Indexed'), t('Type'), t('Boost'));
-
-  $rows = array();
-  foreach (element_children($form['fields']) as $name) {
-    $row = array();
-    foreach (element_children($form['fields'][$name]) as $field) {
-      if ($cell = render($form['fields'][$name][$field])) {
-        $row[] = $cell;
-      }
-    }
-    if (empty($form['fields'][$name]['description']['#value'])) {
-      $rows[] = $row;
-    }
-    else {
-      $rows[] = array(
-        'data' => $row,
-        'title' => strip_tags($form['fields'][$name]['description']['#value']),
-      );
-    }
-  }
 
   $note = isset($form['note']) ? $form['note'] : '';
   $submit = $form['submit'];
   $additional = isset($form['additional']) ? $form['additional'] : FALSE;
   unset($form['note'], $form['submit'], $form['additional']);
+
   $output = drupal_render_children($form);
-  $output .= theme('table', array('header' => $header, 'rows' => $rows));
+
+  if (!empty($form['fields'])) {
+    $header = array(t('Field'), t('Machine name'), t('Indexed'), t('Type'), t('Boost'));
+
+    $rows = array();
+    foreach (element_children($form['fields']) as $name) {
+      $row = array();
+      foreach (element_children($form['fields'][$name]) as $field) {
+        if ($cell = render($form['fields'][$name][$field])) {
+          $row[] = $cell;
+        }
+      }
+      if (empty($form['fields'][$name]['description']['#value'])) {
+        $rows[] = $row;
+      }
+      else {
+        $rows[] = array(
+          'data' => $row,
+          'title' => strip_tags($form['fields'][$name]['description']['#value']),
+        );
+      }
+    }
+    $output .= theme('table', array('header' => $header, 'rows' => $rows));
+  }
+
   $output .= render($note);
   $output .= render($submit);
   if ($additional) {
diff --git a/search_api.module b/search_api.module
index 0c2e024..440e1fb 100644
--- a/search_api.module
+++ b/search_api.module
@@ -2155,7 +2155,15 @@ function search_api_index_load_multiple($ids = array(), $conditions = array(), $
  *   - total: The total number of items that have to be indexed for this index.
  */
 function search_api_index_status(SearchApiIndex $index) {
-  return $index->datasource()->getIndexStatus($index);
+  try {
+    return $index->datasource()->getIndexStatus($index);
+  }
+  catch (SearchApiException $e) {
+    watchdog('search_api_views', 'Unable to get index status for index !index: !msg', array(
+      '!index' => $index->name,
+      '!msg' => $e->getMessage(),
+    ), WATCHDOG_ERROR);
+  }
 }
 
 /**
