diff --git a/phone.module b/phone.module
index 914e662..7d5d2e5 100644
--- a/phone.module
+++ b/phone.module
@@ -62,6 +62,7 @@ function phone_field_info() {
       'label' => t('Phone Number'),
       'instance_settings' => array(
         'phone_country_code' => 0,
+        'phone_default_country_field' => '',
         'phone_default_country_code' => '1',
         'phone_int_max_length' => 15,
         'ca_phone_separator' => '-',
@@ -118,15 +119,56 @@ function phone_field_instance_settings_form($field, $instance) {
       '#type' => 'markup',
       '#value' => t('International phone numbers are in the form +XX YYYYYYY where XX is a country code and YYYYYYY is the local number. This field type is based off of the <a href="http://www.itu.int/rec/T-REC-E.123/en">E.123 specification</a>.'),
     );
+
+    $instance_fields = array('' => '- Choose -');
+    foreach (field_info_instances($instance['entity_type'], $instance['bundle'])
+             as $field_name => $instance_info) {
+      if ($instance_info['id'] != $instance['id']) {
+        $field_info = field_info_field_by_id($instance_info['field_id']);
+        if (in_array($field_info['type'], array(
+          'text',
+          'list_text',
+          'number_integer',
+          'list_integer',
+          'addressfield'
+        ), TRUE)) {
+          $instance_fields[$field_name] = $instance_info['label'];
+        }
+      }
+    }
+    $form['phone_default_country_field'] = array(
+      '#type' => 'select',
+      '#title' => t('Field containing the default country to add / use for verification, for non-international numbers.'),
+      '#description' => t('Phone numbers will be validated for the country (code) value entered in this field. If you need a fixed default country instead, leave this empty and use the text box just below.'),
+      '#options' => $instance_fields,
+      '#default_value' => !empty($settings['phone_default_country_field']) ? $settings['phone_default_country_field'] : '',
+      '#states' => array(
+        'invisible' => array(
+          ':input[name="field[settings][country]"]' => array('!value' => 'int'),
+        ),
+      ),
+    );
+
     $form['phone_default_country_code'] = array(
       '#type' => 'textfield',
       '#title' => t('Default country code to add to international numbers without one (omit + sign)'),
       '#default_value' => $settings['phone_default_country_code'],
+      '#states' => array(
+        'visible' => array(
+          ':input[name="instance[settings][phone_default_country_field]"]' => array('value' => ''),
+          ':input[name="field[settings][country]"]' => array('value' => 'int'),
+        ),
+      ),
     );
     $form['phone_int_max_length'] = array(
       '#type' => 'textfield',
       '#title' => t('Maximum length of international numbers, according to the ITU this is 15'),
       '#default_value' => $settings['phone_int_max_length'],
+      '#states' => array(
+        'invisible' => array(
+          ':input[name="field[settings][country]"]' => array('!value' => 'int'),
+        ),
+      ),
     );
   }
 
@@ -152,7 +194,7 @@ function phone_field_instance_settings_form($field, $instance) {
 function phone_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
   foreach ($items as $delta => $item) {
     if (isset($item['value']) && $item['value'] != '') {
-      $ccode = $field['settings']['country'];
+      $ccode = !empty($item['countrycode']) ? $item['countrycode'] :  $field['settings']['country'];
       $value = $item['value'];
       if (!valid_phone_number($ccode, $value, $instance['settings'])) {
         $country = phone_country_info($ccode);
@@ -169,11 +211,14 @@ function phone_field_validate($entity_type, $entity, $field, $instance, $langcod
  * Implements hook_field_prepare_view().
  */
 function phone_field_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items) {
-  $ccode = $field['settings']['country'];
-  if (phone_countries($ccode) !== NULL) {
-    foreach ($items as $id => $items_per_entity) {
-      foreach ($items_per_entity as $delta => $item) {
-        if (isset($item['value'])) {
+  foreach ($items as $id => $items_per_entity) {
+    foreach ($items_per_entity as $delta => $item) {
+      if (isset($item['value'])) {
+        // Prefer dynamic country value over field setting. (It's probably only
+        // set by phone_element_validate(), only if field setting is 'int', but
+        // other code could fill it. The same column name is used by v2.x.
+        $ccode = !empty($item['countrycode']) ? $item['countrycode'] :  $field['settings']['country'];
+        if (phone_countries($ccode) !== NULL) {
           $items[$id][$delta]['value'] = format_phone_number($ccode, $item['value'], $instances[$id]['settings']);
         }
       }
@@ -236,12 +281,13 @@ function phone_field_widget_form(&$form, &$form_state, $field, $instance, $langc
     '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : '',
     '#required' => $element['#required'],
     '#size' => 17,
-    '#maxlength' => (
-      $field['settings']['country'] == 'int' ?
-        (isset($instance['settings']['phone_int_max_length']) ? $instance['settings']['phone_int_max_length'] : NULL)
-        : NULL
-    ),
   );
+  if ($field['settings']['country'] == 'int') {
+    $element += array(
+      '#maxlength' => isset($instance['settings']['phone_int_max_length']) ? $instance['settings']['phone_int_max_length'] : NULL,
+      '#element_validate' => array('phone_element_validate'),
+    );
+  }
   return array('value' => $element);
 }
 
@@ -251,6 +297,63 @@ function phone_field_widget_form(&$form, &$form_state, $field, $instance, $langc
 
 
 /**
+ * element_validate function for a phone field.
+ */
+function phone_element_validate($element, &$form_state, $complete_form) {
+  // An 'international' field needs to know which country to validate against.
+  // If that country comes from another field, we need to make sure that value
+  // is present in phone_field_validate(), so we copy it into the field item.
+
+  if (isset($element['#field_name']) && isset($element['#entity']) && isset($element['#entity_type'])) {
+    $field_info = field_info_field($element['#field_name']);
+    if ($field_info['settings']['country'] == 'int') {
+      // This field is 'international'...
+      list (,,$bundle) = entity_extract_ids($element['#entity_type'], $element['#entity']);
+      $instance_info = field_info_instance($element['#entity_type'], $element['#field_name'], $bundle);
+      if (!empty($instance_info['settings']['phone_default_country_field'])) {
+        // ...and has a country field that is a dependency of this one.
+
+        // Prepare for getting/setting value in $form_state. We assume our
+        // #parents ends with OUR_FIELDNAME / LANGCODE / DELTA / 'value' ...
+        $phone_field_parents = $element['#parents'];
+        array_pop($phone_field_parents);
+        // ...and that $form_state has our country field on the same level.
+        // Get field item.
+        $cc_field_parents = $phone_field_parents;
+        array_splice($cc_field_parents, -3, 1, $instance_info['settings']['phone_default_country_field']);
+        $cc_item = drupal_array_get_nested_value($form_state['values'], $cc_field_parents);
+
+        // Get country code from the field item.
+        $countrycode = '';
+        if (!empty($cc_item['country'])) {
+          // This works for addressfield.
+          $countrycode = $cc_item['country'];
+        }
+        elseif (!empty($cc_item['value'])) {
+          // This works for most fields.
+          $countrycode = $cc_item['value'];
+        }
+        if ($countrycode) {
+
+          if (is_numeric($countrycode)) {
+            // We support numeric phone codes too; convert to 2-letter country.
+            module_load_include('inc', 'phone', 'include/phone.int');
+            $countrycode = phone_country_code_convert($countrycode);
+          }
+          if ($countrycode) {
+            // Insert the value 'next to' the phone number's 'value' value. This
+            // way it will be passed to phone_field_validate().
+            $phone_field_parents[] = 'countrycode';
+            drupal_array_set_nested_value($form_state['values'], $phone_field_parents, strtolower($countrycode));
+          }
+        }
+      }
+    }
+  }
+}
+
+
+/**
  * @defgroup other_hooks Other Hook Implementations
  */
 
