diff --git a/addressfield.module b/addressfield.module
index 25b277d..5d38afe 100644
--- a/addressfield.module
+++ b/addressfield.module
@@ -418,9 +418,40 @@ function addressfield_default_values($field, $instance, array $address = array()
  * Implements hook_field_is_empty().
  */
 function addressfield_field_is_empty($item, $field) {
-  // Every address field must have at least a country value or it is considered
-  // empty, even if it has name information.
-  return empty($item['country']);
+
+  // We need the field instance to check to see if country is optional and if
+  // default country is the same as the currently set country. In that case we
+  // consider the field to be empty.
+  // @TODO - it might be safer still to have a flag that says to count
+  // submissions with country-only as empty when there is a default country.
+  $default_country = $optional_country = FALSE;
+  if (isset($item['element_key'])) {
+    $instance_keys = explode('|', $item['element_key']);
+    list($entity_type, $bundle_name, $field_name) = $instance_keys;
+    $field_instance = field_info_instance($entity_type, $field_name, $bundle_name);
+    if (isset($field_instance['widget']['settings']['format_handlers']['optional-country'])) {
+      $optional_country = $field_instance['widget']['settings']['format_handlers']['optional-country'];
+    }
+    if (isset($field_instance['default_value'][0]['country'])) {
+      $default_country = $field_instance['default_value'][0]['country'];
+    }
+  }
+
+  // @TODO - $optional_country should be a boolean to match similar settings
+  $ignore_item_keys = array('element_key', '_weight');
+  if ($optional_country && $default_country && $default_country == $item['country']) {
+    $ignore_item_keys[] = 'country';
+  }
+
+  foreach ($item as $field_name => $field_value) {
+    if (in_array($field_name, $ignore_item_keys)) {
+      continue;
+    }
+    if (!empty($field_value)) {
+      return FALSE;
+    }
+  }
+  return TRUE;
 }
 
 /**
@@ -534,13 +565,11 @@ function addressfield_field_widget_form(&$form, &$form_state, $field, $instance,
   // $form_state['values'] is empty because of #limit_validation_errors, so
   // $form_state['input'] needs to be used instead.
   $parents = array_merge($element['#field_parents'], array($element['#field_name'], $langcode, $delta));
-  if (!empty($form_state['input'])) {
-    $input_address = drupal_array_get_nested_value($form_state['input'], $parents);
-  }
+  $input_address = drupal_array_get_nested_value($form_state['input'], $parents);
   if (!empty($input_address)) {
     $address = $input_address;
   }
-  elseif (!empty($items[$delta]['country'])) {
+  elseif (count($items) && isset($items[$delta]) && !addressfield_field_is_empty($items[$delta], NULL)) {
     // Else use the saved value for the field.
     $address = $items[$delta];
   }
@@ -553,7 +582,7 @@ function addressfield_field_widget_form(&$form, &$form_state, $field, $instance,
   }
 
   // Merge in default values.
-  $address += addressfield_default_values($field, $instance, $address);
+  $address += addressfield_default_values($countries, isset($settings['format_handlers']['optional-country']));
 
   // Add the form elements for the standard widget, which includes a country
   // select list at the top that reloads the available address elements when the
@@ -601,7 +630,7 @@ function addressfield_field_widget_form(&$form, &$form_state, $field, $instance,
  * Element validate callback: rebuilds the form on country change.
  */
 function addressfield_standard_country_validate($element, &$form_state) {
-  if ($element['#default_value'] != $element['#value']) {
+  if (isset($element['#default_value']) && $element['#default_value'] != $element['#value']) {
     $parents = $element['#parents'];
     array_pop($parents);
     $address = drupal_array_get_nested_value($form_state['values'], $parents);
@@ -730,6 +759,8 @@ function addressfield_field_formatter_settings_summary($field, $instance, $view_
   $display = $instance['display'][$view_mode];
   $settings = $display['settings'];
 
+  $summary = '';
+
   if ($settings['use_widget_handlers']) {
     return t('Use widget configuration');
   }
diff --git a/optional-country.inc b/optional-country.inc
new file mode 100644
index 0000000..7a2a02c
--- /dev/null
+++ b/optional-country.inc
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @file
+ * Makes the country field optional.
+ */
+
+$plugin = array(
+  'title' => t('Make country optional'),
+  'format callback' => 'addressfield_format_address_optional_country',
+  'type' => 'address',
+  'weight' => -80,
+);
+
+/**
+ * Format callback.
+ *
+ * @see CALLBACK_addressfield_format_callback()
+ */
+function addressfield_format_address_optional_country(&$format, $address, $context = array()) {
+  $format['country']['#required'] = FALSE;
+  $format['country']['#empty_value'] = '';
+}
