diff --git a/prepopulate.module b/prepopulate.module
index 105283b..7d87070 100644
--- a/prepopulate.module
+++ b/prepopulate.module
@@ -61,6 +61,11 @@ function prepopulate_after_build($form, &$form_state) {
  *   String or array. Value(s) to be applied to the element.
  */
 function _prepopulate_request_walk(&$form, &$request_slice) {
+  $root_element = &drupal_static(__FUNCTION__);
+  if (!isset($root_element)) {
+    $root_element = $form;
+  }
+
   $limited_types = array('value', 'hidden', 'button', 'image_button');
   if (is_array($request_slice)) {
     foreach (array_keys($request_slice) as $request_variable) {
@@ -76,10 +81,12 @@ function _prepopulate_request_walk(&$form, &$request_slice) {
     }
   }
   else {
+    $is_editable = !empty($root_element['#prepopulate_editable']) || !empty($form['#prepopulate_editable']);
+
     if ($form['#type'] == 'markup' || empty($form['#type'])) {
       $form['#value'] = check_plain($request_slice);
     }
-    else {
+    elseif (!$is_editable || ($is_editable && empty($form['#value']))) {
       $form['#value'] = $request_slice;
     }
     if ($form['#type'] == 'checkboxes' || $form['#type'] == 'checkbox') {
