diff --git a/src/generic/apt/aptitude_resolver_universe.cc b/src/generic/apt/aptitude_resolver_universe.cc
index d1901c6..2074c22 100644
--- a/src/generic/apt/aptitude_resolver_universe.cc
+++ b/src/generic/apt/aptitude_resolver_universe.cc
@@ -264,11 +264,17 @@ aptitude_resolver_version::dep_iterator::applicable(const pkgCache::DepIterator
       eassert(!prv.end());
       eassert(is_conflict(dep->Type));
 
-      if(const_cast<pkgCache::PrvIterator &>(prv).OwnerPkg() == const_cast<pkgCache::DepIterator &>(dep).ParentPkg())
-	return false;
+      // NB: inlined pkgCache::DepIterator::IsIgnorable
+      // if(dep.IsIgnorable(prv) == true)
+      //   return false;
+      const pkgCache::PkgIterator pkg = dep.ParentPkg();
+      if(prv.OwnerPkg()->Group == pkg->Group)
+        return false;
+      if(pkg->Group == dep.TargetPkg()->Group && prv.OwnerPkg()->Group != pkg->Group)
+        return false;
     }
   else
-    if(const_cast<pkgCache::DepIterator &>(dep).ParentPkg() == const_cast<pkgCache::DepIterator &>(dep).TargetPkg())
+    if(dep.ParentPkg() == dep.TargetPkg())
       return false;
 
   if(!is_interesting_dep(dep, cache))
@@ -316,39 +322,34 @@ void aptitude_resolver_dep::solver_iterator::normalize()
     {
       while(!end())
 	{
-	  while(!ver_lst.end())
-	    {
-	      bool ver_matches =
-		!dep_lst.TargetVer() ||
-		_system->VS->CheckDep(ver_lst.VerStr(),
-				      dep_lst->CompareOp,
-				      dep_lst.TargetVer());
+          for(; ver_lst.end() == false; ++ver_lst)
+            {
+              if(dep_lst.IsIgnorable(ver_lst.ParentPkg()) == true)
+                continue;
 
-	      if(ver_matches && ver_disappeared(ver_lst))
-		ver_matches = false;
+              if(_system->VS->CheckDep(ver_lst.VerStr(),
+                                       dep_lst->CompareOp,
+                                       dep_lst.TargetVer()) == false)
+                continue;
 
-	      if(ver_matches)
-		// Found the next entry; drop out.
-		return;
-	      else
-		++ver_lst;
-	    }
+              if(ver_disappeared(ver_lst) == false)
+                return;
+            }
 
 	  // If we ran out of versions, try provides instead.
-	  while(!prv_lst.end())
-	    {
-	      bool prv_matches=(!dep_lst.TargetVer()) ||
-		(prv_lst.ProvideVersion() &&
-		 _system->VS->CheckDep(prv_lst.ProvideVersion(),
-				       dep_lst->CompareOp,
-				       dep_lst.TargetVer()));
+          for(; prv_lst.end() == false; ++prv_lst)
+            {
+              if(dep_lst.IsIgnorable(prv_lst) == true)
+                continue;
 
-	      if(prv_matches &&
-		 !ver_disappeared(prv_lst.OwnerVer()))
-		return;
-	      else
-		++prv_lst;
-	    }
+              if(_system->VS->CheckDep(prv_lst.ProvideVersion(),
+                                       dep_lst->CompareOp,
+                                       dep_lst.TargetVer()) == false)
+                continue;
+
+              if(ver_disappeared(prv_lst.OwnerVer()) == false)
+                return;
+            }
 
 	  // No more target versions or providers of the target;
 	  // increment the dependency list if we aren't yet at the
@@ -440,18 +441,27 @@ bool aptitude_resolver_dep::solved_by(const aptitude_resolver_version &v) const
 
       while(1)
 	{
-	  if(d.TargetPkg() == v.get_pkg() &&
-	     (!d.TargetVer() || _system->VS->CheckDep(v.get_ver().VerStr(),
-						      d->CompareOp,
-						      d.TargetVer())))
-	    return true;
+          if(d.IsIgnorable(v.get_pkg()) == false
+             && _system->VS->CheckDep(v.get_ver().VerStr(),
+                                      d->CompareOp,
+                                      d.TargetVer()) == true)
+            return true;
 
 	  // Check for a resolution via Provides.
-	  if(!d.TargetVer())
-	    for(pkgCache::PrvIterator p2 = v.get_ver().ProvidesList();
-		!p2.end(); ++p2)
-	      if(const_cast<pkgCache::PrvIterator &>(p2).ParentPkg() == d.TargetPkg())
-		return true;
+          for(pkgCache::PrvIterator p2 = v.get_ver().ProvidesList();
+              p2.end() == false; ++p2)
+            {
+              if(d.IsIgnorable(p2) == true)
+                continue;
+
+              if(p2.ParentPkg() != d.TargetPkg())
+                continue;
+
+              if(_system->VS->CheckDep(p2.ProvideVersion(),
+                                       d->CompareOp,
+                                       d.TargetVer()) == true)
+                return true;
+            }
 
 	  if((d->CompareOp & pkgCache::Dep::Or) != 0)
 	    ++d;
diff --git a/src/generic/apt/aptitude_resolver_universe.h b/src/generic/apt/aptitude_resolver_universe.h
index e10ce6a..285f372 100644
--- a/src/generic/apt/aptitude_resolver_universe.h
+++ b/src/generic/apt/aptitude_resolver_universe.h
@@ -982,25 +982,32 @@ bool aptitude_resolver_dep::broken_under(const InstallationType &I) const
 
       while(!dep.end())
 	{
-	  pkgCache::VerIterator direct_ver=I.version_of(aptitude_resolver_package(dep.TargetPkg(), cache)).get_ver();
-	  if(!direct_ver.end())
-	    {
-	      const char * const direct_verstr = direct_ver.VerStr();
-	      const char * const dep_targetstr = dep.TargetVer();
-	      if(!direct_ver.end() &&
-		 _system->VS->CheckDep(direct_verstr,
-				       dep->CompareOp,
-				       dep_targetstr))
-		return false;
-	    }
-
-	  if(!dep.TargetVer())
-	    {
-	      for(pkgCache::PrvIterator prv=dep.TargetPkg().ProvidesList();
-		  !prv.end(); ++prv)
-		if(prv.OwnerVer() == I.version_of(aptitude_resolver_package(prv.OwnerPkg(), cache)).get_ver())
-		  return false;
-	    }
+          if(dep.IsIgnorable(dep.TargetPkg()) == false)
+            {
+              const aptitude_resolver_package pkg(dep.TargetPkg(), cache);
+              const pkgCache::VerIterator direct_ver = I.version_of(pkg).get_ver();
+              if((direct_ver.end() == false)
+                 && (_system->VS->CheckDep(direct_ver.VerStr(),
+                                           dep->CompareOp,
+                                           dep.TargetVer()) == true))
+                return false;
+            }
+
+          for(pkgCache::PrvIterator prv = dep.TargetPkg().ProvidesList();
+              prv.end() == false; ++prv)
+            {
+              if(dep.IsIgnorable(prv) == true)
+                continue;
+
+              if(_system->VS->CheckDep(prv.ProvideVersion(),
+                                       dep->CompareOp,
+                                       dep.TargetVer()) == false)
+                continue;
+
+              const aptitude_resolver_package pkg(prv.OwnerPkg(), cache);
+              if(prv.OwnerVer() == I.version_of(pkg).get_ver())
+                return false;
+            }
 
 	  if(!(dep->CompareOp & pkgCache::Dep::Or))
 	    break;
@@ -1015,10 +1022,14 @@ bool aptitude_resolver_dep::broken_under(const InstallationType &I) const
       // single element of the Conflicts/Breaks: either a direct
       // conflict or an indirect conflict (i.e., via a virtual pkg).
 
+      // NB: The dep_iterator already skips conflicts for which
+      // DepIterator::IsIgnorable is true so avoid repeating those
+      // tests here.
+
       if(prv == NULL)
 	{
-	  if(start_iter.TargetPkg() == start_iter.ParentPkg())
-	    return false;
+          // if(start_iter.IsIgnorable(start_iter.TargetPkg()) == true)
+          //   return false;
 
 	  pkgCache::VerIterator direct_ver=I.version_of(aptitude_resolver_package(start_iter.TargetPkg(), cache)).get_ver();
 
@@ -1034,8 +1045,8 @@ bool aptitude_resolver_dep::broken_under(const InstallationType &I) const
 	{
 	  pkgCache::PrvIterator prv_iter(cache->GetCache(), const_cast<pkgCache::Provides *>(prv), (pkgCache::Package *)0);
 
-	  if(prv_iter.OwnerPkg() == start_iter.ParentPkg())
-	    return false;
+	  // if(start_iter.IsIgnorable(prv_iter) == true)
+	  //   return false;
 
 	  if(start_iter.TargetVer() != NULL)
 	    return false;
