Index: wp-includes/admin-bar.php
===================================================================
--- wp-includes/admin-bar.php	(revision 21890)
+++ wp-includes/admin-bar.php	(working copy)
@@ -488,52 +488,62 @@
 	$cpts = (array) get_post_types( array( 'show_in_admin_bar' => true ), 'objects' );
 
 	if ( isset( $cpts['post'] ) && current_user_can( $cpts['post']->cap->edit_posts ) ) {
-		$actions[ 'post-new.php' ] = array( $cpts['post']->labels->name_admin_bar, 'new-post' );
+		$actions[5] = array( 'post-new.php', $cpts['post']->labels->name_admin_bar, 'new-post' );
 		unset( $cpts['post'] );
 	}
 
 	if ( current_user_can( 'upload_files' ) )
-		$actions[ 'media-new.php' ] = array( _x( 'Media', 'add new from admin bar' ), 'new-media' );
+		$actions[10] = array( 'media-new.php', _x( 'Media', 'add new from admin bar' ), 'new-media' );
 
 	if ( current_user_can( 'manage_links' ) )
-		$actions[ 'link-add.php' ] = array( _x( 'Link', 'add new from admin bar' ), 'new-link' );
+		$actions[15] = array( 'link-add.php', _x( 'Link', 'add new from admin bar' ), 'new-link' );
 
 	if ( isset( $cpts['page'] ) && current_user_can( $cpts['page']->cap->edit_posts ) ) {
-		$actions[ 'post-new.php?post_type=page' ] = array( $cpts['page']->labels->name_admin_bar, 'new-page' );
+		$actions[20] = array( 'post-new.php?post_type=page', $cpts['page']->labels->name_admin_bar, 'new-page' );
 		unset( $cpts['page'] );
 	}
 
+	if ( current_user_can( 'promote_users' ) || current_user_can( 'create_users' ) )
+		$actions[70] = array( 'user-new.php', _x( 'User', 'add new from admin bar' ), 'new-user' );
+
 	// Add any additional custom post types.
 	foreach ( $cpts as $cpt ) {
 		if ( ! current_user_can( $cpt->cap->edit_posts ) )
 			continue;
 
-		$key = 'post-new.php?post_type=' . $cpt->name;
-		$actions[ $key ] = array( $cpt->labels->name_admin_bar, 'new-' . $cpt->name );
+		$link = 'post-new.php?post_type=' . $cpt->name;
+		// Avoid clash with parent node and a 'content' post type.
+		$id = 'content' === $cpt->name ? 'add-new-content' : 'new-' . $cpt->name;
+
+		if ( $position = $cpt->menu_position ) {
+			while ( isset( $actions[ $position ] ) )
+				$position++;
+			$actions[ $position ] = array( $link, $cpt->labels->name_admin_bar, $id );
+		} else {
+			$actions[] = array( $link, $cpt->labels->name_admin_bar, $id );
+		}
 	}
-	// Avoid clash with parent node and a 'content' post type.
-	if ( isset( $actions['post-new.php?post_type=content'] ) )
-		$actions['post-new.php?post_type=content'][1] = 'add-new-content';
 
-	if ( current_user_can( 'create_users' ) || current_user_can( 'promote_users' ) )
-		$actions[ 'user-new.php' ] = array( _x( 'User', 'add new from admin bar' ), 'new-user' );
-
 	if ( ! $actions )
 		return;
 
+	ksort( $actions );
+
 	$title = '<span class="ab-icon"></span><span class="ab-label">' . _x( 'New', 'admin bar menu group label' ) . '</span>';
 
+	$first = current( $actions );
+
 	$wp_admin_bar->add_menu( array(
 		'id'    => 'new-content',
 		'title' => $title,
-		'href'  => admin_url( current( array_keys( $actions ) ) ),
+		'href'  => admin_url( $first[0] ),
 		'meta'  => array(
 			'title' => _x( 'Add New', 'admin bar menu group label' ),
 		),
 	) );
 
-	foreach ( $actions as $link => $action ) {
-		list( $title, $id ) = $action;
+	foreach ( $actions as $action ) {
+		list( $link, $title, $id ) = $action;
 
 		$wp_admin_bar->add_menu( array(
 			'parent'    => 'new-content',
