diff --git a/payment/uc_google_checkout/uc_google_checkout.admin.inc b/payment/uc_google_checkout/uc_google_checkout.admin.inc
index 4205002..62e91e2 100644
--- a/payment/uc_google_checkout/uc_google_checkout.admin.inc
+++ b/payment/uc_google_checkout/uc_google_checkout.admin.inc
@@ -96,20 +96,20 @@ function uc_google_checkout_settings($form, &$form_state) {
   return system_settings_form($form);
 }
 
-function uc_google_checkout_shipping_settings($form) {
+function uc_google_checkout_shipping_settings($form, &$form_state) {
   $form['help'] = array(
     '#value' => t("For merchant-calculated shipping, Google Checkout requires a fallback price in case it can't get a calculated shipping rate in time. When the cart request is sent to Google Checkout, Ubercart pre-calculates the shipping rates using this default address. Choose a location that will cause an average shipping cost to be returned."),
   );
 
   $form['uc_google_checkout_delivery_city'] = uc_textfield(uc_get_field_name('city'), variable_get('uc_google_checkout_delivery_city', ''), TRUE);
-  if (isset($_POST['country'])) {
-    $country = $_POST['country'];
+  if (isset($form_state['values']['uc_google_checkout_delivery_country'])) {
+    $country = $form_state['values']['uc_google_checkout_delivery_country'];
   }
   else {
     $country = variable_get('uc_google_checkout_delivery_country', 0);
   }
-  $form['uc_google_checkout_delivery_country'] = uc_country_select(uc_get_field_name('country'), variable_get('uc_google_checkout_delivery_country', 0));
-  $form['uc_google_checkout_delivery_zone'] = uc_zone_select(uc_get_field_name('zone'), variable_get('uc_google_checkout_delivery_zone', 0), NULL, $country);
+  $form['uc_google_checkout_delivery_country'] = uc_country_select(uc_get_field_name('country'), variable_get('uc_google_checkout_delivery_country', 0), array('ajax' => 'uc_google_checkout_delivery_zone'));
+  $form['uc_google_checkout_delivery_zone'] = uc_zone_select(uc_get_field_name('zone'), variable_get('uc_google_checkout_delivery_zone', 0), $country, array('ajax' => 'uc_google_checkout_delivery_zone'));
   $form['uc_google_checkout_delivery_postal_code'] = uc_textfield(uc_get_field_name('postal_code'), variable_get('uc_google_checkout_delivery_postal_code', ''), TRUE, NULL, 10, 10);
 
   return system_settings_form($form);
diff --git a/payment/uc_payment_pack/uc_payment_pack.module b/payment/uc_payment_pack/uc_payment_pack.module
index 7f658c9..01865b2 100644
--- a/payment/uc_payment_pack/uc_payment_pack.module
+++ b/payment/uc_payment_pack/uc_payment_pack.module
@@ -435,14 +435,14 @@ function uc_payment_method_check($op, &$order, $form = NULL, &$form_state = NULL
       $form['uc_check_mailing_street1'] = uc_textfield(uc_get_field_name('street1'), variable_get('uc_check_mailing_street1', ''), FALSE, NULL, 128);
       $form['uc_check_mailing_street2'] = uc_textfield(uc_get_field_name('street2'), variable_get('uc_check_mailing_street2', ''), FALSE, NULL, 128);
       $form['uc_check_mailing_city'] = uc_textfield(uc_get_field_name('city'), variable_get('uc_check_mailing_city', ''), FALSE);
-      $form['uc_check_mailing_country'] = uc_country_select(uc_get_field_name('country'), variable_get('uc_check_mailing_country', uc_store_default_country()));
-      if (isset($_POST['uc_check_mailing_country'])) {
-        $country_id = intval($_POST['uc_check_mailing_country']);
+      $form['uc_check_mailing_country'] = uc_country_select(uc_get_field_name('country'), variable_get('uc_check_mailing_country', uc_store_default_country()), array('ajax' => 'method_check][uc_check_mailing_zone'));
+      if (isset($form_state['values']['uc_check_mailing_country'])) {
+        $country_id = $form_state['values']['uc_check_mailing_country'];
       }
       else {
         $country_id = variable_get('uc_check_mailing_country', uc_store_default_country());
       }
-      $form['uc_check_mailing_zone'] = uc_zone_select(uc_get_field_name('zone'), variable_get('uc_check_mailing_zone', ''), FALSE, $country_id);
+      $form['uc_check_mailing_zone'] = uc_zone_select(uc_get_field_name('zone'), variable_get('uc_check_mailing_zone', ''), $country_id, array('ajax' => 'method_check][uc_check_mailing_zone'));
       $form['uc_check_mailing_postal_code'] = uc_textfield(uc_get_field_name('postal_code'), variable_get('uc_check_mailing_postal_code', ''), FALSE, NULL, 10, 10);
       $form['uc_check_policy'] = array(
         '#type' => 'textarea',
diff --git a/shipping/uc_quote/uc_quote.admin.inc b/shipping/uc_quote/uc_quote.admin.inc
index 7f6e47b..17eb5fc 100644
--- a/shipping/uc_quote/uc_quote.admin.inc
+++ b/shipping/uc_quote/uc_quote.admin.inc
@@ -120,14 +120,9 @@ function uc_quote_admin_settings($form, &$form_state) {
   $form['default_address']['street1'] = uc_textfield(uc_get_field_name('street1'), $address->street1, FALSE, NULL, 64);
   $form['default_address']['street2'] = uc_textfield(uc_get_field_name('street2'), $address->street2, FALSE, NULL, 64);
   $form['default_address']['city'] = uc_textfield(uc_get_field_name('city'), $address->city, FALSE);
-  if (isset($_POST['country'])) {
-    $country = $_POST['country'];
-  }
-  else {
-    $country = $address->country;
-  }
-  $form['default_address']['country'] = uc_country_select(uc_get_field_name('country'), $address->country);
-  $form['default_address']['zone'] = uc_zone_select(uc_get_field_name('zone'), $address->zone, NULL, $country);
+  $form['default_address']['country'] = uc_country_select(uc_get_field_name('country'), $address->country, array('ajax' => 'default_address][zone'));
+  $country = isset($form_state['values']['country']) ? $form_state['values']['country'] : $address->country;
+  $form['default_address']['zone'] = uc_zone_select(uc_get_field_name('zone'), $address->zone, $country, array('ajax' => 'default_address][zone'));
   $form['default_address']['postal_code'] = uc_textfield(uc_get_field_name('postal_code'), $address->postal_code, FALSE, NULL, 10, 10);
 
   $form['actions'] = array('#type' => 'actions');
diff --git a/shipping/uc_quote/uc_quote.module b/shipping/uc_quote/uc_quote.module
index 7ec7097..d6da769 100644
--- a/shipping/uc_quote/uc_quote.module
+++ b/shipping/uc_quote/uc_quote.module
@@ -211,16 +211,6 @@ function uc_quote_form_alter(&$form, &$form_state, $form_id) {
       $address = variable_get('uc_quote_store_default_address', new UcAddress());
     }
 
-    // Store the country to use for the zone select based on $_POST.
-    // TODO: Fix this for D6!  Neither the $_POST or $form_state are available
-    // when the node form is being processed. : (
-    if (isset($_POST['country'])) {
-      $country = $_POST['country'];
-    }
-    else {
-      $country = $address->country;
-    }
-
     // Initialize the shipping fieldset array.
     if (!isset($form['shipping'])) {
       $form['shipping'] = array();
@@ -260,9 +250,10 @@ function uc_quote_form_alter(&$form, &$form_state, $form_id) {
     $form['shipping']['default_address']['street1'] = uc_textfield(uc_get_field_name('street1'), $address->street1, FALSE, NULL, 64);
     $form['shipping']['default_address']['street2'] = uc_textfield(uc_get_field_name('street2'), $address->street2, FALSE, NULL, 64);
     $form['shipping']['default_address']['city'] = uc_textfield(uc_get_field_name('city'), $address->city, FALSE);
-    $form['shipping']['default_address']['zone'] = uc_zone_select(uc_get_field_name('zone'), $address->zone, NULL, $country);
+    $country = isset($form_state['values']['country']) ? $form_state['values']['country'] : $address->country;
+    $form['shipping']['default_address']['zone'] = uc_zone_select(uc_get_field_name('zone'), $address->zone, $country, array('ajax' => 'shipping][default_address][zone'));
     $form['shipping']['default_address']['postal_code'] = uc_textfield(uc_get_field_name('postal_code'), $address->postal_code, FALSE, NULL, 10, 10);
-    $form['shipping']['default_address']['country'] = uc_country_select(uc_get_field_name('country'), $address->country);
+    $form['shipping']['default_address']['country'] = uc_country_select(uc_get_field_name('country'), $address->country, array('ajax' => 'shipping][default_address][zone'));
   }
 }
 
@@ -529,10 +520,16 @@ function uc_quote_get_default_shipping_address($nid) {
 function uc_cart_pane_quotes($form, &$form_state, $items) {
   global $user;
 
-  $form['delivery_country'] = uc_country_select(uc_get_field_name('country'), isset($form_state['values']['delivery_country']) ? $form_state['values']['delivery_country'] : uc_store_default_country(), NULL, 'name', TRUE);
-  $country_id = isset($_POST['delivery_country']) ? intval($_POST['delivery_country']) : uc_store_default_country();
-  $form['delivery_zone'] = uc_zone_select(uc_get_field_name('zone'), isset($form_state['values']['delivery_zone']) ? $form_state['values']['delivery_zone'] : NULL, NULL, $country_id, 'name', TRUE);
-  $form['delivery_postal_code'] = uc_textfield(uc_get_field_name('postal_code'), isset($form_state['values']['delivery_postal_code']) ? $form_state['values']['delivery_postal_code'] : '', TRUE, NULL, 10, 10);
+  $order = new UcOrder();
+  $order->uid = $user->uid;
+  $order->delivery_country = isset($form_state['values']['delivery_country']) ? $form_state['values']['delivery_country'] : uc_store_default_country();
+  $order->delivery_zone = isset($form_state['values']['delivery_zone']) ? $form_state['values']['delivery_zone'] : NULL;
+  $order->delivery_postal_code = isset($form_state['values']['delivery_postal_code']) ? $form_state['values']['delivery_postal_code'] : '';
+  $order->products = $items;
+
+  $form['delivery_country'] = uc_country_select(uc_get_field_name('country'), $order->delivery_country, array('required' => TRUE, 'ajax' => 'delivery_zone'));
+  $form['delivery_zone'] = uc_zone_select(uc_get_field_name('zone'), $order->delivery_zone, $order->delivery_country, array('required' => TRUE, 'ajax' => 'delivery_zone'));
+  $form['delivery_postal_code'] = uc_textfield(uc_get_field_name('postal_code'), $order->delivery_postal_code, TRUE, NULL, 10, 10);
   $form['get_quote'] = array(
     '#type' => 'button',
     '#value' => t('Calculate'),
@@ -546,13 +543,6 @@ function uc_cart_pane_quotes($form, &$form_state, $items) {
     '#value' => 'cart',
   );
 
-  $order = new UcOrder();
-  $order->uid = $user->uid;
-  $order->delivery_country = $form['delivery_country']['#default_value'];
-  $order->delivery_zone = $form['delivery_zone']['#default_value'];
-  $order->delivery_postal_code = $form['delivery_postal_code']['#default_value'];
-  $order->products = $items;
-
   module_load_include('inc', 'uc_quote', 'uc_quote.pages');
   $quotes = uc_quote_assemble_quotes($order);
 
diff --git a/shipping/uc_shipping/uc_shipping.js b/shipping/uc_shipping/uc_shipping.js
index 8a068a4..91e73be 100644
--- a/shipping/uc_shipping/uc_shipping.js
+++ b/shipping/uc_shipping/uc_shipping.js
@@ -26,10 +26,6 @@ function apply_address(type, json_address) {
 
     if (jQuery('#edit-' + type + '-country').val() != address.country) {
       jQuery('#edit-' + type + '-country').val(address.country);
-      try {
-        uc_update_zone_select('edit-' + type + '-country', address.zone);
-      }
-      catch (err) {}
     }
 
     jQuery('#edit-' + type + '-zone').val(address.zone);
diff --git a/shipping/uc_shipping/uc_shipping.module b/shipping/uc_shipping/uc_shipping.module
index 010111e..37077ae 100644
--- a/shipping/uc_shipping/uc_shipping.module
+++ b/shipping/uc_shipping/uc_shipping.module
@@ -756,20 +756,18 @@ function uc_shipping_address_form($form, &$form_state, $addresses, $order) {
   $form['origin']['pickup_street1'] = uc_textfield(uc_get_field_name('street1'), $address->street1, FALSE, NULL, 64);
   $form['origin']['pickup_street2'] = uc_textfield(uc_get_field_name('street2'), $address->street2, FALSE, NULL, 64);
   $form['origin']['pickup_city'] = uc_textfield(uc_get_field_name('city'), $address->city, FALSE);
-  $form['origin']['pickup_country'] = uc_country_select(uc_get_field_name('country'), $address->country);
-  if (isset($_POST['pickup_country'])) {
-    $country = $_POST['pickup_country'];
-  }
-  else {
-    $country = $address->country;
-  }
-  $form['origin']['pickup_zone'] = uc_zone_select(uc_get_field_name('zone'), $address->zone, NULL, $country);
+  $form['origin']['pickup_country'] = uc_country_select(uc_get_field_name('country'), $address->country, array('ajax' => 'origin][pickup_zone'));
+  $country = isset($form_state['values']['pickup_country']) ? $form_state['values']['pickup_country'] : $address->country;
+  $form['origin']['pickup_zone'] = uc_zone_select(uc_get_field_name('zone'), $address->zone, $country, array('ajax' => 'origin][pickup_zone'));
   $form['origin']['pickup_postal_code'] = uc_textfield(uc_get_field_name('postal_code'), $address->postal_code, FALSE, NULL, 10, 10);
 
   $order_form = uc_order_pane_ship_to('edit-form', $order);
   $form['destination'] = $order_form['ship_to'];
   $form['destination']['delivery_email'] = uc_textfield(uc_get_field_name('email'), $order->primary_email, FALSE, NULL, 255);
   $form['destination']['delivery_email']['#weight'] = -1;
+  $form['destination']['delivery_country'] = uc_country_select(uc_get_field_name('country'), $order->delivery_country, array('ajax' => 'destination][delivery_zone'));
+  $country = isset($form_state['values']['delivery_country']) ? $form_state['values']['delivery_country'] : $order->delivery_country;
+  $form['destination']['delivery_zone'] = uc_zone_select(uc_get_field_name('zone'), $order->delivery_zone, $country, array('ajax' => 'destination][delivery_zone'));
   $form['destination']['#type'] = 'fieldset';
   $form['destination']['#title'] = t('Destination address');
   $form['destination']['#collapsible'] = TRUE;
diff --git a/uc_cart/uc_cart.js b/uc_cart/uc_cart.js
index cf40ca8..1a763de 100644
--- a/uc_cart/uc_cart.js
+++ b/uc_cart/uc_cart.js
@@ -137,10 +137,6 @@ function apply_address(type, address_str) {
 
   if (jQuery('#edit-panes-' + temp + '-country').val() != address.country) {
     jQuery('#edit-panes-' + temp + '-country').val(address.country).trigger('change');
-    try {
-      uc_update_zone_select('edit-panes-' + temp + '-country', address.zone);
-    }
-    catch (err) { }
   }
 
   jQuery('#edit-panes-' + temp + '-zone').val(address.zone).trigger('change');
diff --git a/uc_cart/uc_cart_checkout_pane.inc b/uc_cart/uc_cart_checkout_pane.inc
index a6d2dab..9f9ce88 100644
--- a/uc_cart/uc_cart_checkout_pane.inc
+++ b/uc_cart/uc_cart_checkout_pane.inc
@@ -263,20 +263,14 @@ function uc_checkout_pane_delivery($op, $order, $form = NULL, &$form_state = NUL
         $delivery_city = $order ? $order->delivery_city : '';
         $contents['delivery_city'] = uc_textfield(uc_get_field_name('city'), $delivery_city, uc_address_field_required('city'));
       }
+      $delivery_country = $order ? $order->delivery_country : NULL;
       if (uc_address_field_enabled('country')) {
-        $delivery_country = $order ? $order->delivery_country : NULL;
-        $contents['delivery_country'] = uc_country_select(uc_get_field_name('country'), $delivery_country, NULL, 'name', uc_address_field_required('country'));
+        $contents['delivery_country'] = uc_country_select(uc_get_field_name('country'), $delivery_country, array('required' => uc_address_field_required('country'), 'ajax' => 'panes][delivery][delivery_zone'));
       }
       if (uc_address_field_enabled('zone')) {
-        if (isset($_POST['panes']['delivery']['delivery_country'])) {
-          $country_id = intval($_POST['panes']['delivery']['delivery_country']);
-        }
-        else {
-          $country_id = $delivery_country;
-        }
         $delivery_zone = $order ? $order->delivery_zone : NULL;
-        $contents['delivery_zone'] = uc_zone_select(uc_get_field_name('zone'), $delivery_zone, NULL, $country_id, 'name', uc_address_field_required('zone'));
-        if (isset($_POST['panes']) && count($contents['delivery_zone']['#options']) == 1) {
+        $contents['delivery_zone'] = uc_zone_select(uc_get_field_name('zone'), $delivery_zone, $delivery_country, array('required' => uc_address_field_required('zone'), 'ajax' => 'panes][delivery][delivery_zone'));
+        if (count($contents['delivery_zone']['#options']) == 1) {
           $contents['delivery_zone']['#required'] = FALSE;
         }
       }
@@ -357,20 +351,14 @@ function uc_checkout_pane_billing($op, $order, $form = NULL, &$form_state = NULL
         $billing_city = $order ? $order->billing_city : '';
         $contents['billing_city'] = uc_textfield(uc_get_field_name('city'), $billing_city, uc_address_field_required('city'));
       }
+      $billing_country = $order ? $order->billing_country : NULL;
       if (uc_address_field_enabled('country')) {
-        $billing_country = $order ? $order->billing_country : NULL;
-        $contents['billing_country'] = uc_country_select(uc_get_field_name('country'), $billing_country, NULL, 'name', uc_address_field_required('country'));
+        $contents['billing_country'] = uc_country_select(uc_get_field_name('country'), $billing_country, array('required' => uc_address_field_required('country'), 'ajax' => 'panes][billing][billing_zone'));
       }
       if (uc_address_field_enabled('zone')) {
-        if (isset($_POST['panes']['billing']['billing_country'])) {
-          $country_id = intval($_POST['panes']['billing']['billing_country']);
-        }
-        else {
-          $country_id = $billing_country;
-        }
         $billing_zone = $order ? $order->billing_zone : NULL;
-        $contents['billing_zone'] = uc_zone_select(uc_get_field_name('zone'), $billing_zone, NULL, $country_id, 'name', uc_address_field_required('zone'));
-        if (isset($_POST['panes']) && count($contents['billing_zone']['#options']) == 1) {
+        $contents['billing_zone'] = uc_zone_select(uc_get_field_name('zone'), $billing_zone, $billing_country, array('required' => uc_address_field_required('zone'), 'ajax' => 'panes][billing][billing_zone'));
+        if (count($contents['billing_zone']['#options']) == 1) {
           $contents['billing_zone']['#required'] = FALSE;
         }
       }
diff --git a/uc_order/uc_order.js b/uc_order/uc_order.js
index 45ef7d8..4695110 100644
--- a/uc_order/uc_order.js
+++ b/uc_order/uc_order.js
@@ -134,10 +134,6 @@ function apply_address(type, address_str) {
 
   if (jQuery('#edit-' + type + '-country').val() != address['country']) {
     jQuery('#edit-' + type + '-country').val(address['country']);
-    try {
-      uc_update_zone_select('edit-' + type + '-country', address['zone']);
-    }
-    catch (err) {}
   }
 
   jQuery('#edit-' + type + '-zone').val(address['zone']);
diff --git a/uc_order/uc_order.order_pane.inc b/uc_order/uc_order.order_pane.inc
index 63d421b..29dd2f7 100644
--- a/uc_order/uc_order.order_pane.inc
+++ b/uc_order/uc_order.order_pane.inc
@@ -48,16 +48,11 @@ function uc_order_pane_ship_to($op, $order, &$form = NULL, &$form_state = NULL)
         $form['ship_to']['delivery_city'] = uc_textfield(uc_get_field_name('city'), $order->delivery_city, FALSE);
       }
       if (uc_address_field_enabled('country')) {
-        $form['ship_to']['delivery_country'] = uc_country_select(uc_get_field_name('country'), $order->delivery_country);
+        $form['ship_to']['delivery_country'] = uc_country_select(uc_get_field_name('country'), $order->delivery_country, array('ajax' => 'ship_to][delivery_zone'));
       }
       if (uc_address_field_enabled('zone')) {
-        if (isset($_POST['delivery_country'])) {
-          $country_id = intval($_POST['delivery_country']);
-        }
-        else {
-          $country_id = $order->delivery_country;
-        }
-        $form['ship_to']['delivery_zone'] = uc_zone_select(uc_get_field_name('zone'), $order->delivery_zone, NULL, $country_id);
+        $country_id = isset($form_state['values']) ? $form_state['values']['delivery_country'] : $order->delivery_country;
+        $form['ship_to']['delivery_zone'] = uc_zone_select(uc_get_field_name('zone'), $order->delivery_zone, $country_id, array('ajax' => 'ship_to][delivery_zone'));
       }
       if (uc_address_field_enabled('postal_code')) {
         $form['ship_to']['delivery_postal_code'] = uc_textfield(uc_get_field_name('postal_code'), $order->delivery_postal_code, FALSE, NULL, 10, 10);
@@ -135,16 +130,11 @@ function uc_order_pane_bill_to($op, $order, &$form = NULL, &$form_state = NULL)
         $form['bill_to']['billing_city'] = uc_textfield(uc_get_field_name('city'), $order->billing_city, FALSE);
       }
       if (uc_address_field_enabled('country')) {
-        $form['bill_to']['billing_country'] = uc_country_select(uc_get_field_name('country'), $order->billing_country);
+        $form['bill_to']['billing_country'] = uc_country_select(uc_get_field_name('country'), $order->billing_country, array('ajax' => 'bill_to][billing_zone'));
       }
       if (uc_address_field_enabled('zone')) {
-        if (isset($_POST['billing_country'])) {
-          $country_id = intval($_POST['billing_country']);
-        }
-        else {
-          $country_id = $order->billing_country;
-        }
-        $form['bill_to']['billing_zone'] = uc_zone_select(uc_get_field_name('zone'), $order->billing_zone, NULL, $country_id);
+        $country_id = isset($form_state['values']) ? $form_state['values']['billing_country'] : $order->billing_country;
+        $form['bill_to']['billing_zone'] = uc_zone_select(uc_get_field_name('zone'), $order->billing_zone, $country_id, array('ajax' => 'bill_to][billing_zone'));
       }
       if (uc_address_field_enabled('postal_code')) {
         $form['bill_to']['billing_postal_code'] = uc_textfield(uc_get_field_name('postal_code'), $order->billing_postal_code, FALSE, NULL, 10, 10);
diff --git a/uc_store/uc_country_select.js b/uc_store/uc_country_select.js
deleted file mode 100644
index b4a6aa7..0000000
--- a/uc_store/uc_country_select.js
+++ /dev/null
@@ -1,44 +0,0 @@
-
-/**
- * @file
- * Switches the zones list when a country is chosen for an address.
- */
-
-/**
- * Sets the select box change behavior for the country selector
- */
-Drupal.behaviors.ucCountrySelect = {
-  attach: function(context, settings) {
-    jQuery('select[id$=-country]:not(.ucCountrySelect-processed)', context).addClass('ucCountrySelect-processed').change(
-      function() {
-        uc_update_zone_select(this.id, '', settings);
-      }
-    );
-  }
-}
-
-/**
- * Updates the zone select element with new options.
- */
-function uc_update_zone_select(country_select, default_zone, settings) {
-  settings = settings || Drupal.settings;
-
-  var zone_select = country_select.substr(0, country_select.length - 8) + '-zone';
-
-  var options = { 'country_id' : jQuery('#' + country_select).val() };
-
-  jQuery('#' + zone_select).parent().siblings('.zone-throbber').attr('style', 'background-image: url(' + settings.basePath + 'misc/throbber.gif); background-repeat: no-repeat; background-position: 100% -20px;').html('&nbsp;&nbsp;&nbsp;&nbsp;');
-
-  jQuery.post(settings.basePath + '?q=uc_js_util/zone_select', options,
-         function (contents) {
-           if (contents.match('value="-1"') != null) {
-             jQuery('#' + zone_select).attr('disabled', 'disabled');
-           }
-           else {
-             jQuery('#' + zone_select).removeAttr('disabled');
-           }
-           jQuery('#' + zone_select).empty().append(contents).val(default_zone).change();
-           jQuery('#' + zone_select).parent().siblings('.zone-throbber').removeAttr('style').empty();
-         }
-  );
-}
diff --git a/uc_store/uc_store.admin.inc b/uc_store/uc_store.admin.inc
index 6fb4df6..b6319fc 100644
--- a/uc_store/uc_store.admin.inc
+++ b/uc_store/uc_store.admin.inc
@@ -641,15 +641,10 @@ function uc_store_settings_form($form, &$form_state) {
   $form['address']['uc_store_street1'] = uc_textfield(uc_get_field_name('street1'), variable_get('uc_store_street1', NULL), FALSE, NULL, 128);
   $form['address']['uc_store_street2'] = uc_textfield(uc_get_field_name('street2'), variable_get('uc_store_street2', NULL), FALSE, NULL, 128);
   $form['address']['uc_store_city'] = uc_textfield(uc_get_field_name('city'), variable_get('uc_store_city', NULL), FALSE);
-  $form['address']['uc_store_country'] = uc_country_select(uc_get_field_name('country'), uc_store_default_country());
+  $form['address']['uc_store_country'] = uc_country_select(uc_get_field_name('country'), uc_store_default_country(), NULL, 'name', FALSE, 'address][uc_store_zone');
 
-  if (isset($_POST['uc_store_country'])) {
-    $country_id = intval($_POST['uc_store_country']);
-  }
-  else {
-    $country_id = uc_store_default_country();
-  }
-  $form['address']['uc_store_zone'] = uc_zone_select(uc_get_field_name('zone'), variable_get('uc_store_zone', NULL), NULL, $country_id);
+  $country_id = isset($form_state['values']) ? $form_state['values']['uc_store_country'] : uc_store_default_country();
+  $form['address']['uc_store_zone'] = uc_zone_select(uc_get_field_name('zone'), variable_get('uc_store_zone', NULL), NULL, $country_id, 'name', FALSE, 'address][uc_store_zone');
   $form['address']['uc_store_postal_code'] = uc_textfield(uc_get_field_name('postal_code'), variable_get('uc_store_postal_code', NULL), FALSE, NULL, 10);
 
   $form['currency'] = array(
diff --git a/uc_store/uc_store.module b/uc_store/uc_store.module
index 86228ba..c8c0fe0 100644
--- a/uc_store/uc_store.module
+++ b/uc_store/uc_store.module
@@ -172,13 +172,6 @@ function uc_store_menu() {
     'file' => 'uc_store.admin.inc',
   );
 
-  $items['uc_js_util/%'] = array(
-    'title' => 'JS utilities',
-    'page callback' => 'uc_store_js_util',
-    'page arguments' => array(1),
-    'access arguments' => array('access content'),
-    'type' => MENU_CALLBACK,
-  );
   $items['admin/store/customers/orders/%'] = array(
     'title' => 'Customer orders',
     'description' => 'View a list of orders placed by this customer.',
@@ -677,26 +670,6 @@ function uc_store_address_fields_form_reset($form_id, &$form_state) {
   drupal_set_message(t('The configuration options have been reset to their default values.'));
 }
 
-/**
- * A handler for Javascript helper functions...
- */
-function uc_store_js_util($func) {
-  switch ($func) {
-    case 'zone_select':
-      $country_id = intval($_POST['country_id']) > 0 ? intval($_POST['country_id']) : uc_store_default_country();
-      $title = isset($_POST['title']) ? check_plain($_POST['title']) : NULL;
-      $display = isset($_POST['display']) ? check_plain($_POST['display']) : 'name';
-      $select = uc_zone_select($title, NULL, NULL, $country_id, $display);
-      $select['#parents'] = array();
-      $match = array('`<[/]*div[^>]*>`', '`<[/]*select[^>]*>`', '`\n|\r`');
-      $replace = array('', '', '');
-      $output = preg_replace($match, $replace, theme('select', array('element' => $select)));
-  }
-
-  print $output;
-  exit();
-}
-
 /*******************************************************************************
  * Module and Helper Functions
  ******************************************************************************/
@@ -1128,37 +1101,60 @@ function uc_zone_get_by_id($id) {
 /**
  * Creates a zone select box for a form.
  *
- * @param $display
- *   Can be 'code' or 'name'.
- */
-function uc_zone_select($title, $default = NULL, $description = NULL, $country_id = NULL, $display = 'name', $required = FALSE) {
+ * @param $title
+ *   The label for the field.
+ * @param $default
+ *   The default zone ID.
+ * @param $country_id
+ *   The country ID
+ * @param array $options
+ *   An associative array of additional options, with the following elements:
+ *   - 'description': The description for the field (defaults to none).
+ *   - 'display': The values to display, either 'name' (default) or 'code'.
+ *   - 'required': TRUE if the field is required (defaults to FALSE).
+ *   - 'ajax': If set, this should be the Form API reference to this element,
+ *     so it can be updated using Ajax when the country is changed.
+ *
+ * @return
+ *   A Form API select element.
+ */
+function uc_zone_select($title = '', $default = NULL, $country_id = NULL, $options = array()) {
+  $options += array(
+    'description' => NULL,
+    'display' => 'name',
+    'required' => FALSE,
+    'ajax' => '',
+  );
+
   if (empty($country_id)) {
     $country_id = uc_store_default_country();
   }
-  $order_by = ($display == 'code') ? 'zone_code' : 'zone_name';
 
-  $zones = db_query("SELECT * FROM {uc_zones} WHERE zone_country_id = :id ORDER BY $order_by", array(':id' => $country_id));
+  $order_by = ($options['display'] == 'code') ? 'zone_code' : 'zone_name';
+  $result = db_query("SELECT * FROM {uc_zones} WHERE zone_country_id = :id ORDER BY $order_by", array(':id' => $country_id));
 
-  $options[''] = t('Please select');
-  foreach ($zones as $zone) {
-    $options[$zone->zone_id] = ($display == 'code') ? $zone->zone_code : $zone->zone_name;
+  $zones = array('' => t('Please select'));
+  foreach ($result as $zone) {
+    $zones[$zone->zone_id] = $zone->$order_by;
   }
-
-  if (count($options) == 1) {
-    $options = array(-1 => t('Not applicable'));
+  if (count($zones) == 1) {
+    $zones = array(-1 => t('Not applicable'));
   }
 
   $select = array(
     '#type' => 'select',
     '#title' => $title,
-    '#description' => $description,
-    '#options' => $options,
+    '#description' => $options['description'],
+    '#options' => $zones,
     '#default_value' => $default,
-    '#required' => $required,
-    '#disabled' => isset($options[-1]) ? TRUE : FALSE,
-    '#suffix' => '<span class="zone-throbber"></span>',
+    '#required' => $options['required'],
+    '#disabled' => isset($zones[-1]),
   );
 
+  if ($options['ajax']) {
+    $select['#prefix'] = '<div id="ajax-' . str_replace('][', '-', $options['ajax']) . '">';
+    $select['#suffix'] = '</div>';
+  }
   return $select;
 }
 
@@ -1188,14 +1184,34 @@ function uc_country_get_by_id($id) {
 /**
  * Creates a country select box for a form.
  *
- * @param $display
- *   Can be 'name', 'code2' for the 2-digit code, or 'code3' for the 3-digit code.
- */
-function uc_country_select($title, $default = NULL, $description = NULL, $display = 'name', $required = FALSE) {
-  if ($display == 'code2') {
+ * @param $title
+ *   The label for the field.
+ * @param $default
+ *   The default country ID, or NULL to use the store default country.
+ * @param array $options
+ *   An associative array of additional options, with the following elements:
+ *   - 'description': The description for the field (defaults to none).
+ *   - 'display': The values to display, either 'name' (default), 'code2' for
+ *     the 2-character ISO code, or 'code3' for the 3-character ISO code.
+ *   - 'required': TRUE if the field is required (defaults to FALSE).
+ *   - 'ajax': If set, changing the country will update this related element
+ *     with a list of zones for this country.
+ *
+ * @return
+ *   A Form API select element.
+ */
+function uc_country_select($title, $default = NULL, $options = array()) {
+  $options += array(
+    'description' => NULL,
+    'display' => 'name',
+    'required' => FALSE,
+    'ajax' => '',
+  );
+ 
+  if ($options['display'] == 'code2') {
     $order_by = 'country_iso_code_2';
   }
-  elseif ($display == 'code3') {
+  elseif ($options['display'] == 'code3') {
     $order_by = 'country_iso_code_3';
   }
   else {
@@ -1204,31 +1220,54 @@ function uc_country_select($title, $default = NULL, $description = NULL, $displa
 
   $result = db_query("SELECT * FROM {uc_countries} WHERE version > :version ORDER BY $order_by", array(':version' => 0));
 
-  $options = array();
-  while ($country = $result->fetchAssoc()) {
-    $options[$country['country_id']] = $country[$order_by];
+  $countries = array();
+  foreach ($result as $country) {
+    $countries[$country->country_id] = $country->$order_by;
   }
-  if (count($options) == 0) {
-    $options[] = t('No countries found.');
+  if (empty($countries)) {
+    $countries[] = t('No countries found.');
   }
 
-  $default = db_query("SELECT country_id FROM {uc_countries} WHERE country_id = :id AND version > :version", array(':id' => empty($default) ? 0 : intval($default), ':version' => 0))->fetchField();
+  if (!$default || !isset($countries[$default])) {
+    $default = uc_store_default_country();
+  }
 
   $select = array(
     '#type' => 'select',
     '#title' => $title,
-    '#description' => $description,
-    '#options' => $options,
-    '#default_value' => empty($default) ? uc_store_default_country() : $default,
-    '#required' => $required,
+    '#description' => $options['description'],
+    '#options' => $countries,
+    '#default_value' => $default,
+    '#required' => $options['required'],
   );
 
-  drupal_add_js(drupal_get_path('module', 'uc_store') . '/uc_country_select.js');
+  if ($options['ajax']) {
+    $select['#ajax'] = array(
+      'callback' => 'uc_country_ajax_zone',
+      'wrapper' => 'ajax-' . str_replace('][', '-', $options['ajax']),
+      'progress' => array(
+        'type' => 'throbber',
+      ),
+    );
+  }
 
   return $select;
 }
 
 /**
+ * Ajax callback to updates the zone select box when the country is changed.
+ */
+function uc_country_ajax_zone($form, &$form_state) {
+  $keys = explode('-', substr($form_state['triggering_element']['#ajax']['wrapper'], 5));
+  while ($keys) {
+    $form = $form[array_shift($keys)];
+  }
+
+  unset($form['#title']);
+  return $form;
+}
+
+/**
  * Returns a list of available countries.
  */
 function uc_country_option_list() {
