Index: wp-includes/media.php
===================================================================
--- wp-includes/media.php	(revision 18656)
+++ wp-includes/media.php	(working copy)
@@ -1061,20 +1061,11 @@
 	 * @return string Content with shortcode parsed
 	 */
 	function run_shortcode( $content ) {
-		global $shortcode_tags;
-
-		// Back up current registered shortcodes and clear them all out
-		$orig_shortcode_tags = $shortcode_tags;
-		remove_all_shortcodes();
-
 		add_shortcode( 'embed', array(&$this, 'shortcode') );
 
 		// Do the shortcode (only the [embed] one is registered)
-		$content = do_shortcode( $content );
+		$content = do_shortcode( $content, 'embed' );
 
-		// Put the original shortcodes back
-		$shortcode_tags = $orig_shortcode_tags;
-
 		return $content;
 	}
 
@@ -1438,4 +1429,4 @@
 	return apply_filters( 'embed_googlevideo', '<embed type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docid=' . esc_attr($matches[2]) . '&amp;hl=en&amp;fs=true" style="width:' . esc_attr($width) . 'px;height:' . esc_attr($height) . 'px" allowFullScreen="true" allowScriptAccess="always" />', $matches, $attr, $url, $rawattr );
 }
 
-?>
\ No newline at end of file
+?>
Index: wp-includes/shortcodes.php
===================================================================
--- wp-includes/shortcodes.php	(revision 18656)
+++ wp-includes/shortcodes.php	(working copy)
@@ -141,13 +141,13 @@
  * @param string $content Content to search for shortcodes
  * @return string Content with shortcodes filtered out.
  */
-function do_shortcode($content) {
+function do_shortcode($content, $tag = null) {
 	global $shortcode_tags;
 
 	if (empty($shortcode_tags) || !is_array($shortcode_tags))
 		return $content;
 
-	$pattern = get_shortcode_regex();
+	$pattern = get_shortcode_regex( $tag );
 	return preg_replace_callback('/'.$pattern.'/s', 'do_shortcode_tag', $content);
 }
 
@@ -168,15 +168,18 @@
  * @since 2.5
  * @uses $shortcode_tags
  *
+ * @param string $tag Specify a single tag to process
+ *
  * @return string The shortcode search regular expression
  */
-function get_shortcode_regex() {
-	global $shortcode_tags;
-	$tagnames = array_keys($shortcode_tags);
-	$tagregexp = join( '|', array_map('preg_quote', $tagnames) );
+function get_shortcode_regex( $tag = null ) {
+	if ( empty( $tag ) )
+		$tag = '[^\s\]]+';
+	else
+		$tag = preg_quote( $tag );
 
 	// WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcodes()
-	return '(.?)\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)';
+	return '(.?)\[(' . $tag . ')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)';
 }
 
 /**
@@ -201,6 +204,9 @@
 	$tag = $m[2];
 	$attr = shortcode_parse_atts( $m[3] );
 
+	if ( empty( $shortcode_tags[$tag] ) || ! is_callable( $shortcode_tags[$tag] ) )
+		$shortcode_tags[$tag] = 'unregistered_shortcode';
+
 	if ( isset( $m[5] ) ) {
 		// enclosing tag - extra parameter
 		return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, $m[5], $tag ) . $m[6];
@@ -295,4 +301,15 @@
 
 add_filter('the_content', 'do_shortcode', 11); // AFTER wpautop()
 
-?>
\ No newline at end of file
+/**
+ * Function used to process any unregistered shortcodes
+ *
+ * @param array $atts Attributes from shortcode - Unused
+ * @param string $content Content of shortcode
+ *
+ * @return string Content of shortcode
+ */
+function unregistered_shortcode( $atts = null, $content = null ) {
+	return (string) $content;
+}
+?>
