Index: Slim/Plugin/Extensions/Settings.pm
===================================================================
--- Slim/Plugin/Extensions/Settings.pm	(revision 29003)
+++ Slim/Plugin/Extensions/Settings.pm	(working copy)
@@ -151,7 +151,7 @@
 	my $plugins = Slim::Utils::PluginManager->allPlugins;
 	my $states  = preferences('plugin.state');
 
-	my $seen = {};
+	my $hide = {};
 	my $current = {};
 
 	# create entries for built in plugins and those already installed
@@ -190,7 +190,7 @@
 			push @inactive, $entry;
 		}
 
-		$seen->{$plugin} = 1;
+		$hide->{$plugin} = 1;
 	}
 
 	my @results = sort { $a->{'weight'} !=  $b->{'weight'} ?
@@ -236,16 +236,28 @@
 
 	Slim::Utils::PluginManager->message(undef);
 
-	# prune out duplicate entries, favour repos later in the list so that entries get pruned from the 3rd party and other repos
+	# prune out duplicate entries, favour favour higher version numbers
+	
+	# pass 1 - find the higher version numbers
+	my $max = {};
 
-	for my $repo (reverse @results) {
+	for my $repo (@results) {
+		for my $entry (@{$repo->{'entries'}}) {
+			my $name = $entry->{'name'};
+			if (!defined $max->{$name} || Slim::Utils::Versions->compareVersions($entry->{'version'}, $max->{$name}) > 0) {
+				$max->{$name} = $entry->{'version'};
+			}
+		}
+	}
+
+	# pass 2 - prune out lower versions or entries which are hidden as they are shown in enabled plugins
+	for my $repo (@results) {
 		my $i = 0;
 		while (my $entry = $repo->{'entries'}->[$i]) {
-			if ($seen->{$entry->{'name'}}) {
+			if ($hide->{$entry->{'name'}} || $max->{$entry->{'name'}} ne $entry->{'version'}) {
 				splice @{$repo->{'entries'}}, $i, 1;
 				next;
 			}
-			$seen->{$entry->{'name'}} = 1;
 			$i++;
 		}
 	}
Index: Slim/Control/Jive.pm
===================================================================
--- Slim/Control/Jive.pm	(revision 29003)
+++ Slim/Control/Jive.pm	(working copy)
@@ -3199,9 +3199,39 @@
 
 	if ( ! --$data->{'remaining'} ) {
 
+		# create a list of entries with the duplicates removed, favoring higher version numbers
+
+		# pass 1 - find max versions
+		my $max = {};
+
+		for my $entry (@{$data->{'results'}}) {
+
+			my $name = $entry->{'name'};
+
+			if (!defined $max->{$name} || Slim::Utils::Versions->compareVersions($entry->{'version'}, $max->{$name}) > 0) {
+
+				$max->{$name} = $entry->{'version'};
+			}
+		}
+
+		# pass 2 - build list containing single entry for per extension
+		my @results = ();
+
+		for my $entry (@{$data->{'results'}}) {
+
+			my $name = $entry->{'name'};
+
+			if (defined $max->{$name} && $max->{$name} eq $entry->{'version'}) {
+
+				push @results, $entry;
+
+				delete $max->{$name};
+			}
+		}
+
 		my $cnt = 0;
 
-		for my $entry ( sort { $a->{'title'} cmp $b->{'title'} } @{$data->{'results'}} ) {
+		for my $entry ( sort { $a->{'title'} cmp $b->{'title'} } @results ) {
 
 			$request->setResultLoopHash('item_loop', $cnt++, $entry);
 		}