diff --git a/typo3/sysext/core/Documentation/Changelog/master/Feature-90333-Dashboard.rst b/typo3/sysext/core/Documentation/Changelog/master/Feature-90333-Dashboard.rst
index 41613a8aa325edb49171d807cdc57f7926af4ef1..63845db80b4cd22a888009fe3b4101a45b1e9997 100644
--- a/typo3/sysext/core/Documentation/Changelog/master/Feature-90333-Dashboard.rst
+++ b/typo3/sysext/core/Documentation/Changelog/master/Feature-90333-Dashboard.rst
@@ -45,14 +45,14 @@ Creating your own widget
 Besides the widgets shipped with TYPO3 core, you can also write your own widget. To
 do so, you can extend one of the WidgetAbstracts available in EXT:dashboard.
 
-* AbstractWidget: a basic abstract that can be used as the start of simple widgets
-* AbstractRssWidget: with this abstract it is easy to create a widget showing a RSS feed
-* AbstractListWidget: this abstract will give you an easy start to show a list of items
-* AbstractCtaButtonWidget: when you want to show a Call-To-Action button, this is the right abstract
-* AbstractChartWidget: the base of all chart widgets
-* AbstractBarChartWidget: when you want to show a widget with a bar-chart you can extend this class
-* AbstractDoughnutChartWidget: this abstract gives you the possibility to create a doughnut-chart widget
-* AbstractNumberWithIconWidget: this abstract will give you the possibility to show a title, number and an icon
+* `AbstractWidget`: a basic abstract that can be used as the start of simple widgets
+* `AbstractRssWidget`: with this abstract it is easy to create a widget showing a RSS feed
+* `AbstractListWidget`: this abstract will give you an easy start to show a list of items
+* `AbstractCtaButtonWidget`: when you want to show a Call-To-Action button, this is the right abstract
+* `AbstractChartWidget`: the base of all chart widgets
+* `AbstractBarChartWidget`: when you want to show a widget with a bar-chart you can extend this class
+* `AbstractDoughnutChartWidget`: this abstract gives you the possibility to create a doughnut-chart widget
+* `AbstractNumberWithIconWidget`: this abstract will give you the possibility to show a title, number and an icon
 
 By extending one of those abstracts, and provide it with the right data, you are able to
 have a new widget quite fast. The only thing that is left is to register the widget.
@@ -91,8 +91,10 @@ modal when adding a new widget to your dashboard. In this way you can group the
 widgets to get a clear overview for your users. By default the following widget groups are
 available:
 
-* widgetGroup-general: Widgets with a more generic purpose
-* widgetGroup-typo3: Widgets with information regarding the TYPO3 product or community
+* `widgetGroup-general`: Widgets with a more generic purpose
+* `widgetGroup-systemInfo`: Widgets which provide system related information
+* `widgetGroup-typo3`: Widgets with information regarding the TYPO3 product or community
+* `widgetGroup-documentation`: Widgets with links to TYPO3 documentation
 
 You can also configure your own widget groups. To do so, you create a file :file:`EXT:your_extension/Configuration/Backend/DashboardWidgetGroups.php`.
 In that file you specify the information of the groups.
diff --git a/typo3/sysext/dashboard/Classes/Controller/DashboardController.php b/typo3/sysext/dashboard/Classes/Controller/DashboardController.php
index 0ab83cad876b736569b628f67cba29c3a4486d51..8d8c4ee92b9c2a1c2719845ab42a3606dd9b485c 100644
--- a/typo3/sysext/dashboard/Classes/Controller/DashboardController.php
+++ b/typo3/sysext/dashboard/Classes/Controller/DashboardController.php
@@ -30,7 +30,6 @@ use TYPO3\CMS\Dashboard\Dashboard;
 use TYPO3\CMS\Dashboard\DashboardPreset;
 use TYPO3\CMS\Dashboard\DashboardPresetRegistry;
 use TYPO3\CMS\Dashboard\DashboardRepository;
-use TYPO3\CMS\Dashboard\Exception\NoDashboardAvailableException;
 use TYPO3\CMS\Dashboard\WidgetGroupRegistry;
 use TYPO3\CMS\Dashboard\WidgetRegistry;
 use TYPO3\CMS\Dashboard\Widgets\Interfaces\AdditionalCssInterface;
@@ -69,13 +68,19 @@ class DashboardController extends AbstractController
 
     protected $requireJsModules = [];
 
-    /** @var Dashboard */
+    /**
+     * @var Dashboard
+     */
     protected $currentDashboard;
 
-    /** @var Dashboard[] */
+    /**
+     * @var Dashboard[]
+     */
     protected $dashboardsForCurrentUser;
 
-    /** @var DashboardPreset[] */
+    /**
+     * @var DashboardPreset[]
+     */
     protected $availableDashboardPresets;
 
     /**
@@ -121,9 +126,6 @@ class DashboardController extends AbstractController
         $this->initializeDashboardsForCurrentUser();
     }
 
-    /**
-     * @throws NoDashboardAvailableException
-     */
     protected function initializeDashboardsForCurrentUser(): void
     {
         $this->dashboardsForCurrentUser = $this->getDashboardsForCurrentUser();
diff --git a/typo3/sysext/dashboard/Classes/DashboardRepository.php b/typo3/sysext/dashboard/Classes/DashboardRepository.php
index 72cf1d58417c8bac1dda2bf7788b78287bc435a9..2889802ea7e7da00d5c21bb5c5d129a50c9419c8 100644
--- a/typo3/sysext/dashboard/Classes/DashboardRepository.php
+++ b/typo3/sysext/dashboard/Classes/DashboardRepository.php
@@ -27,7 +27,7 @@ class DashboardRepository
     private const TABLE = 'be_dashboards';
 
     /**
-     * @var array
+     * @var string[]
      */
     protected $allowedFields = ['title'];
 
diff --git a/typo3/sysext/dashboard/Classes/Exception/NoDashboardAvailableException.php b/typo3/sysext/dashboard/Classes/Exception/NoDashboardAvailableException.php
deleted file mode 100644
index 267769c35ab8a654b491ef139eb228dc43088762..0000000000000000000000000000000000000000
--- a/typo3/sysext/dashboard/Classes/Exception/NoDashboardAvailableException.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-declare(strict_types = 1);
-
-namespace TYPO3\CMS\Dashboard\Exception;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-use TYPO3\CMS\Core\Exception;
-
-/**
- * Exception is thrown if no dashboard is available for the current user
- */
-class NoDashboardAvailableException extends Exception
-{
-}
diff --git a/typo3/sysext/dashboard/Classes/Widgets/AbstractBarChartWidget.php b/typo3/sysext/dashboard/Classes/Widgets/AbstractBarChartWidget.php
index aec23c9515c717ce90d099b468ac5c58ad233565..3c744cfead151dde462100f01b2f0e5214c4f811 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/AbstractBarChartWidget.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/AbstractBarChartWidget.php
@@ -18,15 +18,24 @@ namespace TYPO3\CMS\Dashboard\Widgets;
 /**
  * The AbstractBarChartWidget class is the basic widget class for bar charts.
  * It is possible to extend this class for custom widgets.
- * In your class you have to store the data to display in $this->chartData
+ * In your class you have to store the data to display in $this->chartData.
  * More information can be found in the documentation.
  */
 abstract class AbstractBarChartWidget extends AbstractChartWidget
 {
+    /**
+     * @inheritDoc
+     */
     protected $iconIdentifier = 'content-widget-chart-bar';
 
+    /**
+     * @inheritDoc
+     */
     protected $chartType = 'bar';
 
+    /**
+     * @inheritDoc
+     */
     protected $chartOptions = [
         'maintainAspectRatio' => false,
         'legend' => [
diff --git a/typo3/sysext/dashboard/Classes/Widgets/AbstractChartWidget.php b/typo3/sysext/dashboard/Classes/Widgets/AbstractChartWidget.php
index 84c7eceed45568d00a43f14fbd81fa31784774be..03aef89102e63a9ae019c6ad3a730bf8f8e09731 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/AbstractChartWidget.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/AbstractChartWidget.php
@@ -20,7 +20,7 @@ use TYPO3\CMS\Dashboard\Widgets\Interfaces\EventDataInterface;
 use TYPO3\CMS\Dashboard\Widgets\Interfaces\RequireJsModuleInterface;
 
 /**
- * The AbstractChartWidget class is the basic widget class for all chart widgets
+ * The AbstractChartWidget class is the basic widget class for all chart widgets.
  * It is possible to extend this class for custom widgets. EXT:dashboard also provides
  * more special chart types for widgets (bar chart and doughnut chart).
  */
@@ -41,7 +41,7 @@ abstract class AbstractChartWidget extends AbstractWidget implements AdditionalC
     protected $chartType = '';
 
     /**
-     * This array should contain the data for the graph. The data and options you have depend on the type
+     * This property should contain the data for the graph. The data and options you have depend on the type
      * of chart. More information can be found in the documentation of the specific type.
      *
      * @link https://www.chartjs.org/docs/latest/charts/bar.html#data-structure
@@ -65,7 +65,7 @@ abstract class AbstractChartWidget extends AbstractWidget implements AdditionalC
     /**
      * This property can be used to pass data to the JavaScript that will handle the content rendering. For
      * charts, the only property necessary for charts is the graphConfig element. This will be set in the
-     * getEventData method of this class. Setting this property manual is therefore not needed.
+     * getEventData method of this class. Setting this property manually is therefore not needed.
      *
      * @see getEventData
      *
@@ -76,13 +76,13 @@ abstract class AbstractChartWidget extends AbstractWidget implements AdditionalC
     /**
      * The default colors that will be used for the graphs.
      *
-     * @var array
+     * @var string[]
      */
     protected $chartColors = ['#ff8700', '#a4276a', '#1a568f', '#4c7e3a', '#69bbb5'];
 
     /**
-     * If you want to show a button below the graph, you need to set the title and the link to the button. This text
-     * can be a fixed string or can contain a translatable string.
+     * If you want to show a button below the graph, you need to set the title and the link to the button.
+     * This text can be a fixed string or can contain a translatable string.
      *
      * @var string
      */
@@ -105,7 +105,7 @@ abstract class AbstractChartWidget extends AbstractWidget implements AdditionalC
     protected $buttonTarget = '';
 
     /**
-     * This CSS-class is used so the JavaScript can identify the widgets containing graphs. Overriding this
+     * This CSS class is used so the JavaScript can identify the widgets containing graphs. Overriding this
      * property could lead to the widget not working.
      *
      * @internal
@@ -125,8 +125,8 @@ abstract class AbstractChartWidget extends AbstractWidget implements AdditionalC
     protected $templateName = 'ChartWidget';
 
     /**
-     * This method is used to define the data that will be shown in the graph. This method should be implemented and
-     * should set the data in the chartData property
+     * This method is used to define the data that will be shown in the graph. This method should be implemented
+     * and should set the data in the chartData property.
      *
      * @see chartData
      */
diff --git a/typo3/sysext/dashboard/Classes/Widgets/AbstractCtaButtonWidget.php b/typo3/sysext/dashboard/Classes/Widgets/AbstractCtaButtonWidget.php
index e622e3ba7746da8f677de0355a24b002e2681668..7e4a6d00b2e93bc237701787617bf3dfe8f9e439 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/AbstractCtaButtonWidget.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/AbstractCtaButtonWidget.php
@@ -22,11 +22,42 @@ namespace TYPO3\CMS\Dashboard\Widgets;
  */
 abstract class AbstractCtaButtonWidget extends AbstractWidget
 {
+    /**
+     * This link will be the main data in the widget
+     *
+     * @var string
+     */
     protected $link = '';
+
+    /**
+     * When filled, this is used as the button label
+     *
+     * @var string
+     */
     protected $label = '';
+
+    /**
+     * When filled, a text is shown above the link
+     *
+     * @var string
+     */
     protected $text = '';
+
+    /**
+     * This property contains the identifier of the icon that should be shown in the widget
+     *
+     * @var string
+     */
     protected $icon;
+
+    /**
+     * @inheritDoc
+     */
     protected $iconIdentifier = 'content-widget-calltoaction';
+
+    /**
+     * @inheritDoc
+     */
     protected $templateName = 'CtaWidget';
 
     public function __construct(string $identifier)
diff --git a/typo3/sysext/dashboard/Classes/Widgets/AbstractDoughnutChartWidget.php b/typo3/sysext/dashboard/Classes/Widgets/AbstractDoughnutChartWidget.php
index 0ce7a6db678671e68eef10d789ddde415c287823..824fdebcdc676a2deaa3863ea8793086d2b921f0 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/AbstractDoughnutChartWidget.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/AbstractDoughnutChartWidget.php
@@ -18,15 +18,24 @@ namespace TYPO3\CMS\Dashboard\Widgets;
 /**
  * The AbstractDoughnutChartWidget class is the basic widget class for doughnut charts.
  * It is possible to extend this class for custom widgets.
- * In your class you have to store the data to display in $this->chartData
+ * In your class you have to store the data to display in $this->chartData.
  * More information can be found in the documentation.
  */
 abstract class AbstractDoughnutChartWidget extends AbstractChartWidget
 {
+    /**
+     * @inheritDoc
+     */
     protected $iconIdentifier = 'content-widget-chart-pie';
 
+    /**
+     * @inheritDoc
+     */
     protected $chartType = 'doughnut';
 
+    /**
+     * @inheritDoc
+     */
     protected $chartOptions = [
         'maintainAspectRatio' => false,
         'legend' => [
@@ -36,7 +45,5 @@ abstract class AbstractDoughnutChartWidget extends AbstractChartWidget
         'cutoutPercentage' => 60
     ];
 
-    protected $width = 2;
-
     protected $height = 4;
 }
diff --git a/typo3/sysext/dashboard/Classes/Widgets/AbstractListWidget.php b/typo3/sysext/dashboard/Classes/Widgets/AbstractListWidget.php
index bbe9c66242f905434290908890704c7aba4f988d..6e68682d94c40e3551f7cf66554d15fd1342c537 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/AbstractListWidget.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/AbstractListWidget.php
@@ -22,22 +22,54 @@ namespace TYPO3\CMS\Dashboard\Widgets;
  */
 abstract class AbstractListWidget extends AbstractWidget
 {
+    /**
+     * This property should contain the items to be displayed
+     *
+     * @var array
+     */
     protected $items = [];
-    protected $iconIdentifier = 'dashboard-bars';
+
+    /**
+     * Limit the amount of items to be displayed
+     *
+     * @var int
+     */
     protected $limit = 5;
-    protected $totalItems = 0;
-    protected $templateName = 'ListWidget';
-    protected $height = 4;
-    protected $width = 2;
+
+    /**
+     * Link to e.g. an external resource with the full items list
+     *
+     * @var string
+     */
     protected $moreItemsLink = '';
+
+    /**
+     * This should be the text for the more items link
+     *
+     * @var string
+     */
     protected $moreItemsText = '';
 
+    /**
+     * @inheritDoc
+     */
+    protected $height = 4;
+
+    /**
+     * @inheritDoc
+     */
+    protected $iconIdentifier = 'content-widget-list';
+
+    /**
+     * @inheritDoc
+     */
+    protected $templateName = 'ListWidget';
+
     public function renderWidgetContent(): string
     {
         $this->view->assign('items', $this->items);
         $this->view->assign('moreItemsLink', $this->moreItemsLink);
         $this->view->assign('moreItemsText', $this->moreItemsText);
-        $this->view->assign('totalNumberOfItems', $this->totalItems);
         return $this->view->render();
     }
 }
diff --git a/typo3/sysext/dashboard/Classes/Widgets/AbstractNumberWithIconWidget.php b/typo3/sysext/dashboard/Classes/Widgets/AbstractNumberWithIconWidget.php
index 29855ce116e2888eb2f8b531bfcba0bdd1d48d06..486b06bd24a9495a7bb8048ed29d2001eefb7529 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/AbstractNumberWithIconWidget.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/AbstractNumberWithIconWidget.php
@@ -1,6 +1,5 @@
 <?php
 declare(strict_types = 1);
-
 namespace TYPO3\CMS\Dashboard\Widgets;
 
 /*
@@ -17,22 +16,12 @@ namespace TYPO3\CMS\Dashboard\Widgets;
  */
 
 /**
- * The AbstractTextWidget class is the basic widget class for simple text content.
+ * The AbstractNumberWithIconWidget class is the basic widget class to display a number next to an icon.
  * It is possible to extend this class for own widgets.
- * In your class you have to set $this->text with the text to display.
+ * Simply overwrite $this->subtitle, $this->number and $this->icon to make use of this widget type.
  */
 abstract class AbstractNumberWithIconWidget extends AbstractWidget
 {
-    /**
-     * @inheritDoc
-     */
-    protected $iconIdentifier = 'content-widget-number';
-
-    /**
-     * @inheritDoc
-     */
-    protected $templateName = 'NumberWithIconWidget';
-
     /**
      * When filled, a subtitle is shown below the title
      *
@@ -54,6 +43,16 @@ abstract class AbstractNumberWithIconWidget extends AbstractWidget
      */
     protected $icon;
 
+    /**
+     * @inheritDoc
+     */
+    protected $iconIdentifier = 'content-widget-number';
+
+    /**
+     * @inheritDoc
+     */
+    protected $templateName = 'NumberWithIconWidget';
+
     protected function initializeView(): void
     {
         parent::initializeView();
diff --git a/typo3/sysext/dashboard/Classes/Widgets/AbstractRssWidget.php b/typo3/sysext/dashboard/Classes/Widgets/AbstractRssWidget.php
index f0430c9e52d2974366b89ab1b938c2ddd15c1a08..e07c0420ef14d1514a902398a1cab72f6e7cde50 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/AbstractRssWidget.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/AbstractRssWidget.php
@@ -1,6 +1,5 @@
 <?php
 declare(strict_types = 1);
-
 namespace TYPO3\CMS\Dashboard\Widgets;
 
 /*
@@ -28,17 +27,40 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
  */
 abstract class AbstractRssWidget extends AbstractListWidget
 {
+    /**
+     * The rss file (resource) the data should be fetched from
+     *
+     * @var string
+     */
     protected $rssFile = '';
 
+    /**
+     * Lifetime of the items cache
+     *
+     * @var int
+     */
     protected $lifeTime = 900;
 
-    protected $iconIdentifier = 'dashboard-rss';
-
-    protected $templateName = 'RssWidget';
-
+    /**
+     * @inheritDoc
+     */
     protected $height = 6;
+
+    /**
+     * @inheritDoc
+     */
     protected $width = 4;
 
+    /**
+     * @inheritDoc
+     */
+    protected $iconIdentifier = 'content-widget-rss';
+
+    /**
+     * @inheritDoc
+     */
+    protected $templateName = 'RssWidget';
+
     /**
      * @var FrontendInterface
      */
@@ -52,11 +74,6 @@ abstract class AbstractRssWidget extends AbstractListWidget
         $this->loadRssFeed();
     }
 
-    public function setRssFile(string $rssFile): void
-    {
-        $this->rssFile = $rssFile;
-    }
-
     protected function loadRssFeed(): void
     {
         $cacheHash = md5($this->rssFile);
@@ -64,7 +81,6 @@ abstract class AbstractRssWidget extends AbstractListWidget
             return;
         }
 
-        /** @var \SimpleXMLElement $rssFeed */
         $rssContent = GeneralUtility::getUrl($this->rssFile);
         if ($rssContent === false) {
             throw new RuntimeException('RSS URL could not be fetched', 1573385431);
diff --git a/typo3/sysext/dashboard/Classes/Widgets/AbstractWidget.php b/typo3/sysext/dashboard/Classes/Widgets/AbstractWidget.php
index f19a2d88971ccca23ef9ce01d92a54ba4165ddfe..c55f7f7c04d765f881e4f483f3b112023bad422d 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/AbstractWidget.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/AbstractWidget.php
@@ -25,54 +25,78 @@ use TYPO3Fluid\Fluid\View\ViewInterface;
  * The AbstractWidget class is the basic widget class for all widgets.
  * It is possible to extend this class for custom widgets, but EXT:dashboard provides
  * some more specific types of widgets to extend from. For more details, please check:
+ *
+ * @see AbstractBarChartWidget
+ * @see AbstractChartWidget
  * @see AbstractCtaButtonWidget
+ * @see AbstractDoughnutChartWidget
  * @see AbstractListWidget
+ * @see AbstractNumberWithIconWidget
  * @see AbstractRssWidget
  */
 abstract class AbstractWidget implements WidgetInterface
 {
     /**
+     * The unique identifier of the widget
+     *
      * @var string
      */
     protected $identifier;
 
     /**
+     * The title is used for the widget selector
+     *
      * @var string
      */
     protected $title;
 
     /**
+     * The description is used for the widget selector
+     *
      * @var string
      */
     protected $description = '';
 
     /**
+     * The height of the widget in rows (1-6)
+     *
      * @var int
      */
     protected $height = 2;
 
     /**
+     * The width of the widget in rows (1-4)
+     *
      * @var int
      */
     protected $width = 2;
 
     /**
+     * The icon identifier is used for the widget selector
+     *
      * @var string
      */
     protected $iconIdentifier = '';
 
     /**
+     * The template name of the widget
+     *
      * @var string
      */
     protected $templateName = 'Widget';
 
+    /**
+     * Additional CSS classes which should be added to the rendered widget
+     *
+     * @var string
+     */
+    protected $additionalClasses = '';
+
     /**
      * @var ViewInterface
      */
     protected $view;
 
-    protected $additionalClasses = '';
-
     public function __construct(string $identifier)
     {
         $this->identifier = $identifier;
diff --git a/typo3/sysext/dashboard/Classes/Widgets/FailedLoginsWidget.php b/typo3/sysext/dashboard/Classes/Widgets/FailedLoginsWidget.php
index f957aa5106cf2852e9c2893a7cecd3a88528f5ff..115cd49871d325f79df4bcc56ca9e1d181e78978 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/FailedLoginsWidget.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/FailedLoginsWidget.php
@@ -1,6 +1,5 @@
 <?php
 declare(strict_types = 1);
-
 namespace TYPO3\CMS\Dashboard\Widgets;
 
 /*
@@ -23,6 +22,9 @@ use TYPO3\CMS\Core\SysLog\Error as SystemLogErrorClassification;
 use TYPO3\CMS\Core\SysLog\Type as SystemLogType;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 
+/**
+ * This widget will show the number of failed logins during a given period
+ */
 class FailedLoginsWidget extends AbstractNumberWithIconWidget
 {
     protected $title = 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.failedLogins.title';
@@ -36,39 +38,32 @@ class FailedLoginsWidget extends AbstractNumberWithIconWidget
         parent::initializeView();
     }
 
-    /**
-     * Get number of failed logins during a period
-     *
-     * @param int $secondsBack
-     *
-     * @return int
-     */
     public function getNumberOfFailedLogins(int $secondsBack = 86400): int
     {
         $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
         $queryBuilder = $connectionPool->getQueryBuilderForTable('sys_log');
 
         return (int)$queryBuilder->count('uid')
-                ->from('sys_log')
-                ->where(
-                    $queryBuilder->expr()->eq(
-                        'type',
-                        $queryBuilder->createNamedParameter(SystemLogType::LOGIN, Connection::PARAM_INT)
-                    ),
-                    $queryBuilder->expr()->eq(
-                        'action',
-                        $queryBuilder->createNamedParameter(SystemLogLoginAction::ATTEMPT, Connection::PARAM_INT)
-                    ),
-                    $queryBuilder->expr()->neq(
-                        'error',
-                        $queryBuilder->createNamedParameter(SystemLogErrorClassification::MESSAGE, Connection::PARAM_INT)
-                    ),
-                    $queryBuilder->expr()->gt(
-                        'tstamp',
-                        $queryBuilder->createNamedParameter($GLOBALS['EXEC_TIME'] - $secondsBack, Connection::PARAM_INT)
-                    )
+            ->from('sys_log')
+            ->where(
+                $queryBuilder->expr()->eq(
+                    'type',
+                    $queryBuilder->createNamedParameter(SystemLogType::LOGIN, Connection::PARAM_INT)
+                ),
+                $queryBuilder->expr()->eq(
+                    'action',
+                    $queryBuilder->createNamedParameter(SystemLogLoginAction::ATTEMPT, Connection::PARAM_INT)
+                ),
+                $queryBuilder->expr()->neq(
+                    'error',
+                    $queryBuilder->createNamedParameter(SystemLogErrorClassification::MESSAGE, Connection::PARAM_INT)
+                ),
+                $queryBuilder->expr()->gt(
+                    'tstamp',
+                    $queryBuilder->createNamedParameter($GLOBALS['EXEC_TIME'] - $secondsBack, Connection::PARAM_INT)
                 )
-                ->execute()
-                ->fetchColumn();
+            )
+            ->execute()
+            ->fetchColumn();
     }
 }
diff --git a/typo3/sysext/dashboard/Classes/Widgets/Interfaces/AdditionalCssInterface.php b/typo3/sysext/dashboard/Classes/Widgets/Interfaces/AdditionalCssInterface.php
index 2ba1fdc3376d671f5520787cbab33b1be0813e5c..83d152c7bd606381a63419d48333c7df833ddc98 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/Interfaces/AdditionalCssInterface.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/Interfaces/AdditionalCssInterface.php
@@ -1,6 +1,5 @@
 <?php
 declare(strict_types = 1);
-
 namespace TYPO3\CMS\Dashboard\Widgets\Interfaces;
 
 /**
diff --git a/typo3/sysext/dashboard/Classes/Widgets/Interfaces/AdditionalJavaScriptInterface.php b/typo3/sysext/dashboard/Classes/Widgets/Interfaces/AdditionalJavaScriptInterface.php
index 194b6ee801953d658365a08fcc5fe6e19286c7fd..6691a2bf56d4d2be01864f98922894fc42bcce4a 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/Interfaces/AdditionalJavaScriptInterface.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/Interfaces/AdditionalJavaScriptInterface.php
@@ -1,6 +1,5 @@
 <?php
 declare(strict_types = 1);
-
 namespace TYPO3\CMS\Dashboard\Widgets\Interfaces;
 
 /**
diff --git a/typo3/sysext/dashboard/Classes/Widgets/Interfaces/EventDataInterface.php b/typo3/sysext/dashboard/Classes/Widgets/Interfaces/EventDataInterface.php
index 93734fd7f4d1b2636ca6a4719bac0c7b0e124a16..fae69e9c6d567955b3041639ef399d9f7f3b4694 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/Interfaces/EventDataInterface.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/Interfaces/EventDataInterface.php
@@ -1,6 +1,5 @@
 <?php
 declare(strict_types = 1);
-
 namespace TYPO3\CMS\Dashboard\Widgets\Interfaces;
 
 /**
@@ -10,7 +9,7 @@ namespace TYPO3\CMS\Dashboard\Widgets\Interfaces;
 interface EventDataInterface
 {
     /**
-     * This method returns data which should be send to widget as JSON encoded value.
+     * This method returns data which should be send to the widget as JSON encoded value.
      * @return array
      */
     public function getEventData(): array;
diff --git a/typo3/sysext/dashboard/Classes/Widgets/Interfaces/RequireJsModuleInterface.php b/typo3/sysext/dashboard/Classes/Widgets/Interfaces/RequireJsModuleInterface.php
index 4013ad487b64ad086dfc8174851ebcb02c759971..7add78da29a705c97a6c3030b14bbfc24cf26727 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/Interfaces/RequireJsModuleInterface.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/Interfaces/RequireJsModuleInterface.php
@@ -1,6 +1,5 @@
 <?php
 declare(strict_types = 1);
-
 namespace TYPO3\CMS\Dashboard\Widgets\Interfaces;
 
 /**
diff --git a/typo3/sysext/dashboard/Classes/Widgets/Interfaces/WidgetInterface.php b/typo3/sysext/dashboard/Classes/Widgets/Interfaces/WidgetInterface.php
index 7c4baa7e9dd9c722198fab7aa2183ceb8710c64d..b122bb81d20794ab4e59c3027c85c8a40a75b354 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/Interfaces/WidgetInterface.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/Interfaces/WidgetInterface.php
@@ -1,42 +1,47 @@
 <?php
 declare(strict_types = 1);
-
 namespace TYPO3\CMS\Dashboard\Widgets\Interfaces;
 
 /**
  * The WidgetInterface is the base interface for all kind of widgets.
+ * All widgets must implement this interface.
  * It contains the methods which are required for all widgets.
  */
 interface WidgetInterface
 {
+    /**
+     * Returns the unique identifer of a widget
+     *
+     * @return string
+     */
     public function getIdentifier(): string;
 
     /**
-     * Return the title of a widget, this is used for the widget selector
+     * Returns the title of a widget, this is used for the widget selector
      * @return string
      */
     public function getTitle(): string;
 
     /**
-     * Return the description of a widget, this is used for the widget selector
+     * Returns the description of a widget, this is used for the widget selector
      * @return string
      */
     public function getDescription(): string;
 
     /**
-     * Return the icon identifier of a widget, this is used for the widget selector
+     * Returns the icon identifier of a widget, this is used for the widget selector
      * @return string
      */
     public function getIconIdentifier(): string;
 
     /**
-     * Returns the height of the widget in rows (1-4)
+     * Returns the height of a widget in rows (1-6)
      * @return int
      */
     public function getHeight(): int;
 
     /**
-     * Returns the width of the widget in columns (1-4)
+     * Returns the width of a widget in columns (1-4)
      * @return int
      */
     public function getWidth(): int;
diff --git a/typo3/sysext/dashboard/Classes/Widgets/SysLogErrorsWidget.php b/typo3/sysext/dashboard/Classes/Widgets/SysLogErrorsWidget.php
index bca0ac207a52b6ee8b993e2551283b1613b06526..c1069043ad8a8ba7342e76d84bc05c4b00e588f3 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/SysLogErrorsWidget.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/SysLogErrorsWidget.php
@@ -16,24 +16,23 @@ namespace TYPO3\CMS\Dashboard\Widgets;
  */
 
 use TYPO3\CMS\Backend\Routing\UriBuilder;
+use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\SysLog\Type as SystemLogType;
 use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 
+/**
+ * This widget will show the number of system log errors in a bar chart
+ */
 class SysLogErrorsWidget extends AbstractBarChartWidget
 {
     protected $title = 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.sysLogErrors.title';
-
     protected $description = 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.sysLogErrors.description';
-
     protected $buttonText = 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.sysLogErrors.buttonText';
-
     protected $width = 4;
-
     protected $height = 4;
-
     protected $data = [];
-
     protected $labels = [];
 
     protected function initializeView(): void
@@ -75,9 +74,18 @@ class SysLogErrorsWidget extends AbstractBarChartWidget
             ->count('*')
             ->from('sys_log')
             ->where(
-                $queryBuilder->expr()->eq('type', 5),
-                $queryBuilder->expr()->gte('tstamp', $start),
-                $queryBuilder->expr()->lte('tstamp', $end)
+                $queryBuilder->expr()->eq(
+                    'type',
+                    $queryBuilder->createNamedParameter(SystemLogType::ERROR, Connection::PARAM_INT)
+                ),
+                $queryBuilder->expr()->gte(
+                    'tstamp',
+                    $queryBuilder->createNamedParameter($start, Connection::PARAM_INT)
+                ),
+                $queryBuilder->expr()->lte(
+                    'tstamp',
+                    $queryBuilder->createNamedParameter($end, Connection::PARAM_INT)
+                )
             )
             ->execute()
             ->fetchColumn();
diff --git a/typo3/sysext/dashboard/Classes/Widgets/T3NewsWidget.php b/typo3/sysext/dashboard/Classes/Widgets/T3NewsWidget.php
index 20fc71dc4a1abcb2d8581170b6c281fc33871f9e..1f15ecd5bea8f92b6994ce446b17f47fd2bd27a4 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/T3NewsWidget.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/T3NewsWidget.php
@@ -25,7 +25,6 @@ class T3NewsWidget extends AbstractRssWidget
     protected $lifeTime = 43200; // 12 hours cache
     protected $title = 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.t3news.title';
     protected $description = 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.t3news.description';
-    protected $iconIdentifier = 'content-widget-rss';
     protected $moreItemsLink = 'https://typo3.org/project/news';
     protected $moreItemsText = 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.t3news.moreItems';
 }
diff --git a/typo3/sysext/dashboard/Classes/Widgets/T3SecurityAdvisoriesWidget.php b/typo3/sysext/dashboard/Classes/Widgets/T3SecurityAdvisoriesWidget.php
index 3d8b17dbdeaba4c171d9a8affc48a9ec0200e21a..a3ea8e9d149c658ccd79c21a0f9b14cf0a8cef1d 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/T3SecurityAdvisoriesWidget.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/T3SecurityAdvisoriesWidget.php
@@ -25,7 +25,6 @@ class T3SecurityAdvisoriesWidget extends AbstractRssWidget
     protected $lifeTime = 43200; // 12 hours cache
     protected $title = 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.t3securityAdvisories.title';
     protected $description = 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.t3securityAdvisories.description';
-    protected $iconIdentifier = 'content-widget-rss';
     protected $moreItemsLink = 'https://typo3.org/help/security-advisories';
     protected $moreItemsText = 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.t3securityAdvisories.moreItems';
 }
diff --git a/typo3/sysext/dashboard/Classes/Widgets/TypeOfUsersWidget.php b/typo3/sysext/dashboard/Classes/Widgets/TypeOfUsersWidget.php
index ca39a1b0aa77623b0b4339be45fbaeab69ae9d89..42bfd0bc2bafc55612832a185fac3c1d13019036 100644
--- a/typo3/sysext/dashboard/Classes/Widgets/TypeOfUsersWidget.php
+++ b/typo3/sysext/dashboard/Classes/Widgets/TypeOfUsersWidget.php
@@ -15,13 +15,16 @@ namespace TYPO3\CMS\Dashboard\Widgets;
  * The TYPO3 project - inspiring people to share!
  */
 
+use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Database\ConnectionPool;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 
+/**
+ * This widget will show the type of users (admin / non-admin) in a doughnut chart
+ */
 class TypeOfUsersWidget extends AbstractDoughnutChartWidget
 {
     protected $title = 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.typeOfUsers.title';
-
     protected $description = 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.typeOfUsers.description';
 
     /**
@@ -53,7 +56,10 @@ class TypeOfUsersWidget extends AbstractDoughnutChartWidget
             ->count('*')
             ->from('be_users')
             ->where(
-                $queryBuilder->expr()->eq('admin', $admin ? 1 : 0)
+                $queryBuilder->expr()->eq(
+                    'admin',
+                    $queryBuilder->createNamedParameter($admin ? 1 : 0, Connection::PARAM_INT)
+                )
             )
             ->execute()
             ->fetchColumn();
diff --git a/typo3/sysext/dashboard/Configuration/TCA/Overrides/be_groups.php b/typo3/sysext/dashboard/Configuration/TCA/Overrides/be_groups.php
index 6bb327f6dcf6a0c45c99be3a4b08ea65749c9866..6b1472aae8e5a7b56363c33f31380ce1dce9b5db 100644
--- a/typo3/sysext/dashboard/Configuration/TCA/Overrides/be_groups.php
+++ b/typo3/sysext/dashboard/Configuration/TCA/Overrides/be_groups.php
@@ -1,7 +1,7 @@
 <?php
 defined('TYPO3_MODE') or die();
 
-call_user_func(function () {
+call_user_func(static function () {
     $additionalColumns = [
         'availableWidgets' => [
             'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:availableWidgets',
diff --git a/typo3/sysext/dashboard/ext_localconf.php b/typo3/sysext/dashboard/ext_localconf.php
index 9c39f02cc47cca50f1d27d35ea392aaa8f86a48a..eddc0dd8ffabf1d50d9188eac936dd5087afc9c1 100644
--- a/typo3/sysext/dashboard/ext_localconf.php
+++ b/typo3/sysext/dashboard/ext_localconf.php
@@ -4,7 +4,7 @@ if (!defined('TYPO3_MODE')) {
     die('Access denied.');
 }
 
-call_user_func(function () {
+call_user_func(static function () {
     if (TYPO3_MODE === 'BE') {
         if (!is_array($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['dashboard_rss'])) {
             $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['dashboard_rss'] = [