Index: wp-includes/default-widgets.php
===================================================================
--- wp-includes/default-widgets.php	(revision 17246)
+++ wp-includes/default-widgets.php	(working copy)
@@ -332,32 +332,71 @@
 	}
 
 	function widget( $args, $instance ) {
-		extract($args);
-		$title = apply_filters('widget_title', empty($instance['title']) ? '&nbsp;' : $instance['title'], $instance, $this->id_base);
+		extract( $args );
+
+		$title             = apply_filters( 'widget_title', empty( $instance['title'] ) ? '&nbsp;' : $instance['title'], $instance, $this->id_base );
+		$current_post_type = $this->_get_current_post_type( $instance );
+
 		echo $before_widget;
+
 		if ( $title )
-			echo $before_title . $title . $after_title;
-		echo '<div id="calendar_wrap">';
-		get_calendar();
-		echo '</div>';
+			echo $before_title . $title . $after_title; ?>
+
+		<div id="calendar_wrap">
+
+			<?php get_calendar( true, true, $current_post_type ); ?>
+
+		</div>
+
+		<?php
+		
 		echo $after_widget;
 	}
 
 	function update( $new_instance, $old_instance ) {
-		$instance = $old_instance;
-		$instance['title'] = strip_tags($new_instance['title']);
+		$instance              = $old_instance;
+		$instance['title']     = strip_tags( $new_instance['title'] );
+		$instance['post_type'] = stripslashes( $new_instance['post_type'] );
 
 		return $instance;
 	}
 
 	function form( $instance ) {
-		$instance = wp_parse_args( (array) $instance, array( 'title' => '' ) );
-		$title = strip_tags($instance['title']);
-?>
-		<p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
-		<input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></p>
-<?php
+		$instance          = wp_parse_args( (array) $instance, array( 'title' => '' ) );
+		$title             = strip_tags( $instance['title'] );
+		$current_post_type = $this->_get_current_post_type( $instance );
+		?>
+
+		<p>
+			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
+			<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
+		</p>
+
+		<p>
+			<label for="<?php echo $this->get_field_id( 'post_type' ); ?>"><?php _e( 'Post Type:' ); ?></label>
+			<select class="widefat" id="<?php echo $this->get_field_id( 'post_type' ); ?>" name="<?php echo $this->get_field_name('post_type'); ?>">
+
+				<?php foreach ( get_post_types( array(), 'objects' ) as $post_type ) :
+					if ( !post_type_supports( $post_type->name, 'calendar' ) )
+						continue;
+					?>
+
+					<option value="<?php echo esc_attr( $post_type->name ); ?>"<?php selected( $post_type->name, $current_post_type ); ?>><?php echo $post_type->label; ?></option>
+
+				<?php endforeach; ?>
+
+			</select>
+		</p>
+
+		<?php
 	}
+
+	function _get_current_post_type( $instance ) {
+		if ( !empty( $instance['post_type'] ) && post_type_exists( $instance['post_type'] ) )
+			return $instance['post_type'];
+
+		return 'post';
+	}
 }
 
 /**
Index: wp-includes/general-template.php
===================================================================
--- wp-includes/general-template.php	(revision 17246)
+++ wp-includes/general-template.php	(working copy)
@@ -1071,10 +1071,16 @@
  *
  * @param bool $initial Optional, default is true. Use initial calendar names.
  * @param bool $echo Optional, default is true. Set to false for return.
+ * @param string $post_type Optional, default is 'post'. Use to get a calendar
+ *                           of a custom post type
  */
-function get_calendar($initial = true, $echo = true) {
+function get_calendar( $initial = true, $echo = true, $post_type = 'post' ) {
 	global $wpdb, $m, $monthnum, $year, $wp_locale, $posts;
 
+	// Check if the post type exists
+	if ( empty( $post_type ) || !post_type_exists( 'post' ) )
+		return false;
+
 	$cache = array();
 	$key = md5( $m . $monthnum . $year );
 	if ( $cache = wp_cache_get( 'get_calendar', 'calendar' ) ) {
@@ -1093,7 +1099,7 @@
 
 	// Quick check. If we have no posts at all, abort!
 	if ( !$posts ) {
-		$gotsome = $wpdb->get_var("SELECT 1 as test FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' LIMIT 1");
+		$gotsome = $wpdb->get_var("SELECT 1 as test FROM $wpdb->posts WHERE post_type = '$post_type' AND post_status = 'publish' LIMIT 1");
 		if ( !$gotsome ) {
 			$cache[ $key ] = '';
 			wp_cache_set( 'get_calendar', $cache, 'calendar' );
@@ -1134,13 +1140,13 @@
 	$previous = $wpdb->get_row("SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
 		FROM $wpdb->posts
 		WHERE post_date < '$thisyear-$thismonth-01'
-		AND post_type = 'post' AND post_status = 'publish'
+		AND post_type = '$post_type' AND post_status = 'publish'
 			ORDER BY post_date DESC
 			LIMIT 1");
 	$next = $wpdb->get_row("SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
 		FROM $wpdb->posts
 		WHERE post_date > '$thisyear-$thismonth-{$last_day} 23:59:59'
-		AND post_type = 'post' AND post_status = 'publish'
+		AND post_type = '$post_type' AND post_status = 'publish'
 			ORDER BY post_date ASC
 			LIMIT 1");
 
@@ -1194,7 +1200,7 @@
 	// Get days with posts
 	$dayswithposts = $wpdb->get_results("SELECT DISTINCT DAYOFMONTH(post_date)
 		FROM $wpdb->posts WHERE post_date >= '{$thisyear}-{$thismonth}-01 00:00:00'
-		AND post_type = 'post' AND post_status = 'publish'
+		AND post_type = '$post_type' AND post_status = 'publish'
 		AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59'", ARRAY_N);
 	if ( $dayswithposts ) {
 		foreach ( (array) $dayswithposts as $daywith ) {
@@ -1214,7 +1220,7 @@
 		."FROM $wpdb->posts "
 		."WHERE post_date >= '{$thisyear}-{$thismonth}-01 00:00:00' "
 		."AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59' "
-		."AND post_type = 'post' AND post_status = 'publish'"
+		."AND post_type = '$post_type' AND post_status = 'publish'"
 	);
 	if ( $ak_post_titles ) {
 		foreach ( (array) $ak_post_titles as $ak_post_title ) {
Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 17246)
+++ wp-includes/post.php	(working copy)
@@ -26,7 +26,7 @@
 		'hierarchical' => false,
 		'rewrite' => false,
 		'query_var' => false,
-		'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'post-formats' ),
+		'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'post-formats', 'calendar' ),
 	) );
 
 	register_post_type( 'page', array(
@@ -1209,9 +1209,10 @@
  *
  * All features are directly associated with a functional area of the edit screen, such as the
  * editor or a meta box: 'title', 'editor', 'comments', 'revisions', 'trackbacks', 'author',
- * 'excerpt', 'page-attributes', 'thumbnail', and 'custom-fields'.
+ * 'excerpt', 'page-attributes', 'thumbnail', 'calendar' and 'custom-fields'.
  *
  * Additionally, the 'revisions' feature dictates whether the post type will store revisions,
+ * the 'calendar' feature will show the post type in the select box in the calendar widget,
  * and the 'comments' feature dicates whether the comments count will show on the edit screen.
  *
  * @since 3.0.0
