diff --git a/build/psalm-baseline.xml b/build/psalm-baseline.xml
index f9b8daea202abf8d33d130924a7f672df8e330da..0d07bcf37f4d06fa5dbc795512c8f7bd44c9ea6d 100644
--- a/build/psalm-baseline.xml
+++ b/build/psalm-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<files psalm-version="3.17.2@9e526d9cb569fe4631e6a737bbb7948d05596e3f">
+<files psalm-version="4.0.1@b1e2e30026936ef8d5bf6a354d1c3959b6231f44">
   <file src="3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Connection.php">
     <ImplementedReturnTypeMismatch occurrences="1">
       <code>string|null</code>
@@ -132,6 +132,9 @@
     <InvalidOperand occurrences="1">
       <code>$argv[5]</code>
     </InvalidOperand>
+    <InvalidScalarArgument occurrences="1">
+      <code>$chunkSize</code>
+    </InvalidScalarArgument>
     <MissingFile occurrences="1">
       <code>require '../../../../3rdparty/autoload.php'</code>
     </MissingFile>
@@ -905,6 +908,9 @@
     <InvalidReturnType occurrences="1">
       <code>?string</code>
     </InvalidReturnType>
+    <UndefinedDocblockClass occurrences="1">
+      <code>$operator-&gt;arguments[0]-&gt;name</code>
+    </UndefinedDocblockClass>
     <UndefinedPropertyFetch occurrences="1">
       <code>$operator-&gt;arguments[0]-&gt;name</code>
     </UndefinedPropertyFetch>
@@ -1142,11 +1148,10 @@
       <code>$id</code>
       <code>$remoteId</code>
     </InvalidScalarArgument>
-    <TypeDoesNotContainNull occurrences="2">
+    <TypeDoesNotContainNull occurrences="3">
       <code>$permission === null</code>
       <code>$remoteId === null</code>
     </TypeDoesNotContainNull>
-    <TypeDoesNotContainType occurrences="1"/>
   </file>
   <file src="apps/federatedfilesharing/lib/FederatedShareProvider.php">
     <InvalidArrayAccess occurrences="2">
@@ -2019,12 +2024,10 @@
     <InvalidScalarArgument occurrences="1">
       <code>$quota</code>
     </InvalidScalarArgument>
-    <TypeDoesNotContainNull occurrences="1">
+    <TypeDoesNotContainNull occurrences="2">
       <code>$groupid === null</code>
-    </TypeDoesNotContainNull>
-    <TypeDoesNotContainType occurrences="1">
       <code>$groupid === null</code>
-    </TypeDoesNotContainType>
+    </TypeDoesNotContainNull>
     <UndefinedInterfaceMethod occurrences="1">
       <code>getSubAdmin</code>
     </UndefinedInterfaceMethod>
@@ -2540,9 +2543,9 @@
     </NullableReturnStatement>
   </file>
   <file src="apps/user_ldap/lib/User_Proxy.php">
-    <FalseOperand occurrences="1">
+    <InvalidReturnStatement occurrences="1">
       <code>$users</code>
-    </FalseOperand>
+    </InvalidReturnStatement>
   </file>
   <file src="apps/user_ldap/lib/Wizard.php">
     <FalsableReturnStatement occurrences="2">
@@ -2933,6 +2936,7 @@
   <file src="core/routes.php">
     <InvalidScope occurrences="2">
       <code>$this</code>
+      <code>$this</code>
     </InvalidScope>
   </file>
   <file src="core/templates/layout.public.php">
@@ -2940,6 +2944,11 @@
       <code>getIcon</code>
     </UndefinedInterfaceMethod>
   </file>
+  <file src="lib/autoloader.php">
+    <RedundantCondition occurrences="1">
+      <code>$this-&gt;memoryCache</code>
+    </RedundantCondition>
+  </file>
   <file src="lib/base.php">
     <InternalMethod occurrences="2">
       <code>getAppsNeedingUpgrade</code>
@@ -3151,8 +3160,7 @@
     <InvalidScalarArgument occurrences="1">
       <code>$exception-&gt;getCode()</code>
     </InvalidScalarArgument>
-    <NoInterfaceProperties occurrences="3">
-      <code>$this-&gt;request-&gt;server</code>
+    <NoInterfaceProperties occurrences="2">
       <code>$this-&gt;request-&gt;server</code>
       <code>$this-&gt;request-&gt;server</code>
     </NoInterfaceProperties>
@@ -3334,12 +3342,21 @@
     <ImplementedReturnTypeMismatch occurrences="1">
       <code>Color</code>
     </ImplementedReturnTypeMismatch>
+    <ImplicitToStringCast occurrences="1">
+      <code>$avatar</code>
+    </ImplicitToStringCast>
+    <InvalidNullableReturnType occurrences="1">
+      <code>string|boolean</code>
+    </InvalidNullableReturnType>
     <InvalidReturnStatement occurrences="1">
       <code>$finalPalette[$this-&gt;hashToInt($hash, $steps * 3)]</code>
     </InvalidReturnStatement>
     <InvalidReturnType occurrences="1">
       <code>Color</code>
     </InvalidReturnType>
+    <NullableReturnStatement occurrences="1">
+      <code>$image-&gt;data()</code>
+    </NullableReturnStatement>
   </file>
   <file src="lib/private/Avatar/GuestAvatar.php">
     <ImplementedReturnTypeMismatch occurrences="1">
@@ -3432,6 +3449,10 @@
     <TypeDoesNotContainType occurrences="1">
       <code>$needsUpdate</code>
     </TypeDoesNotContainType>
+    <UndefinedVariable occurrences="2">
+      <code>$CONFIG</code>
+      <code>$CONFIG</code>
+    </UndefinedVariable>
   </file>
   <file src="lib/private/Console/Application.php">
     <InvalidArgument occurrences="1">
@@ -4597,20 +4618,32 @@
     </InvalidPropertyAssignmentValue>
   </file>
   <file src="lib/private/Group/Group.php">
-    <InvalidArgument occurrences="6">
+    <InvalidArgument occurrences="7">
       <code>IGroup::class . '::postAddUser'</code>
       <code>IGroup::class . '::postDelete'</code>
       <code>IGroup::class . '::postRemoveUser'</code>
       <code>IGroup::class . '::preAddUser'</code>
       <code>IGroup::class . '::preDelete'</code>
       <code>IGroup::class . '::preRemoveUser'</code>
+      <code>bool</code>
     </InvalidArgument>
     <InvalidOperand occurrences="1">
       <code>$hide</code>
     </InvalidOperand>
+    <InvalidReturnStatement occurrences="1">
+      <code>$users</code>
+    </InvalidReturnStatement>
+    <InvalidReturnType occurrences="1">
+      <code>int|bool</code>
+    </InvalidReturnType>
     <MoreSpecificImplementedParamType occurrences="1">
       <code>$user</code>
     </MoreSpecificImplementedParamType>
+    <RedundantCondition occurrences="3">
+      <code>$this-&gt;emitter</code>
+      <code>$this-&gt;emitter</code>
+      <code>$this-&gt;emitter</code>
+    </RedundantCondition>
     <TooManyArguments occurrences="6">
       <code>dispatch</code>
       <code>dispatch</code>
@@ -4756,6 +4789,11 @@
       <code>$request</code>
     </RedundantCondition>
   </file>
+  <file src="lib/private/Log/File.php">
+    <TypeDoesNotContainNull occurrences="1">
+      <code>$limit === null</code>
+    </TypeDoesNotContainNull>
+  </file>
   <file src="lib/private/Log/LogDetails.php">
     <RedundantCondition occurrences="1">
       <code>is_string($request-&gt;getMethod())</code>
@@ -5313,9 +5351,6 @@
       <code>$this-&gt;appendIfExist($this-&gt;serverroot, 'apps/'.$script.'.js')</code>
       <code>$this-&gt;appendIfExist($this-&gt;serverroot, 'core/'.$script.'.js')</code>
     </InvalidOperand>
-    <TypeDoesNotContainType occurrences="1">
-      <code>$found</code>
-    </TypeDoesNotContainType>
   </file>
   <file src="lib/private/Template/SCSSCacher.php">
     <InvalidScalarArgument occurrences="1">
@@ -5508,12 +5543,10 @@
     <TooManyArguments occurrences="1">
       <code>dispatch</code>
     </TooManyArguments>
-    <TypeDoesNotContainNull occurrences="1">
+    <TypeDoesNotContainNull occurrences="2">
       <code>$appId === null</code>
-    </TypeDoesNotContainNull>
-    <TypeDoesNotContainType occurrences="1">
       <code>$appId === null</code>
-    </TypeDoesNotContainType>
+    </TypeDoesNotContainNull>
   </file>
   <file src="lib/private/legacy/OC_DB.php">
     <InvalidReturnStatement occurrences="1">
diff --git a/composer.json b/composer.json
index 8a2f4e2558a801c9d5bf68346e40fea2d79d20ac..36faa4eaf21d8ac6f646225b88fda8c357897107 100644
--- a/composer.json
+++ b/composer.json
@@ -17,7 +17,7 @@
     },
     "require-dev": {
         "nextcloud/coding-standard": "^0.3.0",
-        "vimeo/psalm": "^3.17"
+        "vimeo/psalm": "^4.0"
     },
     "scripts": {
         "cs:fix": "php-cs-fixer fix",
diff --git a/composer.lock b/composer.lock
index 96591226fdd678bdc2b271cf014ac3fca827e63c..0a8aa999f09d95449b5175aa2f60fe6748309d70 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "4526d0f09bab5c2ef66902593cbc4456",
+    "content-hash": "e13ded744e614c48738e6ecc965d868e",
     "packages": [],
     "packages-dev": [
         {
@@ -2765,16 +2765,16 @@
         },
         {
             "name": "vimeo/psalm",
-            "version": "3.17.2",
+            "version": "4.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/vimeo/psalm.git",
-                "reference": "9e526d9cb569fe4631e6a737bbb7948d05596e3f"
+                "reference": "b1e2e30026936ef8d5bf6a354d1c3959b6231f44"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/vimeo/psalm/zipball/9e526d9cb569fe4631e6a737bbb7948d05596e3f",
-                "reference": "9e526d9cb569fe4631e6a737bbb7948d05596e3f",
+                "url": "https://api.github.com/repos/vimeo/psalm/zipball/b1e2e30026936ef8d5bf6a354d1c3959b6231f44",
+                "reference": "b1e2e30026936ef8d5bf6a354d1c3959b6231f44",
                 "shasum": ""
             },
             "require": {
@@ -2793,9 +2793,9 @@
                 "felixfbecker/advanced-json-rpc": "^3.0.3",
                 "felixfbecker/language-server-protocol": "^1.4",
                 "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0",
-                "nikic/php-parser": "4.3.* || 4.4.* || 4.5.* || 4.6.* || ^4.8",
+                "nikic/php-parser": "^4.10.1",
                 "openlss/lib-array2xml": "^1.0",
-                "php": "^7.1.3|^8",
+                "php": "^7.3|^8",
                 "sebastian/diff": "^3.0 || ^4.0",
                 "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0",
                 "webmozart/glob": "^4.1",
@@ -2809,11 +2809,11 @@
                 "bamarni/composer-bin-plugin": "^1.2",
                 "brianium/paratest": "^4.0.0",
                 "ext-curl": "*",
-                "phpdocumentor/reflection-docblock": "^4.3.4 || ^5",
+                "phpdocumentor/reflection-docblock": "^5",
                 "phpmyadmin/sql-parser": "5.1.0",
                 "phpspec/prophecy": ">=1.9.0",
-                "phpunit/phpunit": "^7.5.16 || ^8.5 || ^9.0",
-                "psalm/plugin-phpunit": "^0.11",
+                "phpunit/phpunit": "^9.0",
+                "psalm/plugin-phpunit": "^0.13",
                 "slevomat/coding-standard": "^5.0",
                 "squizlabs/php_codesniffer": "^3.5",
                 "symfony/process": "^4.3",
@@ -2832,7 +2832,8 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.x-dev",
+                    "dev-master": "4.x-dev",
+                    "dev-3.x": "3.x-dev",
                     "dev-2.x": "2.x-dev",
                     "dev-1.x": "1.x-dev"
                 }
@@ -2861,7 +2862,7 @@
                 "inspection",
                 "php"
             ],
-            "time": "2020-10-15T00:23:17+00:00"
+            "time": "2020-10-20T13:40:17+00:00"
         },
         {
             "name": "webmozart/assert",