Index: wp-includes/functions.php
===================================================================
--- wp-includes/functions.php	(revision 3645)
+++ wp-includes/functions.php	(working copy)
@@ -1446,24 +1446,58 @@
 
 function get_posts($args) {
 	global $wpdb;
+
+	if ( is_array($args) )
+		$r = &$args;
+	else
+		parse_str($args, $r);
 	parse_str($args, $r);
-	if ( !isset($r['numberposts']) )
-		$r['numberposts'] = 5;
-	if ( !isset($r['offset']) )
-		$r['offset'] = 0;
-	if ( !isset($r['category']) )
-		$r['category'] = '';
-	if ( !isset($r['orderby']) )
-		$r['orderby'] = 'post_date';
-	if ( !isset($r['order']) )
-		$r['order'] = 'DESC';
 
+	$defaults = array('numberposts' => 5, 'offset' => 0, 'category' => '',
+		'orderby' => 'post_date', 'order' => 'DESC', 'include' => '', 'exclude' => '');
+	$r = array_merge($defaults, $r);
+	extract($r);
+
+	$inclusions = '';
+	if ( !empty($include) ) {
+		$offset = 0;	//ignore offset, category, and exclude params if using include
+		$category = ''; 
+		$exclude = '';  
+		$incposts = preg_split('/[\s,]+/',$include);
+		$numberposts = count($incposts);  // only the number of posts included
+		if ( count($incposts) ) {
+			foreach ( $incposts as $incpost ) {
+				if (empty($inclusions))
+					$inclusions = ' AND ( ID = ' . intval($incpost) . ' ';
+				else
+					$inclusions .= ' OR ID = ' . intval($incpost) . ' ';
+			}
+		}
+	}
+	if (!empty($inclusions)) 
+		$inclusions .= ')';	
+
+	$exclusions = '';
+	if ( !empty($exclude) ) {
+		$exposts = preg_split('/[\s,]+/',$exclude);
+		if ( count($exposts) ) {
+			foreach ( $exposts as $expost ) {
+				if (empty($exclusions))
+					$exclusions = ' AND ( ID <> ' . intval($expost) . ' ';
+				else
+					$exclusions .= ' AND ID <> ' . intval($expost) . ' ';
+			}
+		}
+	}
+	if (!empty($exclusions)) 
+		$exclusions .= ')';
+
 	$posts = $wpdb->get_results(
 		"SELECT DISTINCT * FROM $wpdb->posts " .
-		( empty( $r['category'] ) ? "" : ", $wpdb->post2cat " ) .
-		" WHERE (post_type = 'post' AND post_status = 'publish') ".
-		( empty( $r['category'] ) ? "" : "AND $wpdb->posts.ID = $wpdb->post2cat.post_id AND $wpdb->post2cat.category_id = " . $r['category']. " " ) .
-		" GROUP BY $wpdb->posts.ID ORDER BY " . $r['orderby'] . " " . $r['order'] . " LIMIT " . $r['offset'] . ',' . $r['numberposts'] );
+		( empty( $category ) ? "" : ", $wpdb->post2cat " ) .
+		" WHERE (post_type = 'post' AND post_status = 'publish') $exclusions $inclusions " .
+		( empty( $category ) ? "" : "AND $wpdb->posts.ID = $wpdb->post2cat.post_id AND $wpdb->post2cat.category_id = " . $category. " " ) .
+		" GROUP BY $wpdb->posts.ID ORDER BY " . $orderby . " " . $order . " LIMIT " . $offset . ',' . $numberposts );
 
 	update_post_caches($posts);
 
Index: wp-includes/template-functions-bookmarks.php
===================================================================
--- wp-includes/template-functions-bookmarks.php	(revision 3645)
+++ wp-includes/template-functions-bookmarks.php	(working copy)
@@ -283,20 +283,43 @@
 		parse_str($args, $r);
 
 	$defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => -1,
-		'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0);
+		'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'include' => '', 'exclude' => '');
 	$r = array_merge($defaults, $r);
 	extract($r);
 
+	$inclusions = '';
+	if ( !empty($include) ) {
+	$exclude = '';  //ignore exclude, category, and category_name params if using include
+	$category = -1;
+	$category_name = '';
+		$inclinks = preg_split('/[\s,]+/',$include);
+		if ( count($inclinks) ) {
+			foreach ( $inclinks as $inclink ) {
+				if (empty($inclusions))
+					$inclusions = ' AND ( link_id = ' . intval($inclink) . ' ';
+				else
+					$inclusions .= ' OR link_id = ' . intval($inclink) . ' ';
+			}
+		}
+	}
+	if (!empty($inclusions)) 
+		$inclusions .= ')';
+
 	$exclusions = '';
 	if ( !empty($exclude) ) {
-		$exlinks = preg_split('/[\s,]+/',$r['exclude']);
+		$exlinks = preg_split('/[\s,]+/',$exclude);
 		if ( count($exlinks) ) {
 			foreach ( $exlinks as $exlink ) {
-				$exclusions .= ' AND link_id <> ' . intval($exlink) . ' ';
+				if (empty($exclusions))
+					$exclusions = ' AND ( link_id <> ' . intval($exlink) . ' ';
+				else
+					$exclusions .= ' AND link_id <> ' . intval($exlink) . ' ';
 			}
 		}
 	}
-
+	if (!empty($exclusions)) 
+		$exclusions .= ')';
+		
 	if ( ! empty($category_name) ) {
 		if ( $cat_id = $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories WHERE cat_name='$category_name' LIMIT 1") )
 			$category = $cat_id;
@@ -320,7 +343,7 @@
 		$get_updated = ", UNIX_TIMESTAMP(link_updated) AS link_updated_f ";
 	}
 
-	$orderby = strtolower($r['orderby']);
+	$orderby = strtolower($orderby);
 	$length = '';
 	switch ($orderby) {
 		case 'length':
@@ -341,6 +364,7 @@
 		$visible = "AND link_visible = 'Y'";
 
 	$query = "SELECT * $length $recently_updated_test $get_updated FROM $wpdb->links $join WHERE 1=1 $visible $category_query";
+	$query .= " $exclusions $inclusions";
 	$query .= " ORDER BY $orderby $order";
 	if ($limit != -1)
 		$query .= " LIMIT $limit";
Index: wp-includes/template-functions-category.php
===================================================================
--- wp-includes/template-functions-category.php	(revision 3645)
+++ wp-includes/template-functions-category.php	(working copy)
@@ -376,28 +376,49 @@
 		parse_str($args, $r);
 
 	$defaults = array('type' => 'post', 'child_of' => 0, 'orderby' => 'name', 'order' => 'ASC',
-		'hide_empty' => true, 'include_last_update_time' => false, 'hierarchical' => 1);
+		'hide_empty' => true, 'include_last_update_time' => false, 'hierarchical' => 1, $exclude => '', $include => '');
 	$r = array_merge($defaults, $r);
-	$r['orderby'] = "cat_" . $r['orderby'];
+	$r['orderby'] = "cat_" . $r['orderby'];  // restricts order by to cat_ID and cat_name fields
 	extract($r);
 
-	$exclusions = '';
-	$having = '';
 	$where = 'cat_ID > 0';
+	$inclusions = '';
+	if ( !empty($include) ) {
+		$child_of = 0; //ignore child_of and exclude params if using include 
+		$exclude = '';  
+		$incategories = preg_split('/[\s,]+/',$include);
+		if ( count($incategories) ) {
+			foreach ( $incategories as $incat ) {
+				if (empty($inclusions))
+					$inclusions = ' AND ( cat_ID = ' . intval($incat) . ' ';
+				else
+					$inclusions .= ' OR cat_ID = ' . intval($incat) . ' ';
+			}
+		}
+	}
+	if (!empty($inclusions)) 
+		$inclusions .= ')';	
+	$where .= $inclusions;
 
 	$exclusions = '';
 	if ( !empty($exclude) ) {
 		$excategories = preg_split('/[\s,]+/',$exclude);
 		if ( count($excategories) ) {
 			foreach ( $excategories as $excat ) {
-				$exclusions .= ' AND cat_ID <> ' . intval($excat) . ' ';
-				// TODO: Exclude children of excluded cats?
+				if (empty($exclusions))
+					$exclusions = ' AND ( cat_ID <> ' . intval($excat) . ' ';
+				else
+					$exclusions .= ' AND cat_ID <> ' . intval($excat) . ' ';
+				// TODO: Exclude children of excluded cats?   Note: children are getting excluded
 			}
 		}
 	}
+	if (!empty($exclusions)) 
+		$exclusions .= ')';
 	$exclusions = apply_filters('list_cats_exclusions', $exclusions );
 	$where .= $exclusions;
 
+	$having = '';
 	if ( $hide_empty ) {
 		if ( 'link' == $type )
 			$having = 'HAVING link_count > 0';
Index: wp-includes/template-functions-post.php
===================================================================
--- wp-includes/template-functions-post.php	(revision 3645)
+++ wp-includes/template-functions-post.php	(working copy)
@@ -306,24 +306,47 @@
 		parse_str($args, $r);
 
 	$defaults = array('child_of' => 0, 'sort_order' => 'ASC', 'sort_column' => 'post_title',
-		'hierarchical' => 1);
+		'hierarchical' => 1, $exclude => '', $include => '');
 	$r = array_merge($defaults, $r);
+	extract($r);
 
+	$inclusions = '';
+	if ( !empty($include) ) {
+		$child_of = 0; //ignore child_of and exclude params if using include 
+		$exclude = '';  
+		$incpages = preg_split('/[\s,]+/',$include);
+		if ( count($incpages) ) {
+			foreach ( $incpages as $incpage ) {
+				if (empty($inclusions))
+					$inclusions = ' AND ( ID = ' . intval($incpage) . ' ';
+				else
+					$inclusions .= ' OR ID = ' . intval($incpage) . ' ';
+			}
+		}
+	}
+	if (!empty($inclusions)) 
+		$inclusions .= ')';	
+
 	$exclusions = '';
-	if ( !empty($r['exclude']) ) {
-		$expages = preg_split('/[\s,]+/',$r['exclude']);
+	if ( !empty($exclude) ) {
+		$expages = preg_split('/[\s,]+/',$exclude);
 		if ( count($expages) ) {
 			foreach ( $expages as $expage ) {
-				$exclusions .= ' AND ID <> ' . intval($expage) . ' ';
+				if (empty($exclusions))
+					$exclusions = ' AND ( ID <> ' . intval($expage) . ' ';
+				else
+					$exclusions .= ' AND ID <> ' . intval($expage) . ' ';
 			}
 		}
 	}
+	if (!empty($exclusions)) 
+		$exclusions .= ')';
 
 	$pages = $wpdb->get_results("SELECT * " .
 		"FROM $wpdb->posts " .
 		"WHERE post_type = 'page' AND post_status = 'publish' " .
-		"$exclusions " .
-		"ORDER BY " . $r['sort_column'] . " " . $r['sort_order']);
+		"$exclusions $inclusions" .
+		"ORDER BY " . $sort_column . " " . $sort_order);
 
 	if ( empty($pages) )
 		return array();
@@ -331,8 +354,8 @@
 	// Update cache.
 	update_page_cache($pages);
 
-	if ( $r['child_of'] || $r['hierarchical'] )
-		$pages = & get_page_children($r['child_of'], $pages);
+	if ( $child_of || $hierarchical )
+		$pages = & get_page_children($child_of, $pages);
 
 	return $pages;
 }
