diff --git a/classes/lti/OpencastLTI.php b/classes/lti/OpencastLTI.php
index 4d914a9d97667c54c22ca88bb0005542617b9fcd..fdf69f3048af9e6eb7d9c6a43f6f1dc86013d7ce 100644
--- a/classes/lti/OpencastLTI.php
+++ b/classes/lti/OpencastLTI.php
@@ -352,7 +352,17 @@ class OpencastLTI
 
         // check, if the calculated and actual acls differ and update if so
         if ($oc_acl <> $acl->toArray()) {
-            $client->setACL($target_id, $acl);
+            // To only touch ACLs set by the Stud.IP plugin,
+            // copy over existing ACLs which aren't handled by Stud.IP.
+            foreach ($oc_acl as $oc_acl_entry) {
+                if (!preg_match('~(?:[0-9a-f]{32}_(?:Instructor|Learner)|ROLE_ANONYMOUS|ROLE_ADMIN)~', $oc_acl_entry['role'])) {
+                    $e = new \AccessControlEntity($oc_acl_entry['role'], $oc_acl_entry['action'], $oc_acl_entry['allow']);
+                    $acl->add_ace($e);
+                }
+            }
+            if ($oc_acl <> $acl->toArray()) {
+                $client->setACL($target_id, $acl);
+            }
         }
     }