diff --git wp-includes/post.php wp-includes/post.php
index cea834b..fc4c7cb 100644
--- wp-includes/post.php
+++ wp-includes/post.php
@@ -2328,6 +2328,18 @@ function wp_get_single_post($postid = 0, $mode = OBJECT) {
 	)
 		return ( OBJECT == $mode ? null : array() );
 
+	// get custom taxonomies
+	$taxonomies = get_object_taxonomies( $post, 'names', true );
+	$tax_input = array();
+
+	if ( ! empty( $taxonomies ) ) {
+		foreach ( $taxonomies as $taxonomy ) {
+			$post_terms = wp_get_post_terms( $postid, $taxonomy, array( 'fields' => 'ids' ) );
+			if ( ! empty( $post_terms ) )
+				$tax_input[$taxonomy] = $post_terms;
+		}
+	}
+
 	// Set categories and tags
 	if ( $mode == OBJECT ) {
 		$post->post_category = array();
@@ -2336,6 +2348,7 @@ function wp_get_single_post($postid = 0, $mode = OBJECT) {
 		$post->tags_input = array();
 		if ( is_object_in_taxonomy($post->post_type, 'post_tag') )
 			$post->tags_input = wp_get_post_tags($postid, array('fields' => 'names'));
+		$post->tax_input = $tax_input;
 	} else {
 		$post['post_category'] = array();
 		if ( is_object_in_taxonomy($post['post_type'], 'category') )
@@ -2343,8 +2356,8 @@ function wp_get_single_post($postid = 0, $mode = OBJECT) {
 		$post['tags_input'] = array();
 		if ( is_object_in_taxonomy($post['post_type'], 'post_tag') )
 			$post['tags_input'] = wp_get_post_tags($postid, array('fields' => 'names'));
+		$post['tax_input'] = $tax_input;
 	}
-
 	return $post;
 }
 
diff --git wp-includes/taxonomy.php wp-includes/taxonomy.php
index 60068c5..e678c9a 100644
--- wp-includes/taxonomy.php
+++ wp-includes/taxonomy.php
@@ -140,9 +140,10 @@ function get_taxonomies( $args = array(), $output = 'names', $operator = 'and' )
  *
  * @param array|string|object $object Name of the type of taxonomy object, or an object (row from posts)
  * @param string $output The type of output to return, either taxonomy 'names' or 'objects'. 'names' is the default.
+ * @param bool $exclude_builtin Specify <code>true</code> to return only custom taxonomies. <code>false</code> is the default.
  * @return array The names of all taxonomy of $object_type.
  */
-function get_object_taxonomies($object, $output = 'names') {
+function get_object_taxonomies($object, $output = 'names', $exclude_builtin = false) {
 	global $wp_taxonomies;
 
 	if ( is_object($object) ) {
@@ -155,6 +156,8 @@ function get_object_taxonomies($object, $output = 'names') {
 
 	$taxonomies = array();
 	foreach ( (array) $wp_taxonomies as $tax_name => $tax_obj ) {
+		if ( $exclude_builtin && $tax_obj->_builtin )
+			continue;
 		if ( array_intersect($object, (array) $tax_obj->object_type) ) {
 			if ( 'names' == $output )
 				$taxonomies[] = $tax_name;
@@ -256,7 +259,8 @@ function is_taxonomy_hierarchical($taxonomy) {
  * boolean value.
  *
  * update_count_callback - works much like a hook, in that it will be called
- * when the count is updated.
+ * when the count is updated; if not defined and show_ui is true, defaults to '_update_post_term_count'.
+ * To suppress default callback in any cases, set update_count_callback to false.
  *
  * rewrite - false to prevent rewrite, or array('slug'=>$slug) to customize
  * permastruct; default will use $taxonomy as slug.
@@ -335,6 +339,10 @@ function register_taxonomy( $taxonomy, $object_type, $args = array() ) {
 	if ( is_null($args['show_ui']) )
 		$args['show_ui'] = $args['public'];
 
+	if ( $args['show_ui'] && $args['update_count_callback'] === '' ) {
+		$args['update_count_callback'] = '_update_post_term_count';
+	}
+
 	// Whether to show this type in nav-menus.php. Defaults to the setting for public.
 	if ( null === $args['show_in_nav_menus'] )
 		$args['show_in_nav_menus'] = $args['public'];
