Index: src/js/_enqueues/lib/admin-bar.js
===================================================================
--- src/js/_enqueues/lib/admin-bar.js	(revision 46241)
+++ src/js/_enqueues/lib/admin-bar.js	(working copy)
@@ -505,7 +505,6 @@
 			aB = d.getElementById('wpadminbar');
 
 			if ( d.body && aB ) {
-				d.body.appendChild( aB );
 
 				if ( aB.className )
 					aB.className = aB.className.replace(/nojs/, '');
Index: src/wp-includes/default-filters.php
===================================================================
--- src/wp-includes/default-filters.php	(revision 46241)
+++ src/wp-includes/default-filters.php	(working copy)
@@ -535,7 +535,10 @@
 add_action( 'admin_init', '_wp_admin_bar_init' );
 add_action( 'before_signup_header', '_wp_admin_bar_init' );
 add_action( 'activate_header', '_wp_admin_bar_init' );
-add_action( 'wp_footer', 'wp_admin_bar_render', 1000 );
+add_action( 'wp_body_open', 'wp_admin_bar_render', 1000 );
+if ( ! did_action( 'wp_body_open' ) ) {
+	add_action( 'wp_footer', 'wp_admin_bar_render', 1000 );
+}
 add_action( 'in_admin_header', 'wp_admin_bar_render', 0 );
 
 // Former admin filters that can also be hooked on the front end
