diff --git a/check_mysqlserver b/check_mysqlserver
index 343f961a7af48f8ee72b0972f9a5444cb8b5b861..de7b3b943d601e8fda789ba3fba33b453a4ed374 100755
--- a/check_mysqlserver
+++ b/check_mysqlserver
@@ -1,8 +1,6 @@
 #!/bin/bash
 # ======================================================================
 #
-# !!! WORK IN PROGRESS !!! DO NOT USE YET !!!
-#
 # Check MYSQL / MARIADB SERVER
 #
 # requirements:
@@ -20,19 +18,17 @@
 # 2020-08-xx  v0.0  <axel.hahn@iml.unibe.ch>
 # 2021-06-08  v0.1  <axel.hahn@iml.unibe.ch>  update HOME .. better implement a param and ENV var
 # 2021-06-24  v0.2  <axel.hahn@iml.unibe.ch>  check if query cache is enabled as a shared function
+# 2023-06-06  v0.3  <axel.hahn@unibe.ch>      some shell fixes
 # ======================================================================
 
 
-. `dirname $0`/inc_pluginfunctions
-_version="0.2"
+. $( dirname $0 )/inc_pluginfunctions
+
+self_APPNAME=$( basename $0 | tr [:lower:] [:upper:] )
+self_APPVERSION=0.3
 
 # --- set HOME
-# HOME=/etc/icinga2-passive-client
 HOME=/etc/icingaclient
-# cd $( dirname $0)
-# cd ..
-# HOME=$( pwd ); export HOME
-# cd - >/dev/null
 
 # --- other vars...
 cfgfile=$HOME/.my.cnf
@@ -89,7 +85,7 @@ function _install(){
     echo "- creating config file $cfgfile ... "
     cat  >$cfgfile <<EOF
 #
-# generated on `date`
+# generated on $(date)
 #
 [client]
 user=$myuser
@@ -106,17 +102,18 @@ EOF
 
 # show usage
 function _usage(){
+    local _self=$( basename $0 )
     cat <<EOH
 ______________________________________________________________________
 
-CHECK MYSQL SERVER :: v${_version}
+${self_APPNAME} :: v${self_APPVERSION}
 
 (c) Institute for Medical Education - University of Bern
 Licence: GNU GPL 3
 ______________________________________________________________________
 
 USAGE:
-  `basename $0` [OPTIONS] -m METHOD
+  $_self [OPTIONS] -m METHOD
 
 OPTIONS:
   -h  this help
@@ -133,8 +130,8 @@ PARAMETERS:
       qcache-hits     query cache efficiency: cached vs non cached and inserted
 
 EXAMPLES:
-  `basename $0` -i
-  `basename $0` -m commands
+  $_self -i
+  $_self -m commands
 
 EOH
 }
@@ -146,8 +143,8 @@ function _mysqlreadvars(){
 
 function _mysqlgetvar() {
     local sVarname=$1
-    lastvalue=`grep "^$sVarname[^_a-z]" ${datafile} | awk '{ print $2 }'`
-    echo $lastvalue
+    lastvalue=$(grep "^${sVarname}[^_a-z]" ${datafile} | awk '{ print $2 }')
+    echo "$lastvalue"
 }
 # get a value from mysql status output
 # param  string  variable name
@@ -160,20 +157,20 @@ function _mysqlrendervar() {
     local sFloat=$4
 
     # local iValue=`grep "^$sVarname[^_a-z]" ${datafile} | awk '{ print $2 }'`
-    local iValue=`_mysqlgetvar "$sVarname"`
+    local iValue=$(_mysqlgetvar "$sVarname")
     if [ "$iValue" = "" ]; then
             ph.abort "no value for ${sVarname}"
     fi
 
     # get label for perfdata
-    local sLabel=`echo ${sVarname} | sed "s#^${sRemove}##g"`
+    local sLabel=$(echo ${sVarname} | sed "s#^${sRemove}##g")
     if [ ! -z $sDeltaUnit ]; then
-        local iSpeed=` ph.perfdeltaspeed "mysql-${sVarname}" ${iValue} $sDeltaUnit $sFloat`
-        out=$out`printf "%25s: %10s %s \n" "${sLabel}" "${iValue}" "... delta = ${iSpeed} per $sDeltaUnit${NL}"`
+        local iSpeed=$( ph.perfdeltaspeed "mysql-${sVarname}" ${iValue} $sDeltaUnit $sFloat)
+        out=$out$(printf "%25s: %10s %s \n" "${sLabel}" "${iValue}" "... delta = ${iSpeed} per $sDeltaUnit${NL}")
         ph.perfadd "${sLabel}"   "${iSpeed}"
         lastvalue=$iSpeed
     else
-        out=${out}`printf "%25s: %10s \n" "${sLabel}" "${iValue}${NL}"`
+        out=${out}$(printf "%25s: %10s \n" "${sLabel}" "${iValue}${NL}")
         ph.perfadd "${sLabel}" "${iValue}"
         lastvalue=$iValue
     fi
@@ -182,8 +179,8 @@ function _mysqlrendervar() {
 
 function _mysqlrenderdelta() {
     local deltaUnit=$3
-    test -z $deltaUnit && deltaUnit="sec"
-    _mysqlrendervar "$1" "$2" $deltaUnit $4
+    test -z "$deltaUnit" && deltaUnit="sec"
+    _mysqlrendervar "$1" "$2" "$deltaUnit" "$4"
 }
 
 # helper function for caching checks
@@ -204,9 +201,9 @@ function _verify_cache(){
 # MAIN
 # ----------------------------------------------------------------------
 
-bOptInstall=`   ph.hasParamoption "i" "$@"`
-bOptUninstall=` ph.hasParamoption "u" "$@"`
-bOptHelp=`      ph.hasParamoption "h" "$@"`
+bOptInstall=$(   ph.hasParamoption "i" "$@")
+bOptUninstall=$( ph.hasParamoption "u" "$@")
+bOptHelp=$(      ph.hasParamoption "h" "$@")
 
 if [ $bOptHelp -eq 1 -o $# -lt 1 ]; then
     _usage
@@ -247,7 +244,7 @@ fi
 # --- check installation
 grep $myuser $cfgfile >/dev/null 2>/dev/null 
 if [ $? -ne 0 ]; then
-    ph.abort "MYSQL access not possible yet. You need to install the monitoring user first: as root execute `basename $0` -i"
+    ph.abort "MYSQL access not possible yet. You need to install the monitoring user first: as root execute $(basename $0) -i"
 fi
 
 # ----------------------------------------------------------------------
@@ -260,10 +257,10 @@ if [ $? -ne 0 ]; then
 fi
 
 # --- set optional limits
-typeset -i iWarnLimit=`     ph.getValueWithParam 0 w "$@"`
-typeset -i iCriticalLimit=` ph.getValueWithParam 0 c "$@"`
+typeset -i iWarnLimit=$(     ph.getValueWithParam 0 w "$@")
+typeset -i iCriticalLimit=$( ph.getValueWithParam 0 c "$@")
 
-sMode=`ph.getValueWithParam '' m "$@"`
+sMode=$(ph.getValueWithParam '' m "$@")
 
 case "${sMode}" in
 
diff --git a/check_psqlserver b/check_psqlserver
new file mode 100755
index 0000000000000000000000000000000000000000..275a17ffd3cd56d7990d4a8270c7258d89d9b298
--- /dev/null
+++ b/check_psqlserver
@@ -0,0 +1,238 @@
+#!/bin/bash
+# ======================================================================
+#
+# !!! WORK IN PROGRESS !!! DO NOT USE YET !!!
+#
+# Check PSQL SERVER
+#
+# requirements:
+# - psql client
+#
+# installation:
+# - execute check_psqlserver -i
+#
+# ----------------------------------------------------------------------
+# 2023-06-xx  v0.0  <axel.hahn@unibe.ch>
+# ======================================================================
+
+
+. $(dirname $0)/inc_pluginfunctions
+self_APPNAME=$( basename $0 | tr [:lower:] [:upper:] )
+self_APPVERSION=0.1
+
+# --- set HOME
+HOME=/etc/icinga2-passive-client
+# HOME=/etc/icingaclient
+
+# --- other vars...
+cfgfile=$HOME/.psql.conf
+myuser=icingamonitor
+
+# new line
+NL="
+"
+
+lastvalue=
+out=" "
+
+# ----------------------------------------------------------------------
+# FUNCTIONS
+# ----------------------------------------------------------------------
+
+# uninstall database user
+function _uninstall(){
+    echo UNINSTALL ...
+    su - postgres -c "psql -c \"DROP USER ${myuser};\""
+    unset PGHOST
+    unset PGUSER
+    unset PGPASSWORD
+}
+
+# (re)install database user for monitoring
+function _install(){
+    echo INSTALLING ...
+    local pwlength=64
+    echo "- check psql connection..."
+    su postgres -c "psql -V postgres"
+    if [ $? -ne 0 ]; then
+        echo "ERROR: psql connect without password failed."
+        exit 1
+    fi
+
+    echo "- creating mysql user $myuser@localhost with random password ($pwlength chars)..."
+    mypw=$( head /dev/urandom | tr -dc A-Za-z0-9 | head -c $pwlength )
+
+    SQL1="CREATE USER ${myuser} WITH PASSWORD '${mypw}' CONNECTION LIMIT 5";
+    SQL2="GRANT pg_monitor TO ${myuser};"
+    # SQL2="GRANT MONITOR_QUERIES TO ${myuser};"
+    su - postgres -c "psql -c \"${SQL1}\""
+    if [ $? -ne 0 ]; then
+        echo "ERROR: psql command to create user failed."
+        exit 1
+    fi
+    echo "- grant ..."
+    su - postgres -c "psql -c \"${SQL2}\""
+    if [ $? -ne 0 ]; then
+        echo "ERROR: psql command to grant permissions failed."
+        # exit 1
+    fi
+
+    echo "- creating config file $cfgfile ... "
+    cat  >$cfgfile <<EOF
+#
+# generated on $(date)
+#
+export PGUSER=${myuser}
+export PGPASSWORD=${mypw}
+export PGHOST=localhost
+export PGDATABASE=postgres
+EOF
+    ls -l $cfgfile
+    if [ $? -ne 0 ]; then
+        echo "ERROR: creation of config file failed."
+        exit 1
+    fi
+}
+
+function _usage(){
+    local _self=$( basename $0 )
+    cat <<EOH
+______________________________________________________________________
+
+${self_APPNAME} :: v${self_APPVERSION}
+
+THIS IS AN PRE ALPHA VERSION - DO NOT USE THIS
+
+(c) Institute for Medical Education - Univerity of Bern
+Licence: GNU GPL 3
+______________________________________________________________________
+
+USAGE:
+  $_self [OPTIONS] -m METHOD
+
+OPTIONS:
+  -h  this help
+  -i  install monitoring user (must be executed as root)
+  -u  uninstall monitoring user (must be executed as root)
+
+PARAMETERS:
+  -m  method; valid methods are:
+      dbstat          first implmenetation test
+
+EXAMPLES:
+  $_self -i
+  $_self -m commands
+
+EOH
+}
+
+function renderCounts(){
+  local _query="$1"
+  local _out=$( psql -c "${_query}")
+  # out+=$( echo "DEBUG: _query=${_query}${NL}" )
+  # echo "DEBUG: _out="; echo "${_out}"
+
+  local _iCounter=0
+  typeset -i _iCounter
+
+  local _header
+  _header=$( echo "${_out}" | head -1 | tr -d ' ')
+  local _data
+  _data=$( echo "${_out}" | head -3 | tail -1 | tr -d ' ')
+
+  # echo "DEBUG: _header=${_header}"
+  IFS="|"
+  read -ra aCols <<< "$_header"
+  read -ra aVals <<< "$_data"
+  for sColumn in ${aCols[*]}
+  do
+    local value=${aVals[$_iCounter]}
+    # echo "DEBUG: $sColumn = $value"
+    out+=$( printf "%25s: %10s \n" "${sColumn}" "${value}${NL}")
+    ph.perfadd "${sColumn}" "${value}"
+    _iCounter+=1
+  done
+}
+# ----------------------------------------------------------------------
+# MAIN
+# ----------------------------------------------------------------------
+
+bOptInstall=$(   ph.hasParamoption "i" "$@")
+bOptUninstall=$( ph.hasParamoption "u" "$@")
+bOptHelp=$(      ph.hasParamoption "h" "$@")
+
+if [ $bOptHelp -eq 1 -o $# -lt 1 ]; then
+    _usage
+    exit 0
+fi
+
+# --- check required tools
+# ph.require mysql
+
+# --- install
+if [ $bOptInstall -eq 1 -a "$( whoami )" = "root" ]; then
+    if [ -f $cfgfile ]; then
+        ph.status "SKIP installation. config file already exists: $cfgfile."
+        ph.exit
+    fi
+    HOME=/root
+    export HOME
+
+    _uninstall
+    _install
+
+    ph.status "Installation was done"
+    ph.exit
+fi
+
+# --- uninstall
+if [ $bOptUninstall -eq 1 -a "$( whoami )" = "root" ]; then
+    HOME=/root
+
+    _uninstall
+    rm -f $cfgfile
+
+    ph.status "Uninstalled."
+    ph.exit
+fi
+
+
+# --- check installation
+grep $myuser $cfgfile >/dev/null 2>/dev/null
+if [ $? -ne 0 ]; then
+    ph.abort "PSQL access not possible yet. You need to install the monitoring user first: as root execute `basename $0` -i"
+fi
+
+# ----------------------------------------------------------------------
+
+sMode=$(ph.getValueWithParam '' m "$@")
+
+case "${sMode}" in
+
+    "dbstat")
+        descr="statistics over all databases"
+        renderCounts "select \
+            sum(xact_commit)   as commit,   \
+            sum(xact_rollback) as rollback, \
+            sum(blks_read)     as blkread,  \
+            sum(blks_hit)      as blkhit    \
+            from pg_stat_database "
+          ;;
+    "queries")
+        # psql -c "select * from pg_stat_activity "
+        # psql -c "select * from pg_stat_statements " -> av psql v11
+        ;;
+
+    *)
+        echo ERRROR: [${sMode}] is an INVALID mode
+        _usage
+        ph.abort
+
+esac
+
+ph.status "Pgsql $sMode :: $descr"
+echo "$out"
+
+ph.exit
+
+# ----------------------------------------------------------------------