Index: wp-admin/admin-ajax.php
===================================================================
--- wp-admin/admin-ajax.php	(revision 4192)
+++ wp-admin/admin-ajax.php	(working copy)
@@ -106,6 +106,53 @@
 	}
 	die('0');
 	break;
+case 'add-quickcategory' : // On the Fly
+	if ( !current_user_can( 'manage_categories' ) )
+		die('-1');
+	$names = explode(',', $_POST['newcat']);
+	$x = new WP_Ajax_Response();
+	foreach ( $names as $hierarchical_cat_name ) {
+		$cat_names = explode('>', $hierarchical_cat_name);
+		$parents = array();
+		$depth = count($cat_names) - 1;
+		foreach ( $cat_names as $cat_name ) {
+			$cat_name = trim($cat_name);
+			if ( !$category_nicename = sanitize_title($cat_name) )
+				die('0');
+			if ( $parents ) {
+				$n = count($parents);
+				$category_parent = $parents[count($parents) - 1]['cat_ID'];
+			} else {
+				$n = 0;
+				$category_parent = 0;
+			}
+			if ( !$cat_ID = category_exists( $cat_name ) ) {
+				if ( current_user_can( 'manage_categories' ) ) {
+					$cat_ID = wp_create_category($cat_name, $category_parent);
+				} else {
+					die('-1');
+				}
+			}
+			$cat_name = wp_specialchars(stripslashes($cat_name));
+			$category = compact('cat_name', 'cat_ID');
+			if ( $depth == $n ) {
+				$li = get_quickadd_category($category, $parents, true);
+				$x->add( array(
+					'what' => 'quickcategory',
+					'id' => $cat_ID,
+					'data' => $li
+				) );
+			} else {
+				$parents[] = $category;
+			}
+		}
+	}
+	$x->send();
+	break;
+case 'delete-quickcategory' :
+	if ( !current_user_can( 'manage_categories') )
+		die('-1');
+	break;
 case 'add-category' : // On the Fly
 	if ( !current_user_can( 'manage_categories' ) )
 		die('-1');
Index: wp-admin/wp-admin.css
===================================================================
--- wp-admin/wp-admin.css	(revision 4192)
+++ wp-admin/wp-admin.css	(working copy)
@@ -1073,10 +1073,49 @@
 	background-position: 0 -28px;
 }
 
+#moremeta h4 {
+	margin: 0;
+	background: #eee;
+	position: relative;
+	left: -5px;
+	width: 182px;
+	text-indent: 10px;
+	color: #444;
+display: none;
+}
+
 #categorychecklist {
 	margin-right: 6px;
 }
 
+#categorylist {
+	font-size: 10px;
+	color: #333;
+	list-style: none;
+}
+
+#categorylist a {
+	color: #f00;
+	border-bottom: 0;
+}
+
+#categorylist b {
+	color: #000;
+}
+
+#categorylist span {
+	display: block;
+	position: absolute;
+	left: -15px;
+	color: #888;
+}
+
+#categorylist li {
+	left: -20px;
+	position: relative;
+	width: 155px;
+}
+
 /* additional clone styles */
 .dbx-clone {
 	opacity: 0.8;
Index: wp-admin/admin-functions.php
===================================================================
--- wp-admin/admin-functions.php	(revision 4192)
+++ wp-admin/admin-functions.php	(working copy)
@@ -712,6 +712,40 @@
 	write_nested_categories(get_nested_link_categories($default));
 }
 
+function quickadd_categories($default = 0) {
+		write_nested_quickadd_categories(get_nested_categories($default));
+}
+
+// $categories is the array to expand
+// $parents is an array of the parents of $categories, with the first element in the array being the top level parent, and so forth
+function write_nested_quickadd_categories($categories, $parents = array()) {
+	foreach ( (array) $categories as $category ) {
+		if ( $category['checked'] )
+			write_quickadd_category($category, $parents);
+		if ( $category['children'] ) {
+			$newparents = $parents;
+			$newparents[] = array('cat_name' => $category['cat_name']);
+			write_nested_quickadd_categories($category['children'], $newparents);
+		}
+	}
+}
+
+function write_quickadd_category($category, $parents = array()) {
+	echo get_quickadd_category($category, $parents);
+}
+
+function get_quickadd_category($category, $parents = array(), $with_input = false) {
+	$return = '';
+	$return .= "<li id='quickcategory-{$category['cat_ID']}'><span>[<a href='#' onclick='quickCatRemove({$category['cat_ID']}); return false;'>x</a>]</span> ";
+	foreach ( (array) $parents as $parent )
+		$return .= $parent['cat_name'] . ' &raquo; ';
+	$return .= "<b>{$category['cat_name']}</b>";
+	if ( $with_input )
+		$return .= "<input value='{$category['cat_ID']}' type='hidden' id='quickcat-hidden-{$category['cat_ID']}' name='post_category[]' />";
+	$return .= "</li>\n\n";
+	return $return;
+}
+
 // Dandy new recursive multiple category stuff.
 function cat_rows($parent = 0, $level = 0, $categories = 0) {
 	if (!$categories)
Index: wp-admin/admin-db.php
===================================================================
--- wp-admin/admin-db.php	(revision 4192)
+++ wp-admin/admin-db.php	(working copy)
@@ -217,8 +217,8 @@
 	return 1;
 }
 
-function wp_create_category($cat_name) {
-	$cat_array = compact('cat_name');
+function wp_create_category($cat_name, $category_parent = 0) {
+	$cat_array = compact('cat_name', 'category_parent');
 	return wp_insert_category($cat_array);
 }
 
Index: wp-admin/edit-form-advanced.php
===================================================================
--- wp-admin/edit-form-advanced.php	(revision 4192)
+++ wp-admin/edit-form-advanced.php	(working copy)
@@ -71,13 +71,34 @@
 <div id="moremeta">
 <div id="grabit" class="dbx-group">
 
-<fieldset id="categorydiv" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Categories') ?></h3>
+<fieldset id="quickcategorydiv" class="dbx-box" style="display: none;">
+<h3 class="dbx-handle"><?php _e('Quick Categories') ?></h3>
 <div class="dbx-content">
 <p id="jaxcat"></p>
-<ul id="categorychecklist"><?php dropdown_categories(get_option('default_category')); ?></ul></div>
+<h4>Assigned categories</h4>
+<ul id="categorylist">
+<?php quickadd_categories(get_option('default_category')); ?>
+</ul>
+<!--
+	<li id="quickcategory-1"><span>[<a href="#">x</a>]</span> <b>Category name</b></li>
+	<li id="quickcategory-2"><span>[<a href="#">x</a>]</span> Parent &raquo; <b>Child</b></li>
+	<li id="quickcategory-3"><span>[<a href="#">x</a>]</span> Another Category &raquo; With &raquo; <b>a grandchild</b></li>
+-->
+</div>
 </fieldset>
+<script type="text/javascript">
+<!--
+document.getElementByID('quickcategorydiv').style.display = 'auto';
+//-->
+</script>
 
+<fieldset id="categorydiv" class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Category Tree') ?></h3>
+<div class="dbx-content">
+<ul id="categorychecklist"><?php dropdown_categories(get_option('default_category')); ?></ul>
+</div>
+</fieldset>
+
 <fieldset id="commentstatusdiv" class="dbx-box">
 <h3 class="dbx-handle"><?php _e('Discussion') ?></h3>
 <div class="dbx-content">
Index: wp-admin/cat-js.php
===================================================================
--- wp-admin/cat-js.php	(revision 4192)
+++ wp-admin/cat-js.php	(working copy)
@@ -2,13 +2,35 @@
 require_once('../wp-config.php');
 cache_javascript_headers();
 ?>
-addLoadEvent(function(){catList=new listMan('categorychecklist');catList.ajaxRespEl='jaxcat';catList.topAdder=1;catList.alt=0;catList.showLink=0;});
+addLoadEvent(function(){quickCatList=new listMan('categorylist');quickCatList.ajaxRespEl='jaxcat';quickCatList.topAdder=1;quickCatList.alt=0;quickCatList.showLink=0;});
+addLoadEvent(function(){catList=new listMan('categorychecklist');catList.ajaxRespEl='jaxcat';catList.topAdder=0;catList.alt=0;catList.showLink=0;});
 addLoadEvent(newCatAddIn);
 function newCatAddIn() {
 	var jaxcat = $('jaxcat');
 	if ( !jaxcat )
 		return false;
 	jaxcat.update('<span id="ajaxcat"><input type="text" name="newcat" id="newcat" size="16" autocomplete="off"/><input type="button" name="Button" id="catadd" value="<?php _e('Add'); ?>"/><span id="howto"><?php _e('Separate multiple categories with commas.'); ?></span></span>');
-	$('newcat').onkeypress = function(e) { return killSubmit("catList.ajaxAdder('category','jaxcat');", e); };
-	$('catadd').onclick = function() { catList.ajaxAdder('category', 'jaxcat'); };
+
+/*
+killSubmit("catList.ajaxAdder('category','jaxcat');", e); 
+catList.ajaxAdder('category', 'jaxcat');
+
+I'm having problems sending both ajaxAdder() calls.  The first one works, but the second has an error.
+I think it is because the first one is "taking" the input field and blanking it and the second one gets
+blank data.  No idea how to fix it.
+*/
+	$('newcat').onkeypress = function(e) { return killSubmit("quickCatList.ajaxAdder('quickcategory','jaxcat');", e); };
+	$('catadd').onclick = function() { quickCatList.ajaxAdder('quickcategory', 'jaxcat'); };
 }
+
+function quickCatAdd(id) {
+	// Later
+}
+
+function quickCatRemove(id) {
+	if ( document.getElementById('quickcat-hidden-' + id) )
+		document.getElementById('quickcat-hidden-' + id).value = '';
+	quickCatList.ajaxDelete('quickcategory', id);
+	if ( document.getElementById('in-category-' + id) )
+		document.getElementById('in-category-' + id).checked = false;
+}
\ No newline at end of file
