diff --git a/docker/containers/web-server/Dockerfile b/docker/containers/web-server/Dockerfile
index 7c3184da3063e539c7e3713c95a4375cbad26519..7610b02d5fc7545debfc2f6893c6cfe378eedcdc 100644
--- a/docker/containers/web-server/Dockerfile
+++ b/docker/containers/web-server/Dockerfile
@@ -1,7 +1,7 @@
 #
 # GENERATED BY init.sh - template: ./templates/web-server-Dockerfile - 42dce773c83597a7d05af398bdd66d15
 #
-FROM php:8.2-apache
+FROM php:8.3-apache
 
 # install packages
 RUN apt-get update && apt-get install -y git unzip zip
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
index e83b069998ede1184fe98d776e71653c847056ff..84b9ccf917b4e1c392f1842acb5bf48303dc8e86 100644
--- a/docker/docker-compose.yml
+++ b/docker/docker-compose.yml
@@ -19,7 +19,7 @@ services:
     build:
       context: .
       dockerfile: ./containers/web-server/Dockerfile
-    image: "php:8.2-apache"
+    image: "php:8.3-apache"
     container_name: 'adminlte-renderer-server'
     ports:
       - '${APP_PORT}:80'
diff --git a/docker/init.sh.cfg b/docker/init.sh.cfg
index 294cad2e9c5030e09827756ddef54df5b4aaac8f..cb5f510b17a1066017c6cc3387a463023089a124 100644
--- a/docker/init.sh.cfg
+++ b/docker/init.sh.cfg
@@ -17,7 +17,7 @@ APP_APT_PACKAGES="git unzip zip"
 #APP_APACHE_MODULES="rewrite"
 APP_APACHE_MODULES="rewrite"
 
-APP_PHP_VERSION=8.2
+APP_PHP_VERSION=8.3
 # APP_PHP_MODULES="curl pdo_mysql mbstring xml zip xdebug"
 APP_PHP_MODULES=""
 
diff --git a/docs/10_Description.md b/docs/10_Description.md
index 5d1183f8c8c703a79db7303e4d5b85354666600e..5c89e4a57febe8b5b797ff6e904eef8910884c71 100644
--- a/docs/10_Description.md
+++ b/docs/10_Description.md
@@ -18,7 +18,7 @@ The AdminLTE renderer is a PHP class offers several methods to render
   * buttons
   * ...
 
-The class is compatible to PHP 7+8 ... up to PHP 8.2.
+The class is compatible to PHP 7+8 ... up to PHP 8.3.
 
 ## Screenshots
 
diff --git a/public_html/classes/render-adminlte.class.php b/public_html/classes/render-adminlte.class.php
index 7ee43120fa838536474c539be315d03f14a2e67b..72f2e76b16ee60ab361530ccb858634633151439 100755
--- a/public_html/classes/render-adminlte.class.php
+++ b/public_html/classes/render-adminlte.class.php
@@ -158,26 +158,6 @@ class renderadminlte {
     // 
     // ----------------------------------------------------------------------
     
-    /**
-     * verify if an item has a correct value
-     * it returns false if a key is not defined to be checked
-     * it returns true if it was validated successfully
-     * it dies with an errror, if a value check failed
-     * 
-     * @param string  $sType      type; key in $_aValidItems; one of bgcolor|color|type|size
-     * @param string  $sValue     value to check
-     * @param string  $sReferrer  optional: method that called this function
-     */
-    protected function _DELETE_ME___checkValue($sType, $sValue, $sReferrer=false){
-        if (!$sValue || !array_key_exists($sType, $this->_aValidItems)){
-            return false;
-        }
-        if(array_search($sValue, $this->_aValidItems[$sType])===false){
-            echo "ERROR: ".($sReferrer ? $sReferrer.' - ' : '')."value [$sValue] is not a valid for type [$sType]; it must be one of ".implode("|", $this->_aValidItems[$sType]).'<br>';
-        }
-        return true;
-    }
-
     /**
      * used in cosntructor
      * initialize all element definitions
@@ -580,13 +560,16 @@ class renderadminlte {
             $iCounter=0;
         }
         
-        // special menu entry: horizontal bar (label is "-")
-        if($aLink['label']=='-'){
-            return '<div class="dropdown-divider"></div>';
-        }
-        // special menu entry: hamburger menu item (label is "=")
-        if($aLink['label']=='='){
-            return '<li class="nav-item"><a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a></li>';
+        switch ($aLink['label']) {
+            // special menu entry: horizontal bar (label is "-")
+            case '-': return '<div class="dropdown-divider"></div>'; break;
+
+            // special menu entry: hamburger menu item (label is "=")
+            case '=': return '<li class="nav-item"><a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a></li>'; break;
+
+            // special menu entry: hamburger menu item (label is "|")
+            // requires css: .navbar-nav li.divider{border-left: 1px solid rgba(0,0,0,0.2);}
+            case '|': return '<li class="divider"></li>'; break;
         }
 
         $aChildren=isset($aLink['children']) && is_array($aLink['children']) && count($aLink['children']) ? $aLink['children'] : false;
@@ -670,9 +653,16 @@ class renderadminlte {
      * @param  array  $aUlOptions  array of html attrubutes for wrapping UL tag
      * @return string
      */
-    public function getTopNavigation($aNavItems, $aUlOptions=['class'=>'navbar-nav']){
+    public function getTopNavigation($aNavItems, $aUlOptions=false, $aNavItemsRight=[], $aUlOptionsRight=false){
         // array_unshift($aNavItems, ['class'=>'nav-link', 'data-widget'=>'pushmenu', 'href'=>'#', 'role'=>'button', 'label'=>'<i class="fa-solid fa-bars"></i>']);
-        return $this->addWrapper('ul', $aUlOptions, $this->getNavItems($aNavItems));
+        $aUlOptLeft=$aUlOptions ? $aUlOptions : ['class'=>'navbar-nav'];
+        $aUlOptRight=$aUlOptionsRight ? $aUlOptionsRight : ['class'=>'navbar-nav ml-auto'];
+        return $this->addWrapper('ul', $aUlOptLeft, $this->getNavItems($aNavItems))
+            .(count($aNavItemsRight)
+                ? $this->addWrapper('ul', $aUlOptRight, $this->getNavItems($aNavItemsRight))
+                : ''
+            )
+            ;
     }
 
     // ----------------------------------------------------------------------
@@ -1085,7 +1075,7 @@ class renderadminlte {
 
         // print_r($aOptions);
 
-        $sVariantPrefix=$aVariants[$aOptions['variant']] ? $aVariants[$aOptions['variant']] : $aVariants['default'];
+        $sVariantPrefix=isset($aVariants[$aOptions['variant']]) ? $aVariants[$aOptions['variant']] : $aVariants['default'];
         $sClass='card'
                 . $this->_addClassValue($aOptions['type'],    $sVariantPrefix)
                 .($aOptions['shadow'] && isset($this->_aValueMappings['shadow'][$aOptions['shadow']]) 
@@ -1106,10 +1096,13 @@ class renderadminlte {
             $aOptions['tools'].=($aOptions[$sTool] ? $sHtml : '');
         }
         // build parts of the card
-        $sCardHeader=$this->addWrapper('div', ['class'=>'card-header'],
+        $sCardHeader=$aOptions['title'] 
+            ? $this->addWrapper('div', ['class'=>'card-header'],
             $this->_tag('h3', ['class'=>'card-title', 'label'=>$aOptions['title']])
             . ($aOptions['tools'] ? $this->_tag('div', ['class'=>'card-tools', 'label'=>$aOptions['tools']]) : '')
-        );
+            )
+            : ''
+            ;
 
         $sCardBody=$this->_tag('div', ['class'=>'card-body', 'label'=>$aOptions['text']]);
         $sCardFooter=$aOptions['footer'] ? $this->_tag('div', ['class'=>'card-footer', 'label'=>$aOptions['footer']]) : '';
@@ -1372,7 +1365,6 @@ class renderadminlte {
         if( ! isset($aOptions['tabs']) || ! is_array($aOptions['tabs']) ){
             return false;
         }
-        static $iTabCounter;
         if (!isset($iTabCounter)){
             $iTabCounter=1;
         } else {