diff --git a/Makefile b/Makefile
index c9287d067f23719c7f8f7334d09daa2b6d87b3c9..042a53d588339b9b449e8d7da2192a80c6f6b010 100644
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ sourceDirectory := $(shell pwd)
 #### Common Lisp implementations available for testing.
 ## export ASDF_TEST_LISPS to override the default list of such implementations,
 ## or specify a lisps= argument at the make command-line
-defaultLisps = ccl clisp sbcl ecl ecl_bytecodes cmucl abcl scl allegro lispworks allegromodern gcl xcl
+defaultLisps = ccl clisp sbcl ecl ecl_bytecodes cmucl abcl scl allegro lispworks allegromodern gcl xcl mkcl
 ifdef ASDF_TEST_LISPS
 lisps ?= ${ASDF_TEST_LISPS}
 else
@@ -26,7 +26,7 @@ endif
 
 ## grep for #+/#- features in the test/ directory to see plenty of disabled tests on some platforms
 ## NOT SUPPORTED BY OUR AUTOMATED TESTS:
-##	cormancl genera lispworks-personal-edition mkcl rmcl
+##	cormancl genera lispworks-personal-edition rmcl
 ## Some are manually tested once in a while.
 ifdef ASDF_TEST_SYSTEMS
 s ?= ${ASDF_TEST_SYSTEMS}
diff --git a/asdf.asd b/asdf.asd
index f79df388b702c4b70572a2604d627d88f0f3af03..d14349255b78c7f2da4fd941b2255e673d3fd06a 100644
--- a/asdf.asd
+++ b/asdf.asd
@@ -75,7 +75,7 @@
   :licence "MIT"
   :description "Another System Definition Facility"
   :long-description "ASDF builds Common Lisp software organized into defined systems."
-  :version "3.1.0.107" ;; to be automatically updated by make bump-version
+  :version "3.1.0.108" ;; to be automatically updated by make bump-version
   :depends-on ()
   #+asdf3 :encoding #+asdf3 :utf-8
   :class #.(if (find-class 'package-system nil) 'package-system 'system)
diff --git a/header.lisp b/header.lisp
index 4b392fc4b8b8b00a98194b58d5912b6db80fbcb5..543e2b0324b970395ac44410cf1c54bea6b503df 100644
--- a/header.lisp
+++ b/header.lisp
@@ -1,5 +1,5 @@
 ;;; -*- mode: Common-Lisp; Base: 10 ; Syntax: ANSI-Common-Lisp ; buffer-read-only: t; -*-
-;;; This is ASDF 3.1.0.107: Another System Definition Facility.
+;;; This is ASDF 3.1.0.108: Another System Definition Facility.
 ;;;
 ;;; Feedback, bug reports, and patches are all welcome:
 ;;; please mail to <asdf-devel@common-lisp.net>.
diff --git a/uiop/lisp-build.lisp b/uiop/lisp-build.lisp
index adab079bace012c440eea6d9f09abbd12c498078..350424896eaab24fee721468de070954583b91bb 100644
--- a/uiop/lisp-build.lisp
+++ b/uiop/lisp-build.lisp
@@ -20,7 +20,7 @@
    ;; Types
    #+sbcl #:sb-grovel-unknown-constant-condition
    ;; Functions & Macros
-   #:get-optimization-settings #:proclaim-optimization-settings
+   #:get-optimization-settings #:proclaim-optimization-settings #:with-optimization-settings
    #:call-with-muffled-compiler-conditions #:with-muffled-compiler-conditions
    #:call-with-muffled-loader-conditions #:with-muffled-loader-conditions
    #:reify-simple-sexp #:unreify-simple-sexp
@@ -60,20 +60,32 @@ This can help you produce more deterministic output for FASLs."))
     "Optimization settings to be used by PROCLAIM-OPTIMIZATION-SETTINGS")
   (defvar *previous-optimization-settings* nil
     "Optimization settings saved by PROCLAIM-OPTIMIZATION-SETTINGS")
+  (defparameter +optimization-variables+
+    ;; TODO: allegro genera corman mcl
+    (or #+(or abcl xcl) '(system::*speed* c::*space* c::*safety* c::*debug*)
+        #+clisp '(system::*optimize*)
+        #+clozure '(ccl::*nx-speed* ccl::*nx-space* ccl::*nx-safety*
+                    ccl::*nx-debug* ccl::*nx-cspeed*)
+        #+(or cmu scl) '(c::*default-cookie*)
+        #+ecl '(c::*speed* c::*space* c::*safety* c::*debug*)
+        #+gcl '(compiler::*speed* compiler::*space* compiler::*compiler-new-safety* compiler::*debug*)
+        #+lispworks '(compiler::*optimization-level*)
+        #+mkcl '(si::*speed* si::*space* si::*safety* si::*debug*)
+        #+sbcl '(sb-c::*policy*)))
   (defun get-optimization-settings ()
     "Get current compiler optimization settings, ready to PROCLAIM again"
-    #-(or clisp clozure cmu ecl mkcl sbcl scl)
-    (warn "~S does not support ~S. Please help me fix that." 'get-optimization-settings (implementation-type))
+    #-(or abcl clisp clozure cmu ecl lispworks mkcl sbcl scl xcl)
+    (warn "~S does not support ~S. Please help me fix that."
+          'get-optimization-settings (implementation-type))
     #+clozure (ccl:declaration-information 'optimize nil)
-    #+(or clisp cmu ecl mkcl sbcl scl)
+    #+(or abcl clisp cmu ecl lispworks mkcl sbcl scl xcl)
     (let ((settings '(speed space safety debug compilation-speed #+(or cmu scl) c::brevity)))
       #.`(loop :for x :in settings
-               ,@(or #+ecl '(:for v :in '(c::*speed* c::*space* c::*safety* c::*debug*))
-                     #+mkcl '(:for v :in '(si::*speed* si::*space* si::*safety* si::*debug*))
-                     #+(or cmu scl) '(:for f :in '(c::cookie-speed c::cookie-space c::cookie-safety c::cookie-debug c::cookie-cspeed c::cookie-brevity)))
+               ,@(or #+(or abcl ecl gcl mkcl xcl) '(:for v :in *optimization-variables*))
                :for y = (or #+clisp (gethash x system::*optimize*)
-                            #+(or ecl mkcl) (symbol-value v)
-                            #+(or cmu scl) (funcall f c::*default-cookie*)
+                            #+(or abcl ecl mkcl xcl) (symbol-value v)
+                            #+(or cmu scl) (slot-value c::*default-cookie* x)
+                            #+lispworks (slot-value compiler::*optimization-level* x)
                             #+sbcl (cdr (assoc x sb-c::*policy*)))
                :when y :collect (list x y))))
   (defun proclaim-optimization-settings ()
@@ -81,7 +93,11 @@ This can help you produce more deterministic output for FASLs."))
     (proclaim `(optimize ,@*optimization-settings*))
     (let ((settings (get-optimization-settings)))
       (unless (equal *previous-optimization-settings* settings)
-        (setf *previous-optimization-settings* settings)))))
+        (setf *previous-optimization-settings* settings))))
+  (defmacro with-optimization-settings ((&optional (settings *optimization-settings*)) &body body)
+    `(let ,(loop :for v :in +optimization-variables+ :collect `(,v ,v))
+       ,@(when settings `((proclaim `(optimize ,@,settings))))
+       ,@body)))
 
 
 ;;; Condition control
diff --git a/upgrade.lisp b/upgrade.lisp
index 3a14c78c4d0da3e9d12cd8b1dae575937e28437b..b19cea08d3c662d1946f58601100fec6149afea0 100644
--- a/upgrade.lisp
+++ b/upgrade.lisp
@@ -67,7 +67,7 @@ previously-loaded version of ASDF."
          ;; "3.4.5.67" would be a development version in the official branch, on top of 3.4.5.
          ;; "3.4.5.0.8" would be your eighth local modification of official release 3.4.5
          ;; "3.4.5.67.8" would be your eighth local modification of development version 3.4.5.67
-         (asdf-version "3.1.0.107")
+         (asdf-version "3.1.0.108")
          (existing-version (asdf-version)))
     (setf *asdf-version* asdf-version)
     (when (and existing-version (not (equal asdf-version existing-version)))
diff --git a/version.lisp-expr b/version.lisp-expr
index 19204742c9248a342d9e59f6be128c03ec8d359f..409ab742649e7aebca459072b7936a501939d411 100644
--- a/version.lisp-expr
+++ b/version.lisp-expr
@@ -1,2 +1,2 @@
-"3.1.0.107"
+"3.1.0.108"