Index: tests/tests/link.php
===================================================================
--- tests/tests/link.php	(revision 25017)
+++ tests/tests/link.php	(working copy)
@@ -2,7 +2,7 @@
 /**
  * @group link
  */
-class Tests_Link_Functions extends WP_UnitTestCase {
+class Tests_Link extends WP_UnitTestCase {
 
 	function _get_pagenum_link_cb( $url ) {
 		return $url . '/WooHoo';
@@ -27,4 +27,71 @@
 
 		$_SERVER['REQUEST_URI'] = $old_req_uri;
 	}
+
+	function test_wp_get_shortlink() {
+		$post_id = $this->factory->post->create();
+		$post_id2 = $this->factory->post->create();
+
+		// Basic case
+		$this->assertEquals( get_permalink( $post_id ), wp_get_shortlink( $post_id, 'post' ) );
+
+		// Global post is not set
+		$this->assertEquals( '', wp_get_shortlink( 0, 'post' ) );
+		$this->assertEquals( '', wp_get_shortlink( 0 ) );
+		$this->assertEquals( '', wp_get_shortlink() );
+
+		$GLOBALS['post'] = get_post( $post_id );
+
+		// Global post is set
+		$this->assertEquals( get_permalink( $post_id ), wp_get_shortlink( 0, 'post' ) );
+		$this->assertEquals( get_permalink( $post_id ), wp_get_shortlink( 0 ) );
+		$this->assertEquals( get_permalink( $post_id ), wp_get_shortlink() );
+
+		// Not the global post
+		$this->assertEquals( get_permalink( $post_id2 ), wp_get_shortlink( $post_id2, 'post' ) );
+
+		unset( $GLOBALS['post'] );
+
+		// Global post is not set, once again
+		$this->assertEquals( '', wp_get_shortlink( 0, 'post' ) );
+		$this->assertEquals( '', wp_get_shortlink( 0 ) );
+		$this->assertEquals( '', wp_get_shortlink() );
+
+		global $wp_rewrite;
+		$wp_rewrite->permalink_structure = '';
+		$wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%day%/%postname%/' );
+		$wp_rewrite->flush_rules();
+
+		// With a permalink structure set, get_permalink() will no longer match.
+		$this->assertNotEquals( get_permalink( $post_id ), wp_get_shortlink( $post_id, 'post' ) );
+		$this->assertEquals( home_url( '?p=' . $post_id ), wp_get_shortlink( $post_id, 'post' ) );
+
+		// Global post and permalink structure are set
+		$GLOBALS['post'] = get_post( $post_id );
+		$this->assertEquals( home_url( '?p=' . $post_id ), wp_get_shortlink( 0, 'post' ) );
+		$this->assertEquals( home_url( '?p=' . $post_id ), wp_get_shortlink( 0 ) );
+		$this->assertEquals( home_url( '?p=' . $post_id ), wp_get_shortlink() );
+
+		$wp_rewrite->set_permalink_structure( '' );
+		$wp_rewrite->flush_rules();
+	}
+
+	function test_wp_get_shortlink_with_page() {
+		$post_id = $this->factory->post->create( array( 'post_type' => 'page' ) );
+
+		// Basic case
+		// Don't test against get_permalink() since it uses ?page_id= for pages.
+		$this->assertEquals( home_url( '?p=' . $post_id ), wp_get_shortlink( $post_id, 'post' ) );
+
+		global $wp_rewrite;
+		$wp_rewrite->permalink_structure = '';
+		$wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%day%/%postname%/' );
+		$wp_rewrite->flush_rules();
+
+		$this->assertEquals( home_url( '?p=' . $post_id ), wp_get_shortlink( $post_id, 'post' ) );
+
+		$wp_rewrite->set_permalink_structure( '' );
+		$wp_rewrite->flush_rules();
+	}
+
 }
\ No newline at end of file
Index: src/wp-includes/link-template.php
===================================================================
--- src/wp-includes/link-template.php	(revision 25027)
+++ src/wp-includes/link-template.php	(working copy)
@@ -2351,20 +2351,21 @@
 
 	global $wp_query;
 	$post_id = 0;
-	if ( 'query' == $context && is_single() ) {
+	if ( 'query' == $context && is_singular() ) { 
 		$post_id = $wp_query->get_queried_object_id();
+		$post = get_post( $post_id );
 	} elseif ( 'post' == $context ) {
-		$post = get_post($id);
+		$post = get_post( $id );
 		$post_id = $post->ID;
 	}
 
 	$shortlink = '';
 
-	// Return p= link for posts.
-	if ( !empty($post_id) && '' != get_option('permalink_structure') ) {
-		$post = get_post($post_id);
-		if ( isset($post->post_type) && 'post' == $post->post_type )
-			$shortlink = home_url('?p=' . $post->ID);
+	// Return p= link for all public post types.
+	if ( ! empty( $post_id ) ) {
+		$post_type = get_post_type_object( $post->post_type );
+		if ( $post_type->public )
+			$shortlink = home_url('?p=' . $post_id);
 	}
 
 	return apply_filters('get_shortlink', $shortlink, $id, $context, $allow_slugs);
