diff --git a/lib/classes/ContentBar.php b/lib/classes/ContentBar.php
index 53b3dfce98162aef4399e58aad9c9703d6d2e445..0e6a664dcb0365fc70221cefeb7ac53d291bfc35 100644
--- a/lib/classes/ContentBar.php
+++ b/lib/classes/ContentBar.php
@@ -36,18 +36,19 @@ class ContentBar
     public static function get(): ContentBar
     {
         if (static::$instance === null) {
-            static::$instance = new static;
+            static::$instance = new static();
         }
         return static::$instance;
     }
 
     /**
      * Private constructor to ensure that the singleton Get() method is always
-     * used.
+     * used. The constructor is finalized so that the call to get() will never
+     * fail.
      *
      * @see ContentBar::get
      */
-    protected function __construct()
+    protected final function __construct()
     {
     }
 
diff --git a/lib/classes/CoursewarePDFCertificate.php b/lib/classes/CoursewarePDFCertificate.php
index e3ef02f70bb92de223faf95f18010466185447ef..ca6e704c27b221960218f44a56ebe0ed85dc8344 100644
--- a/lib/classes/CoursewarePDFCertificate.php
+++ b/lib/classes/CoursewarePDFCertificate.php
@@ -2,13 +2,12 @@
 
 class CoursewarePDFCertificate extends TCPDF
 {
+    protected $background;
+
     public function __construct($background = false, $orientation = 'P', $unit = 'mm', $format = 'A4', $unicode = true, $encoding = 'UTF-8')
     {
-        $this->config = Config::get();
-        if ($this->config->getValue('LOAD_EXTERNAL_MEDIA') === 'proxy') {
-            $this->media_proxy = new MediaProxy();
-        }
         parent::__construct($orientation, $unit, $format, $unicode, $encoding, false);
+
         if ($background) {
             $fileRef = FileRef::find($background);
             $this->background = $fileRef->file->getPath();
diff --git a/lib/classes/JsonApi/Routes/Courseware/UnitsCopy.php b/lib/classes/JsonApi/Routes/Courseware/UnitsCopy.php
index 53654598d522a16eb1bc37dff144f17e3cf36428..61ffa956cf2d8531c0013b164a7ce30c788dc419 100644
--- a/lib/classes/JsonApi/Routes/Courseware/UnitsCopy.php
+++ b/lib/classes/JsonApi/Routes/Courseware/UnitsCopy.php
@@ -32,7 +32,13 @@ class UnitsCopy extends NonJsonApiController
         $rangeType = $data['rangeType'];
         $modified = $data['modified'];
 
-        if (!Authority::canCreateUnit($user)) {
+        try {
+            $range = \RangeFactory::createRange($rangeType, $rangeId);
+        } catch (\Exception $e) {
+            throw new RecordNotFoundException('Range could not be found');
+        }
+
+        if (!Authority::canCreateUnit($user, $range)) {
             throw new AuthorizationFailedException();
         }
 
@@ -43,4 +49,4 @@ class UnitsCopy extends NonJsonApiController
 
         return $response;
     }
-}
\ No newline at end of file
+}
diff --git a/lib/classes/JsonApi/Routes/Courseware/UnitsCreate.php b/lib/classes/JsonApi/Routes/Courseware/UnitsCreate.php
index c10961984d4d188d1ed68073f46a0f124ed015e1..f8fb17b6b5290c0824058c6058387850a3bb632a 100644
--- a/lib/classes/JsonApi/Routes/Courseware/UnitsCreate.php
+++ b/lib/classes/JsonApi/Routes/Courseware/UnitsCreate.php
@@ -3,12 +3,12 @@
 namespace JsonApi\Routes\Courseware;
 
 use JsonApi\Errors\AuthorizationFailedException;
+use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
 use JsonApi\Routes\ValidationTrait;
 use JsonApi\Schemas\Courseware\Unit as UnitSchema;
 use Psr\Http\Message\ResponseInterface as Response;
 use Psr\Http\Message\ServerRequestInterface as Request;
-use Studip\Activity\Activity;
 
 /**
  * Create a block in a container.
diff --git a/lib/classes/JsonApi/Routes/Courseware/UnitsUpdate.php b/lib/classes/JsonApi/Routes/Courseware/UnitsUpdate.php
index 53fccd3358fe46f4b1d31d199f577adb42c5df85..762fb0437e81a86eda650ea66ad0c721073642cd 100644
--- a/lib/classes/JsonApi/Routes/Courseware/UnitsUpdate.php
+++ b/lib/classes/JsonApi/Routes/Courseware/UnitsUpdate.php
@@ -6,6 +6,7 @@ use Courseware\Unit;
 use JsonApi\Errors\AuthorizationFailedException;
 use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
+use JsonApi\Routes\TimestampTrait;
 use JsonApi\Routes\ValidationTrait;
 use JsonApi\Schemas\Courseware\Unit as UnitSchema;
 use Psr\Http\Message\ResponseInterface as Response;
@@ -17,6 +18,7 @@ use Psr\Http\Message\ServerRequestInterface as Request;
 class UnitsUpdate extends JsonApiController
 {
     use EditBlockAwareTrait;
+    use TimestampTrait;
     use ValidationTrait;
 
     /**
diff --git a/lib/classes/JsonApi/Routes/Files/FileRefsContentShow.php b/lib/classes/JsonApi/Routes/Files/FileRefsContentShow.php
index b2b67ce024620ccf9afddef40c49527ebac9d667..e2d19c4a95b73382f699eb5c1524320c1cca475f 100644
--- a/lib/classes/JsonApi/Routes/Files/FileRefsContentShow.php
+++ b/lib/classes/JsonApi/Routes/Files/FileRefsContentShow.php
@@ -114,7 +114,7 @@ class FileRefsContentShow extends NonJsonApiController
 
         $fileRef->incrementDownloadCounter();
 
-        $stream = Psr7\stream_for(fopen($pathFile, 'rb'));
+        $stream = Psr7\Utils::streamFor(fopen($pathFile, 'rb'));
 
         return $response->withBody($stream);
     }
diff --git a/lib/classes/Virusscanner.php b/lib/classes/Virusscanner.php
index 628fdbac42d6414593df5512ad48a025cae5c485..077e3e26de5fc5297a6915fec0ff3242d36a2584 100644
--- a/lib/classes/Virusscanner.php
+++ b/lib/classes/Virusscanner.php
@@ -88,6 +88,13 @@ class Virusscanner
         return [];
     }
 
+    /**
+     * Finalized constructor so that the instantition in scan() will never fail.
+     */
+    protected final function __construct()
+    {
+    }
+
     /**
      * Establishes a connection to virus scanner via socket or TCP, depending on Stud.IP configuration.
      *
diff --git a/lib/cronjobs/remind_oer_upload.class.php b/lib/cronjobs/remind_oer_upload.class.php
index 9ac20e799d610717cbc4c2ab07a12d6194c26533..a1a8ee1984cbb7ec12817091d5030101217f9b16 100644
--- a/lib/cronjobs/remind_oer_upload.class.php
+++ b/lib/cronjobs/remind_oer_upload.class.php
@@ -39,10 +39,10 @@ class RemindOerUpload extends CronJob
                 $filetype = $file_ref->getFileType();
                 $file_to_suggest = $filetype->convertToStandardFile();
 
-                $this->author = $file_ref->owner->username;
-                $this->link_to_share = URLHelper::getURL('dispatch.php/file/share_oer/' . $result['file_ref_id']);
-                $this->linktext = _('Klicken Sie hier, um das Material im OER-Campus zu veröffentlichen.');
-                $this->formatted_link = '['. $this->linktext .']' . $this->link_to_share;
+                $author = $file_ref->owner->username;
+                $link_to_share = URLHelper::getURL('dispatch.php/file/share_oer/' . $result['file_ref_id']);
+                $linktext = _('Klicken Sie hier, um das Material im OER-Campus zu veröffentlichen.');
+                $formatted_link = '['. $linktext .']' . $link_to_share;
 
                 $oer_reminder_message = sprintf(_("Sie wollten daran erinnert werden, die folgende Datei im OER-Campus zu veröffentlichen:\n\n"
                     . "Dateiname: %s \n"
@@ -50,14 +50,14 @@ class RemindOerUpload extends CronJob
                     . "%s \n\n"),
                     $file_to_suggest->getFilename(),
                     $file_to_suggest->getDescription(),
-                    $this->formatted_link
+                    $formatted_link
                 );
 
                 $messaging = new messaging();
 
                 $messaging->insert_message(
                     $oer_reminder_message,
-                    $this->author,
+                    $author,
                     '____%system%____',
                     '',
                     Request::option('message_id'),
@@ -67,10 +67,7 @@ class RemindOerUpload extends CronJob
                 );
 
                 OERPostUpload::deleteBySQL("file_ref_id = ?", [$result['file_ref_id']]);
-
             }
-
         }
-
     }
 }
diff --git a/lib/cronjobs/send_mail_notifications.class.php b/lib/cronjobs/send_mail_notifications.class.php
index c336308194e8ebbfb5c7432a5593a9b8f82dfdc8..08882943b94634d363996075648e89a35ba2c834 100644
--- a/lib/cronjobs/send_mail_notifications.class.php
+++ b/lib/cronjobs/send_mail_notifications.class.php
@@ -114,7 +114,7 @@ class SendMailNotificationsJob extends CronJob
                     return;
                 }
 
-                $GLOBALS['user'] = new Seminar_user($user);
+                $GLOBALS['user'] = new Seminar_User($user);
 
                 $ok = false;
                 $mailmessage = $notification->getAllNotifications($user->id);
diff --git a/lib/models/QuestionnaireInfo.php b/lib/models/QuestionnaireInfo.php
index 75965866f7eb46271defa27e6637239a01e40aca..0b1493c5d6ba6bd16280b64c68ebd16158187186 100644
--- a/lib/models/QuestionnaireInfo.php
+++ b/lib/models/QuestionnaireInfo.php
@@ -1,6 +1,4 @@
 <?php
-require_once 'lib/classes/QuestionType.interface.php';
-
 class QuestionnaireInfo extends QuestionnaireQuestion implements QuestionType
 {
     public static function getIcon(bool $active = false) : Icon
@@ -45,7 +43,7 @@ class QuestionnaireInfo extends QuestionnaireQuestion implements QuestionType
 
     public function createAnswer()
     {
-
+        return new QuestionnaireAnswer(); // Unused but necessary
     }
 
     public function getUserIdsOfFilteredAnswer($answer_option)
diff --git a/lib/models/User.class.php b/lib/models/User.class.php
index 82709db4b4edd926ac33a87c740d029f4c18b007..0653f5ce7e9a14c5674244185be34c5aa807250a 100644
--- a/lib/models/User.class.php
+++ b/lib/models/User.class.php
@@ -237,7 +237,10 @@ class User extends AuthUserMd5 implements Range, PrivacyObject
      */
     public static function build($data, $is_new = true)
     {
-        $user = new static();
+        // Note: This should be used instead of `new static()` since PHPStan
+        $class = get_called_class();
+        $user = new $class();
+
         $user->info = new UserInfo();
         $user->setData($data);
         $user->setNew($is_new);