diff --git search_api.admin.inc search_api.admin.inc
index 43cac9b..835454f 100644
--- search_api.admin.inc
+++ search_api.admin.inc
@@ -11,17 +11,18 @@ function search_api_admin_overview() {
   $header = array(
     // @todo Wait for http://drupal.org/node/109493
 //    array('data' => t('Status'), 'field' => 'enabled', 'descending' => TRUE, 'sort' => 'desc'),
-    array('data' => t('Status'), 'field' => 'enabled', 'sort' => 'desc'),
+    array('data' => t('Status'), 'field' => 'enabled'),
     array('data' => t('Type'), 'colspan' => 2),
     array('data' => t('Name'), 'field' => 'name'),
     array('data' => t('Operations'), 'colspan' => 3),
   );
 
-  $servers = search_api_list_servers(FALSE, $header);
-  $all_indexes = search_api_list_indexes(array('only_enabled' => FALSE), $header);
+  $servers = search_api_list_servers(FALSE);
+  $all_indexes = search_api_list_indexes();
+
   $indexes = array();
   foreach ($all_indexes as $index) {
-    $indexes[$index->server][$index->id] = $index;
+    $indexes[$index->server][$index->machine_name] = $index;
   }
 
   $rows = array();
@@ -52,7 +53,7 @@ function search_api_admin_overview() {
   $edit = '/edit';
   $delete = '/delete';
   foreach ($servers as $server) {
-    $url = $pre . $server->id;
+    $url = $pre . $server->machine_name;
     $rows[] = array(
       $server->enabled ? $t_enabled : $t_disabled,
       $t_server,
@@ -61,8 +62,8 @@ function search_api_admin_overview() {
       l($t_edit, $url . $edit),
       l($t_delete, $url . $delete),
     );
-    if (!empty($indexes[$server->id])) {
-      foreach ($indexes[$server->id] as $index) {
+    if (!empty($indexes[$server->machine_name])) {
+      foreach ($indexes[$server->machine_name] as $index) {
         $url = $pre_index . $index->id;
         $rows[] = array(
           $index->enabled ? $t_enabled : $t_disabled,
@@ -300,13 +301,13 @@ function search_api_admin_server_view(SearchApiServer $server = NULL, $action =
 
   if (!empty($action)) {
     if ($action == 'enable') {
-      if (search_api_server_enable($server->id)) {
+      if (search_api_server_enable($server->machine_name)) {
         drupal_set_message(t('The server was successfully enabled.'));
       }
       else {
         drupal_set_message(t('The server could not be enabled. Check the logs for details.'), 'error');
       }
-      drupal_goto('admin/config/search/search_api/server/' . $server->id);
+      drupal_goto('admin/config/search/search_api/server/' . $server->machine_name);
     }
     else {
       $ret = drupal_get_form('search_api_admin_confirm', 'server', $action, $server);
@@ -321,7 +322,7 @@ function search_api_admin_server_view(SearchApiServer $server = NULL, $action =
   $options = $server->view();
   return array(
     '#theme' => 'search_api_server',
-    '#id' => $server->id,
+    '#id' => $server->machine_name,
     '#name' => $server->name,
     '#machine_name' => $server->machine_name,
     '#description' => $server->description,
@@ -426,9 +427,9 @@ function search_api_admin_server_edit(array $form, array &$form_state, SearchApi
   $form['options']['#title'] = $class['name'];
   $form['options']['#description'] = $class['description'];
 
-  $form['id'] = array(
+  $form['machine_name'] = array(
     '#type' => 'value',
-    '#value' => $server->id,
+    '#value' => $server->machine_name,
   );
 
   $form['submit'] = array(
@@ -455,8 +456,8 @@ function search_api_admin_server_edit_submit(array $form, array &$form_state) {
   form_state_values_clean($form_state);
 
   $values = $form_state['values'];
-  $id = $values['id'];
-  unset($values['id']);
+  $id = $values['machine_name'];
+  unset($values['machine_name']);
 
   if (isset($values['options'])) {
     $server = $values['options']['server'];
@@ -546,12 +547,12 @@ function search_api_admin_add_index(array $form, array &$form_state) {
   // List enabled servers first.
   foreach ($servers as $server) {
     if ($server->enabled) {
-      $form['server']['#options'][$server->id] = $server->name;
+      $form['server']['#options'][$server->machine_name] = $server->name;
     }
   }
   foreach ($servers as $server) {
     if (!$server->enabled) {
-      $form['server']['#options'][$server->id] = $server->name . ' (' . t('disabled') . ')';
+      $form['server']['#options'][$server->machine_name] = $server->name . ' (' . t('disabled') . ')';
     }
   }
   $form['cron_limit'] = array(
@@ -707,7 +708,7 @@ function theme_search_api_index(array $variables) {
 
   if (!empty($server)) {
     $output .= '<dt>' . t('Server') . '</dt>' . "\n";
-    $output .= '<dd>' . l($server->name, 'admin/config/search/search_api/server/' . $server->id);
+    $output .= '<dd>' . l($server->name, 'admin/config/search/search_api/server/' . $server->machine_name);
     if (!empty($server->description)) {
       $output .= '<p class="description">' . nl2br(check_plain($server->description)) . '</p>';
     }
@@ -766,9 +767,9 @@ function search_api_admin_index_status_form(array $form, array &$form_state, Sea
   $server = $index->server();
 
   $form['#attached']['css'][] = drupal_get_path('module', 'search_api') . '/search_api.admin.css';
-  $form['id'] = array(
+  $form['machine_name'] = array(
     '#type' => 'value',
-    '#value' => $index->id,
+    '#value' => $index->machine_name,
   );
 
   $form['status_message'] = array(
@@ -882,7 +883,7 @@ function search_api_admin_index_status_form_validate(array $form, array &$form_s
 function search_api_admin_index_status_form_submit(array $form, array &$form_state) {
   $redirect = &$form_state['redirect'];
   $values = $form_state['values'];
-  $id = $values['id'];
+  $id = $values['machine_name'];
   $base = 'admin/config/search/search_api';
   $pre = $base . '/index/' . $id;
   switch ($values['op']) {
@@ -970,12 +971,12 @@ function search_api_admin_index_edit(array $form, array &$form_state, SearchApiI
   // List enabled servers first.
   foreach ($servers as $server) {
     if ($server->enabled) {
-      $form['server']['#options'][$server->id] = $server->name;
+      $form['server']['#options'][$server->machine_name] = $server->name;
     }
   }
   foreach ($servers as $server) {
     if (!$server->enabled) {
-      $form['server']['#options'][$server->id] =  t('@server_name (disabled)', array('@server_name' => $server->name));
+      $form['server']['#options'][$server->machine_name] =  t('@server_name (disabled)', array('@server_name' => $server->name));
     }
   }
   $form['cron_limit'] = array(
@@ -988,9 +989,9 @@ function search_api_admin_index_edit(array $form, array &$form_state, SearchApiI
     '#attributes' => array('class' => array('search-api-cron-limit')),
   );
 
-  $form['id'] = array(
+  $form['machine_name'] = array(
     '#type' => 'value',
-    '#value' => $index->id,
+    '#value' => $index->machine_name,
   );
 
   $form['submit'] = array(
@@ -1019,14 +1020,14 @@ function search_api_admin_index_edit_submit(array $form, array &$form_state) {
   form_state_values_clean($form_state);
 
   $values = $form_state['values'];
-  $index = search_api_index_load($values['id']);
+  $index = search_api_index_load($values['machine_name']);
   $values['options'] = $index->options;
   $values['options']['cron_limit'] = $values['cron_limit'];
   unset($values['cron_limit']);
-  unset($values['id']);
+  unset($values['machine_name']);
 
-  $ret = search_api_index_edit($index->id, $values);
-  $form_state['redirect'] = 'admin/config/search/search_api/index/' . $index->id;
+  $ret = search_api_index_edit($index->machine_name, $values);
+  $form_state['redirect'] = 'admin/config/search/search_api/index/' . $index->machine_name;
   if ($ret) {
     drupal_set_message(t('The search index was successfully edited.'));
   }
@@ -1199,7 +1200,7 @@ function search_api_admin_index_workflow(array $form, array &$form_state, Search
     }
   }
 
-  $form['id'] = array('#type' => 'value', '#value' => $index->id);
+  $form['machine_name'] = array('#type' => 'value', '#value' => $index->machine_name);
   $form['actions'] = array('#type' => 'actions');
   $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
 
@@ -1240,7 +1241,7 @@ function theme_search_api_admin_item_order(array $variables) {
 function search_api_admin_index_workflow_submit(array $form, array &$form_state) {
   $values = $form_state['values'];
   unset($values['processors']['settings']);
-  $index = search_api_index_load($values['id']);
+  $index = search_api_index_load($values['machine_name']);
 
   $options = empty($index->options) ? array() : $index->options;
   $options['data_alter_callbacks'] = $values['callbacks'];
@@ -1252,7 +1253,7 @@ function search_api_admin_index_workflow_submit(array $form, array &$form_state)
 
   $ret = search_api_index_edit($index->id, array('options' => $options));
   if ($ret) {
-    search_api_index_reindex($index->id);
+    search_api_index_reindex($index->machine_name);
     drupal_set_message(t("The search index' workflow was successfully edited. " .
         'All content was scheduled for re-indexing so the new settings can take effect.'));
   }
@@ -1262,10 +1263,10 @@ function search_api_admin_index_workflow_submit(array $form, array &$form_state)
 
   if (empty($options['fields'])) {
     drupal_set_message(t('Please set the fields that should be indexed.'));
-    $form_state['redirect'] = 'admin/config/search/search_api/index/' . $index->id . '/fields';
+    $form_state['redirect'] = 'admin/config/search/search_api/index/' . $index->machine_name . '/fields';
   }
   else {
-    $form_state['redirect'] = 'admin/config/search/search_api/index/' . $index->id;
+    $form_state['redirect'] = 'admin/config/search/search_api/index/' . $index->machine_name;
   }
 }
 
@@ -1353,9 +1354,9 @@ function search_api_admin_index_fields(array $form, array &$form_state, SearchAp
     }
   }
 
-  $form['id'] = array(
+  $form['machine_name'] = array(
     '#type' => 'value',
-    '#value' => $index->id,
+    '#value' => $index->machine_name,
   );
 
   $form['submit'] = array(
@@ -1527,7 +1528,7 @@ function theme_search_api_admin_fields_table($variables) {
  * Submit function for search_api_admin_index_fields.
  */
 function search_api_admin_index_fields_submit(array $form, array &$form_state) {
-  $id = $form_state['values']['id'];
+  $id = $form_state['values']['machine_name'];
   if ($form_state['values']['op'] == t('Save changes')) {
     $fields = $form_state['values']['fields'];
     foreach ($fields as $name => &$field) {
@@ -1683,7 +1684,7 @@ function search_api_admin_confirm_submit(array $form, array &$form_state) {
 
   $type = $values['type'];
   $action = $values['action'];
-  $id = $values['id'];
+  $id = $values['machine_name'];
 
   $function = "search_api_{$type}_{$action}";
   if ($function($id)) {
diff --git search_api.install search_api.install
index 399691b..4b1af99 100644
--- search_api.install
+++ search_api.install
@@ -92,9 +92,9 @@ function search_api_schema() {
         'not null' => FALSE,
       ),
       'server' => array(
-        'description' => 'The {search_api_server}.id with which data should be indexed.',
-        'type' => 'int',
-        'unsigned' => TRUE,
+        'description' => 'The {search_api_server}.machine_name with which data should be indexed.',
+        'type' => 'varchar',
+        'length' => 50,
         'not null' => FALSE,
       ),
       'entity_type' => array(
@@ -258,3 +258,33 @@ function search_api_update_7101() {
     throw new DrupalUpdateException(t('An exception occurred during the update: !msg.', array('!msg' => $e->getMessage())));
   }
 }
+
+/**
+ * Implements hook_update_N().
+ *
+ * Update function that makes $index->server to use the machine name.
+ */
+function search_api_update_7102() {
+  $indexes = array();
+  $select = db_select('search_api_index', 'i')->fields('i');
+  foreach ($select->execute() as $index) {
+    $indexes[$index->id] = $index;
+  }
+  $servers = db_select('search_api_server', 's')->fields('s')->execute()->fetchAllAssoc();
+
+  db_drop_field('search_api_index', 'server');
+  $spec = array(
+    'description' => 'The {search_api_server}.machine_name with which data should be indexed.',
+    'type' => 'varchar',
+    'length' => 50,
+    'not null' => FALSE,
+  );
+  db_add_field('search_api_index', 'server', $spec);
+
+  foreach ($indexes as $index) {
+    db_update('search_api_index')
+      ->fields(array('server' => $servers[$index->server]['machine_name']))
+      ->condition('id', $index->id)
+      ->execute();
+  }
+}
diff --git search_api.module search_api.module
index b4c4fc7..3311b26 100644
--- search_api.module
+++ search_api.module
@@ -234,7 +234,6 @@ function search_api_entity_info() {
     'metadata controller class' => FALSE,
     'entity class' => 'SearchApiServer',
     'base table' => 'search_api_server',
-    'load hook' => 'search_api_server_load',
     'uri callback' => 'search_api_server_url',
     'module' => 'search_api',
     'exportable' => TRUE,
@@ -250,7 +249,6 @@ function search_api_entity_info() {
     'metadata controller class' => FALSE,
     'entity class' => 'SearchApiIndex',
     'base table' => 'search_api_index',
-    'load hook' => 'search_api_index_load',
     'uri callback' => 'search_api_index_url',
     'module' => 'search_api',
     'exportable' => TRUE,
@@ -445,6 +443,11 @@ function search_api_entity_delete($entity, $type) {
  * Implements hook_search_api_alter_callback_info().
  */
 function search_api_search_api_alter_callback_info() {
+  $callbacks['search_api_alter_prepare_view'] = array(
+    'name' => t('Call hook'),
+    'description' => t('Calls the standard entity_prepare_view() function for all items.'),
+    'weight' => -10,
+  );
   $callbacks['search_api_alter_add_url'] = array(
     'name' => t('URL field'),
     'description' => t("Adds the item's URL to the indexed data."),
@@ -465,25 +468,22 @@ function search_api_search_api_alter_callback_info() {
 function search_api_search_api_processor_info() {
   $processors['search_api_case_ignore'] = array(
     'name' => t('Ignore case'),
-    'description' => t('This processor will make searches case-insensitive for all fulltext fields (and, optionally, also for filters on string fields).'),
+    'description' => t('A processor that makes searches case-insensitive.'),
     'class' => 'SearchApiIgnoreCase',
   );
   $processors['search_api_html_filter'] = array(
     'name' => t('HTML filter'),
-    'description' => t('Strips HTML tags from fulltext fields and decodes HTML entities. ' .
-        'Use this processor when indexing HTML data, e.g., node bodies for certain text formats.<br />' .
-        'The processor also allows to boost (or ignore) the contents of specific elements.'),
+    'description' => t('Strips HTML tags from indexed data and decodes HTML entities.'),
     'class' => 'SearchApiHtmlFilter',
     'weight' => 10,
   );
   $processors['search_api_tokenizer'] = array(
     'name' => t('Tokenizer'),
-    'description' => t('Tokenizes fulltext data by stripping whitespace. ' .
-        'This processor allows you to specify which characters make up words and which characters should be ignored, using regular expression syntax. ' .
-        'Otherwise it is up to the search server implementation to decide how to split indexed fulltext data.'),
+    'description' => t('Tokenizes fulltext data by stripping whitespace.'),
     'class' => 'SearchApiTokenizer',
     'weight' => 20,
   );
+  // @todo Add a "Score corrector", normalizing scores a bit?
 
   return $processors;
 }
@@ -570,6 +570,20 @@ function search_api_set_items_indexed(SearchApiIndex $index, array $ids) {
 }
 
 /**
+ * Search API data alteration callback that calls entity_prepare_view() for all
+ * items.
+ *
+ * @param SearchApiIndex $index
+ *   The index on which the items are indexed.
+ * @param array $items
+ *   An array of objects containing the entity data.
+ */
+function search_api_alter_prepare_view(SearchApiIndex $index, array &$items) {
+  entity_prepare_view($index->entity_type, $items);
+  return array();
+}
+
+/**
  * Search API data alteration callback that adds an URL field for all items.
  *
  * @param SearchApiIndex $index
@@ -928,38 +942,14 @@ function search_api_extract_fields(EntityMetadataWrapper $wrapper, array $fields
  *
  * @param $only_enabled
  *   Whether to retrieve only enabled servers.
- * @param $header
- *   A table header to sort by.
  *
  * @return array
  *   An array of objects representing all (or, if $enabled is TRUE, only
  *   enabled) search servers.
  */
-function search_api_list_servers($only_enabled = TRUE, $header = NULL) {
-  $servers = &drupal_static(__FUNCTION__);
-
-  $enabled = (int) $only_enabled;
-  if (!isset($servers[$enabled])) {
-    $select = db_select('search_api_server', 's', array('fetch' => 'SearchApiServer'))->fields('s');
-    if ($enabled) {
-      $select->condition('s.enabled', 1);
-    }
-    if (!empty($header)) {
-      $select = $select->extend('TableSort')->orderByHeader($header);
-    }
-
-    $results = $select->execute();
-    $servers[$enabled] = array();
-    foreach ($results as $row) {
-      $row->options = unserialize($row->options);
-      $servers[$enabled][$row->id] = $row;
-    }
-
-    module_invoke_all('search_api_server_load', $servers[$enabled]);
-    module_invoke_all('entity_load', $servers[$enabled], 'search_api_server');
-  }
-
-  return $servers[$enabled];
+function search_api_list_servers($only_enabled = TRUE) {
+  $conditions = $only_enabled ? array('enabled' => 1) : array();
+  return entity_load('search_api_server', FALSE, $conditions);
 }
 
 /**
@@ -975,7 +965,7 @@ function search_api_list_servers($only_enabled = TRUE, $header = NULL) {
  */
 function search_api_server_load($id, $reset = FALSE) {
   $ret = entity_load('search_api_server', array($id), array(), $reset);
-  return $ret ? array_shift($ret) : NULL;
+  return $ret ? reset($ret) : FALSE;
 }
 
 /**
@@ -1045,7 +1035,7 @@ function search_api_server_insert(array $values) {
  *   FALSE on failure.
  */
 function search_api_server_edit($id, array $fields) {
-  $server = search_api_server_load($id, TRUE);
+  $server = search_api_server_load($id);
   $changeable = array('name' => 1, 'description' => 1, 'options' => 1, 'enabled' => 1);
   foreach ($fields as $field => $value) {
     if (!isset($changeable[$field]) || $value === $server->$field) {
@@ -1240,47 +1230,18 @@ function search_api_server_delete($id) {
 /**
  * Returns a list of search indexes.
  *
- * @param $options
+ * @param $conditions
  *   An associative array of conditions on the returned indexes.
  *   - enabled: When set to TRUE, only enabled indexes will be returned.
  *   - server: Return only indexes on the server with the specified id.
  *   - entity_type: Return only indexes on the specified entity type.
- * @param $header
- *   A table header to sort by.
  *
  * @return array
  *   An array of objects representing the search indexes that meet the
  *   specified criteria.
  */
-function search_api_list_indexes(array $options = array(), $header = NULL) {
-  $server = empty($options['server']) ? NULL : $options['server'];
-  $type = empty($options['entity_type']) ? NULL : $options['entity_type'];
-
-  $select = db_select('search_api_index', 'i', array('fetch' => 'SearchApiIndex'))->fields('i');
-  if (!empty($options['enabled'])) {
-    $select->condition('i.enabled', 1);
-  }
-  if (!empty($server)) {
-    $select->condition('i.server', $server);
-  }
-  if (!empty($type)) {
-    $select->condition('i.entity_type', $type);
-  }
-  if (!empty($header)) {
-    $select = $select->extend('TableSort')->orderByHeader($header);
-  }
-
-  $results = $select->execute();
-  $indexes = array();
-  foreach ($results as $row) {
-    $row->options = unserialize($row->options);
-    $indexes[$row->id] = $row;
-  }
-
-  module_invoke_all('search_api_index_load', $indexes);
-  module_invoke_all('entity_load', $indexes, 'search_api_index');
-
-  return $indexes;
+function search_api_list_indexes(array $conditions = array()) {
+  return entity_load('search_api_index', FALSE, $conditions);
 }
 
 /**
