diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc
index 158564b..cd40923 100644
--- a/apt-pkg/algorithms.cc
+++ b/apt-pkg/algorithms.cc
@@ -627,8 +627,28 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg)
 	 if ((Cache[End] & pkgDepCache::DepGInstall) == pkgDepCache::DepGInstall)
 	    break;
 	 
+	 // Find provider for virtual package with highest score.
+	 PkgIterator P = Start.TargetPkg();
+	 PrvIterator Provides = P.ProvidesList();
+
+	 if (!Provides.end())
+	 {
+	     // Skip over indirect provisions of package that owns the dependency.
+	     // See pkgCache::DepIterator::SmartTargetPkg
+	     for (;!Provides.end() && Provides.OwnerPkg() == Start.ParentPkg(); Provides++);
+
+	     // Loop through provider list and find package with highest score.
+	     while (!Provides.end())
+	     {
+		 if (Scores[Provides.OwnerPkg()->ID] > Scores[P->ID])
+		 {
+		     P = Provides.OwnerPkg();
+		 }
+		 Provides++;
+	     }
+	 }
+
 	 // Do not change protected packages
-	 PkgIterator P = Start.SmartTargetPkg();
 	 if ((Flags[P->ID] & Protected) == Protected)
 	 {
 	    if (Debug == true)
