diff --git a/README.md b/README.md
index e850d03ec96ffe05c2677ac3ff8c54f204bb18e2..b49c1d5db93d8ccec9383cc3ee30d2d37a99f1d4 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # LDAP Docker
 
-> A dockerized OpenLDAP with phpLDAPadmin webui.
+> A dockerized OpenLDAP with LDAP Account Manager.
 
 ## Requirements
 
diff --git a/docker-compose.yml b/docker-compose.yml
index d19800a112fda4baeeb7668c26410d907f03b0cb..565378e08b39e94e7164831139a5cc92bcb1d230 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,18 +11,28 @@ services:
             LDAP_ROOTPASS: foo
             LDAP_DOMAIN: nowhere.com
             LDAP_ORGANIZATION: none
-    phpldapadmin:
+
+    nss-pam-ldapd:
         build:
-            context: phpldapadmin/
+            context: nss-pam-ldapd/
+        command: /usr/sbin/nslcd --debug --nofork
+        environment:
+            LDAP_BASE_DN: 'dc=nowhere,dc=com'
+        volumes:
+            - _run_ldap:/run/slapd
+
+    ldap-account-manager:
+        build:
+            context: ldap-account-manager/
         links:
             - slapd
         volumes:
             - _run_ldap:/run/slapd
-        environment:
-            PLA_BASE_DN: 'dc=nowhere,dc=com'
-            PLA_BIND_ID: 'cn=admin,dc=nowhere,dc=com'
+            - ldap-account-manager:/var/lib/ldap-account-manager
         ports:
             - 80:80
+
 volumes:
     _run_ldap:
     ldap:
+    ldap-account-manager:
diff --git a/phpldapadmin/.dockerignore b/ldap-account-manager/.dockerignore
similarity index 100%
rename from phpldapadmin/.dockerignore
rename to ldap-account-manager/.dockerignore
diff --git a/ldap-account-manager/Dockerfile b/ldap-account-manager/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..f89d5056a1b9b0373fb3b3673544b8ccc7615838
--- /dev/null
+++ b/ldap-account-manager/Dockerfile
@@ -0,0 +1,27 @@
+FROM debian:buster-slim
+RUN apt-get update && \
+    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
+        ldap-account-manager\
+        wget \
+    && \
+    ln -sf /dev/stdout /var/log/apache2/access.log && \
+    ln -sf /dev/stderr /var/log/apache2/error.log && \
+    ln -sf /dev/stdout /var/log/apache2/lam.log && \
+    mv /etc/ldap-account-manager/config.cfg /var/lib/ldap-account-manager/config/config.cfg && \
+    ln -sf /var/lib/ldap-account-manager/config/config.cfg /etc/ldap-account-manager/config.cfg && \
+    mv /var/lib/ldap-account-manager /var/lib/ldap-account-manager.orig && \
+    mkdir -m 755 /var/lib/ldap-account-manager && \
+    sed -i 's@SYSLOG@/var/log/apache2/lam.log@' /var/lib/ldap-account-manager.orig/config/config.cfg && \
+    sed -i '/<\/VirtualHost>/i RedirectMatch permanent "^/$" "/lam"' /etc/apache2/sites-enabled/000-default.conf && \
+    rm -rf /tmp/* /var/tmp/* /var/lib/apt/lists/* /var/cache/apt/archives/*
+COPY --chown=root:root entrypoint /entrypoint
+ENV APACHE_RUN_DIR=/run/apache2 \
+    APACHE_LOG_DIR=/var/log/apache2 \
+    APACHE_RUN_USER=www-data \
+    APACHE_RUN_GROUP=www-data \
+    APACHE_PID_FILE=/run/apache2/apache2.pid
+EXPOSE 80
+VOLUME /var/lib/ldap-account-manager
+ENTRYPOINT [ "/entrypoint" ]
+CMD [ "apache2", "-DFOREGROUND" ]
+HEALTHCHECK CMD wget --spider --quiet http://localhost/lam || exit 1
diff --git a/ldap-account-manager/README.md b/ldap-account-manager/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..9ff062e4d9a4c54a2c6692374bdd58fe52c331bc
--- /dev/null
+++ b/ldap-account-manager/README.md
@@ -0,0 +1,10 @@
+# LDAP Account Manager
+
+> Dockerized LDAP Account Manager.
+
+## Usage
+
+The image isn't configured with environment variables, instead it uses a volume
+for `/var/lib/ldap-account-manager` that contains the application's
+configuration files. On first run the default files are copied to the volume and
+the configuration is done through the application itself.
diff --git a/ldap-account-manager/entrypoint b/ldap-account-manager/entrypoint
new file mode 100755
index 0000000000000000000000000000000000000000..3095d2067bf0e89bf3ca0d4b7a5f566d656e14a8
--- /dev/null
+++ b/ldap-account-manager/entrypoint
@@ -0,0 +1,7 @@
+#!/bin/sh
+set -eux
+
+chown root:root /var/lib/ldap-account-manager
+chmod 755 /var/lib/ldap-account-manager
+cp --archive --no-clobber --verbose --no-target-directory /var/lib/ldap-account-manager.orig /var/lib/ldap-account-manager
+eval exec "$@"
diff --git a/nss-pam-ldapd/.dockerignore b/nss-pam-ldapd/.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..dd449725e188f816bcebfc05678064efcbc29a81
--- /dev/null
+++ b/nss-pam-ldapd/.dockerignore
@@ -0,0 +1 @@
+*.md
diff --git a/nss-pam-ldapd/Dockerfile b/nss-pam-ldapd/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..b9c274f8b3ec4760c6d03c86fe16671ea180beab
--- /dev/null
+++ b/nss-pam-ldapd/Dockerfile
@@ -0,0 +1,21 @@
+FROM debian:stretch-slim
+RUN apt-get update && \
+    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
+        ca-certificates \
+        gosu \
+        libnss-ldapd \
+        libpam-ldapd \
+    && \
+    mkdir -p /run/nslcd && \
+    chown -R nslcd:nslcd /run/nslcd/ && \
+    sed -i 's/compat/compat ldap/g' /etc/nsswitch.conf && \
+    rm -rf /tmp/* /var/tmp/* /var/lib/apt/lists/* /var/cache/apt/archives/* /etc/nslcd.conf
+COPY --chown=root:root entrypoint /
+ENV LDAP_URIS=ldapi:/// \
+    LDAP_AUTH_TYPE=none \
+    LDAP_STARTTLS=false \
+    LDAP_BASE_DN="dc=trusted" \
+    LDAP_CACERTFILE=/etc/ssl/certs/ca-certificates.crt
+ENTRYPOINT [ "/entrypoint" ]
+CMD [ "/usr/sbin/nslcd", "--nofork" ]
+HEALTHCHECK CMD pgrep nslcd || exit 1
diff --git a/nss-pam-ldapd/README.md b/nss-pam-ldapd/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..46bdbc8786218f50ada6480a84d563c17d34b1e1
--- /dev/null
+++ b/nss-pam-ldapd/README.md
@@ -0,0 +1,20 @@
+# nss-pam-ldapd
+
+> Dockerized example nss-pam-ldapd.
+
+## Usage
+
+The process running inside the container is `nslcd` which is the nameserver
+daemon. To use this container, execute a different process (like `su` or
+`getent`) inside the container.
+
+## Environment variables
+
+Name | Default value
+--- | ---
+`LDAP_URIS` | `ldapi:///`
+`LDAP_AUTH_TYPE` | `none`
+`LDAP_BINDDN`
+`LDAP_STARTTLS` | `false`
+`LDAP_BASE_DN` | `dc=trusted`
+`LDAP_CACERTFILE` | `/etc/ssl/certs/ca-certificates.crt`
diff --git a/nss-pam-ldapd/entrypoint b/nss-pam-ldapd/entrypoint
new file mode 100755
index 0000000000000000000000000000000000000000..356b649b1606eedb3029405cb251e79f02482378
--- /dev/null
+++ b/nss-pam-ldapd/entrypoint
@@ -0,0 +1,24 @@
+#!/bin/sh
+set -eux
+
+chown -R nslcd:nslcd /run/nslcd
+
+cat << EOF | debconf-set-selections -v
+nslcd nslcd/ldap-uris string ${LDAP_URIS:-}
+nslcd	nslcd/ldap-bindpw	password	${LDAP_BINDPW:-}
+nslcd	nslcd/ldap-auth-type	select	${LDAP_AUTH_TYPE:-}
+nslcd	nslcd/ldap-binddn	string	${LDAP_BINDDN:-}
+nslcd	nslcd/ldap-sasl-authcid	string	${LDAP_SASL_AUTHCID:-}
+nslcd	nslcd/ldap-reqcert	select	${LDAP_REQCERT:-}
+nslcd	nslcd/ldap-sasl-realm	string	${LDAP_SASL_REALM:-}
+nslcd	nslcd/ldap-starttls	boolean	${LDAP_STARTTLS:-}
+nslcd	nslcd/ldap-base	string	${LDAP_BASE_DN:-}
+nslcd	nslcd/ldap-sasl-authzid	string	${LDAP_SASL_AUTHZID:-}
+nslcd	nslcd/ldap-sasl-mech	select	${LDAP_SASL_MECH:-}
+nslcd	nslcd/ldap-cacertfile	string	${LDAP_CACERTFILE:-}
+nslcd	nslcd/ldap-sasl-secprops	string	${LDAP_SASL_SECPROPS:-}
+EOF
+
+dpkg-reconfigure -f noninteractive nslcd
+
+eval exec gosu "nslcd:nslcd" "$@"
diff --git a/phpldapadmin/Dockerfile b/phpldapadmin/Dockerfile
deleted file mode 100644
index c4043961c9b266a0d71b886d1faa1e29d65dbde2..0000000000000000000000000000000000000000
--- a/phpldapadmin/Dockerfile
+++ /dev/null
@@ -1,11 +0,0 @@
-FROM alpine:3.8
-RUN apk add --update --no-cache phpldapadmin php5-apache2 php5-openssl && \
-    ln -sf /dev/stdout /var/log/apache2/access.log && \
-    ln -sf /dev/stderr /var/log/apache2/error.log && \
-    mkdir -p /run/apache2/
-
-COPY --chown=root:root config.php /usr/share/webapps/phpldapadmin/config/
-COPY --chown=root:root phpldapadmin.conf /etc/apache2/conf.d/
-ENV PLA_HOST=ldapi://%2frun%2fslapd%2fldapi
-CMD [ "httpd", "-DFOREGROUND" ]
-HEALTHCHECK CMD wget --spider --quiet http://localhost/htdocs/index.php || exit 1
diff --git a/phpldapadmin/README.md b/phpldapadmin/README.md
deleted file mode 100644
index 296b2c6ddea0e372dff3976a3d5dffc350f42bf2..0000000000000000000000000000000000000000
--- a/phpldapadmin/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# phpLDAPadmin
-
-> Dockerized phpLDAPadmin.
-
-## Environment variables
-
-Name | Default value
---- | ---
-`PLA_NAME` | `LDAP server`
-`PLA_HOST` | `slapd`
-`PLA_PORT` | `389`
-`PLA_BASE` |
-`PLA_AUTH_TYPE` | `cookie`
-`PLA_BIND_ID` |
-`PLA_TLS` | `false`
diff --git a/phpldapadmin/config.php b/phpldapadmin/config.php
deleted file mode 100644
index 616618e2787f09e89d3f21799f0399d7968549b3..0000000000000000000000000000000000000000
--- a/phpldapadmin/config.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-$servers = new Datastore();
-
-$servers->newServer('ldap_pla');
-$servers->setValue('server', 'name', getenv('PLA_NAME') ?: 'LDAP Server');
-$servers->setValue('server', 'host', getenv('PLA_HOST') ?: 'slapd');
-$servers->setValue('server', 'port', getenv('PLA_PORT') ?: '389');
-$servers->setValue('server', 'base', array(getenv('PLA_BASE_DN') ?: ''));
-$servers->setValue('login', 'auth_type', getenv('PLA_AUTH_TYPE') ?: 'cookie');
-$servers->setValue('login', 'bind_id', getenv('PLA_BIND_ID') ?: '');
-$servers->setValue('server', 'tls', strtolower(getenv('PLA_TLS') ?: 'false') == 'true');
-
-?>
diff --git a/phpldapadmin/phpldapadmin.conf b/phpldapadmin/phpldapadmin.conf
deleted file mode 100644
index 8d78331e1ce2678d8d3855d31c23facaaaff1e34..0000000000000000000000000000000000000000
--- a/phpldapadmin/phpldapadmin.conf
+++ /dev/null
@@ -1,39 +0,0 @@
-<VirtualHost _default_:80>
-    DocumentRoot /usr/share/webapps/phpldapadmin/
-</VirtualHost>
-
-<Directory /usr/share/webapps/phpldapadmin/>
-
-    DirectoryIndex index.php
-    Options +FollowSymLinks
-    AllowOverride None
-
-    Require all granted
-
-    <IfModule mod_mime.c>
-
-      <IfModule mod_php5.c>
-        AddType application/x-httpd-php .php
-
-        php_flag magic_quotes_gpc Off
-        php_flag track_vars On
-        php_flag register_globals Off
-        php_value include_path .
-      </IfModule>
-
-      <IfModule !mod_php5.c>
-        <IfModule mod_actions.c>
-          <IfModule mod_cgi.c>
-            AddType application/x-httpd-php .php
-            Action application/x-httpd-php /cgi-bin/php5
-          </IfModule>
-          <IfModule mod_cgid.c>
-            AddType application/x-httpd-php .php
-            Action application/x-httpd-php /cgi-bin/php5
-           </IfModule>
-        </IfModule>
-      </IfModule>
-
-    </IfModule>
-
-</Directory>