diff --git a/plugins/ilias/example-graphs/ilias-day.png b/plugins/ilias/example-graphs/ilias-day.png
new file mode 100644
index 00000000..130604cf
Binary files /dev/null and b/plugins/ilias/example-graphs/ilias-day.png differ
diff --git a/plugins/ilias/ilias_session b/plugins/ilias/ilias_session
new file mode 100755
index 00000000..5f85a7c4
--- /dev/null
+++ b/plugins/ilias/ilias_session
@@ -0,0 +1,236 @@
+#!/usr/bin/env bash
+# Munin plugin for ILIAS
+
+: << =cut
+
+=head1 NAME
+
+ilias_session - Munin plugin to monitor L open source
+learning management system's sessions
+
+=head1 DESCRIPTION
+
+Reads session and user statistcs from any ILIAS MySQL/MariaDB database.
+
+https://ilias.de/ | http://gallery.munin-monitoring.org/contrib/cms-index.html
+
+Requirements:
+
+bash version 4 is required for associative array support.
+This plugin requires mysql CLI or a compatible client being available.
+
+In order to get precise results, please ensure your MySQL server has the same
+time as your ILIAS application server. Timezone does not matter.
+
+=head1 CONFIGURATION
+
+The plugin needs the following configuration settings e.g. in
+/etc/munin/plugin-conf.d/ilias.conf
+
+ [ilias_session]
+ env.ildbuser ilias
+ env.ildbpassword youriliaspasword
+ env.ildb ilias
+ env.ildbhost localhost
+ env.ildbport 3306
+
+WARNING: Setting env.ildbpassword will possibly expose the database password
+to other processes and might be insecure.
+
+=head1 AUTHOR
+
+Copyright 2018 L
+ (L)
+
+=head1 LICENSE
+
+Licensed under the MIT license:
+https://opensource.org/licenses/MIT
+
+=head1 CONTRIBUTE
+
+Find this plugin on L
+
+=head1 MAGIC MARKERS
+
+ #%# family=auto
+ #%# capabilities=autoconf
+
+=head1 VERSION
+
+ 2.0
+
+=head1 CHANGELOG
+
+=head2 2.0 - 2018/04/20
+
+ first sh release
+
+=head2 1.0 - 2018/03/19
+
+ first release
+
+=cut
+
+# Include plugin.sh
+# shellcheck source=/dev/null
+. "${MUNIN_LIBDIR:-}/plugins/plugin.sh"
+
+# Shell options
+set -o nounset # Like perl use strict;
+
+# Graph settings
+global_attr="
+ graph_title ILIAS session and logins
+ graph_category cms
+ graph_args --lower-limit 0
+ graph_vlabel occurences
+ graph_info Number of active ILIAS user sessions and logins
+"
+
+declare -A d_attr=( \
+ [0,field]=iltotal1day \
+ [0,type]=GAUGE \
+ [0,draw]=LINE \
+ [0,label]='users logged in within day' \
+ [0,sql]="SELECT COUNT( usr_id ) AS C
+ FROM \`usr_data\`
+ WHERE last_login >= DATE_SUB( NOW( ) , INTERVAL 1 DAY )
+ " \
+ [1,field]=ilsessions \
+ [1,type]=GAUGE \
+ [1,draw]=LINE \
+ [1,label]='active sessions' \
+ [1,sql]="SELECT COUNT( user_id ) AS C
+ FROM usr_session
+ WHERE \`expires\` > UNIX_TIMESTAMP( NOW( ) ) AND user_id != 0
+ " \
+ [2,field]=il60minavg \
+ [2,type]=GAUGE \
+ [2,draw]=LINE \
+ [2,label]='sessions created/updated within 1h' \
+ [2,sql]="SELECT COUNT( user_id ) AS C
+ FROM usr_session
+ WHERE 60 * 60 > UNIX_TIMESTAMP( NOW( ) ) - ctime AND user_id != 0
+ " \
+ [3,field]=il5minavg \
+ [3,type]=GAUGE \
+ [3,draw]=LINE \
+ [3,label]='sessions created/updated within 5min' \
+ [3,sql]="SELECT COUNT( user_id ) AS C
+ FROM usr_session
+ WHERE 5 * 60 > UNIX_TIMESTAMP( NOW( ) ) - ctime AND user_id != 0
+ " \
+)
+
+# Read the environment and apply defaults
+DB_CLI_TOOL="${ildbcli:-mysql}"
+DB_CLI_CMD="$(command -v "${DB_CLI_TOOL}")"
+DB_HOST="${ildbhost:-localhost}"
+DB_PORT="${ildbport:-3306}"
+DB="${ildb:-ilias}"
+DB_USER="${ildbuser:-root}"
+DB_PASSWORD="${ildbpassword:-}"
+
+# Functions
+
+autoconf() {
+ if command -v "${DB_CLI_TOOL}" >/dev/null ; then
+ echo yes
+ else
+ echo "no (failed to find executable '${DB_CLI_TOOL}')"
+ fi
+}
+
+config() {
+ local label_max_length=45
+ local i=0
+
+ # print global attributes
+ echo "$global_attr" | sed -e 's/^ *//' -e '/^$/d'
+
+ i=0
+ # -v varname
+ # True if the shell variable varname is set (has been assigned a value).
+ # https://stackoverflow.com/a/45385463/2683737
+ while [[ -v d_attr[$i,field] ]]; do
+ field=${d_attr[$i,field]}
+ echo "$field.type ${d_attr[$i,type]}"
+ echo "$field.draw ${d_attr[$i,draw]}"
+ echo "$field.label ${d_attr[$i,label]:0:${label_max_length}}"
+ echo "$field.min 0"
+ ((++i))
+ done
+}
+
+# Join a bash array $1 is the glue
+join_by() {
+ local d=$1
+ shift
+ echo -n "$1"
+ shift
+ printf "%s" "${@/#/$d}"
+}
+
+fetch() {
+ local i=0
+ local query=()
+ local query_string=""
+ declare -a results
+
+ # create an array of queries
+ i=0
+ while [[ -v d_attr[$i,field] ]]; do
+ query+=("${d_attr[$i,sql]}")
+ ((++i))
+ done
+
+ # build query by joining the array elements
+ query_string=$(join_by " UNION ALL " "${query[@]}")
+
+ # obtain result using CLI call; don't supply password through
+ # command line; note that MySQL considers it insecure using
+ # an environment variable:
+ # >This method of specifying your MySQL password must
+ # >be considered extremely insecure and should not be used.
+ # >Some versions of ps include an option to display the
+ # >environment of running processes. [...]
+ result=$(MYSQL_PWD="$DB_PASSWORD" \
+ "$DB_CLI_CMD" \
+ --skip-column-names \
+ -h "$DB_HOST" \
+ -u "$DB_USER" \
+ -P "$DB_PORT" \
+ "$DB" \
+ -e "$query_string" )
+
+ # initialize array
+ mapfile -t results <<< "$result"
+
+ # extract result and echo it to stdout, which is
+ # captured by Munin
+ i=0
+ while [[ -v d_attr[$i,field] ]]; do
+ echo "${d_attr[$i,field]}.value ${results[$i]}"
+ ((++i))
+ done
+}
+
+
+# Main
+case ${1:-} in
+autoconf)
+ autoconf
+ ;;
+config)
+ config
+ [ "${MUNIN_CAP_DIRTYCONFIG:-}" = "1" ] && fetch
+ ;;
+*)
+ fetch
+ ;;
+esac
+
+exit 0
+