diff --git a/modules/image/image.field.inc b/modules/image/image.field.inc
index 07cc1e0..5a584af 100644
--- a/modules/image/image.field.inc
+++ b/modules/image/image.field.inc
@@ -56,7 +56,11 @@ function image_field_settings_form($field, $instance) {
     '#type' => 'managed_file',
     '#description' => t('If no image is uploaded, this image will be shown on display.'),
     '#default_value' => $field['settings']['default_image'],
-    '#upload_location' => 'public://default_images/',
+    // We need to save the default image to the scheme specified by the user,
+    // and the image save happens in the value callback so define a custom
+    // value callback that knows about the uri scheme element.
+    '#value_callback' => 'image_field_settings_default_image_value_callback',
+    '#uri_scheme_element' => &$form['uri_scheme'],
   );
 
   return $form;
@@ -64,6 +68,17 @@ function image_field_settings_form($field, $instance) {
 }
 
 /**
+ * A #value_callback for the image field settings form.
+ *
+ * Makes sure that the correct upload location is set.
+ */
+function image_field_settings_default_image_value_callback(&$element, $input = FALSE, $form_state = NULL) {
+  // Set the uri scheme as possibly set fresh by the user.
+  $element['#upload_location'] = $element['#uri_scheme_element']['#value'] . '://default_images/';
+  return file_managed_file_value($element, $input, $form_state);
+}
+
+/**
  * Implements hook_field_instance_settings_form().
  */
 function image_field_instance_settings_form($field, $instance) {
diff --git a/modules/image/image.module b/modules/image/image.module
index d2d081c..0fd5bd0 100644
--- a/modules/image/image.module
+++ b/modules/image/image.module
@@ -413,6 +413,47 @@ function image_image_style_delete($style) {
 }
 
 /**
+ * Implements hook_field_delete_field().
+ */
+function image_field_delete_field($field) {
+  if ($field['type'] != 'image') {
+    return;
+  }
+
+  // The value of a managed_file element can be an array if #extended == TRUE.
+  $fid = (is_array($field['settings']['default_image']) ? $field['settings']['default_image']['fid'] : $field['settings']['default_image']);
+  if ($fid && ($file = file_load($fid))) {
+    file_usage_delete($file, 'image', 'default_image', $field['id']);
+  }
+}
+
+/**
+ * Implements hook_field_update_field().
+ */
+function image_field_update_field($field, $prior_field, $has_data) {
+  if ($field['type'] != 'image') {
+    return;
+  }
+
+  // The value of a managed_file element can be an array if #extended == TRUE.
+  $fid_new = (is_array($field['settings']['default_image']) ? $field['settings']['default_image']['fid'] : $field['settings']['default_image']);
+  $fid_old = (is_array($prior_field['settings']['default_image']) ? $prior_field['settings']['default_image']['fid'] : $prior_field['settings']['default_image']);
+  if ($fid_new != $fid_old) {
+    if ($fid_new && ($file_new = file_load($fid_new))) {
+      if ($file_new->status != FILE_STATUS_PERMANENT) {
+        $file_new->status = FILE_STATUS_PERMANENT;
+        file_save($file_new);
+      }
+      file_usage_add($file_new, 'image', 'default_image', $field['id']);
+    }
+
+    if ($fid_old && ($file_old = file_load($fid_old))) {
+      file_usage_delete($file_old, 'image', 'default_image', $field['id']);
+    }
+  }
+}
+
+/**
  * Clear cached versions of a specific file in all styles.
  *
  * @param $path
diff --git a/modules/image/image.test b/modules/image/image.test
index 00f79d8..8596d66 100644
--- a/modules/image/image.test
+++ b/modules/image/image.test
@@ -796,7 +796,7 @@ class ImageFieldDisplayTestCase extends ImageFieldTestCase {
     // that would be used on the image field.
     $this->assertNoPattern('<div class="(.*?)field-name-' . strtr($field_name, '_', '-') . '(.*?)">', t('No image displayed when no image is attached and no default image specified.'));
 
-    // Add a default image to the imagefield instance.
+    // Add a default image to the public imagefield instance.
     $images = $this->drupalGetTestFiles('image');
     $edit = array(
       'files[field_settings_default_image]' => drupal_realpath($images[0]->uri),
@@ -806,6 +806,7 @@ class ImageFieldDisplayTestCase extends ImageFieldTestCase {
     field_info_cache_clear();
     $field = field_info_field($field_name);
     $image = file_load($field['settings']['default_image']);
+    $this->assertTrue($image->status == FILE_STATUS_PERMANENT, t('The default image status is permanent.'));
     $default_output = theme('image', array('path' => $image->uri));
     $this->drupalGet('node/' . $node->nid);
     $this->assertRaw($default_output, t('Default image displayed when no user supplied image is present.'));
@@ -831,6 +832,25 @@ class ImageFieldDisplayTestCase extends ImageFieldTestCase {
     field_info_cache_clear();
     $field = field_info_field($field_name);
     $this->assertFalse($field['settings']['default_image'], t('Default image removed from field.'));
+    // Create an image field that uses the private:// scheme and test that the
+    // default image works as expected.
+    $private_field_name = strtolower($this->randomName());
+    $this->createImageField($private_field_name, 'article', array('uri_scheme' => 'private'));
+    // Add a default image to the new field.
+    $edit = array(
+      'files[field_settings_default_image]' => drupal_realpath($images[1]->uri),
+    );
+    $this->drupalPost('admin/structure/types/manage/article/fields/' . $private_field_name, $edit, t('Save settings'));
+    $private_field = field_info_field($private_field_name);
+    $image = file_load($private_field['settings']['default_image']);
+    $this->assertEqual('private', file_uri_scheme($image->uri), t('Default image uses private:// scheme.'));
+    $this->assertTrue($image->status == FILE_STATUS_PERMANENT, t('The default image status is permanent.'));
+    // Create a new node with no image attached and ensure that default private
+    // image is displayed.
+    $node = $this->drupalCreateNode(array('type' => 'article'));
+    $default_output = theme('image', array('path' => $image->uri));
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw($default_output, t('Default private image displayed when no user supplied image is present.'));
   }
 }
 
