diff --git a/lib/admissionrules/preferentialadmission/PreferentialAdmission.class.php b/lib/admissionrules/preferentialadmission/PreferentialAdmission.class.php
index 348d6fcca8f573a0077b639fde74d46c8fd6c3c9..6bb6cebf4c7ee7e2c4e784247ebbf57a1c52da98 100644
--- a/lib/admissionrules/preferentialadmission/PreferentialAdmission.class.php
+++ b/lib/admissionrules/preferentialadmission/PreferentialAdmission.class.php
@@ -446,7 +446,7 @@ class PreferentialAdmission extends AdmissionRule
             $userlist->setUsers($members);
             $userlist->setFactor($bonus);
             $userlist->store();
-            $bonus = $bonus * ($this->bonus_difference + 1);
+            $bonus = $bonus + ($this->bonus_difference + 1);
             $courseset->addUserList($userlist->getId());
             $this->userlists[] = $userlist->getId();
         }
diff --git a/lib/classes/admission/CourseSet.class.php b/lib/classes/admission/CourseSet.class.php
index 50f983fbc054536ad7fba909415c955f0b87328e..cf6cac788933d6cc3122965f6f22443bf4514800 100644
--- a/lib/classes/admission/CourseSet.class.php
+++ b/lib/classes/admission/CourseSet.class.php
@@ -597,14 +597,32 @@ class CourseSet
     public function getUserFactorList()
     {
         $factored_users = [];
+
         foreach ($this->getUserLists() as $ul_id) {
             $user_list = new AdmissionUserList($ul_id);
-            $factored_users = array_merge($factored_users,
-                                 array_combine(array_keys($user_list->getUsers()),
-                                         array_fill(0, count($user_list->getUsers()), $user_list->getFactor())
-                                         )
-                    );
+
+            // Iterate through user list.
+            foreach ($user_list->getUsers() as $user => $assigned) {
+                switch ($user_list->getFactor()) {
+                    // Maximum factor, just set it and stop further processing of user lists.
+                    case PHP_INT_MAX:
+                        $factored_users[$user] = PHP_INT_MAX;
+                        break;
+                    // Backlist, set malus and stop further processing of user lists.
+                    case 0:
+                        $factored_users[$user] = 0;
+                        break;
+                    default:
+                        // Add up current bonus if it isn't already at 0 or PHP_INT_MAX.
+                        if ($factored_users[$user] !== 0 && $factored_users[$user] != PHP_INT_MAX) {
+                            $factored_users[$user] = isset($factored_users[$user]) ?
+                                $factored_users[$user] + $user_list->getFactor() :
+                                $user_list->getFactor();
+                        }
+                }
+            }
         }
+
         return $factored_users;
     }