diff --git a/includes/common.inc b/includes/common.inc
index b55384e2a6b31c51302705377e8e0a8df036cdd6..acd66a789cf1586ab0c7f967338eec94736afae2 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -2113,7 +2113,11 @@ function drupal_render(&$elements) {
   }
 
   $content = '';
-  uasort($elements, "_element_sort");
+  // Either the elements did not go through form_builder or one of the children
+  // has a #weight.
+  if (!isset($elements['#sorted'])) {
+    uasort($elements, "_element_sort");
+  }
   if (!isset($elements['#children'])) {
     $children = element_children($elements);
     /* Render all the children that use a theme function */
diff --git a/includes/form.inc b/includes/form.inc
index e2a3b06ba503b93856f2b165367dcc244ee2a3aa..7eb46188312da4c26d8be7f7fed37c561cb6d458 100644
--- a/includes/form.inc
+++ b/includes/form.inc
@@ -755,8 +755,11 @@ function form_builder($form_id, $form) {
     form_set_value($form, $form['#value']);
   }
 
+  // We start off assuming all form elements are in the correct order.
+  $form['#sorted'] = TRUE;
+
   // Recurse through all child elements.
-  $count  = 0;
+  $count = 0;
   foreach (element_children($form) as $key) {
     $form[$key]['#post'] = $form['#post'];
     $form[$key]['#programmed'] = $form['#programmed'];
@@ -780,6 +783,10 @@ function form_builder($form_id, $form) {
     if (!isset($form[$key]['#weight'])) {
       $form[$key]['#weight'] = $count/1000;
     }
+    else {
+      // If one the child elements has a weight then we will need to sort later.
+      unset($form['#sorted']);
+    }
     $form[$key] = form_builder($form_id, $form[$key]);
     $count++;
   }