diff --git a/content.module b/content.module
index bc2c84c..dc939c9 100644
--- a/content.module
+++ b/content.module
@@ -527,23 +527,48 @@ function content_storage($op, $node) {
       $selects = array();
       foreach ($type['fields'] as $field) {
         $db_info = content_database_info($field);
+        $table = $db_info['table'];
         if ($field['multiple']) {
-          $selects[$db_info['table']]['multiple'] = TRUE;
+          $table_name = $table;
+          $selects[$table_name]['table_name'] = $table_name;
+          $selects[$table_name]['multiple'] = TRUE;
         }
+        else if (!isset($primary_table) || count($selects[$primary_table]['join']) > 30) {
+          $table_name = $primary_table = $table;
+          $selects[$table_name]['table_name'] = $table_name;
+        }
+        else {
+          $table_name = $primary_table;
+          if ($table != $primary_table) {
+            $selects[$primary_table]['join'][] = $table;
+          }
+        }
+
         foreach ($db_info['columns'] as $column => $attributes) {
-          $selects[$db_info['table']]['columns'][] = $attributes['column'];
+          // We should never multiple fields as the same name on different
+          // shared tables, but if we do, an alias for the field will need
+          // to be added.
+          $selects[$table_name]['columns'][] = $table .'.'. $attributes['column'];
+          $field['table'] = $table;
           $field['columns'][$column] = $attributes['column'];
         }
-        $selects[$db_info['table']]['fields'][] = $field;
+        $selects[$table_name]['fields'][] = $field;
       }
       
       foreach ($selects as $table => $select) {
         if ($select['multiple']) {
-          $select['columns'][] = 'delta';
+          $select['columns'][] = $select['table_name'] .'.delta';
+        }
+
+        $join = '';
+        if (!empty($select['join'])) {
+          content_storage_format_join($select['table_name'], TRUE);
+          $join = ' '. implode(' ', array_map('content_storage_format_join', $select['join']));
         }
-        $sql = 'SELECT '. implode(', ', $select['columns']) .' FROM {'. $table .'} WHERE vid = %d';
+
+        $sql = 'SELECT '. implode(', ', $select['columns']) .' FROM {'. $table .'} '. $select['table_name'] . $join .' WHERE '. $select['table_name'] .'.vid = %d';
         if ($select['multiple']) {
-          $result = db_query($sql .' ORDER BY delta', $node->vid);
+          $result = db_query($sql .' ORDER BY delta ASC', $node->vid);
         }
         else {
           $result = db_query_range($sql, $node->vid, 0, 1);
@@ -697,6 +722,18 @@ function content_storage($op, $node) {
 }
 
 /**
+ * Format the joining of the shared tables
+ */
+function content_storage_format_join($a, $init = FALSE) {
+  static $table_name = '';
+  if ($init) {
+    $table_name = $a;
+  }
+  return 'LEFT JOIN {'. $a .'} '. $a .' ON '. $table_name .'.vid = '. $a
+  .'.vid';
+}
+
+/**
  *
  */
 function content_type_placeholder($type) {
