diff --git a/composer.json b/composer.json
index cf08858ee628d98a4e3c442d2a59a4f6b5e77e73..cc3bd782ab6cef743ab81ef4a30d9a788ab82ba8 100644
--- a/composer.json
+++ b/composer.json
@@ -131,7 +131,8 @@
         "wpackagist-plugin/event-organiser": "3.12.1",
         "noblogs/ai-authenticate-rest-api-plugin": "0.0.3",
         "wpackagist-plugin/multisite-custom-css": "1.0",
-        "wpackagist-plugin/activitypub": "0.13.4"
+        "wpackagist-plugin/activitypub": "0.13.4",
+        "wpackagist-plugin/memcached": "4.0.0"
     },    
     "extra": {
         "wordpress-install-dir": "app",
@@ -198,7 +199,8 @@
             ],
             "app/wp-content": [
                 "package:stuttter/ludicrousdb:ludicrousdb/drop-ins/db.php,ludicrousdb/drop-ins/db-error.php",
-                "package:wpackagist-plugin/wp-super-cache:advanced-cache.php"
+                "package:wpackagist-plugin/wp-super-cache:advanced-cache.php",
+                "package:wpackagist-plugin/memcached:object-cache.php"
             ],
             "app": [
                 "package:noblogs/r2db:db-config.php,nginx-map/wp-nginx-map-json.php,nginx-map/wp-nginx-map.php"
diff --git a/composer.lock b/composer.lock
index 452325fad89c30370274ea24105586c5b6cd7fbf..8b4e04ff364936328d8cc572cdfb275db2eb8262 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "48f8128868e7383a16584bf851085bcb",
+    "content-hash": "f3588bfe722e90bd8a683069b0a906bf",
     "packages": [
         {
             "name": "bjornjohansen/wplang",
@@ -1116,6 +1116,24 @@
             "type": "wordpress-plugin",
             "homepage": "https://wordpress.org/plugins/katex/"
         },
+        {
+            "name": "wpackagist-plugin/memcached",
+            "version": "4.0.0",
+            "source": {
+                "type": "svn",
+                "url": "https://plugins.svn.wordpress.org/memcached/",
+                "reference": "tags/4.0.0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://downloads.wordpress.org/plugin/memcached.4.0.0.zip"
+            },
+            "require": {
+                "composer/installers": "^1.0 || ^2.0"
+            },
+            "type": "wordpress-plugin",
+            "homepage": "https://wordpress.org/plugins/memcached/"
+        },
         {
             "name": "wpackagist-plugin/more-privacy-options",
             "version": "4.6",
@@ -2171,5 +2189,5 @@
         "php": ">=7.1"
     },
     "platform-dev": [],
-    "plugin-api-version": "2.3.0"
+    "plugin-api-version": "2.0.0"
 }
diff --git a/docker/build.sh b/docker/build.sh
index ee4f6c65cc613ca3ccb6d43003a15b6bfd15b4e4..491a07f507fefb53f2a97516819db5953b0763ea 100755
--- a/docker/build.sh
+++ b/docker/build.sh
@@ -22,6 +22,7 @@ PACKAGES="
         php-imagick
         php-intl
         php-mysql
+        php-memcache
         php-memcached
         php-mbstring
         php-xml
diff --git a/docker/wp-config.php b/docker/wp-config.php
index 8a9d933acba9c134fa06ff6cbde7e0c457254987..0d24d7b2e60209e355ea49b5c72eef07a244a7a4 100644
--- a/docker/wp-config.php
+++ b/docker/wp-config.php
@@ -118,14 +118,14 @@ define('SMTP_DEBUG', 0);
  *
  * @since 2.6.0
  */
-define('AUTH_KEY',         $noblogs_config['secrets']['auth_key']);
-define('SECURE_AUTH_KEY',  $noblogs_config['secrets']['secure_auth_key']);
-define('LOGGED_IN_KEY',    $noblogs_config['secrets']['logged_in_key']);
-define('NONCE_KEY',        $noblogs_config['secrets']['nonce_key']);
-define('AUTH_SALT',        $noblogs_config['secrets']['auth_salt']);
-define('SECURE_AUTH_SALT', $noblogs_config['secrets']['secure_auth_salt']);
-define('LOGGED_IN_SALT',   $noblogs_config['secrets']['logged_in_salt']);
-define('NONCE_SALT',       $noblogs_config['secrets']['nonce_salt']);
+define('AUTH_KEY',          $noblogs_config['secrets']['auth_key']);
+define('SECURE_AUTH_KEY',   $noblogs_config['secrets']['secure_auth_key']);
+define('LOGGED_IN_KEY',     $noblogs_config['secrets']['logged_in_key']);
+define('NONCE_KEY',         $noblogs_config['secrets']['nonce_key']);
+define('AUTH_SALT',         $noblogs_config['secrets']['auth_salt']);
+define('SECURE_AUTH_SALT',  $noblogs_config['secrets']['secure_auth_salt']);
+define('LOGGED_IN_SALT',    $noblogs_config['secrets']['logged_in_salt']);
+define('NONCE_SALT',        $noblogs_config['secrets']['nonce_salt']);
 
 /**#@-*/
 
@@ -158,6 +158,15 @@ define ('WPLANG', '');
 /* NoSpam API endpoint (internal). */
 define('NOSPAM_API_URL', 'http://nospam.investici.org:9001');
 
+/*
+ * Memcache servers for Wordpress object caching.
+ */
+$memcached_servers = array(
+  'default' => array(
+    '127.0.0.1:7108'
+  )
+);
+
 /*
  * A/I Patch: get more replicas of the partitions in the flexihash calculations.
  */
@@ -171,6 +180,18 @@ if (array_key_exists('debug_cookie_name', $noblogs_config) &&
         define('WP_DEBUG', true);
         define('WP_DEBUG_LOG', true);
         define('WP_DEBUG_DISPLAY', false);
+
+    // Warning handler that dumps stack traces.
+    class WarningWithStacktrace extends ErrorException {}
+    set_error_handler(function($severity, $message, $file, $line) {
+        if ($severity & (E_WARNING | E_NOTICE | E_USER_WARNING | E_USER_NOTICE)) {
+            $ex = new WarningWithStacktrace($message, 0, $severity, $file, $line);
+            error_log("\n" . $ex. "\n");
+            return true;
+        } 
+        return false;
+    });
+
 } else {
     define('WP_DEBUG', false);
 }