diff --git a/commerce_pickpackpoints.module b/commerce_pickpackpoints.module
index d438453..78b6a6f 100755
--- a/commerce_pickpackpoints.module
+++ b/commerce_pickpackpoints.module
@@ -69,7 +69,7 @@ function commerce_pickpackpoints_get_data($reset = FALSE) {
       return NULL;
     }
     $pp_array = (array) $pp_array;
-    foreach ($pp_array['Shop'] as $num => $shop_data) {
+    foreach ($pp_array['Shop'] as $shop_data) {
       $sd = (array) $shop_data;
       $d = array();
       foreach ($sd as $key => $value) {
@@ -79,7 +79,7 @@ function commerce_pickpackpoints_get_data($reset = FALSE) {
         $d[$key] = check_plain($value);
       }
       if (!empty($d['ShopCode'])) {
-        $ppp_array[$num] = $d;
+        $ppp_array[$d['ShopCode']] = $d;
       }
     }
     cache_set('pickpackpoints_data', $ppp_array);
@@ -104,9 +104,12 @@ function commerce_pickpackpoints_get_lists($reset = FALSE) {
   }
 
   $list = array(
-    'pp_county' => array('-1' => t('Choose a county')),
-    'pp_city' => array('-1' => t('Choose a city')),
-    'pp_list' => array('-1' => t('Choose a shop')),
+    'pp_county' => array('none' => t('Choose a county')),
+    'pp_city' => array('none' => t('Choose a city')),
+    'pp_list' => array('none' => t('Choose a shop')),
+    'pp_rendered_shop' => array(),
+    'pp_all_cities' => array('none' => t('Choose a city')),
+    'pp_all_shops' => array('none' => t('Choose a shop')),
   );
 
   $l_county = array();
@@ -114,55 +117,40 @@ function commerce_pickpackpoints_get_lists($reset = FALSE) {
   $l_city = array();
   $l_city_keys = array();
   $l = array();
-  $js_cities = "// Cities of Hungary\nvar cities = new Array();\n";
-  $js_shops = "// Pick-pack shops\nvar shops = new Array();\n";
-  $js_rendered_shops = "// Pick-pack shops\nvar renderedShops = new Array();\nvar shopData = '';\n";
   foreach ($pp_array as $num => $sd) {
     $county = $sd['Area'];
+    if (empty($county)) {
+      continue;
+    }
     $city = $sd['City'];
     if (substr($sd['ZipCode'], 0, 1) == 1) {
       $county = $sd['City'];
       $city = $sd['Area'];
     }
-    if (empty($county)) {
-      continue;
-    }
+    $shop_code = $sd['ShopCode'];
     if (!in_array($county, $l_county)) {
-      $l_county[] = $county;
-      end($l_county);
-      $l_county_keys[$county] = key($l_county);
+      $l_county[$county] = $county;
     }
-    if (empty($l_city[$l_county_keys[$county]]) || !in_array($city, $l_city[$l_county_keys[$county]])) {
-      $l_city[$l_county_keys[$county]][] = $city;
-      end($l_city[$l_county_keys[$county]]);
-      $l_city_keys[$city] = key($l_city[$l_county_keys[$county]]);
+    if (empty($l_city[$county]) || !in_array($city, $l_city[$county])) {
+      $l_city[$county][$city] = $city;
+      $list['pp_all_cities'][$city] = $city;
     }
-    $l[$l_county_keys[$county]][$l_city_keys[$city]][$num] = $sd['ZipCode'] . ' ' . $sd['City'] . ', ' . $sd['Address'] . ' - ' . $sd['ShopType'];
-    $js_rendered_shops .= commerce_pickpackpoints_get_rendered_js_data($num, $sd);
+    $l[$county][$city][$shop_code] = $sd['ZipCode'] . ' ' . $sd['City'] . ', ' . $sd['Address'] . ' - ' . $sd['ShopType'];
+    $list['pp_all_shops'][$shop_code] = $l[$county][$city][$shop_code];
+    $list['pp_rendered_shop'][$shop_code] = commerce_pickpackpoints_get_rendered_data($num, $sd);
   }
 
   asort($l_county);
   foreach ($l_city as $key => $array) {
     asort($l_city[$key]);
-    $js_cities .= "cities[$key] = new Array();\n";
-    $js_shops .= "shops[$key] = new Array();\n";
-    $index = 0;
     foreach ($l_city[$key] as $key2 => $city) {
-      $js_cities .= "cities[$key][$index] = '" . $city . "';\n";
-      $js_shops .= "shops[$key][$index] = new Array();\n";
       asort($l[$key][$key2]);
-      foreach ($l[$key][$key2] as $key3 => $shop) {
-        $js_shops .= "shops[$key][$index][$key3] = '" . $shop . "';\n";
-      }
-      $index++;
     }
   }
 
   $list['pp_county'] += $l_county;
   $list['pp_city'] += $l_city;
   $list['pp_list'] += $l;
-  $list['js'] = $js_cities . $js_shops;
-  $list['js_render'] = $js_rendered_shops;
   cache_set('pickpackpoints_list', $list);
   return $list;
 }
@@ -237,18 +225,6 @@ function commerce_pickpackpoints_get_rendered_data($id, $data) {
 }
 
 /**
- * Generate rendered output to javascript after choosed shop.
- */
-function commerce_pickpackpoints_get_rendered_js_data($id, $data) {
-  $text = "'<div class=\"pickpack-shop-data shop-id-$id\">";
-  $text .= commerce_pickpackpoints_get_rendered_data($id, $data);
-  $text .= "</div><!-- .pickpack-shop-data -->';";
-  $output = "renderedShops[$id] = " . str_replace("\n", '', $text) . ";\n\n";
-
-  return $output;
-}
-
-/**
  * Implements hook_form_FORM_ID_alter().
  */
 function commerce_pickpackpoints_commerce_checkout_pane_info_alter(&$checkout_panes) {
diff --git a/modules/commerce_pickpackpoints_shipping/includes/pickpackpoints_shipping.checkout_pane.inc b/modules/commerce_pickpackpoints_shipping/includes/pickpackpoints_shipping.checkout_pane.inc
index 6abeafc..1347e40 100644
--- a/modules/commerce_pickpackpoints_shipping/includes/pickpackpoints_shipping.checkout_pane.inc
+++ b/modules/commerce_pickpackpoints_shipping/includes/pickpackpoints_shipping.checkout_pane.inc
@@ -20,73 +20,121 @@ function commerce_pickpackpoints_pane_checkout_form($form, &$form_state, $checko
       drupal_goto(commerce_checkout_order_uri($order));
     }
   }
-
+  $form_state['checkout_pane'] = $checkout_pane['pane_id'];
   $lists = commerce_pickpackpoints_get_lists();
-  // Add js regions data.
-  drupal_add_js($lists['js'], array(
-    'type' => 'inline',
-    'group' => JS_DEFAULT,));
-  // Add js shops data.
-  drupal_add_js($lists['js_render'], array(
-    'type' => 'inline',
-    'group' => JS_DEFAULT,));
-  // Add js functions.
-  drupal_add_js(drupal_get_path('module', 'commerce_pickpackpoints') . '/includes/pickpackpoints_regions.js', 'file');
 
-  $county = -1;
-  $city = -1;
-  $shop = -1;
+  $county = 'none';
+  $city = 'none';
+  $shop = 'none';
 
   $form['county'] = array(
     '#type' => 'select',
     '#title' => t('County'),
-    '#default_value' => $county,
+    '#default_value' => isset($form_state['values']['checkout_pane_pickpackpoints']['county']) ? $form_state['values']['checkout_pane_pickpackpoints']['county'] : $county,
     '#options' => $lists['pp_county'],
-    '#attributes' => array(
-      'id' => "counties",
-      'onchange' => "ChangeCountyList();",
+    '#ajax' => array(
+      'callback' => 'commerce_pickpackpoints_choice_county_js',
+      'wrapper' => 'ppp-datapicker-city-wrapper',
     ),
   );
   $form['city'] = array(
     '#type' => 'select',
     '#title' => t('City'),
-    '#default_value' => $city,
-    '#options' => $lists['pp_city'],
-    '#attributes' => array(
-      'id' => "cities",
-      'onchange' => "ChangeCityList();",
+    '#default_value' => isset($form_state['values']['checkout_pane_pickpackpoints']['city']) ? $form_state['values']['checkout_pane_pickpackpoints']['city'] : $city,
+    '#options' => _commerce_pickpackpoints_get_city_options($lists, $form_state),
+    '#ajax' => array(
+      'callback' => 'commerce_pickpackpoints_choice_city_js',
+      'wrapper' => 'ppp-datapicker-shop-wrapper',
     ),
+    '#prefix' => '<div id="ppp-datapicker-city-wrapper">',
+    '#suffix' => '</div>',
+    '#disabled' => isset($form_state['values']['checkout_pane_pickpackpoints']['county']) && $form_state['values']['checkout_pane_pickpackpoints']['county'] != 'none' ? FALSE : TRUE,
   );
   $form['shop'] = array(
     '#type' => 'select',
     '#title' => t('Shop'),
-    '#default_value' => $shop,
-    '#options' => $lists['pp_list'],
-    '#attributes' => array(
-      'id' => "shops",
-      'onchange' => "ChangeShopList();",
-    ),
+    '#default_value' => isset($form_state['values']['checkout_pane_pickpackpoints']['shop']) ? $form_state['values']['checkout_pane_pickpackpoints']['shop'] : $shop,
+    '#options' => _commerce_pickpackpoints_get_shop_options($lists, $form_state),
     '#required' => TRUE,
+    '#ajax' => array(
+      'callback' => 'commerce_pickpackpoints_choice_shop_js',
+      'wrapper' => 'ppp-datapicker-shop-table',
+    ),
+    '#prefix' => '<div id="ppp-datapicker-shop-wrapper">',
+    '#suffix' => '</div>',
+    '#disabled' => isset($form_state['values']['checkout_pane_pickpackpoints']['city']) && $form_state['values']['checkout_pane_pickpackpoints']['city'] != 'none' ? FALSE : TRUE,
   );
 
   $form['shop_info'] = array(
-    '#markup' => '',
-    '#prefix' => '<div id="pickpack-text">',
+    '#markup' => _commerce_pickpackpoints_get_shop_render($lists, $form_state),
+    '#prefix' => '<div id="ppp-datapicker-shop-table">',
     '#suffix' => '</div>',
   );
 
-  // Need on page load to reset select elements.
-  drupal_add_js("PickPackRemoveOptions($county, $city, $shop);", array('type' => 'inline', 'scope' => 'footer'));
-
   return $form;
 }
 
 /**
+ * Ajax callback from county select.
+ */
+function commerce_pickpackpoints_choice_county_js($form, $form_state, $checkout_pane, $order) {
+  return $form[$form_state['checkout_pane']]['city'];
+}
+
+/**
+ * Ajax callback from city select.
+ */
+function commerce_pickpackpoints_choice_city_js($form, $form_state, $checkout_pane, $order) {
+  return $form[$form_state['checkout_pane']]['shop'];
+}
+
+/**
+ * Ajax callback from shop select.
+ */
+function commerce_pickpackpoints_choice_shop_js($form, $form_state) {
+  return $form[$form_state['checkout_pane']]['shop_info'];
+}
+
+/**
+ * Helper for generating city options.
+ */
+function _commerce_pickpackpoints_get_city_options($lists, $form_state) {
+  if (isset($form_state['values'][$form_state['checkout_pane']]['county']) && $form_state['values'][$form_state['checkout_pane']]['county'] != 'none') {
+    $county = $form_state['values'][$form_state['checkout_pane']]['county'];
+    return $lists['pp_city'][$county];
+  }
+  return $lists['pp_all_cities'];
+}
+
+/**
+ * Helper for generating shop options.
+ */
+function _commerce_pickpackpoints_get_shop_options($lists, $form_state) {
+  if (isset($form_state['values'][$form_state['checkout_pane']]['city']) && $form_state['values'][$form_state['checkout_pane']]['city'] != 'none') {
+    $county = $form_state['values'][$form_state['checkout_pane']]['county'];
+    $city = $form_state['values'][$form_state['checkout_pane']]['city'];
+    return $lists['pp_list'][$county][$city];
+  }
+  return $lists['pp_all_shops'];
+}
+
+/**
+ * Helper for display rendered shop data.
+ */
+function _commerce_pickpackpoints_get_shop_render($lists, $form_state) {
+  if (isset($form_state['values'][$form_state['checkout_pane']]['shop']) && $form_state['values'][$form_state['checkout_pane']]['shop'] != 'none') {
+    $shop = $form_state['values'][$form_state['checkout_pane']]['shop'];
+    return $lists['pp_rendered_shop'][$shop];
+  }
+  return '';
+}
+
+/**
  * Pick-pack pont pane: validation callback.
  */
 function commerce_pickpackpoints_pane_checkout_form_validate($form, &$form_state, $checkout_pane, $order) {
   $shop_id = $form_state['values'][$checkout_pane['pane_id']]['shop'];
-  if ($shop_id < 0) {
+  if ($shop_id == 'none') {
     form_set_error($checkout_pane['pane_id'] . '][shop', t('Please choose a shop.'));
     return FALSE;
   }
@@ -116,10 +164,12 @@ function commerce_pickpackpoints_pane_review($form, $form_state, $checkout_pane,
     return '';
   }
   $data = commerce_pickpackpoints_get_data();
-  $content['nickname'] = array(
-    '#type' => 'item',
-    '#title' => t('Products delivery to Pick-pack pont') . ':',
-    '#markup' => commerce_pickpackpoints_get_rendered_data($order->data['pick_pack_shop'], $data[$order->data['pick_pack_shop']]),
+  $content = array(
+    'nickname' => array(
+      '#type' => 'item',
+      '#title' => t('Products delivery to Pick-pack pont') . ':',
+      '#markup' => commerce_pickpackpoints_get_rendered_data($order->data['pick_pack_shop'], $data[$order->data['pick_pack_shop']]),
+    ),
   );
   return drupal_render($content);
 }
