diff --git a/prepopulate.module b/prepopulate.module
index d024385..990a634 100644
--- a/prepopulate.module
+++ b/prepopulate.module
@@ -53,6 +53,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(
     'actions',
     'button',
@@ -80,10 +85,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') {
