diff --git a/schema.xml b/schema.xml
index 3e40fdb..8d362f4 100644
--- a/schema.xml
+++ b/schema.xml
@@ -34,10 +34,10 @@
        limits compression (if enabled in the derived fields) to values which
        exceed a certain size (in characters).
     -->
-    <fieldType name="string" class="solr.StrField" indexed="true" stored="false" sortMissingLast="true" omitNorms="true"/>
+    <fieldType name="string" class="solr.StrField" indexed="true" stored="true" sortMissingLast="true" omitNorms="true"/>
 
     <!-- boolean type: "true" or "false" -->
-    <fieldType name="boolean" class="solr.BoolField" indexed="true" stored="false" sortMissingLast="true" omitNorms="true"/>
+    <fieldType name="boolean" class="solr.BoolField" indexed="true" stored="true" sortMissingLast="true" omitNorms="true"/>
 
     <!-- The optional sortMissingLast and sortMissingFirst attributes are
          currently supported on types that are sorted internally as strings.
@@ -87,10 +87,10 @@
      indexed per value, slightly larger index size, and faster range queries.
      A precisionStep of 0 disables indexing at different precision levels.
     -->
-    <fieldType name="tint" class="solr.TrieIntField" indexed="true" stored="false" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
-    <fieldType name="tfloat" class="solr.TrieFloatField" indexed="true" stored="false" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
-    <fieldType name="tlong" class="solr.TrieLongField" indexed="true" stored="false" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
-    <fieldType name="tdouble" class="solr.TrieDoubleField" indexed="true" stored="false" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
+    <fieldType name="tint" class="solr.TrieIntField" indexed="true" stored="true" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
+    <fieldType name="tfloat" class="solr.TrieFloatField" indexed="true" stored="true" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
+    <fieldType name="tlong" class="solr.TrieLongField" indexed="true" stored="true" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
+    <fieldType name="tdouble" class="solr.TrieDoubleField" indexed="true" stored="true" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
 
 
     <!-- The format for this date field is of the form 1995-12-31T23:59:59Z, and
@@ -116,7 +116,7 @@
     <fieldType name="date" class="solr.DateField" sortMissingLast="true" omitNorms="true"/>
 
     <!-- A Trie based date field for faster date range queries and date faceting. -->
-    <fieldType name="tdate" class="solr.TrieDateField" indexed="true" stored="false" omitNorms="true" precisionStep="6" positionIncrementGap="0"/>
+    <fieldType name="tdate" class="solr.TrieDateField" indexed="true" stored="true" omitNorms="true" precisionStep="6" positionIncrementGap="0"/>
 
     <!-- solr.TextField allows the specification of custom text analyzers
          specified as a tokenizer and a list of token filters. Different
@@ -161,7 +161,7 @@
     stopwords.txt and protwords.txt, and selecting the language used for
     stemming) if you want to use them.
 -->
-    <fieldType name="text" class="solr.TextField" indexed="true" stored="false" multiValued="true" positionIncrementGap="100">
+    <fieldType name="text" class="solr.TextField" indexed="true" stored="true" multiValued="true" positionIncrementGap="100">
       <analyzer type="index">
         <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
         <tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/>
@@ -246,7 +246,7 @@
          With various TokenFilterFactories to produce a sortable field
          that does not include some properties of the source text
       -->
-    <fieldType name="sortString" class="solr.TextField" indexed="true" stored="false" sortMissingLast="true" omitNorms="true">
+    <fieldType name="sortString" class="solr.TextField" indexed="true" stored="true" sortMissingLast="true" omitNorms="true">
       <analyzer>
         <!-- KeywordTokenizer does no actual tokenizing, so the entire
              input string is preserved as a single token
@@ -282,7 +282,7 @@
     <!-- since fields of this type are by default not stored or indexed, any data added to
          them will be ignored outright
      -->
-    <fieldtype name="ignored" stored="false" indexed="false" class="solr.StrField" />
+    <fieldtype name="ignored" stored="true" indexed="false" class="solr.StrField" />
 
  </types>
 
@@ -341,12 +341,7 @@
      this behaviour in one instance. E.g., for indexing a node title not with
      the normal "text" datatype but with "text_ws" (see definitions above), you
      could add:
-     <field name="t_title" type="text_ws" indexed="true" stored="false" />
-
-     Note that all types are defined as indexed=true stored=false, since we only
-     need the result ids and then do an entity_load().
-     We also always use the sortable types, since we don't need the verbatim
-     data anyways.
+     <field name="t_title" type="text_ws" indexed="true" stored="true" />
 -->
 
    <!-- Fulltext fields (are always multiValued) -->
diff --git a/service.inc b/service.inc
index c1d38f4..54b8d14 100644
--- a/service.inc
+++ b/service.inc
@@ -53,20 +53,9 @@ class SearchApiSolrService extends SearchApiAbstractService {
   }
 
   public function configurationForm(array $form, array &$form_state) {
-    if (empty($this->options)) {
-      // First configuring this server
-      $options = array(
-        'host' => 'localhost',
-        'port' => '8983',
-        'path' => '/solr',
-        'http_user' => '',
-        'http_pass' => '',
-      );
-    }
-    else {
+    if ($this->options) {
       // Editing this server
-      $options = $this->options;
-      $url = 'http://' . $options['host'] . ':' . $options['port'] . $options['path'];
+      $url = 'http://' . $this->options['host'] . ':' . $this->options['port'] . $this->options['path'];
       $form['server_description'] = array(
         '#type' => 'item',
         '#title' => t('Solr server URI'),
@@ -74,6 +63,15 @@ class SearchApiSolrService extends SearchApiAbstractService {
       );
     }
 
+    $options = $this->options + array(
+      'host' => 'localhost',
+      'port' => '8983',
+      'path' => '/solr',
+      'http_user' => '',
+      'http_pass' => '',
+      'retrieve_data' => FALSE,
+    );
+
     $form['host'] = array(
       '#type' => 'textfield',
       '#title' => t('Solr host'),
@@ -113,6 +111,15 @@ class SearchApiSolrService extends SearchApiAbstractService {
       '#default_value' => $options['http_pass'],
     );
 
+    $form['retrieve_data'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Retrieve result data from Solr'),
+      '#description' => t('When checked, result data will be retrieved directly from the Solr server. ' .
+          'This might make entity loads unnecessary. Only indexed fields can be retrieved. ' .
+          'Note also that the returned field data might not always be correct, due to preprocessing and caching issues.'),
+      '#default_value' => $options['retrieve_data'],
+    );
+
     return $form;
   }
 
@@ -452,6 +459,9 @@ class SearchApiSolrService extends SearchApiAbstractService {
     if (!empty($options['search_api_spellcheck'])) {
       $params['spellcheck'] = 'true';
     }
+    if (!empty($this->options['retrieve_data'])) {
+      $params['fl'] = '*,score';
+    }
     $call_args = array(
       'query'  => &$keys,
       'offset' => &$offset,
@@ -511,13 +521,14 @@ class SearchApiSolrService extends SearchApiAbstractService {
    *
    * @return array
    *   An array with two keys:
-   *   - 'result count' contains an integer number of total results
-   *   - 'results' is an array of search results; keys are document ids, values
-   *      are arrays of property => value pairs
+   *   - result count: The number of total results.
+   *   - results: An array of search results, as specified by
+   *     SearchApiQueryInterface::execute().
    */
   protected function extractResults(SearchApiQueryInterface $query, Apache_Solr_Response $response) {
     $index = $query->getIndex();
     $fields = $this->getFieldNames($index);
+    $field_options = $index->options['fields'];
 
     // Set up the results array.
     $results = array();
@@ -539,6 +550,13 @@ class SearchApiSolrService extends SearchApiAbstractService {
       foreach ($fields as $search_api_property => $solr_property) {
         if (isset($doc->{$solr_property})) {
           $result['fields'][$search_api_property] = $doc->{$solr_property};
+          // Date fields need some special treatment to become valid date values
+          // (i.e., timestamps) again.
+          if (isset($field_options[$search_api_property]['type'])
+              && $field_options[$search_api_property]['type'] == 'date'
+              && preg_match('/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/', $result['fields'][$search_api_property])) {
+            $result['fields'][$search_api_property] = strtotime($result['fields'][$search_api_property]);
+          }
         }
       }
 
