diff --git a/computed_field.module b/computed_field.module
index c7bff05..3b8e214 100644
--- a/computed_field.module
+++ b/computed_field.module
@@ -43,15 +43,51 @@ function computed_field_entity_property_callback(&$info, $entity_type, $field, $
     'float' => 'decimal', 'numeric' => 'decimal',
     'varchar' => 'text', 'text' => 'text', 'longtext' => 'text',
   );
+
   if (isset($field['columns']['value']) && isset($property_types[$field['columns']['value']['type']])) {
     // Entity API's defaults are pretty good so set the property_type and let
     // them do the work for us.
     $field_type['property_type'] = $property_types[$field['columns']['value']['type']];
-    entity_metadata_field_default_property_callback($info, $entity_type, $field, $instance, $field_type);
-    // The only thing is that a setter doesn't make sense, so let's disable it.
-    $property = &$info[$entity_type]['bundles'][$instance['bundle']]['properties'][$field['field_name']];
-    unset($property['setter callback']);
   }
+  else {
+    $field_type['property_type'] = $property_types[$field['settings']['database']['data_type']];
+  }
+
+  entity_metadata_field_default_property_callback($info, $entity_type, $field, $instance, $field_type);
+  // The only thing is that a setter doesn't make sense, so let's disable it.
+  $property = &$info[$entity_type]['bundles'][$instance['bundle']]['properties'][$field['field_name']];
+
+  if (!$field['settings']['store']) {
+    $property['getter callback'] = 'computed_field_getter_callback';
+  }
+  unset($property['setter callback']);
+}
+
+/**
+ * Computed field getter callback.
+ * @param $entity
+ * @param array $options
+ * @param $name
+ * @param $entity_type
+ * @param $info
+ * @return array|mixed|null
+ */
+function computed_field_getter_callback($entity, array $options, $name, $entity_type, $info) {
+  $field = field_info_field($name);
+  $langcode = isset($options['language']) ? $options['language']->language : LANGUAGE_NONE;
+  $langcode = entity_metadata_field_get_language($entity_type, $entity, $field, $langcode, TRUE);
+  $values = array();
+  if (isset($entity->{$name}[$langcode])) {
+    foreach ($entity->{$name}[$langcode] as $delta => $data) {
+      $values[$delta] = $data['value'];
+      if ($info['type'] == 'boolean' || $info['type'] == 'list<boolean>') {
+        // Ensure that we have a clean boolean data type.
+        $values[$delta] = (boolean) $values[$delta];
+      }
+    }
+  }
+  // For an empty single-valued field, we have to return NULL.
+  return $field['cardinality'] == 1 ? ($values ? reset($values) : NULL) : $values;
 }
 
 /**
