Index: userpoints_badges/userpoints_badges.module
===================================================================
--- userpoints_badges/userpoints_badges.module	(revision 497)
+++ userpoints_badges/userpoints_badges.module	(working copy)
@@ -92,9 +92,18 @@
  */
 function userpoints_badges_run_mass_badge_check($bid, $userpoints_goal) {
   db_query("DELETE FROM {user_badges_user} WHERE bid=%d", $bid);
-  $resultset = db_query("SELECT uid FROM {userpoints} WHERE uid > 0 GROUP BY uid HAVING SUM(points) > %d", 
-    $userpoints_goal);
+  
+  // Don't assign badge to users who already have a greater point-valued badge.
+  $next_greater = db_result(db_query('SELECT userpoints_goal FROM {userpoints_badges} WHERE userpoints_goal > %d ORDER BY userpoints_goal', $userpoints_goal));
+  
+  // Remove any existing lesser point-valued badges from users who qualify for
+  // the new badge.
+  $next_lesser = db_query('SELECT bid FROM {userpoints_badges} WHERE userpoints_goal < %d ORDER BY userpoints_goal DESC', $userpoints_goal);
+  
+  $resultset = db_query("SELECT uid FROM {userpoints} WHERE uid > 0 GROUP BY uid HAVING SUM(points) > %d AND SUM(points) < %d", 
+    $userpoints_goal, $next_greater);
   while ($account = db_fetch_object($resultset)) {
+    db_query("DELETE FROM {user_badges_user} WHERE bid=%d", $next_lesser);
     user_badges_user_add_badge($account->uid, $bid, strtr('Userpoints @bid', array('@bid' => $bid)));
   }
   drupal_set_message(t('Added all users with badges as well'));
@@ -119,12 +128,21 @@
       // Remove all existing badges for this user
       db_query("DELETE FROM {user_badges_user} WHERE uid = %d AND type LIKE 'Userpoints%'", $params['uid']);
       
-      // Iterate through each badge and assign any badge that passes the threshold 
+      // Iterate through each badge and assign the greatest point-valued badge that passes the threshold.
+      $best_badge = NULL;
       foreach ($badges as $badge) {
         if ($total_points >= $badge->userpoints_goal) {
-          user_badges_user_add_badge($params['uid'], $badge->bid, t('Userpoints @bid', array('@bid' => $badge->bid)));
+          if (empty($best_badge)) {
+            $best_badge = $badge;
+          }
+          elseif ($badge->userpoints_goal > $best_badge->userpoints_goal) {
+            $best_badge = $badge;
+          }
         }
       }
+      if (!empty($best_badge)) {
+        user_badges_user_add_badge($params['uid'], $best_badge->bid, t('Userpoints @bid', array('@bid' => $best_badge->bid)));
+      }
   }
 }
 
