diff --git a/db/migrations/5.1.57_cleanup_tool_activations.php b/db/migrations/5.1.57_cleanup_tool_activations.php
new file mode 100644
index 0000000000000000000000000000000000000000..6700816bc85e3503c48c5bd8292a7f5eb5fad1c3
--- /dev/null
+++ b/db/migrations/5.1.57_cleanup_tool_activations.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * @see https://gitlab.studip.de/studip/studip/-/issues/3977
+ */
+return new class extends Migration
+{
+    public function description()
+    {
+        return 'Removes invalid tool activations (that are no longer connected '
+            . 'to a StandardPlugin';
+    }
+
+    protected function up()
+    {
+        $query = "DELETE FROM `tools_activated`
+                  WHERE `plugin_id` NOT IN (
+                      SELECT `pluginid`
+                      FROM `plugins`
+                      WHERE FIND_IN_SET(?, `plugintype`)
+                  )";
+        DBManager::get()->execute($query, [StandardPlugin::class]);
+    }
+};
diff --git a/lib/plugins/engine/PluginManager.class.php b/lib/plugins/engine/PluginManager.class.php
index be4f76618313a1f9bc49096fd533061d8bf61cb3..f08b5fa4064acb711de9f4b4b98f7714a709c727 100644
--- a/lib/plugins/engine/PluginManager.class.php
+++ b/lib/plugins/engine/PluginManager.class.php
@@ -427,41 +427,49 @@ class PluginManager
             $this->plugins[$id]['name'] = $name;
             $this->plugins[$id]['path'] = $path;
             $this->plugins[$id]['type'] = $type;
+        } else {
+            foreach ($this->plugins as $plugin) {
+                $common_types = array_intersect($type, $plugin['type']);
 
-            return $id;
-        }
-
-        foreach ($this->plugins as $plugin) {
-            $common_types = array_intersect($type, $plugin['type']);
-
-            if (count($common_types) > 0 && $plugin['position'] >= $position) {
-                $position = $plugin['position'] + 1;
+                if (count($common_types) > 0 && $plugin['position'] >= $position) {
+                    $position = $plugin['position'] + 1;
+                }
             }
-        }
 
-        $sql = 'INSERT INTO plugins (
+            $sql = 'INSERT INTO plugins (
                     pluginname, pluginclassname, pluginpath,
                     plugintype, navigationpos, dependentonid
                 ) VALUES (?,?,?,?,?,?)';
-        $stmt = $db->prepare($sql);
-        $stmt->execute([$name, $class, $path, join(',', $type), $position, $depends]);
-        $id = $db->lastInsertId();
-
-        $this->plugins[$id] = [
-            'id'          => $id,
-            'name'        => $name,
-            'class'       => $class,
-            'path'        => $path,
-            'type'        => $type,
-            'enabled'     => false,
-            'position'    => $position,
-            'depends'     => $depends
-        ];
+            $stmt = $db->prepare($sql);
+            $stmt->execute([$name, $class, $path, join(',', $type), $position, $depends]);
+            $id = $db->lastInsertId();
 
-        $this->readPluginInfos();
+            $this->plugins[$id] = [
+                'id'          => $id,
+                'name'        => $name,
+                'class'       => $class,
+                'path'        => $path,
+                'type'        => $type,
+                'enabled'     => false,
+                'position'    => $position,
+                'depends'     => $depends
+            ];
+
+            $this->readPluginInfos();
 
-        $db->exec("INSERT INTO roles_plugins (roleid, pluginid)
+            $db->exec("INSERT INTO roles_plugins (roleid, pluginid)
                    SELECT roleid, $id FROM roles WHERE `system` = 'y' AND rolename != 'Nobody'");
+        }
+
+        if (!in_array(StandardPlugin::class, $type)) {
+            ToolActivation::findEachBySQL(
+                function (ToolActivation $activation) use ($id) {
+                    $this->setPluginActivated($id, $activation->range_id, false);
+                },
+                'plugin_id = ?',
+                [$id]
+            );
+        }
 
         return $id;
     }