diff --git a/uc_vat_number.install b/uc_vat_number.install
index 4180c19..6667c2e 100644
--- a/uc_vat_number.install
+++ b/uc_vat_number.install
@@ -167,3 +167,17 @@ function uc_vat_number_update_6200() {
 
   return $ret;
 }
+
+function uc_vat_number_update_6201() {
+  $result = db_query("SELECT order_id, data FROM {uc_orders}");
+  while (($order = db_fetch_array($result))) {
+    $data = unserialize($order['data']);
+    if (isset($data['vat_number'])) {
+      if (trim($data['vat_number']))
+        db_query("INSERT INTO {uc_vat_number} (order_id, vat_number) VALUES (%d, '%s')", $order['order_id'], $data['vat_number']);
+      unset($data['vat_number']);
+      db_query("UPDATE {uc_orders} SET data = '%s' WHERE order_id = %d", serialize($data), $order['order_id']);
+    }
+  }
+  return array();
+}
diff --git a/uc_vat_number.module b/uc_vat_number.module
index 89dddc5..ca51468 100644
--- a/uc_vat_number.module
+++ b/uc_vat_number.module
@@ -161,7 +161,7 @@ function uc_vat_number_order_pane_vat_number($op, $arg1) {
 
     case 'view':
     case 'customer':
-      return $arg1->data["vat_number"];
+      return $arg1->vat_number;
 
     case 'edit-form':
       $form['vat_number'] = array(
@@ -170,7 +170,7 @@ function uc_vat_number_order_pane_vat_number($op, $arg1) {
         '#collapsible' => FALSE,
         '#collapsed' => FALSE,
       );
-      $form['vat_number']['vat_number'] = uc_textfield(t("Customer VAT Number"), $arg1->data['vat_number'], FALSE);
+      $form['vat_number']['vat_number'] = uc_textfield(t("Customer VAT Number"), $arg1->vat_number, FALSE);
       return $form;
 
     case 'edit-theme':
@@ -185,9 +185,8 @@ function uc_vat_number_order_pane_vat_number($op, $arg1) {
       return $output;
 
     case 'edit-process':
-      $data = db_result(db_query("SELECT data FROM {uc_orders} WHERE order_id = %d", $arg1['orderid']));
-      $data = unserialize($data);
-      if ($arg1['vat_number'] != $data['vat_number'])
+      $vat_number = db_result(db_query("SELECT vat_number FROM {uc_vat_number} WHERE order_id = %d", $arg1['orderid']));
+      if ($arg1['vat_number'] != $vat_number)
         $changes['vat_number'] = $arg1['vat_number'];
       return $changes;
   }
@@ -238,7 +237,7 @@ function uc_vat_number_checkout_pane_vat($op, &$arg1, $arg2) {
         '#maxlength' => 32,
         '#weight' => 1,
         '#required' => _uc_vat_number_required() ? TRUE : FALSE,
-        '#default_value' => $order->data['vat_number'],
+        '#default_value' => $order->vat_number,
         '#autocomplete_path' => 'uc_vat_number/vat_autocomplete',
       );
 
@@ -247,14 +246,14 @@ function uc_vat_number_checkout_pane_vat($op, &$arg1, $arg2) {
     case "process":
       // Save VAT number from checkout pane
 
-      $order->data['vat_number'] = $arg2['vat_number'];
+      $order->vat_number = $arg2['vat_number'];
       break;
 
     case "review":
       // Show VAT number on checkout review
 
-      if ($order->data['vat_number']) {
-        $review[] = array('title' => t('Your VAT Number'), 'data' => $arg1->data['vat_number']);
+      if ($order->vat_number) {
+        $review[] = array('title' => t('Your VAT Number'), 'data' => $order->vat_number);
         $review[] = array('title' => t('Our VAT Number'), 'data' => variable_get('uc_store_vat_number', ''));
       }
       return $review;
@@ -265,9 +264,8 @@ function uc_vat_number_checkout_pane_vat($op, &$arg1, $arg2) {
 function uc_vat_number_vat_autocomplete($string) {
   global $user;
   $matches = array();
-  if ($user->uid && $result = db_query("SELECT data FROM {uc_orders} WHERE uid = %d", $user->uid)) {
+  if ($user->uid && $result = db_query("SELECT v.vat_number FROM {uc_orders} o, {uc_vat_number} v WHERE o.uid = %d AND o.order_id = v.order_id", $user->uid)) {
     while ($data = db_fetch_array($result)) {
-      $data = unserialize($data['data']);
       if ($data['vat_number'])
         $matches[check_plain($data['vat_number'])] = check_plain($data['vat_number']);
     }
@@ -282,22 +280,19 @@ function uc_vat_number_vat_autocomplete($string) {
  */
 function uc_vat_number_order($op, &$arg1) {
   switch ($op) {
+    case 'load':
+      $res = db_fetch_object(db_query("SELECT * FROM {uc_vat_number} WHERE order_id = %d", $arg1->order_id));
+      if ($res) {
+        $arg1->vat_number = $res->vat_number;
+      }
+      break;
+
     case 'save':
       if (!isset($arg1->vat_number))
         break;
 
       // Save our VAT number set by hook_order_pane('edit-process')
-      // The order was already saved, so don't just update $order->data now but do the DB query ourselves
-
-      // Load up the existing data array.
-      $data = db_result(db_query("SELECT data FROM {uc_orders} WHERE order_id = %d", $arg1->order_id));
-      $data = unserialize($data);
-
-      // Add the custom data into the data array
-      $data['vat_number'] = $arg1->vat_number;
-
-      // Save it again.
-      db_query("UPDATE {uc_orders} SET data = '%s' WHERE order_id = %d", serialize($data), $arg1->order_id);
+      db_query("UPDATE {uc_vat_number} SET vat_number = '%s' WHERE order_id = %d", $arg1->vat_number, $arg1->order_id);
 
       break;
   }
@@ -315,7 +310,7 @@ function uc_vat_number_token_values($type, $object = NULL) {
 
     case 'order':
       $order = $object;
-      $values['order-vat-number'] = $order->data['vat_number'];
+      $values['order-vat-number'] = $order->vat_number;
       break;
 
   }
@@ -548,7 +543,7 @@ function uc_vat_number_ca_condition() {
  * Returns true if the order has a VAT number
  */
 function uc_vat_number_condition_vat_number($order, $settings) {
-  if (empty($order->data['vat_number']))
+  if (empty($order->vat_number))
     return FALSE;
   else
     return TRUE;
@@ -610,7 +605,7 @@ function uc_vat_number_condition_should_apply_vat($order, $settings) {
     return TRUE;
   elseif (in_array($order->delivery_country, $european_countries)
     && in_array($order->billing_country, $european_countries)
-    && !empty($order->data['vat_number'])
+    && !empty($order->vat_number)
     )
     // intra-community, no VAT
     return FALSE;
