Index: wp-admin/includes/plugin.php
===================================================================
--- wp-admin/includes/plugin.php	(revision 28667)
+++ wp-admin/includes/plugin.php	(working copy)
@@ -47,6 +47,7 @@
  *		'TextDomain' - Plugin's text domain for localization.
  *		'DomainPath' - Plugin's relative directory path to .mo files.
  *		'Network' - Boolean. Whether the plugin can only be activated network wide.
+ *		'UpdateService' - String. Indicates which update service should be used to obtain plugin information. Defaults to wordpressorg (which is the only one handled natively by WordPress core).
  *
  * Some users have issues with opening large files and manipulating the contents
  * for want is usually the first 1kiB or 2kiB. This function stops pulling in
@@ -81,6 +82,7 @@
 		'TextDomain' => 'Text Domain',
 		'DomainPath' => 'Domain Path',
 		'Network' => 'Network',
+		'UpdateService' => 'Update Service',
 		// Site Wide Only is deprecated in favor of Network.
 		'_sitewide' => 'Site Wide Only',
 	);
@@ -93,6 +95,8 @@
 		$plugin_data['Network'] = $plugin_data['_sitewide'];
 	}
 	$plugin_data['Network'] = ( 'true' == strtolower( $plugin_data['Network'] ) );
+	if ( empty( $plugin_data['UpdateService'] ) )
+		$plugin_data['UpdateService'] = 'wordpressorg';
 	unset( $plugin_data['_sitewide'] );
 
 	if ( $markup || $translate ) {
Index: wp-includes/update.php
===================================================================
--- wp-includes/update.php	(revision 28667)
+++ wp-includes/update.php	(working copy)
@@ -228,6 +228,11 @@
 	if ( $time_not_changed && ! $extra_stats ) {
 		$plugin_changed = false;
 		foreach ( $plugins as $file => $p ) {
+			if ( 'wordpressorg' != $p['UpdateService'] ) {
+				unset( $plugins[ $file ] );
+				continue;
+			}
+
 			$new_option->checked[ $file ] = $p['Version'];
 
 			if ( !isset( $current->checked[ $file ] ) || strval($current->checked[ $file ]) !== strval($p['Version']) )
