diff --git a/app/controllers/admin/statusgroups.php b/app/controllers/admin/statusgroups.php
index e9e4e45711b213f3e8c0d1a1c18fd688ea2c6115..57ad3185f6949cf34c2d81d99f893fdaf856a6a6 100644
--- a/app/controllers/admin/statusgroups.php
+++ b/app/controllers/admin/statusgroups.php
@@ -380,7 +380,8 @@ class Admin_StatusgroupsController extends AuthenticatedController
             'inst' => [
                 'name' => _('Institut'),
                 'after_user_add' => function ($user_id) {
-                    $newInstUser = new InstituteMember([$user_id, Context::getId()]);
+                    $newInstUser = InstituteMember::findByUserAndInstitute($user_id, Context::getId()) ?:
+                                   InstituteMember::build(['user_id' => $user_id, 'institut_id' => Context::getId()]);
                     if ($newInstUser->isNew() || $newInstUser->inst_perms == 'user') {
                         $user = new User($user_id);
                         $newInstUser->inst_perms = $user->perms;
diff --git a/app/controllers/institute/members.php b/app/controllers/institute/members.php
index 2fec9072c31e66efa346e040f2848f25b74f894b..162c96deb042b37709a5109ccff44f0a0d35f65b 100644
--- a/app/controllers/institute/members.php
+++ b/app/controllers/institute/members.php
@@ -297,7 +297,8 @@ class Institute_MembersController extends AuthenticatedController
         $enable_mail_dozent = in_array('dozenten', $additionalCheckboxes);
 
         foreach ($mp->getAddedUsers() as $u_id) {
-            $member = new InstituteMember([$u_id, $this->institute->id]);
+            $member = InstituteMember::findByUserAndInstitute($u_id, $this->institute->id) ?:
+                      InstituteMember::build(['user_id' => $u_id, 'institut_id' => $this->institute->id]);
 
             if (!$member->isNew() && $member->inst_perms !== 'user') {
                 // der Admin hat Tomaten auf den Augen, der Mitarbeiter sitzt schon im Institut
@@ -442,7 +443,7 @@ class Institute_MembersController extends AuthenticatedController
             throw new Exception(_('Sie können sich nicht selbst aus der Einrichtung austragen.'));
         }
 
-        $member = InstituteMember::find([$user->id, $this->institute->id]);
+        $member = InstituteMember::findByUserAndInstitute($user->id, $this->institute->id);
         if ($member && $member->delete()) {
             PageLayout::postInfo(sprintf(
                 _('%s wurde von der Liste des Personals gelöscht.'),
diff --git a/app/controllers/settings/statusgruppen.php b/app/controllers/settings/statusgruppen.php
index d7de2546cfc7d278f8affba5e55f961cd2123441..88e42df126669c2164a824abbe4c1689bf8a8de5 100644
--- a/app/controllers/settings/statusgruppen.php
+++ b/app/controllers/settings/statusgruppen.php
@@ -208,7 +208,8 @@ class Settings_StatusgruppenController extends Settings_SettingsController
             } elseif (!$group->addUser($this->user->id)) {
                 PageLayout::postError(_('Fehler beim Eintragen in die Gruppe!'));
             } else {
-                $member  = new InstituteMember([$this->user->id, $range_id]);
+                $member  = InstituteMember::findByUserAndInstitute($this->user->id, $range_id) ?:
+                           InstituteMember::build(['user_id' => $this->user->id, 'institut_id' => $range_id]);
                 $member->inst_perms = $this->user->perms;
 
                 $was_new   = $member->isNew();
diff --git a/db/migrations/5.2.1_add_pk_for_user_inst.php b/db/migrations/5.2.1_add_pk_for_user_inst.php
new file mode 100644
index 0000000000000000000000000000000000000000..1a4e49bdcc80c2864ebae26d794a9c2a1e3bed84
--- /dev/null
+++ b/db/migrations/5.2.1_add_pk_for_user_inst.php
@@ -0,0 +1,32 @@
+<?php
+
+class AddPkForUserInst extends Migration
+{
+    public function description()
+    {
+        return 'add simple pk for user_inst table';
+    }
+
+    public function up()
+    {
+        $db = DBManager::get();
+
+        $sql = 'ALTER TABLE user_inst
+                ADD id int(11) NOT NULL AUTO_INCREMENT FIRST,
+                DROP PRIMARY KEY,
+                ADD PRIMARY KEY (id),
+                ADD UNIQUE KEY user_inst (Institut_id, user_id)';
+        $db->exec($sql);
+    }
+
+    public function down()
+    {
+        $db = DBManager::get();
+
+        $sql = 'ALTER TABLE user_inst
+                DROP id,
+                DROP KEY user_inst,
+                ADD PRIMARY KEY (Institut_id, user_id)';
+        $db->exec($sql);
+    }
+}
diff --git a/lib/classes/JsonApi/Routes/InstituteMemberships/InstituteMembershipsShow.php b/lib/classes/JsonApi/Routes/InstituteMemberships/InstituteMembershipsShow.php
index 1f0067a8b9fdd2704f9aeb30ec47b29a60a79f0d..7662af34693d8a5e657490583f01b3de234da53f 100644
--- a/lib/classes/JsonApi/Routes/InstituteMemberships/InstituteMembershipsShow.php
+++ b/lib/classes/JsonApi/Routes/InstituteMemberships/InstituteMembershipsShow.php
@@ -17,7 +17,7 @@ class InstituteMembershipsShow extends JsonApiController
      */
     public function __invoke(Request $request, Response $response, $args)
     {
-        if (!$membership = \InstituteMember::find(explode('_', $args['id'], 2))) {
+        if (!$membership = \InstituteMember::find($args['id'])) {
             throw new RecordNotFoundException();
         }
 
diff --git a/lib/models/InstituteMember.class.php b/lib/models/InstituteMember.class.php
index fe1b19d8359d9df9bebc4a0bfb551cd5d2840671..4048fdd72f869ef61725b242be627e8f5170373e 100644
--- a/lib/models/InstituteMember.class.php
+++ b/lib/models/InstituteMember.class.php
@@ -134,6 +134,18 @@ class InstituteMember extends SimpleORMap implements PrivacyObject
         );
     }
 
+    /**
+     * Finds an institute membership by user and institute id.
+     *
+     * @param string $user_id
+     * @param string $institute_id
+     * @return InstituteMember|null
+     */
+    public static function findByUserAndInstitute($user_id, $institute_id)
+    {
+        return self::findOneBySQL('user_id = ? AND institut_id = ?', [$user_id, $institute_id]);
+    }
+
     public function getUserFullname($format = 'full')
     {
         return User::build(array_merge(