diff --git a/content.module b/content.module
index dbe7daf..4268b86 100644
--- a/content.module
+++ b/content.module
@@ -526,6 +526,227 @@ function content_field($op, &$node, $field, &$node_field, $teaser, $page) {
 }
 
 /**
+ *
+ */
+function content_storage($op, $node) {
+  $type_name = $node->type;
+  $type = content_types($type_name);
+
+  $return = array();
+
+  if (empty($type['fields'])) {
+    return;
+  }
+  switch ($op) {
+    case 'load':
+      $selects = array();
+      foreach ($type['fields'] as $field) {
+        $db_info = content_database_info($field);
+        if ($field['multiple']) {
+          $selects[$db_info['table']]['multiple'] = TRUE;
+        }
+        foreach ($db_info['columns'] as $column => $attributes) {
+          $selects[$db_info['table']]['columns'][] = $attributes['column'];
+          $field['columns'][$column] = $attributes['column'];
+        }
+        $selects[$db_info['table']]['fields'][] = $field;
+      }
+
+      foreach ($selects as $table => $select) {
+        if ($select['multiple']) {
+          $select['columns'][] = 'delta';
+        }
+        $sql = 'SELECT '. implode(', ', $select['columns']) .' FROM {'. $table .'} WHERE vid = %d';
+        if ($select['multiple']) {
+          $result = db_query($sql .' ORDER BY delta', $node->vid);
+        }
+        else {
+          $result = db_query_range($sql, $node->vid, 0, 1);
+        }
+
+        while ($row = db_fetch_array($result)) {
+          foreach ($select['fields'] as $field) {
+            if ($select['multiple']) {
+              foreach ($field['columns'] as $column => $dbcol) {
+                $return[$field['field_name']][$row['delta']][$column] = $row[$dbcol];
+              }
+            }
+            else {
+              foreach ($field['columns'] as $column => $dbcol) {
+                $return[$field['field_name']][0][$column] = $row[$dbcol];
+              }
+            }
+          }
+        }
+      }
+      break;
+
+    case 'update':
+      $insert_only = $deletes = $updates = $args = array();
+      foreach ($type['fields'] as $field) {
+        $db_info = content_database_info($field);
+
+        if ($field['multiple']) {
+          $deletes[] = $db_info['table'];
+          $insert_only[] = $db_info['table'];
+        }
+        else {
+          foreach ($db_info['columns'] as $column => $attributes) {
+            $placeholder = content_type_placeholder($attributes['type']);
+            if (isset($node->{$field['field_name']})) {
+              $updates[$db_info['table']]['fields'][] = $attributes['column'] .' = '. $placeholder;
+              $updates[$db_info['table']]['values'][] = $node->{$field['field_name']}[0][$column];
+            }
+            else {
+              $null = 'NULL';
+              if (isset($attributes['not null']) && $attributes['not null'] && !is_null($attributes['default'])) {
+                $null = $attributes['default'] === FALSE ? '' : "'". $attributes['default'] ."'";
+              }
+              $updates[$db_info['table']]['fields'][] = $attributes['column'] .' = '. $null;
+            }
+          }
+        }
+      }
+      if (!empty($updates)) {
+        foreach ($updates as $table => $update) {
+          $update['values'][] = $node->vid;
+
+          $sql = 'UPDATE {'. $table .'} SET '. implode(',', $update['fields']) .' WHERE vid = %d';
+          db_query($sql, $update['values']);
+          if (!db_affected_rows()) {
+            $insert_only[] = $table;
+            $op = 'insert';
+          }
+        }
+      }
+
+      if (!empty($deletes)) {
+        foreach (array_unique($deletes) as $table) {
+          db_query('DELETE FROM {'. $table .'} WHERE vid = %d', $node->vid);
+        }
+        $op = 'insert';
+      }
+      if ($op != 'insert') {
+        break;
+      }
+
+    case 'insert':
+      $inserts = array();
+      foreach ($type['fields'] as $field) {
+        $db_info = content_database_info($field);
+        if (!empty($insert_only) && !in_array($db_info['table'], $insert_only)) {
+          continue;
+        }
+        if ($field['multiple']) {
+          $inserts[$db_info['table']]['multiple'] = TRUE;
+        }
+        foreach ($db_info['columns'] as $column => $attributes) {
+          $inserts[$db_info['table']]['columns'][] = $attributes['column'];
+        }
+        if (empty($node->{$field['field_name']})) {
+          $node->{$field['field_name']} = array(0 => array());
+        }
+        foreach ($node->{$field['field_name']} as $delta => $value) {
+          foreach ($db_info['columns'] as $column => $attributes) {
+            if (isset($value[$column])) {
+              $placeholder = content_type_placeholder($attributes['type']); 
+              $inserts[$db_info['table']]['placeholders'][$delta][] = $placeholder;
+              $inserts[$db_info['table']]['values'][$delta][] = $value[$column];
+            }
+            else {
+              $null = 'NULL';
+              if (isset($attributes['not null']) && $attributes['not null'] && !is_null($attributes['default'])) {
+                $null = $attributes['default'] === FALSE ? '' : $attributes['default'];
+              }
+              $inserts[$db_info['table']]['placeholders'][$delta][] = $null;
+            }
+          }
+        }
+      }
+
+      foreach ($inserts as $table => $insert) {
+        $args = array();
+        $insert['columns'][] = 'nid';
+        $insert['columns'][] = 'vid';
+        if ($insert['multiple']) {
+          $insert['columns'][] = 'delta';
+        }
+        $sql = 'INSERT INTO {'. $table .'} ('. implode(',', $insert['columns']) .') VALUES ';
+        $sql_values = array();
+        foreach ($insert['placeholders'] as $delta => $value) {
+          $insert['placeholders'][$delta][] = '%d';
+          $insert['placeholders'][$delta][] = '%d';
+          if ($insert['multiple']) {
+            $insert['placeholders'][$delta][] = '%d';
+          }
+          $sql_values[] = '('. implode(', ', $insert['placeholders'][$delta]) .')';
+          if (!empty($insert['values'][$delta])) {
+            $args = array_merge($args, $insert['values'][$delta]);
+          }
+          $args[] = $node->nid;
+          $args[] = $node->vid;
+          if ($insert['multiple']) {
+            $args[] = $delta;
+          }
+        }
+        $sql.= implode(',', $sql_values);
+
+        db_query($sql, $args);
+      }
+      break;
+
+    case 'delete':
+      $tables = array('content_type_'. $node->type);
+      foreach ($type['fields'] as $field) {
+        $db_info = content_database_info($field);
+        $tables[] = $db_info['table'];
+      }
+      foreach (array_unique($tables) as $table) {
+        db_query('DELETE FROM {'. $table .'} WHERE nid = %d', $node->nid);
+      }
+      break;
+
+    case 'delete revision':
+      $tables = array('content_type_'. $node->type);
+      foreach ($type['fields'] as $field) {
+        $db_info = content_database_info($field);
+        $tables[] = $db_info['table'];
+      }
+      foreach (array_unique($tables) as $table) {
+        db_query('DELETE FROM {'. $table .'} WHERE vid = %d', $node->vid);
+      }
+      break;
+  }
+
+  return $return;
+}
+
+/**
+ *
+ */
+function content_type_placeholder($type) {
+  switch ($attributes['type']) {
+    case 'int':
+    case 'mediumint':
+    case 'tinyint':
+    case 'bigint':
+      return '%d';
+      break;
+
+    case 'float':
+      return '%f';
+      break;
+
+    case 'numeric':
+      return '%s';
+      break;
+
+    default:
+      return '\'%s\'';
+  }
+}
+
+/**
  * Invoke a field hook.
  *
  * For each operation, both this function and _content_field_invoke_default() are
@@ -569,26 +790,25 @@ function _content_field_invoke_default($op, &$node, $teaser = NULL, $page = NULL
   $type = content_types($type_name);
 
   $return = array();
-  if (count($type['fields'])) {
-    foreach ($type['fields'] as $field) {
-      $node_field = isset($node->$field['field_name']) ? $node->$field['field_name'] : array();
 
-      $db_info = content_database_info($field);
-      if (count($db_info['columns'])) {
-        $result = content_field($op, $node, $field, $node_field, $teaser, $page);
-        if (is_array($result)) {
-          $return = array_merge($return, $result);
-        }
-        else if (isset($result)) {
-          $return[] = $result;
-        }
+  if (in_array($op, array('load', 'insert', 'update', 'delete', 'delete revision'))) {
+    return content_storage($op, $node);
+  }
+  else {
+    foreach ($type['fields'] as $field) {
+      $items = isset($node->$field['field_name']) ? $node->$field['field_name'] : array();
+      $result = content_field($op, $node, $field, $items, $teaser, $page);
+      if (is_array($result)) {
+        $return = array_merge($return, $result);
+      }
+      else if (isset($result)) {
+        $return[] = $result;
       }
       if (isset($node->$field['field_name'])) {
-        $node->$field['field_name'] = $node_field;
+        $node->$field['field_name'] = $items;
       }
     }
   }
-
   return $return;
 }
 
