Index: wp-admin/includes/meta-boxes.php
===================================================================
--- wp-admin/includes/meta-boxes.php	(revision 15416)
+++ wp-admin/includes/meta-boxes.php	(working copy)
@@ -116,7 +116,7 @@
 } elseif ( !empty( $post->post_password ) ) {
 	$visibility = 'password';
 	$visibility_trans = __('Password protected');
-} elseif ( $post_type == 'post' && is_sticky( $post->ID ) ) {
+} elseif ( post_type_supports( $post_type, 'sticky') && is_sticky( $post->ID ) ) {
 	$visibility = 'public';
 	$visibility_trans = __('Public, Sticky');
 } else {
@@ -130,15 +130,15 @@
 
 <div id="post-visibility-select" class="hide-if-js">
 <input type="hidden" name="hidden_post_password" id="hidden-post-password" value="<?php echo esc_attr($post->post_password); ?>" />
-<?php if ($post_type == 'post'): ?>
+<?php if ( post_type_supports( $post_type, 'sticky') ): ?>
 <input type="checkbox" style="display:none" name="hidden_post_sticky" id="hidden-post-sticky" value="sticky" <?php checked(is_sticky($post->ID)); ?> />
 <?php endif; ?>
 <input type="hidden" name="hidden_post_visibility" id="hidden-post-visibility" value="<?php echo esc_attr( $visibility ); ?>" />
 
 
 <input type="radio" name="visibility" id="visibility-radio-public" value="public" <?php checked( $visibility, 'public' ); ?> /> <label for="visibility-radio-public" class="selectit"><?php _e('Public'); ?></label><br />
-<?php if ($post_type == 'post'): ?>
-<span id="sticky-span"><input id="sticky" name="sticky" type="checkbox" value="sticky" <?php checked(is_sticky($post->ID)); ?> tabindex="4" /> <label for="sticky" class="selectit"><?php _e('Stick this post to the front page') ?></label><br /></span>
+<?php if ( post_type_supports( $post_type, 'sticky') ): ?>
+<span id="sticky-span"><input id="sticky" name="sticky" type="checkbox" value="sticky" <?php checked(is_sticky($post->ID)); ?> tabindex="4" /> <label for="sticky" class="selectit"><?php _e('Stick this to the front page') ?></label><br /></span>
 <?php endif; ?>
 <input type="radio" name="visibility" id="visibility-radio-password" value="password" <?php checked( $visibility, 'password' ); ?> /> <label for="visibility-radio-password" class="selectit"><?php _e('Password protected'); ?></label><br />
 <span id="password-span"><label for="post_password"><?php _e('Password:'); ?></label> <input type="text" name="post_password" id="post_password" value="<?php echo esc_attr($post->post_password); ?>" /><br /></span>
Index: wp-admin/includes/template.php
===================================================================
--- wp-admin/includes/template.php	(revision 15416)
+++ wp-admin/includes/template.php	(working copy)
@@ -1111,7 +1111,7 @@
 				</select>
 			</label>
 
-<?php if ( 'post' == $screen->post_type && $can_publish && current_user_can( $post_type_object->cap->edit_others_posts ) ) : ?>
+<?php if ( post_type_supports($screen->post_type, 'sticky') && $can_publish && current_user_can( $post_type_object->cap->edit_others_posts ) ) : ?>
 
 <?php	if ( $bulk ) : ?>
 
@@ -1128,7 +1128,7 @@
 
 			<label class="alignleft">
 				<input type="checkbox" name="sticky" value="sticky" />
-				<span class="checkbox-title"><?php _e( 'Make this post sticky' ); ?></span>
+				<span class="checkbox-title"><?php _e( 'Make this sticky' ); ?></span>
 			</label>
 
 <?php	endif; // $bulk ?>
Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 15416)
+++ wp-includes/post.php	(working copy)
@@ -23,7 +23,7 @@
 		'hierarchical' => false,
 		'rewrite' => false,
 		'query_var' => false,
-		'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
+		'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'sticky' ),
 	) );
 
 	register_post_type( 'page', array(
@@ -1338,11 +1338,16 @@
 	global $id;
 
 	$post_id = absint($post_id);
+        $sticky_post_type = get_post_type($post_id);
 
 	if ( !$post_id )
 		$post_id = absint($id);
 
-	$stickies = get_option('sticky_posts');
+        if('post' == $sticky_post_type) {
+            $stickies = get_option('sticky_posts');
+        } else {
+            $stickies = get_option('sticky_' . $sticky_post_type);
+        }
 
 	if ( !is_array($stickies) )
 		return false;
@@ -1489,7 +1494,13 @@
  * @param int $post_id Post ID.
  */
 function stick_post($post_id) {
+    $sticky_post_type = get_post_type($post_id);
+
+    if('post' == $sticky_post_type){
 	$stickies = get_option('sticky_posts');
+    } else {
+        $stickies = get_option('sticky_' . $sticky_post_type);
+    }
 
 	if ( !is_array($stickies) )
 		$stickies = array($post_id);
@@ -1497,7 +1508,12 @@
 	if ( ! in_array($post_id, $stickies) )
 		$stickies[] = $post_id;
 
+
+    if('post' == $sticky_post_type){
 	update_option('sticky_posts', $stickies);
+    } else {
+        update_option('sticky_'. $sticky_post_type, $stickies);
+    }
 }
 
 /**
@@ -1510,7 +1526,12 @@
  * @param int $post_id Post ID.
  */
 function unstick_post($post_id) {
+    $sticky_post_type = get_post_type($post_id);
+    if('post' == get_post_type($post_id)) {
 	$stickies = get_option('sticky_posts');
+    } else {
+        $stickies = get_option('sticky_' . $sticky_post_type);
+    }
 
 	if ( !is_array($stickies) )
 		return;
@@ -1523,8 +1544,11 @@
 		return;
 
 	array_splice($stickies, $offset, 1);
-
+    if('post' == $sticky_post_type){
 	update_option('sticky_posts', $stickies);
+    } else {
+        update_option('sticky_'. $sticky_post_type, $stickies);
+    }
 }
 
 /**
Index: wp-includes/query.php
===================================================================
--- wp-includes/query.php	(revision 15416)
+++ wp-includes/query.php	(working copy)
@@ -2471,54 +2471,67 @@
 		}
 
 		// Put sticky posts at the top of the posts array
-		$sticky_posts = get_option('sticky_posts');
-		if ( $this->is_home && $page <= 1 && is_array($sticky_posts) && !empty($sticky_posts) && !$q['caller_get_posts'] ) {
-			$num_posts = count($this->posts);
-			$sticky_offset = 0;
-			// Loop over posts and relocate stickies to the front.
-			for ( $i = 0; $i < $num_posts; $i++ ) {
-				if ( in_array($this->posts[$i]->ID, $sticky_posts) ) {
-					$sticky_post = $this->posts[$i];
-					// Remove sticky from current position
-					array_splice($this->posts, $i, 1);
-					// Move to front, after other stickies
-					array_splice($this->posts, $sticky_offset, 0, array($sticky_post));
-					// Increment the sticky offset.  The next sticky will be placed at this offset.
-					$sticky_offset++;
-					// Remove post from sticky posts array
-					$offset = array_search($sticky_post->ID, $sticky_posts);
-					unset( $sticky_posts[$offset] );
-				}
-			}
+		foreach(get_post_types() as $sticky_post_type) {
+                    if( !post_type_supports( $sticky_post_type, 'sticky') ) {
+                        continue;
+                    }
+                    
+                    if( 'post' == $sticky_post_type) {
+                        // get the core post stickies
+                        $sticky_posts = get_option('sticky_posts');
+                    } else { // TODO: Need a conditional here to see if stickies to be combined?
+                        continue;
+                        // get the custom_post_type stickies
+                        // $sticky_posts = get_option('sticky_'.$sticky_post_type);
+                    }
+                    if ( $this->is_home && $page <= 1 && is_array($sticky_posts) && !empty($sticky_posts) && !$q['caller_get_posts'] ) {
+                            $num_posts = count($this->posts);
+                            $sticky_offset = 0;
+                            // Loop over posts and relocate stickies to the front.
+                            for ( $i = 0; $i < $num_posts; $i++ ) {
+                                    if ( in_array($this->posts[$i]->ID, $sticky_posts) ) {
+                                            $sticky_post = $this->posts[$i];
+                                            // Remove sticky from current position
+                                            array_splice($this->posts, $i, 1);
+                                            // Move to front, after other stickies
+                                            array_splice($this->posts, $sticky_offset, 0, array($sticky_post));
+                                            // Increment the sticky offset.  The next sticky will be placed at this offset.
+                                            $sticky_offset++;
+                                            // Remove post from sticky posts array
+                                            $offset = array_search($sticky_post->ID, $sticky_posts);
+                                            unset( $sticky_posts[$offset] );
+                                    }
+                            }
 
-			// If any posts have been excluded specifically, Ignore those that are sticky.
-			if ( !empty($sticky_posts) && !empty($q['post__not_in']) )
-				$sticky_posts = array_diff($sticky_posts, $q['post__not_in']);
+                            // If any posts have been excluded specifically, Ignore those that are sticky.
+                            if ( !empty($sticky_posts) && !empty($q['post__not_in']) )
+                                    $sticky_posts = array_diff($sticky_posts, $q['post__not_in']);
 
-			// Fetch sticky posts that weren't in the query results
-			if ( !empty($sticky_posts) ) {
-				$stickies__in = implode(',', array_map( 'absint', $sticky_posts ));
-				// honor post type(s) if not set to any
-				$stickies_where = '';
-				if ( 'any' != $post_type && '' != $post_type ) {
-					if ( is_array( $post_type ) ) {
-						$post_types = join( "', '", $post_type );
-					} else {
-						$post_types = $post_type;
-					}
-					$stickies_where = "AND $wpdb->posts.post_type IN ('" . $post_types . "')";
-				}
+                            // Fetch sticky posts that weren't in the query results
+                            if ( !empty($sticky_posts) ) {
+                                    $stickies__in = implode(',', array_map( 'absint', $sticky_posts ));
+                                    // honor post type(s) if not set to any
+                                    $stickies_where = '';
+                                    if ( 'any' != $post_type && '' != $post_type ) {
+                                            if ( is_array( $post_type ) ) {
+                                                    $post_types = join( "', '", $post_type );
+                                            } else {
+                                                    $post_types = $post_type;
+                                            }
+                                            $stickies_where = "AND $wpdb->posts.post_type IN ('" . $post_types . "')";
+                                    }
 
-				$stickies = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE $wpdb->posts.ID IN ($stickies__in) $stickies_where" );
-				foreach ( $stickies as $sticky_post ) {
-					// Ignore sticky posts the current user cannot read or are not published.
-					if ( 'publish' != $sticky_post->post_status )
-						continue;
-					array_splice($this->posts, $sticky_offset, 0, array($sticky_post));
-					$sticky_offset++;
-				}
-			}
-		}
+                                    $stickies = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE $wpdb->posts.ID IN ($stickies__in) $stickies_where" );
+                                    foreach ( $stickies as $sticky_post ) {
+                                            // Ignore sticky posts the current user cannot read or are not published.
+                                            if ( 'publish' != $sticky_post->post_status )
+                                                    continue;
+                                            array_splice($this->posts, $sticky_offset, 0, array($sticky_post));
+                                            $sticky_offset++;
+                                    }
+                            }
+                    }
+                }
 
 		if ( !$q['suppress_filters'] )
 			$this->posts = apply_filters_ref_array('the_posts', array( $this->posts, &$this ) );
