merged.

Pascal J. Bourguignon [2015-07-06 20:49]
merged.
Filename
clext/closer-weak-test.lisp
clext/com.informatimago.clext.asd
clext/com.informatimago.clext.association.asd
clext/com.informatimago.clext.association.test.asd
clext/com.informatimago.clext.test.asd
clext/run-program/com.informatimago.clext.run-program.asd
clext/run-program/com.informatimago.clext.run-program.test.asd
clext/run-program/run-program-test.lisp
clisp/com.informatimago.clisp.asd
clisp/com.informatimago.clisp.test.asd
clisp/uffi-bsd.lisp
clisp/uffi.lisp
clmisc/com.informatimago.clmisc.asd
clmisc/com.informatimago.clmisc.test.asd
com.informatimago.asd
com.informatimago.test.asd
common-lisp/apple-file/com.informatimago.common-lisp.apple-file.asd
common-lisp/apple-file/com.informatimago.common-lisp.apple-file.test.asd
common-lisp/arithmetic/com.informatimago.common-lisp.arithmetic.asd
common-lisp/arithmetic/com.informatimago.common-lisp.arithmetic.test.asd
common-lisp/arithmetic/p127n2.lisp
common-lisp/bank/com.informatimago.common-lisp.bank.asd
common-lisp/bank/com.informatimago.common-lisp.bank.test.asd
common-lisp/cesarum/bset.lisp
common-lisp/cesarum/cache-test.lisp
common-lisp/cesarum/cache.lisp
common-lisp/cesarum/com.informatimago.common-lisp.cesarum.asd
common-lisp/cesarum/com.informatimago.common-lisp.cesarum.test.asd
common-lisp/cesarum/date.lisp
common-lisp/cesarum/dictionary.lisp
common-lisp/cesarum/index-set-test.lisp
common-lisp/cesarum/index-set.lisp
common-lisp/cesarum/list-test.lisp
common-lisp/cesarum/llrbtree.lisp
common-lisp/cesarum/sequence-test.lisp
common-lisp/cesarum/set-test.lisp
common-lisp/cesarum/simple-test.lisp
common-lisp/cesarum/sparse-vector-test.lisp
common-lisp/cesarum/stream.lisp
common-lisp/cesarum/string-test.lisp
common-lisp/com.informatimago.common-lisp.asd
common-lisp/com.informatimago.common-lisp.test.asd
common-lisp/csv/com.informatimago.common-lisp.csv.asd
common-lisp/csv/com.informatimago.common-lisp.csv.test.asd
common-lisp/csv/csv.lisp
common-lisp/data-encoding/bencode-test.lisp
common-lisp/data-encoding/com.informatimago.common-lisp.data-encoding.asd
common-lisp/data-encoding/com.informatimago.common-lisp.data-encoding.test.asd
common-lisp/diagram/com.informatimago.common-lisp.diagram.asd
common-lisp/diagram/com.informatimago.common-lisp.diagram.test.asd
common-lisp/ed/com.informatimago.common-lisp.ed.asd
common-lisp/ed/com.informatimago.common-lisp.ed.test.asd
common-lisp/graphviz/com.informatimago.common-lisp.graphviz.asd
common-lisp/graphviz/com.informatimago.common-lisp.graphviz.test.asd
common-lisp/heap/com.informatimago.common-lisp.heap.asd
common-lisp/heap/com.informatimago.common-lisp.heap.test.asd
common-lisp/html-base/com.informatimago.common-lisp.html-base.asd
common-lisp/html-base/com.informatimago.common-lisp.html-base.test.asd
common-lisp/html-generator/com.informatimago.common-lisp.html-generator.asd
common-lisp/html-generator/com.informatimago.common-lisp.html-generator.test.asd
common-lisp/html-generator/html.lisp
common-lisp/html-parser/com.informatimago.common-lisp.html-parser.asd
common-lisp/html-parser/com.informatimago.common-lisp.html-parser.test.asd
common-lisp/http/com.informatimago.common-lisp.http.asd
common-lisp/http/com.informatimago.common-lisp.http.test.asd
common-lisp/interactive/com.informatimago.common-lisp.interactive.asd
common-lisp/interactive/com.informatimago.common-lisp.interactive.test.asd
common-lisp/invoice/com.informatimago.common-lisp.invoice.asd
common-lisp/invoice/com.informatimago.common-lisp.invoice.test.asd
common-lisp/lisp-reader/com.informatimago.common-lisp.lisp-reader.asd
common-lisp/lisp-reader/com.informatimago.common-lisp.lisp-reader.test.asd
common-lisp/lisp-reader/package-fun.lisp
common-lisp/lisp-reader/reader-test.lisp
common-lisp/lisp-reader/reader.lisp
common-lisp/lisp-sexp/com.informatimago.common-lisp.lisp-sexp.asd
common-lisp/lisp-sexp/com.informatimago.common-lisp.lisp-sexp.test.asd
common-lisp/lisp-text/com.informatimago.common-lisp.lisp-text.asd
common-lisp/lisp-text/com.informatimago.common-lisp.lisp-text.test.asd
common-lisp/lisp/com.informatimago.common-lisp.lisp.asd
common-lisp/lisp/com.informatimago.common-lisp.lisp.ibcl.asd
common-lisp/lisp/com.informatimago.common-lisp.lisp.ibcl.test.asd
common-lisp/lisp/com.informatimago.common-lisp.lisp.stepper.asd
common-lisp/lisp/com.informatimago.common-lisp.lisp.stepper.test.asd
common-lisp/lisp/com.informatimago.common-lisp.lisp.test.asd
common-lisp/parser/com.informatimago.common-lisp.parser.asd
common-lisp/parser/com.informatimago.common-lisp.parser.test.asd
common-lisp/parser/scanner.lisp
common-lisp/picture/com.informatimago.common-lisp.picture.asd
common-lisp/picture/com.informatimago.common-lisp.picture.test.asd
common-lisp/picture/picture.lisp
common-lisp/regexp/com.informatimago.common-lisp.regexp.test.asd
common-lisp/rfc2822/com.informatimago.common-lisp.rfc2822.asd
common-lisp/rfc2822/com.informatimago.common-lisp.rfc2822.test.asd
common-lisp/rfc3548/com.informatimago.common-lisp.rfc3548.asd
common-lisp/rfc3548/com.informatimago.common-lisp.rfc3548.test.asd
common-lisp/rfc3548/rfc3548-test.lisp
common-lisp/telnet/com.informatimago.common-lisp.telnet.asd
common-lisp/telnet/com.informatimago.common-lisp.telnet.test.asd
common-lisp/unix/com.informatimago.common-lisp.unix.asd
common-lisp/unix/com.informatimago.common-lisp.unix.test.asd
editor/com.informatimago.editor.asd
editor/com.informatimago.editor.test.asd
editor/editor.lisp
future/com.informatimago.future.asd
future/com.informatimago.future.empty.asd
future/com.informatimago.future.empty.test.asd
future/com.informatimago.future.test.asd
languages/cpp/c-string-reader-test.lisp
languages/cpp/c-string-reader.lisp
languages/cpp/com.informatimago.languages.cpp.asd
languages/cpp/com.informatimago.languages.cpp.test.asd
languages/cpp/cpp-macro.lisp
languages/cpp/cpp-test.lisp
languages/cpp/cpp.lisp
languages/cpp/expression-test.lisp
languages/cpp/expression.lisp
languages/cpp/packages.lisp
languages/cxx/com.informatimago.languages.cxx.asd
languages/cxx/com.informatimago.languages.cxx.test.asd
languages/linc/com.informatimago.linc.asd
languages/linc/com.informatimago.linc.test.asd
languages/lua/com.informatimago.languages.lua.asd
languages/lua/com.informatimago.languages.lua.test.asd
languages/lua/lua-scanner-test.lisp
lispdoc/com.informatimago.lispdoc.asd
lispdoc/com.informatimago.lispdoc.test.asd
objcl/com.informatimago.objcl.asd
objcl/com.informatimago.objcl.cocoa-playground.asd
objcl/com.informatimago.objcl.cocoa-playground.test.asd
objcl/com.informatimago.objcl.test.asd
objcl/gnu/com.ogamita.swig.asd
objcl/gnu/com.ogamita.swig.test.asd
objcl/mac-roman-test.lisp
objcl/mac-roman.lisp
objcl/objc-support.lisp
objcl/objcl-test.lisp
objcl/packages.lisp
rdp/com.informatimago.rdp.basic.asd
rdp/com.informatimago.rdp.basic.example.asd
rdp/com.informatimago.rdp.basic.example.test.asd
rdp/com.informatimago.rdp.basic.test.asd
rdp/com.informatimago.rdp.example.asd
rdp/com.informatimago.rdp.example.test.asd
rdp/com.informatimago.rdp.test.asd
small-cl-pgms/botihn/com.informatimago.small-cl-pgms.botihn.asd
small-cl-pgms/brainfuck/com.informatimago.small-cl-pgms.brainfuck.asd
small-cl-pgms/brainfuck/com.informatimago.small-cl-pgms.brainfuck.test.asd
small-cl-pgms/com.informatimago.small-cl-pgms.asd
small-cl-pgms/com.informatimago.small-cl-pgms.life.asd
small-cl-pgms/com.informatimago.small-cl-pgms.life.test.asd
small-cl-pgms/com.informatimago.small-cl-pgms.quine.asd
small-cl-pgms/com.informatimago.small-cl-pgms.quine.test.asd
small-cl-pgms/com.informatimago.small-cl-pgms.test.asd
small-cl-pgms/com.informatimago.small-cl-pgms.what-implementation.asd
small-cl-pgms/com.informatimago.small-cl-pgms.what-implementation.test.asd
susv3/com.informatimago.susv3.asd
susv3/com.informatimago.susv3.test.asd
tools/check-asdf.lisp
tools/com.informatimago.tools.asd
tools/com.informatimago.tools.bad-system-with-cycles.asd
tools/com.informatimago.tools.check-asdf.asd
tools/com.informatimago.tools.check-asdf.test.asd
tools/com.informatimago.tools.make-depends.asd
tools/com.informatimago.tools.make-depends.test.asd
tools/com.informatimago.tools.manifest.asd
tools/com.informatimago.tools.manifest.test.asd
tools/com.informatimago.tools.pathname.asd
tools/com.informatimago.tools.pathname.test.asd
tools/com.informatimago.tools.quicklisp.asd
tools/com.informatimago.tools.quicklisp.test.asd
tools/com.informatimago.tools.script.asd
tools/com.informatimago.tools.script.test.asd
tools/com.informatimago.tools.source.asd
tools/com.informatimago.tools.source.test.asd
tools/com.informatimago.tools.summary.asd
tools/com.informatimago.tools.summary.test.asd
tools/com.informatimago.tools.symbol.asd
tools/com.informatimago.tools.symbol.test.asd
tools/com.informatimago.tools.test.asd
tools/com.informatimago.tools.thread.asd
tools/com.informatimago.tools.undefmethod.asd
tools/com.informatimago.tools.undefmethod.test.asd
tools/manifest.lisp
tools/quicklisp.lisp
tools/source.lisp
tools/undefmethod-test.lisp
xcode/com.informatimago.xcode.asd
xcode/com.informatimago.xcode.test.asd
diff --git a/clext/closer-weak-test.lisp b/clext/closer-weak-test.lisp
index a703214..9ce585d 100644
--- a/clext/closer-weak-test.lisp
+++ b/clext/closer-weak-test.lisp
@@ -48,12 +48,21 @@
   #+clisp (:import-from "EXT" "GC")
   #+cmu   (:import-from "EXTENSIONS" "GC")
   #+ccl   (:import-from "CCL" "GC")
+  (:shadowing-import-from
+   "COM.INFORMATIMAGO.CLEXT.CLOSER-WEAK"
+   "HASH-TABLE" "MAKE-HASH-TABLE"
+   "HASH-TABLE-P" "HASH-TABLE-COUNT" "HASH-TABLE-REHASH-SIZE"
+   "HASH-TABLE-REHASH-THRESHOLD" "HASH-TABLE-SIZE" "HASH-TABLE-TEST"
+   "GETHASH" "REMHASH" "MAPHASH" "WITH-HASH-TABLE-ITERATOR" "CLRHASH")
   (:export "TEST/ALL"))
 (in-package "COM.INFORMATIMAGO.CLEXT.CLOSER-WEAK.TEST")

 #+sbcl (defun gc () (sb-ext:gc :full t))

-
+(defvar co)
+(defvar tab)
+(defvar wp)
+(defvar wpp)

 ;;;
 ;;; This tests.lisp is taken from clisp-2.38/tests/tests.lisp
diff --git a/clext/com.informatimago.clext.asd b/clext/com.informatimago.clext.asd
index 1fbadcb..5b19fdc 100644
--- a/clext/com.informatimago.clext.asd
+++ b/clext/com.informatimago.clext.asd
@@ -46,7 +46,7 @@ specifications, like GRAY or other portability libraries.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.3.2"
+  :version "1.3.4"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.clext/")
diff --git a/clext/com.informatimago.clext.association.asd b/clext/com.informatimago.clext.association.asd
index e82eb38..8759a50 100644
--- a/clext/com.informatimago.clext.association.asd
+++ b/clext/com.informatimago.clext.association.asd
@@ -45,7 +45,7 @@ This system would use CLOSER-MOP, which is not available on MOCL.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.0.0"
+  :version "1.0.2"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.clext/")
@@ -71,7 +71,7 @@ CLOS associations.  It uses CLOSER-MOP.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.0.0"
+  :version "1.0.2"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.clext/")
diff --git a/clext/com.informatimago.clext.association.test.asd b/clext/com.informatimago.clext.association.test.asd
index aac8467..ae517d7 100644
--- a/clext/com.informatimago.clext.association.test.asd
+++ b/clext/com.informatimago.clext.association.test.asd
@@ -45,7 +45,7 @@ to define CLOS associations.  It uses CLOSER-MOP.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.0.0"
+  :version "1.0.2"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.clext/")
@@ -55,12 +55,13 @@ to define CLOS associations.  It uses CLOSER-MOP.
                ((#:albert #:docbook #:textcolor) . "black"))
   #+asdf-unicode :encoding #+asdf-unicode :utf-8
   :depends-on ("closer-mop"
+               "com.informatimago.common-lisp.cesarum"
                "com.informatimago.clext.association")
   :components ((:file "association-test"))
-  :perform (asdf:test-op
-            (o s)
-            (let ((*package* (find-package "COM.INFORMATIMAGO.CLEXT.ASSOCIATION")))
-              (uiop:symbol-call "COM.INFORMATIMAGO.CLEXT.ASSOCIATION.TEST"  "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (o s)
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.CLEXT.ASSOCIATION")))
+                              (uiop:symbol-call "COM.INFORMATIMAGO.CLEXT.ASSOCIATION.TEST"  "TEST/ALL"))))


 ;;;; THE END ;;;;
diff --git a/clext/com.informatimago.clext.test.asd b/clext/com.informatimago.clext.test.asd
index 0d3fe57..8a694f4 100644
--- a/clext/com.informatimago.clext.test.asd
+++ b/clext/com.informatimago.clext.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.clext")
   :components     ((:file "closer-weak-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.CLEXT.CLOSER-WEAK.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.CLEXT.CLOSER-WEAK.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.CLEXT.CLOSER-WEAK.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.CLEXT.CLOSER-WEAK.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/clext/run-program/com.informatimago.clext.run-program.asd b/clext/run-program/com.informatimago.clext.run-program.asd
index df0329d..189f627 100644
--- a/clext/run-program/com.informatimago.clext.run-program.asd
+++ b/clext/run-program/com.informatimago.clext.run-program.asd
@@ -35,7 +35,7 @@
 (asdf:defsystem "com.informatimago.clext.run-program"
   :description "An portable run-program function."
   :author "Pascal J. Bourguignon"
-  :version "1.0.0"
+  :version "1.0.2"
   :license "AGPL3"
   :depends-on ("com.informatimago.common-lisp.cesarum")
   :components ((:file "run-program"))
diff --git a/clext/run-program/com.informatimago.clext.run-program.test.asd b/clext/run-program/com.informatimago.clext.run-program.test.asd
index 868bce6..41d1085 100644
--- a/clext/run-program/com.informatimago.clext.run-program.test.asd
+++ b/clext/run-program/com.informatimago.clext.run-program.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.clext.run-program")
   :components     ((:file "run-program-test"))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (dolist (p '( "COM.INFORMATIMAGO.CLEXT.RUN-PROGRAM.TEST"))
-                     (let ((*package* (find-package p)))
-                       (uiop/package:symbol-call p "TEST/ALL")))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (dolist (p '( "COM.INFORMATIMAGO.CLEXT.RUN-PROGRAM.TEST"))
+                              (let ((*package* (find-package p)))
+                                (uiop/package:symbol-call p "TEST/ALL")))))

 ;;;; THE END ;;;;
diff --git a/clext/run-program/run-program-test.lisp b/clext/run-program/run-program-test.lisp
index a79374d..19f8b82 100644
--- a/clext/run-program/run-program-test.lisp
+++ b/clext/run-program/run-program-test.lisp
@@ -91,7 +91,7 @@ Journal
                                        "algorithme" "en" "question" "a" "ete" "publie"
                                        "en" "1960" "dans" "IBM" "Journal"))
                            (function string<))))
-    (test equal sorted-list stream-contents
+    (check equal sorted-list stream-contents
            () "~%~20A=~S~%~20A=~S~%"
            "sorted-list" sorted-list
            "stream-contents" stream-contents)))
@@ -120,16 +120,16 @@ Journal

   (run-program "true" '() :wait nil :error "TESTERR.TXT")
   (sleep 1)
-  (test equal '() (text-file-contents "TESTERR.TXT"))
+  (check equal '() (text-file-contents "TESTERR.TXT"))

   (run-program "true" '() :wait t :error "TESTERR.TXT")
-  (test equal '() (text-file-contents "TESTERR.TXT"))
+  (check equal '() (text-file-contents "TESTERR.TXT"))



   (let ((process (run-program "sh" '("-c" "echo error 1>&2")
                               :wait nil :input nil :output nil :error :stream)))
-    (test equal '("error")
+    (check equal '("error")
           (unwind-protect
                (text-stream-contents (process-error process))
             (close (process-error process)))))
@@ -138,7 +138,7 @@ Journal
   (ignore-errors (delete-file "TESTERR.TXT"))
   (run-program "sh" '("-c" "echo error 1>&2")
                :wait t :input nil :output nil :error "TESTERR.TXT")
-  (test equal '("error") (text-file-contents "TESTERR.TXT"))
+  (check equal '("error") (text-file-contents "TESTERR.TXT"))


   (with-open-file (err "TESTERR.TXT"
@@ -147,7 +147,7 @@ Journal
                        )
     (run-program "sh" '("-c" "echo error 1>&2")
                  :wait t :input nil :output nil :error err))
-  (test equal '("error") (text-file-contents "TESTERR.TXT"))
+  (check equal '("error") (text-file-contents "TESTERR.TXT"))


   (run-program "printf" '("Hello\\nWorld\\n") :wait t)
@@ -155,7 +155,7 @@ Journal
   (run-program "printf" '("Hello\\nWorld\\n") :wait nil)

   (let ((process (run-program "printf" '("Hello\\nWorld\\n") :wait nil :output :stream)))
-    (test equal '("Hello" "World")
+    (check equal '("Hello" "World")
           (unwind-protect
                (loop
                  :for line = (read-line (process-output process) nil nil)
@@ -168,14 +168,14 @@ Journal
                        #+ccl :sharing #+ccl :lock)
      (run-program "printf" '("Hello\\nWorld\\n") :wait nil :output out)
      (sleep 1))
-  (test equal '("Hello" "World") (text-file-contents "TESTOUT.TXT"))
+  (check equal '("Hello" "World") (text-file-contents "TESTOUT.TXT"))


   (with-open-file (out  "TESTOUT.TXT"
                         :direction :output :if-does-not-exist :create :if-exists :supersede
                        #+ccl :sharing #+ccl :lock)
     (run-program "printf" '("Hello\\nWorld\\n") :wait t :output out))
-  (test equal '("Hello" "World") (text-file-contents "TESTOUT.TXT"))
+  (check equal '("Hello" "World") (text-file-contents "TESTOUT.TXT"))


   (run-program "sort" '() :environment '(("LC_CTYPE"   . "C") ("LC_COLLATE" . "C"))
diff --git a/clisp/com.informatimago.clisp.asd b/clisp/com.informatimago.clisp.asd
index d905714..37b8898 100644
--- a/clisp/com.informatimago.clisp.asd
+++ b/clisp/com.informatimago.clisp.asd
@@ -42,7 +42,7 @@
   :author "Pascal J. Bourguignon <pjb@informatimago.com>"
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :license "AGPL3"
-  :version "1.2.2"
+  :version "1.2.4"
   :depends-on ()
   :components ())

@@ -60,7 +60,7 @@ should be made into implementation independant packages).
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.2"
+  :version "1.2.4"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Spring 2014")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.clmisc/")
diff --git a/clisp/com.informatimago.clisp.test.asd b/clisp/com.informatimago.clisp.test.asd
index 74a88a2..134b396 100644
--- a/clisp/com.informatimago.clisp.test.asd
+++ b/clisp/com.informatimago.clisp.test.asd
@@ -37,6 +37,7 @@
 ;;;;    along with this program.  If not, see <http://www.gnu.org/licenses/>
 ;;;;
 ;;;;***************************************************************************
+(in-package "COMMON-LISP-USER")

 #-clisp
 (asdf:defsystem "com.informatimago.clisp.test"
@@ -46,7 +47,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,9 +59,8 @@
   #+asdf-unicode :encoding #+asdf-unicode :utf-8
   :depends-on     ()
   :components     ()
-  :perform        (asdf:test-op
-                   (operation system)
-                   (declare (ignore operation system))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op (o s) (declare (ignore o s))))
+

 #+clisp
 (asdf:defsystem "com.informatimago.clisp.test"
@@ -70,7 +70,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -83,11 +83,10 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.clisp")
   :components     ((:file "string-test" :depends-on ()))
-  :perform        (asdf:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (dolist (p '("COM.INFORMATIMAGO.CLISP.STRING.TEST"))
-                     (let ((*package* (find-package p)))
-                       (uiop/package:symbol-call p "TEST/ALL")))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op (operation system)
+                                         (declare (ignore operation system))
+                                         (dolist (p '("COM.INFORMATIMAGO.CLISP.STRING.TEST"))
+                                           (let ((*package* (find-package p)))
+                                             (uiop/package:symbol-call p "TEST/ALL")))))

 ;;;; THE END ;;;;
diff --git a/clisp/uffi-bsd.lisp b/clisp/uffi-bsd.lisp
index c8a020b..5bbc32a 100644
--- a/clisp/uffi-bsd.lisp
+++ b/clisp/uffi-bsd.lisp
@@ -354,7 +354,7 @@ LEGAL:  Copyright Pascal J. Bourguignon 2003 - 2004
   ) ;;+TYPE-CONVERSION-HASH+


-(proclaim '(inline get-type-conversion-record))
+(declaim (inline get-type-conversion-record))
 (defun get-type-conversion-record (uffi-type)
   "
 PRIVATE
diff --git a/clisp/uffi.lisp b/clisp/uffi.lisp
index c776162..4977218 100644
--- a/clisp/uffi.lisp
+++ b/clisp/uffi.lisp
@@ -342,7 +342,7 @@ LEGAL:  Copyright Pascal J. Bourguignon 2003 - 2004
   ) ;;+TYPE-CONVERSION-HASH+


-(proclaim '(inline get-type-conversion-record))
+(declaim (inline get-type-conversion-record))
 (defun get-type-conversion-record (uffi-type)
   "
 PRIVATE
diff --git a/clmisc/com.informatimago.clmisc.asd b/clmisc/com.informatimago.clmisc.asd
index 2edd6a6..ee524b0 100644
--- a/clmisc/com.informatimago.clmisc.asd
+++ b/clmisc/com.informatimago.clmisc.asd
@@ -47,7 +47,7 @@ a format similar to what is used by LISTSERV.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.clmisc/")
diff --git a/clmisc/com.informatimago.clmisc.test.asd b/clmisc/com.informatimago.clmisc.test.asd
index 27b9195..0fde462 100644
--- a/clmisc/com.informatimago.clmisc.test.asd
+++ b/clmisc/com.informatimago.clmisc.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.clmisc")
   :components     ((:file "resource-utilization-test" :depends-on ()))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.CLMISC.RESOURCE-UTILIZATION.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.CLMISC.RESOURCE-UTILIZATION.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.CLMISC.RESOURCE-UTILIZATION.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.CLMISC.RESOURCE-UTILIZATION.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/com.informatimago.asd b/com.informatimago.asd
index 9883023..61930fe 100644
--- a/com.informatimago.asd
+++ b/com.informatimago.asd
@@ -31,7 +31,7 @@
 ;;;;    You should have received a copy of the GNU Affero General Public License
 ;;;;    along with this program.  If not, see http://www.gnu.org/licenses/
 ;;;;**************************************************************************
-
+(in-package "COMMON-LISP-USER")

 (asdf:defsystem "com.informatimago"
   ;; system attributes:
@@ -41,7 +41,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.0.0"
+  :version "1.0.2"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Winter 2014")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago/")
@@ -69,4 +69,12 @@
   :in-order-to ((asdf:test-op (asdf:test-op "com.informatimago.test"))))


+(defun test-all-com.informatimago ()
+  (asdf:oos 'asdf:load-op :com.informatimago.test)
+  (eval (read-from-string "
+         (let ((com.informatimago.common-lisp.cesarum.simple-test::*current-test-name*       'test-all-com.informatimago)
+               (com.informatimago.common-lisp.cesarum.simple-test::*current-test-parameters* '()))
+           (com.informatimago.common-lisp.cesarum.simple-test:testing
+             (asdf:oos 'asdf:test-op :com.informatimago.test)))")))
+
 ;;;; THE END ;;;;
diff --git a/com.informatimago.test.asd b/com.informatimago.test.asd
index fb09145..be9031a 100644
--- a/com.informatimago.test.asd
+++ b/com.informatimago.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -85,6 +85,7 @@
                  (asdf:test-op "com.informatimago.editor.test")
                  (asdf:test-op "com.informatimago.objcl.test")
                  (asdf:test-op "com.informatimago.susv3.test")
-                 (asdf:test-op "com.informatimago.clisp.test"))))
+                 (asdf:test-op "com.informatimago.clisp.test")
+                 (asdf:test-op "com.informatimago.languages.cpp.test"))))

 ;;;; THE END ;;;;
diff --git a/common-lisp/apple-file/com.informatimago.common-lisp.apple-file.asd b/common-lisp/apple-file/com.informatimago.common-lisp.apple-file.asd
index 67ecc0a..0a03174 100644
--- a/common-lisp/apple-file/com.informatimago.common-lisp.apple-file.asd
+++ b/common-lisp/apple-file/com.informatimago.common-lisp.apple-file.asd
@@ -44,7 +44,7 @@ Read Apple-Single and Apple-Double file formats.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.0.0"
+  :version "1.0.2"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Spring 2013")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.apple-file/")
diff --git a/common-lisp/apple-file/com.informatimago.common-lisp.apple-file.test.asd b/common-lisp/apple-file/com.informatimago.common-lisp.apple-file.test.asd
index 9a69be8..f7e3351 100644
--- a/common-lisp/apple-file/com.informatimago.common-lisp.apple-file.test.asd
+++ b/common-lisp/apple-file/com.informatimago.common-lisp.apple-file.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.apple-file")
   :components     ((:file "apple-file-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (dolist (p '("COM.INFORMATIMAGO.COMMON-LISP.APPLE-FILE.APPLE-FILE.TEST"))
-                     (let ((*package* (find-package p)))
-                       (uiop/package:symbol-call p "TEST/ALL")))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (dolist (p '("COM.INFORMATIMAGO.COMMON-LISP.APPLE-FILE.APPLE-FILE.TEST"))
+                              (let ((*package* (find-package p)))
+                                (uiop/package:symbol-call p "TEST/ALL")))))

 ;;;; THE END ;;;;
diff --git a/common-lisp/arithmetic/com.informatimago.common-lisp.arithmetic.asd b/common-lisp/arithmetic/com.informatimago.common-lisp.arithmetic.asd
index 6bdf30d..3be5b14 100644
--- a/common-lisp/arithmetic/com.informatimago.common-lisp.arithmetic.asd
+++ b/common-lisp/arithmetic/com.informatimago.common-lisp.arithmetic.asd
@@ -41,7 +41,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.arithmetic/")
diff --git a/common-lisp/arithmetic/com.informatimago.common-lisp.arithmetic.test.asd b/common-lisp/arithmetic/com.informatimago.common-lisp.arithmetic.test.asd
index c52f289..9a19ba8 100644
--- a/common-lisp/arithmetic/com.informatimago.common-lisp.arithmetic.test.asd
+++ b/common-lisp/arithmetic/com.informatimago.common-lisp.arithmetic.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.arithmetic")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/arithmetic/p127n2.lisp b/common-lisp/arithmetic/p127n2.lisp
index f9224b9..f2b47fd 100644
--- a/common-lisp/arithmetic/p127n2.lisp
+++ b/common-lisp/arithmetic/p127n2.lisp
@@ -205,6 +205,7 @@ RETURN:  A string containing a human readable representation of the polynom POLY
                                   ))
   "A vector with all legal odd-parity bytes, in 7-bit order.")

+(declaim (inline even-parity odd-parity))

 (defun even-parity (byte)
   "
@@ -220,7 +221,7 @@ RETURN: The BYTE with the parity bit set to odd parity.
 "
     (aref *odd-parity*  (logand byte #x7f)))

-(declaim (inline even-parity odd-parity))
+


 (defun remove-bit7 (poly)
diff --git a/common-lisp/bank/com.informatimago.common-lisp.bank.asd b/common-lisp/bank/com.informatimago.common-lisp.bank.asd
index 32a1e74..15dbf8d 100644
--- a/common-lisp/bank/com.informatimago.common-lisp.bank.asd
+++ b/common-lisp/bank/com.informatimago.common-lisp.bank.asd
@@ -40,7 +40,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.bank/")
diff --git a/common-lisp/bank/com.informatimago.common-lisp.bank.test.asd b/common-lisp/bank/com.informatimago.common-lisp.bank.test.asd
index 597c899..de68bde 100644
--- a/common-lisp/bank/com.informatimago.common-lisp.bank.test.asd
+++ b/common-lisp/bank/com.informatimago.common-lisp.bank.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.bank")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/cesarum/bset.lisp b/common-lisp/cesarum/bset.lisp
index d8904f8..bf67f93 100644
--- a/common-lisp/cesarum/bset.lisp
+++ b/common-lisp/cesarum/bset.lisp
@@ -127,7 +127,7 @@ RETURN: A new copy of the ORIGINAL bset.
 (defmacro bsref (bsa i) `(aref ,bsa ,i))


-(proclaim '(inline last-bitset))
+(declaim (inline last-bitset))
 (defun last-bitset (bitsets)
   "
 RETURN:  The index of the last bitset in the BITSETS array.
@@ -135,7 +135,7 @@ RETURN:  The index of the last bitset in the BITSETS array.
   (1- (array-dimension bitsets 0)))


-(proclaim '(inline elem-to-bitset))
+(declaim (inline elem-to-bitset))
 (defun elem-to-bitset (element)
   "
 RETURN:  The index of the bitset where element is stored.
@@ -148,12 +148,12 @@ NOTE:     0 --> 0
   (truncate element +bit-per-bitset+))


-(proclaim '(inline elem-to-bit))
+(declaim (inline elem-to-bit))
 (defun elem-to-bit (element)
   (mod element +bit-per-bitset+))


-(proclaim '(inline bitset-to-elem))
+(declaim (inline bitset-to-elem))
 (defun bitset-to-elem (index)
   "
 RETURN:  The maximum element + 1 that can be stored in the bitset at INDEX.
diff --git a/common-lisp/cesarum/cache-test.lisp b/common-lisp/cesarum/cache-test.lisp
index 18c6c8e..ad54388 100644
--- a/common-lisp/cesarum/cache-test.lisp
+++ b/common-lisp/cesarum/cache-test.lisp
@@ -53,23 +53,22 @@
                     (directory "/tmp/cache/**/*.*")))
    (setf *test-counter* 0)
    (let ((delay 7))
-     (flet ((producer (key) (values (format nil "~A-~A" key
+     (flet ((producer (key) (values (format nil "~(~A-~A~)" key
                                             (incf *test-counter* ))
                                     (+ delay (get-universal-time))))
             (print-files ()
               (dolist (file (sort (mapcar (function namestring) (directory "/tmp/cache/**/*.*"))
                                   (function string<)))
                 (princ file) (terpri))))
-       (setf *test-cache* (make-cache #p"/tmp/cache/" (function producer)
-                                      :value-file-type "SYM"))
-       (assert-true (string= (cache-get *test-cache* :one)   "ONE-1"))
-       (assert-true (string= (cache-get *test-cache* :two)   "TWO-2"))
-       (assert-true (string= (cache-get *test-cache* :three) "THREE-3"))
-       (assert-true (string= (cache-get *test-cache* :one)   "ONE-1"))
-       (assert-true (string= (cache-get *test-cache* :two)   "TWO-2"))
-       (assert-true (string= (cache-get *test-cache* :three) "THREE-3"))
+       (setf *test-cache* (make-cache #p"/tmp/cache/" (function producer) :value-file-type "SYM"))
+       (assert-true (string= (cache-get *test-cache* :one)   "one-1"))
+       (assert-true (string= (cache-get *test-cache* :two)   "two-2"))
+       (assert-true (string= (cache-get *test-cache* :three) "three-3"))
+       (assert-true (string= (cache-get *test-cache* :one)   "one-1"))
+       (assert-true (string= (cache-get *test-cache* :two)   "two-2"))
+       (assert-true (string= (cache-get *test-cache* :three) "three-3"))
        (setf *test-cache-2* (make-cache #p"/tmp/cache/" (function producer)))
-       (assert-true (string= (cache-get *test-cache-2* :one)   "ONE-1"))
+       (assert-true (string= (cache-get *test-cache-2* :one)   "one-1"))
        (assert-true (string= "SYM" (cache-value-file-type *test-cache-2*)))
        (format t "~2&filled:~%")(finish-output)
        (print-files)
@@ -77,7 +76,7 @@
        (cache-expire *test-cache* :two :keep-file t)
        (format t "~2&expired :one and :two:~%")(finish-output)
        (print-files)
-       (assert-true (string= (cache-get *test-cache* :one)   "ONE-4"))
+       (assert-true (string= (cache-get *test-cache* :one)   "one-4"))
        (format t "~2&expirations~%~:{~15A in ~4D seconds~%~}"
                (cache-map-entries *test-cache*
                                   'list (lambda (entry)
@@ -88,20 +87,17 @@
        (format t "~2&waiting ~D s expiration of :one and :three:~%" delay)
        (finish-output)
        (sleep (1+ delay))
-       (assert-true (string= (cache-get *test-cache* :one)   "ONE-5"))
-       (assert-true (string= (cache-get *test-cache* :three) "THREE-6"))
+       (assert-true (string= (cache-get *test-cache* :one)   "one-5"))
+       (assert-true (string= (cache-get *test-cache* :three) "three-6"))
        (cache-expire-all *test-cache*)
        (format t "~2&expired all~%")(finish-output)
        (print-files)
-       (assert-true (string= (cache-get *test-cache* :one)   "ONE-7"))
-       (assert-true (string= (cache-get *test-cache* :three) "THREE-8"))
-       (assert-true (string= (cache-get *test-cache-2* :one)   "ONE-7"))
-       (assert-true (string= (cache-get *test-cache-2* :three) "THREE-8"))
+       (assert-true (string= (cache-get *test-cache* :one)   "one-7"))
+       (assert-true (string= (cache-get *test-cache* :three) "three-8"))
+       (assert-true (string= (cache-get *test-cache-2* :one)   "one-7"))
+       (assert-true (string= (cache-get *test-cache-2* :three) "three-8"))
        (cache-map-entries *test-cache* nil (function print))))))

-
-
-
 #||

 (define-message html-page-req (sender uri))
diff --git a/common-lisp/cesarum/cache.lisp b/common-lisp/cesarum/cache.lisp
index 730848f..8a3a0f8 100644
--- a/common-lisp/cesarum/cache.lisp
+++ b/common-lisp/cesarum/cache.lisp
@@ -245,7 +245,7 @@ RETURN: The type used for value files in the cache directory.
    (cache-producer
     :reader   cache-producer
     :initarg :producer
-    :type     '(function (t) (values t (integer 0)))
+    :type     (function (t) (values t (integer 0)))
     ;; (producer key) --> value ; expiration
     :documentation "The function used to get fresh data.
      Returns two values: the data and the expiration universal time.")
diff --git a/common-lisp/cesarum/com.informatimago.common-lisp.cesarum.asd b/common-lisp/cesarum/com.informatimago.common-lisp.cesarum.asd
index aa7d10f..cfeafc8 100644
--- a/common-lisp/cesarum/com.informatimago.common-lisp.cesarum.asd
+++ b/common-lisp/cesarum/com.informatimago.common-lisp.cesarum.asd
@@ -62,7 +62,7 @@ all written in 100% conforming Common Lisp.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.3.3"
+  :version "1.3.5"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.cesarum/")
diff --git a/common-lisp/cesarum/com.informatimago.common-lisp.cesarum.test.asd b/common-lisp/cesarum/com.informatimago.common-lisp.cesarum.test.asd
index 01b8ba3..477a095 100644
--- a/common-lisp/cesarum/com.informatimago.common-lisp.cesarum.test.asd
+++ b/common-lisp/cesarum/com.informatimago.common-lisp.cesarum.test.asd
@@ -46,7 +46,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.3.3"
+  :version "1.3.5"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Winter 2015")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.cesarum-test/")
@@ -70,24 +70,24 @@
                (:file "string-test"         :depends-on ())
                (:file "set-test"            :depends-on ())
                (:file "index-set-test"      :depends-on ("set-test")))
-  :perform (asdf:test-op
-            (operation system)
-            (dolist (p '("COM.INFORMATIMAGO.COMMON-LISP.CESARUM.A-STAR.TEST"
-                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.CACHE.TEST"
-                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.DATE.TEST"
-                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.DICTIONARY.TEST"
-                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.FILE.TEST"
-                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.LIST.TEST"
-                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.LLRBTREE.TEST"
-                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.PEEK-STREAM.TEST"
-                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.PRIORITY-QUEUE.TEST"
-                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.SEQUENCE.TEST"
-                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING.TEST"
-                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.SET.TEST"
-                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.INDEX-SET.TEST"
-                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.ASCII.TEST"))
-              (let ((*package* (find-package p)))
-                (uiop:symbol-call p "TEST/ALL")))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (dolist (p '("COM.INFORMATIMAGO.COMMON-LISP.CESARUM.A-STAR.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.CACHE.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.DATE.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.DICTIONARY.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.FILE.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.LIST.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.LLRBTREE.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.PEEK-STREAM.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.PRIORITY-QUEUE.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.SEQUENCE.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.SET.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.INDEX-SET.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.ASCII.TEST"))
+                              (let ((*package* (find-package p)))
+                                (uiop:symbol-call p "TEST/ALL")))))


 ;;;; THE END ;;;;
diff --git a/common-lisp/cesarum/date.lisp b/common-lisp/cesarum/date.lisp
index cf7b428..c7c66d2 100644
--- a/common-lisp/cesarum/date.lisp
+++ b/common-lisp/cesarum/date.lisp
@@ -586,18 +586,18 @@ NOTE:    Only the keywords listed in *DURATION-KEYWORDS* are really allowed.
              `(progn
                 (defgeneric ,name (duration)
                   (:documentation ,(let ((*print-circle* nil))
-                                        (format nil "RETURN: The ~A of the duration.
+                                     (format nil "RETURN: The ~A of the duration.
 NOTE:   This is not the duration expressed in ~:*~A, just the ~:*~A
         component of the duration." (string-downcase name))))
                   (:method ((self duration))
                     (getf (slot-value self 'expression)
                           ',(intern (string name) "KEYWORD") 0)))
-                ,@(unless
-                   no-writer-p
-                   `((defmethod (setf ,name) (value (self duration))
-                       (setf (getf (slot-value self 'expression)
-                                   ',(intern (string name) "KEYWORD"))
-                             value))))
+                ,@(unless no-writer-p
+                    `((defgeneric (setf ,name) (value duration))
+                      (defmethod (setf ,name) (value (self duration))
+                        (setf (getf (slot-value self 'expression)
+                                    ',(intern (string name) "KEYWORD"))
+                              value))))
                 ',name)))
   (define-accessor seconde)
   (define-accessor minute)
@@ -1001,6 +1001,7 @@ NOTE:           UNIVERSAL-TIME when present gives a base date with
   (with-slots (year month day hour minute seconde) (to-timezone self 0)
      (list year month day hour minute seconde)))

+(defgeneric units-of-list-of-numbers (date))
 (defmethod units-of-list-of-numbers  ((self gregorian-calendar-date))
   (declare (ignorable self))
   (list :year :month :day :hour :minute :seconde))
diff --git a/common-lisp/cesarum/dictionary.lisp b/common-lisp/cesarum/dictionary.lisp
index 091de51..74f3d72 100644
--- a/common-lisp/cesarum/dictionary.lisp
+++ b/common-lisp/cesarum/dictionary.lisp
@@ -263,7 +263,7 @@ switches to hash-tables, and below which it switches to A-lists."))
                :accessor adaptating-dictionary-limit))
   (:documentation "A dictionary that changes between an A-list implementation and a hash-table implementation depending on the number of entries."))

-
+(defgeneric adaptating-dictionary-adapt (dictionary))
 (defmethod adaptating-dictionary-adapt ((dictionary adaptating-dictionary))
   (flet ((copy-dictionary (dictionary type)
            (make-dictionary type
diff --git a/common-lisp/cesarum/index-set-test.lisp b/common-lisp/cesarum/index-set-test.lisp
index 53b4189..6e9646d 100644
--- a/common-lisp/cesarum/index-set-test.lisp
+++ b/common-lisp/cesarum/index-set-test.lisp
@@ -60,71 +60,71 @@
   (assert-true (equal-range (make-range :start 0 :end -1)
                             (make-range :first 0 :last -1)))

-  (test = (range-start (make-range :start 1 :count 3)) 1)
-  (test = (range-last  (make-range :start 1 :count 3)) 3)
-  (test = (range-end   (make-range :start 1 :count 3)) 4)
-  (test = (range-count (make-range :start 1 :count 3)) 3)
-  (test = (range-start (copy-range (make-range :start 1 :count 3))) 1)
-  (test = (range-last  (copy-range (make-range :start 1 :count 3))) 3)
-  (test = (range-end   (copy-range (make-range :start 1 :count 3))) 4)
-  (test = (range-count (copy-range (make-range :start 1 :count 3))) 3)
-
-  (test = (range-start (make-range :start 11 :last 13)) 11)
-  (test = (range-last  (make-range :start 11 :last 13)) 13)
-  (test = (range-end   (make-range :start 11 :last 13)) 14)
-  (test = (range-count (make-range :start 11 :last 13))  3)
-  (test = (range-start (copy-range (make-range :start 11 :last 13))) 11)
-  (test = (range-last  (copy-range (make-range :start 11 :last 13))) 13)
-  (test = (range-end   (copy-range (make-range :start 11 :last 13))) 14)
-  (test = (range-count (copy-range (make-range :start 11 :last 13)))  3)
-
-  (test = (range-start (make-range :start 11 :end 14)) 11)
-  (test = (range-last  (make-range :start 11 :end 14)) 13)
-  (test = (range-end   (make-range :start 11 :end 14)) 14)
-  (test = (range-count (make-range :start 11 :end 14))  3)
-  (test = (range-start (copy-range (make-range :start 11 :end 14))) 11)
-  (test = (range-last  (copy-range (make-range :start 11 :end 14))) 13)
-  (test = (range-end   (copy-range (make-range :start 11 :end 14))) 14)
-  (test = (range-count (copy-range (make-range :start 11 :end 14)))  3)
-
-  (test = (range-start (make-range :count 3 :last 13)) 11)
-  (test = (range-last  (make-range :count 3 :last 13)) 13)
-  (test = (range-end   (make-range :count 3 :last 13)) 14)
-  (test = (range-count (make-range :count 3 :last 13))  3)
-  (test = (range-start (copy-range (make-range :count 3 :last 13))) 11)
-  (test = (range-last  (copy-range (make-range :count 3 :last 13))) 13)
-  (test = (range-end   (copy-range (make-range :count 3 :last 13))) 14)
-  (test = (range-count (copy-range (make-range :count 3 :last 13)))  3)
-
-  (test = (range-start (make-range :count 3 :end 14)) 11)
-  (test = (range-last  (make-range :count 3 :end 14)) 13)
-  (test = (range-end   (make-range :count 3 :end 14)) 14)
-  (test = (range-count (make-range :count 3 :end 14))  3)
-  (test = (range-start (copy-range (make-range :count 3 :end 14))) 11)
-  (test = (range-last  (copy-range (make-range :count 3 :end 14))) 13)
-  (test = (range-end   (copy-range (make-range :count 3 :end 14))) 14)
-  (test = (range-count (copy-range (make-range :count 3 :end 14)))  3))
+  (check = (range-start (make-range :start 1 :count 3)) 1)
+  (check = (range-last  (make-range :start 1 :count 3)) 3)
+  (check = (range-end   (make-range :start 1 :count 3)) 4)
+  (check = (range-count (make-range :start 1 :count 3)) 3)
+  (check = (range-start (copy-range (make-range :start 1 :count 3))) 1)
+  (check = (range-last  (copy-range (make-range :start 1 :count 3))) 3)
+  (check = (range-end   (copy-range (make-range :start 1 :count 3))) 4)
+  (check = (range-count (copy-range (make-range :start 1 :count 3))) 3)
+
+  (check = (range-start (make-range :start 11 :last 13)) 11)
+  (check = (range-last  (make-range :start 11 :last 13)) 13)
+  (check = (range-end   (make-range :start 11 :last 13)) 14)
+  (check = (range-count (make-range :start 11 :last 13))  3)
+  (check = (range-start (copy-range (make-range :start 11 :last 13))) 11)
+  (check = (range-last  (copy-range (make-range :start 11 :last 13))) 13)
+  (check = (range-end   (copy-range (make-range :start 11 :last 13))) 14)
+  (check = (range-count (copy-range (make-range :start 11 :last 13)))  3)
+
+  (check = (range-start (make-range :start 11 :end 14)) 11)
+  (check = (range-last  (make-range :start 11 :end 14)) 13)
+  (check = (range-end   (make-range :start 11 :end 14)) 14)
+  (check = (range-count (make-range :start 11 :end 14))  3)
+  (check = (range-start (copy-range (make-range :start 11 :end 14))) 11)
+  (check = (range-last  (copy-range (make-range :start 11 :end 14))) 13)
+  (check = (range-end   (copy-range (make-range :start 11 :end 14))) 14)
+  (check = (range-count (copy-range (make-range :start 11 :end 14)))  3)
+
+  (check = (range-start (make-range :count 3 :last 13)) 11)
+  (check = (range-last  (make-range :count 3 :last 13)) 13)
+  (check = (range-end   (make-range :count 3 :last 13)) 14)
+  (check = (range-count (make-range :count 3 :last 13))  3)
+  (check = (range-start (copy-range (make-range :count 3 :last 13))) 11)
+  (check = (range-last  (copy-range (make-range :count 3 :last 13))) 13)
+  (check = (range-end   (copy-range (make-range :count 3 :last 13))) 14)
+  (check = (range-count (copy-range (make-range :count 3 :last 13)))  3)
+
+  (check = (range-start (make-range :count 3 :end 14)) 11)
+  (check = (range-last  (make-range :count 3 :end 14)) 13)
+  (check = (range-end   (make-range :count 3 :end 14)) 14)
+  (check = (range-count (make-range :count 3 :end 14))  3)
+  (check = (range-start (copy-range (make-range :count 3 :end 14))) 11)
+  (check = (range-last  (copy-range (make-range :count 3 :end 14))) 13)
+  (check = (range-end   (copy-range (make-range :count 3 :end 14))) 14)
+  (check = (range-count (copy-range (make-range :count 3 :end 14)))  3))


 (define-test test/range/complement ()

-  (test equal-ranges
+  (check equal-ranges
         (complement-ranges (vector) 0 100)
         (vector (make-range :start 0 :end 100)))

-  (test equal-ranges
+  (check equal-ranges
         (complement-ranges (vector  (make-range :start 0 :end 100)) 0 100)
         (vector))

-  (test equal-ranges
+  (check equal-ranges
         (complement-ranges (vector (make-range :start 0 :end 90)) 0 100)
         (vector (make-range :start 90 :end 100)))

-  (test equal-ranges
+  (check equal-ranges
         (complement-ranges (vector (make-range :start 10 :end 100)) 0 100)
         (vector (make-range :start 0 :end 10)))

-  (test equal-ranges
+  (check equal-ranges
         (complement-ranges (vector (make-range :start 10 :end 90)) 0 100)
         (vector (make-range :start 0 :end 10)  (make-range :start 90 :end 100)))

diff --git a/common-lisp/cesarum/index-set.lisp b/common-lisp/cesarum/index-set.lisp
index 16d6ea9..f353e97 100644
--- a/common-lisp/cesarum/index-set.lisp
+++ b/common-lisp/cesarum/index-set.lisp
@@ -180,6 +180,7 @@ License:
 (defun index-set (&rest elements)
   (copy 'index-set elements))

+(defgeneric check-invariant (object))
 (defmethod check-invariant ((set index-set))
   (assert (slot-boundp set 'ranges))
   (let ((ranges (slot-value set 'ranges)))
diff --git a/common-lisp/cesarum/list-test.lisp b/common-lisp/cesarum/list-test.lisp
index eb7fcd5..6a55d20 100644
--- a/common-lisp/cesarum/list-test.lisp
+++ b/common-lisp/cesarum/list-test.lisp
@@ -153,10 +153,10 @@


 (define-test test/iota ()
-  (test equalp (iota 5) '(0 1 2 3 4))
-  (test equalp (iota 5 0 -0.10) '(0 -0.1 -0.2 -0.3 -0.4))
-  (test equalp (iota (/ 30 4)) '(0 1 2 3 4 5 6))
-  (test equalp (iota (/ 30 4) 0 4) '(0 4 8 12 16 20 24)))
+  (check equalp (iota 5) '(0 1 2 3 4))
+  (check equalp (iota 5 0 -0.10) '(0 -0.1 -0.2 -0.3 -0.4))
+  (check equalp (iota (/ 30 4)) '(0 1 2 3 4 5 6))
+  (check equalp (iota (/ 30 4) 0 4) '(0 4 8 12 16 20 24)))

 (define-test test/all ()
   (test/list-lengths)
diff --git a/common-lisp/cesarum/llrbtree.lisp b/common-lisp/cesarum/llrbtree.lisp
index 52d1c2f..1ded9d6 100644
--- a/common-lisp/cesarum/llrbtree.lisp
+++ b/common-lisp/cesarum/llrbtree.lisp
@@ -638,7 +638,7 @@ RETURN: true if there was such an entry, or false otherwise.
 ;;;

 (defparameter *dot-counter* 0)
-
+(defgeneric generate-dot (object))
 (defmethod generate-dot ((self tree))
   (let ((id (incf *dot-counter*)))
     (with-open-file (dot (format nil "tree-~5,'0D.dot" id)
@@ -706,6 +706,7 @@ RETURN: true if there was such an entry, or false otherwise.
   (map 'string (function code-char)
        #(#x1b #x5b #x30 #x6d)))

+(defgeneric dump (object &optional indentation bar))
 (defmethod dump ((self null) &optional (indentation "") (bar " "))
   (declare (ignorable self))
   (format t "~A~A~A+---- NIL~A~%" indentation bar *black* *normal*))
diff --git a/common-lisp/cesarum/sequence-test.lisp b/common-lisp/cesarum/sequence-test.lisp
index 159da31..440a881 100644
--- a/common-lisp/cesarum/sequence-test.lisp
+++ b/common-lisp/cesarum/sequence-test.lisp
@@ -94,22 +94,22 @@
   (assert-true (equalp (group-by #(1 2 3 4 5 6 7 8) 3) '(#(1 2 3) #(4 5 6) #(7 8)))))

 (define-test test/parse-sequence-type ()
-  (test equal (multiple-value-list (parse-sequence-type 'list)) '(list t nil))
-  (test equal (multiple-value-list (parse-sequence-type 'vector)) '(vector t nil))
-  (test equal (multiple-value-list (parse-sequence-type '(vector))) '(vector t nil))
-  (test equal (multiple-value-list (parse-sequence-type '(vector *))) '(vector t nil))
-  (test equal (multiple-value-list (parse-sequence-type '(vector * 42))) '(vector t 42))
-  (test equal (multiple-value-list (parse-sequence-type '(vector integer))) '(vector integer nil))
-  (test equal (multiple-value-list (parse-sequence-type '(vector integer 42))) '(vector integer 42))
+  (check equal (multiple-value-list (parse-sequence-type 'list)) '(list t nil))
+  (check equal (multiple-value-list (parse-sequence-type 'vector)) '(vector t nil))
+  (check equal (multiple-value-list (parse-sequence-type '(vector))) '(vector t nil))
+  (check equal (multiple-value-list (parse-sequence-type '(vector *))) '(vector t nil))
+  (check equal (multiple-value-list (parse-sequence-type '(vector * 42))) '(vector t 42))
+  (check equal (multiple-value-list (parse-sequence-type '(vector integer))) '(vector integer nil))
+  (check equal (multiple-value-list (parse-sequence-type '(vector integer 42))) '(vector integer 42))
   (expect-condition 'error  (parse-sequence-type 'array))
   (expect-condition 'error  (parse-sequence-type '(array)))
   (expect-condition 'error  (parse-sequence-type '(array *)))
   (expect-condition 'error  (parse-sequence-type '(array * 42)))
   (expect-condition 'error  (parse-sequence-type '(array * 42)))
-  (test equal (multiple-value-list (parse-sequence-type '(array * 1))) '(array t nil))
-  (test equal (multiple-value-list (parse-sequence-type '(array integer 1))) '(array integer nil))
-  (test equal (multiple-value-list (parse-sequence-type '(array * (42)))) '(array t 42))
-  (test equal (multiple-value-list (parse-sequence-type '(array integer (42)))) '(array integer 42))
+  (check equal (multiple-value-list (parse-sequence-type '(array * 1))) '(array t nil))
+  (check equal (multiple-value-list (parse-sequence-type '(array integer 1))) '(array integer nil))
+  (check equal (multiple-value-list (parse-sequence-type '(array * (42)))) '(array t 42))
+  (check equal (multiple-value-list (parse-sequence-type '(array integer (42)))) '(array integer 42))
   (expect-condition 'error  (parse-sequence-type '(array integer (1 2)))))


diff --git a/common-lisp/cesarum/set-test.lisp b/common-lisp/cesarum/set-test.lisp
index fcc41fd..fca8553 100644
--- a/common-lisp/cesarum/set-test.lisp
+++ b/common-lisp/cesarum/set-test.lisp
@@ -56,8 +56,8 @@
   (loop
     :for seq :in (test-sets 'list-set)
     :do
-    (test eql (map-elements nil (function identity) seq) nil)
-    (test set-equal (let ((result '()))
+    (check eql (map-elements nil (function identity) seq) nil)
+    (check set-equal (let ((result '()))
                       (map-elements nil (lambda (element) (push element result)) seq)
                       result)
           seq)))
@@ -67,7 +67,7 @@
     :for set :in (test-sets test-class)
     :do (loop
           :for class :in (list 'list 'vector test-class)
-          :do (test set-equal (map-elements class (function identity) set)
+          :do (check set-equal (map-elements class (function identity) set)
                     (ecase (cardinal set)
                       (0 '())
                       (1 '(1))
@@ -81,9 +81,9 @@
               (list '(1 2 3 4) 'vector    '(1 2 3 4))
               (list '(1 2 3 4) test-class '(1 2 3 4)))
     :do
-    (test set-equal               (copy type original)  expected (type original))
-    (test set-equal (copy 'list   (copy type original)) expected (type original))
-    (test set-equal (copy 'vector (copy type original)) expected (type original))))
+    (check set-equal               (copy type original)  expected (type original))
+    (check set-equal (copy 'list   (copy type original)) expected (type original))
+    (check set-equal (copy 'vector (copy type original)) expected (type original))))


 (define-test test/is-subseq (test-class1 test-class2)
@@ -138,52 +138,52 @@
 (define-test test/union (operator test-class)
   (flet ((test-set (&rest elements)
            (copy test-class elements)))
-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 1 2 3 7 8 10 11 12)
                              (test-set 1 2 3 7 8 10 11 12))
           (test-set 1 2 3 7 8 10 11 12))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set)
                              (test-set 1 2 3 7 8 10 11 12))
           (test-set 1 2 3 7 8 10 11 12))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 1 2 3 7 8 10 11 12)
                              (test-set))
           (test-set 1 2 3 7 8 10 11 12))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 1 2 3 7 8 10 11 12)
                              (test-set 0 4 5 6 9 10))
           (test-set 0 1 2 3 4 5 6 7 8 9 10 11 12))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 10 11 12)
                              (test-set 1 2 3 7 8))
           (test-set 1 2 3 7 8 10 11 12))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 1 2 3 7 8)
                              (test-set 10 11 12))
           (test-set 1 2 3 7 8 10 11 12))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 1 2 3 5 6 7)
                              (test-set 3 4 5 7 8 9  12 13))
           (test-set 1 2 3 4 5 6 7 8 9 12 13))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 1 2 3 5 6 7  12 13)
                              (test-set 3 4 5 7 8 9))
           (test-set 1 2 3 4 5 6 7 8 9 12 13))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 1 2 3  11 12 13)
                              (test-set 3 4 5  13 14 15))
           (test-set 1 2 3 4 5 11 12 13 14 15))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 3 4 5  13 14 15)
                              (test-set 1 2 3  11 12 13))
           (test-set 1 2 3 4 5 11 12 13 14 15))))
@@ -195,52 +195,52 @@
 (define-test test/intersection (operator test-class)
   (flet ((test-set (&rest elements)
            (copy test-class elements)))
-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 1 2 3 7 8 10 11 12)
                              (test-set 1 2 3 7 8 10 11 12))
           (test-set 1 2 3 7 8 10 11 12))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set)
                              (test-set 1 2 3 7 8 10 11 12))
           (test-set))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 1 2 3 7 8 10 11 12)
                              (test-set))
           (test-set))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 1 2 3 7 8 10 11 12)
                              (test-set 0 4 5 6 9 10))
           (test-set 10))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 10 11 12)
                              (test-set 1 2 3 7 8))
           (test-set))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 1 2 3 7 8)
                              (test-set 10 11 12))
           (test-set))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 1 2 3 5 6 7)
                              (test-set 3 4 5 7 8 9  12 13))
           (test-set 3 5 7))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 1 2 3 5 6 7  12 13)
                              (test-set 3 4 5 7 8 9))
           (test-set 3 5 7))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 1 2 3  11 12 13)
                              (test-set 3 4 5  13 14 15))
           (test-set 3 13))

-    (test set-equal (funcall operator
+    (check set-equal (funcall operator
                              (test-set 3 4 5  13 14 15)
                              (test-set 1 2 3  11 12 13))
           (test-set 3 13))))
diff --git a/common-lisp/cesarum/simple-test.lisp b/common-lisp/cesarum/simple-test.lisp
index bf048e3..10434ae 100644
--- a/common-lisp/cesarum/simple-test.lisp
+++ b/common-lisp/cesarum/simple-test.lisp
@@ -283,11 +283,11 @@ License:
   (when (verbose *verbose-tally*)
     (let ((name-max-length 40))
       (flet ((write-tally (name)
-               (format *test-output* "~&~VA~
+               (format *test-output* "~&~VA~@[~%~0@*~V<~>~3@*~]~
                        ~5D test~:*~P,~:*~[~; ~;~]~
                        ~4D success~:*~[es~;~:;es~]~
                        ~:[,~2:*~[~;  ~;~]~*~4D failure~:*~P~;~].~%"
-                       name-max-length name
+                       name-max-length name (< name-max-length (length name))
                        (+ success-count failure-count)
                        success-count
                        (zerop failure-count)
@@ -307,8 +307,6 @@ License:
         )))
   (values))

-
-
 (defmacro assert-true (expression &optional places format-control &rest format-arguments)
   "Evaluates a test EXPRESSION and check it returns true.
 EXAMPLE:  (assert-true (= 2 (+ 1 1))))
diff --git a/common-lisp/cesarum/sparse-vector-test.lisp b/common-lisp/cesarum/sparse-vector-test.lisp
index c95cecb..b319cca 100644
--- a/common-lisp/cesarum/sparse-vector-test.lisp
+++ b/common-lisp/cesarum/sparse-vector-test.lisp
@@ -123,45 +123,45 @@
           (v (make-vector-tree node-size length :initial-element default :element-type element-type))
           (e (make-array                 length :initial-element default :element-type element-type))
           (s 0))
-     (test equal (vector-element-type v) element-type)
-     (test equal (vector-length       v) length)
-     (test equal (vector-element-type e) element-type)
-     (test equal (vector-length       e) length)
-     (test equalp (vector-elements v) e)
-     (test = (vector-count v) (count default e :test-not (function eql)) (v) "f0")
-     (test < s (vector-storage-size v))
+     (check equal (vector-element-type v) element-type)
+     (check equal (vector-length       v) length)
+     (check equal (vector-element-type e) element-type)
+     (check equal (vector-length       e) length)
+     (check equalp (vector-elements v) e)
+     (check = (vector-count v) (count default e :test-not (function eql)) (v) "f0")
+     (check < s (vector-storage-size v))
      (setf s (vector-storage-size v))
      (report v)
      (loop :for i :from 3 :by 7 :to 18
            :do (setf (vector-ref v i) i
                      (vector-ref e i) i))
-     (test equalp (vector-elements v) e)
-     (test = (vector-count v) (count default e :test-not (function eql)) (v) "f1")
-     (test < s (vector-storage-size v))
+     (check equalp (vector-elements v) e)
+     (check = (vector-count v) (count default e :test-not (function eql)) (v) "f1")
+     (check < s (vector-storage-size v))
      (setf s (vector-storage-size v))
      (report v)
      (loop :for i :from 0 :to 6
            :do (setf (vector-ref v i) i
                      (vector-ref e i) i))
-     (test equalp (vector-elements v) e)
-     (test = (vector-count v) (count default e :test-not (function eql)) (v) "f2")
-     (test < s (vector-storage-size v))
+     (check equalp (vector-elements v) e)
+     (check = (vector-count v) (count default e :test-not (function eql)) (v) "f2")
+     (check < s (vector-storage-size v))
      (setf s (vector-storage-size v))
      (report v)
      (loop :for i :from 16 :to 17
            :do (setf (vector-ref v i) i
                      (vector-ref e i) i))
-     (test equalp (vector-elements v) e)
-     (test = (vector-count v) (count default e :test-not (function eql)) (v) "f3")
-     (test <= s (vector-storage-size v))
+     (check equalp (vector-elements v) e)
+     (check = (vector-count v) (count default e :test-not (function eql)) (v) "f3")
+     (check <= s (vector-storage-size v))
      (setf s (vector-storage-size v))
      (report v)
      (loop :for i :from 0 :to 7
            :do (setf (vector-ref v i) default
                      (vector-ref e i) default))
-     (test equalp (vector-elements v) e)
-     (test = (vector-count v) (count default e :test-not (function eql)) (v) "f4")
-     (test > s (vector-storage-size v))
+     (check equalp (vector-elements v) e)
+     (check = (vector-count v) (count default e :test-not (function eql)) (v) "f4")
+     (check > s (vector-storage-size v))
      (setf s (vector-storage-size v))
      (report v))
    ;; with characters:
@@ -171,30 +171,30 @@
           (node-size    11)
           (v (make-vector-tree node-size length :initial-element default :element-type element-type))
           (e (make-array                 length :initial-element default :element-type element-type)))
-     (test equal (vector-element-type v) element-type)
-     (test equal (vector-length       v) length)
-     (test equal (vector-element-type e) element-type)
-     (test equal (vector-length       e) length)
-     (test equalp (vector-elements v) e)
-     (test = (vector-count v) (count default e :test-not (function eql)) (v) "c0")
+     (check equal (vector-element-type v) element-type)
+     (check equal (vector-length       v) length)
+     (check equal (vector-element-type e) element-type)
+     (check equal (vector-length       e) length)
+     (check equalp (vector-elements v) e)
+     (check = (vector-count v) (count default e :test-not (function eql)) (v) "c0")
      (report v)
      (loop :for i :from 33 :by 7 :to 127
            :do (setf (vector-ref v i) (code-char i)
                      (vector-ref e i) (code-char i)))
-     (test equal (vector-elements v) e)
-     (test = (vector-count v) (count default e :test-not (function eql)) (v) "c1")
+     (check equal (vector-elements v) e)
+     (check = (vector-count v) (count default e :test-not (function eql)) (v) "c1")
      (report v)
      (loop :for i :from 33 :to 63
            :do (setf (vector-ref v i) (code-char i)
                      (vector-ref e i) (code-char i)))
-     (test equal (vector-elements v) e)
-     (test = (vector-count v) (count default e :test-not (function eql)) (v) "c2")
+     (check equal (vector-elements v) e)
+     (check = (vector-count v) (count default e :test-not (function eql)) (v) "c2")
      (report v)
      (loop :for i :from 64 :to 95
            :do (setf (vector-ref v i) (code-char i)
                      (vector-ref e i) (code-char i)))
-     (test equal (vector-elements v) e)
-     (test = (vector-count v) (count default e :test-not (function eql)) (v) "c3")
+     (check equal (vector-elements v) e)
+     (check = (vector-count v) (count default e :test-not (function eql)) (v) "c3")
      (report v))))


diff --git a/common-lisp/cesarum/stream.lisp b/common-lisp/cesarum/stream.lisp
index d01c78d..649c034 100644
--- a/common-lisp/cesarum/stream.lisp
+++ b/common-lisp/cesarum/stream.lisp
@@ -116,8 +116,10 @@ MAX-EXTEND: NIL ==> double the buffer size, or double the buffer size until
             it's greater than MAX-EXTEND, and then increment by MAX-EXTEND.
 RETURN:     A vector containing the elements read from the STREAM.
 "
-  (let ((dirs (pathname-directory (pathname stream))))
-    (if (and (eql :absolute (pop dirs))
+  (let ((dirs (and (typep stream 'file-stream)
+                   (pathname-directory (pathname stream)))))
+    (if (and dirs
+             (eql :absolute (pop dirs))
              (member (pop dirs) '("proc" "sys" "dev") :test (function string=)))
         ;; some implementations have problem reading those file systems with read-sequence
         ;; so we fallback to read-line:
diff --git a/common-lisp/cesarum/string-test.lisp b/common-lisp/cesarum/string-test.lisp
index 31a4f8f..300a437 100644
--- a/common-lisp/cesarum/string-test.lisp
+++ b/common-lisp/cesarum/string-test.lisp
@@ -106,8 +106,10 @@
                      (= (length (explode-string "ABC" 'vector)) (length  #(#\A #\B #\C)))))
   (assert-true (string= (explode-string "ABC" 'string) "ABC"))
   ;; implode a string
-  (assert-true (eq      (implode "" 'symbol "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING") '||))
-  (assert-true (eq      (implode "ABC" 'symbol "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING") 'ABC))
+  (assert-true (eq      (implode "" 'symbol "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING")
+                        'com.informatimago.common-lisp.cesarum.string::||))
+  (assert-true (eq      (implode "ABC" 'symbol "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING")
+                        'com.informatimago.common-lisp.cesarum.string::abc))
   (assert-true (eq      (implode "ABC" 'symbol :keyword) ':ABC))
   (assert-true (string= (implode "" 'string) ""))
   (assert-true (string= (implode "ABC" 'string) "ABC"))
@@ -115,8 +117,10 @@
   (assert-true (equal   (implode "NIL" 'list) '()))
   (assert-true (equalp  (implode "#(1 2 3)" 'vector) #(1 2 3)))
   ;; implode a vector
-  (assert-true (eq      (implode #() 'symbol "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING") '||))
-  (assert-true (eq      (implode #(#\A #\B #\C) 'symbol "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING") 'ABC))
+  (assert-true (eq      (implode #() 'symbol "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING")
+                        'com.informatimago.common-lisp.cesarum.string::||))
+  (assert-true (eq      (implode #(#\A #\B #\C) 'symbol "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING")
+                        'com.informatimago.common-lisp.cesarum.string::abc))
   (assert-true (eq      (implode #(#\A #\B #\C) 'symbol :keyword) ':ABC))
   (assert-true (string= (implode #() 'string) ""))
   (assert-true (string= (implode #(#\A #\B #\C) 'string) "ABC"))
@@ -124,8 +128,10 @@
   (assert-true (equal   (implode #(#\N #\I #\L) 'list) '()))
   (assert-true (equalp  (implode #(#\# #\( #\1 #\space #\2  #\space #\3 #\)) 'vector) #(1 2 3)))
   ;; implode a list
-  (assert-true (eq      (implode '() 'symbol "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING") '||))
-  (assert-true (eq      (implode '(#\A #\B #\C) 'symbol "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING") 'ABC))
+  (assert-true (eq      (implode '() 'symbol "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING")
+                        'com.informatimago.common-lisp.cesarum.string::||))
+  (assert-true (eq      (implode '(#\A #\B #\C) 'symbol "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING")
+                        'com.informatimago.common-lisp.cesarum.string::abc))
   (assert-true (eq      (implode '(#\A #\B #\C) 'symbol :keyword) ':ABC))
   (assert-true (string= (implode '() 'string) ""))
   (assert-true (string= (implode '(#\A #\B #\C) 'string) "ABC"))
diff --git a/common-lisp/com.informatimago.common-lisp.asd b/common-lisp/com.informatimago.common-lisp.asd
index 6622999..6f8899a 100644
--- a/common-lisp/com.informatimago.common-lisp.asd
+++ b/common-lisp/com.informatimago.common-lisp.asd
@@ -39,7 +39,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp/")
diff --git a/common-lisp/com.informatimago.common-lisp.test.asd b/common-lisp/com.informatimago.common-lisp.test.asd
index f244dad..00995eb 100644
--- a/common-lisp/com.informatimago.common-lisp.test.asd
+++ b/common-lisp/com.informatimago.common-lisp.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
diff --git a/common-lisp/csv/com.informatimago.common-lisp.csv.asd b/common-lisp/csv/com.informatimago.common-lisp.csv.asd
index db21314..3f5579a 100644
--- a/common-lisp/csv/com.informatimago.common-lisp.csv.asd
+++ b/common-lisp/csv/com.informatimago.common-lisp.csv.asd
@@ -39,7 +39,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.csv/")
diff --git a/common-lisp/csv/com.informatimago.common-lisp.csv.test.asd b/common-lisp/csv/com.informatimago.common-lisp.csv.test.asd
index 19a0d0b..d39087b 100644
--- a/common-lisp/csv/com.informatimago.common-lisp.csv.test.asd
+++ b/common-lisp/csv/com.informatimago.common-lisp.csv.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.csv"
                    "com.informatimago.common-lisp.cesarum")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/csv/csv.lisp b/common-lisp/csv/csv.lisp
index 3567ff8..f3f370e 100644
--- a/common-lisp/csv/csv.lisp
+++ b/common-lisp/csv/csv.lisp
@@ -272,6 +272,7 @@ inconsistent, a default newline = LF is used. This imports for \ escapes."))
           (scanner-source self))
   self)

+(defgeneric text-term (scanner))
 (defmethod text-term ((scanner scanner))
   (format nil "~A~A" (field-separator scanner) +crlf+))

diff --git a/common-lisp/data-encoding/bencode-test.lisp b/common-lisp/data-encoding/bencode-test.lisp
index 0f99876..77e9602 100644
--- a/common-lisp/data-encoding/bencode-test.lisp
+++ b/common-lisp/data-encoding/bencode-test.lisp
@@ -63,12 +63,11 @@
       (print obj))
     (assert-true (equal obj
                         '(43 "spam" ("spam" "eggs")
-                          (dict ("cow" . "moo") ("spam" . "eggs"))
-                          (dict ("spam" "a" "b")))))
+                          (dict (:cow . "moo") (:spam . "eggs"))
+                          (dict (:spam "a" "b")))))
     (assert-true (string= (bencode-to-string object) str))))


-
 ;; (defun dictp (dict)
 ;;    (and (listp dict) (eql 'dict (first dict))))
 ;;
diff --git a/common-lisp/data-encoding/com.informatimago.common-lisp.data-encoding.asd b/common-lisp/data-encoding/com.informatimago.common-lisp.data-encoding.asd
index 5c88f31..bb3b4e4 100644
--- a/common-lisp/data-encoding/com.informatimago.common-lisp.data-encoding.asd
+++ b/common-lisp/data-encoding/com.informatimago.common-lisp.data-encoding.asd
@@ -53,7 +53,7 @@ Various Data Encoding/Decoding Algorithms:
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.data-encoding/")
diff --git a/common-lisp/data-encoding/com.informatimago.common-lisp.data-encoding.test.asd b/common-lisp/data-encoding/com.informatimago.common-lisp.data-encoding.test.asd
index ec3be06..a75966f 100644
--- a/common-lisp/data-encoding/com.informatimago.common-lisp.data-encoding.test.asd
+++ b/common-lisp/data-encoding/com.informatimago.common-lisp.data-encoding.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -60,13 +60,13 @@
   :components     ((:file "bencode-test"       :depends-on ())
                    (:file "data-encoding-test" :depends-on ())
                    (:file "ieee-754-test"      :depends-on ()))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (dolist (p '("COM.INFORMATIMAGO.COMMON-LISP.DATA-ENCODING.BENCODE.TEST"
-                                "COM.INFORMATIMAGO.COMMON-LISP.DATA-ENCODING.DATA-ENCODING.TEST"
-                                "COM.INFORMATIMAGO.COMMON-LISP.DATA-ENCODING.IEEE-754.TEST"))
-                     (let ((*package* (find-package p)))
-                       (uiop/package:symbol-call p "TEST/ALL")))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (dolist (p '("COM.INFORMATIMAGO.COMMON-LISP.DATA-ENCODING.BENCODE.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.DATA-ENCODING.DATA-ENCODING.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.DATA-ENCODING.IEEE-754.TEST"))
+                              (let ((*package* (find-package p)))
+                                (uiop/package:symbol-call p "TEST/ALL")))))

 ;;;; THE END ;;;;
diff --git a/common-lisp/diagram/com.informatimago.common-lisp.diagram.asd b/common-lisp/diagram/com.informatimago.common-lisp.diagram.asd
index 00dc938..95d7bba 100644
--- a/common-lisp/diagram/com.informatimago.common-lisp.diagram.asd
+++ b/common-lisp/diagram/com.informatimago.common-lisp.diagram.asd
@@ -46,7 +46,7 @@ whose cdr is the list of children.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.diagram/")
diff --git a/common-lisp/diagram/com.informatimago.common-lisp.diagram.test.asd b/common-lisp/diagram/com.informatimago.common-lisp.diagram.test.asd
index c02fa3a..28d1d65 100644
--- a/common-lisp/diagram/com.informatimago.common-lisp.diagram.test.asd
+++ b/common-lisp/diagram/com.informatimago.common-lisp.diagram.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.diagram"
                    "com.informatimago.common-lisp.cesarum")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/ed/com.informatimago.common-lisp.ed.asd b/common-lisp/ed/com.informatimago.common-lisp.ed.asd
index 04d0c2d..521d6ff 100644
--- a/common-lisp/ed/com.informatimago.common-lisp.ed.asd
+++ b/common-lisp/ed/com.informatimago.common-lisp.ed.asd
@@ -48,7 +48,7 @@ cl-ppcre or #+clisp regexp).
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.ed/")
diff --git a/common-lisp/ed/com.informatimago.common-lisp.ed.test.asd b/common-lisp/ed/com.informatimago.common-lisp.ed.test.asd
index 2a7dc21..2a5bc8d 100644
--- a/common-lisp/ed/com.informatimago.common-lisp.ed.test.asd
+++ b/common-lisp/ed/com.informatimago.common-lisp.ed.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.ed"
                    "com.informatimago.common-lisp.cesarum")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/graphviz/com.informatimago.common-lisp.graphviz.asd b/common-lisp/graphviz/com.informatimago.common-lisp.graphviz.asd
index 928c3ee..4fb2039 100644
--- a/common-lisp/graphviz/com.informatimago.common-lisp.graphviz.asd
+++ b/common-lisp/graphviz/com.informatimago.common-lisp.graphviz.asd
@@ -40,7 +40,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.graphviz/")
diff --git a/common-lisp/graphviz/com.informatimago.common-lisp.graphviz.test.asd b/common-lisp/graphviz/com.informatimago.common-lisp.graphviz.test.asd
index 75e95cf..568e24e 100644
--- a/common-lisp/graphviz/com.informatimago.common-lisp.graphviz.test.asd
+++ b/common-lisp/graphviz/com.informatimago.common-lisp.graphviz.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.graphviz"
                    "com.informatimago.common-lisp.cesarum")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/heap/com.informatimago.common-lisp.heap.asd b/common-lisp/heap/com.informatimago.common-lisp.heap.asd
index 6a7fd2d..3d92cf2 100644
--- a/common-lisp/heap/com.informatimago.common-lisp.heap.asd
+++ b/common-lisp/heap/com.informatimago.common-lisp.heap.asd
@@ -46,7 +46,7 @@ garbage collector.  Lisp objects can be copied to/from this heap.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.heap/")
diff --git a/common-lisp/heap/com.informatimago.common-lisp.heap.test.asd b/common-lisp/heap/com.informatimago.common-lisp.heap.test.asd
index 5be8b58..bc2166c 100644
--- a/common-lisp/heap/com.informatimago.common-lisp.heap.test.asd
+++ b/common-lisp/heap/com.informatimago.common-lisp.heap.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.heap")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/html-base/com.informatimago.common-lisp.html-base.asd b/common-lisp/html-base/com.informatimago.common-lisp.html-base.asd
index 93592cb..78cf008 100644
--- a/common-lisp/html-base/com.informatimago.common-lisp.html-base.asd
+++ b/common-lisp/html-base/com.informatimago.common-lisp.html-base.asd
@@ -39,7 +39,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.html-base/")
diff --git a/common-lisp/html-base/com.informatimago.common-lisp.html-base.test.asd b/common-lisp/html-base/com.informatimago.common-lisp.html-base.test.asd
index 4a49c53..9d4eee1 100644
--- a/common-lisp/html-base/com.informatimago.common-lisp.html-base.test.asd
+++ b/common-lisp/html-base/com.informatimago.common-lisp.html-base.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.html-base"
                    "com.informatimago.common-lisp.cesarum")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/html-generator/com.informatimago.common-lisp.html-generator.asd b/common-lisp/html-generator/com.informatimago.common-lisp.html-generator.asd
index 163b4a5..d55a1be 100644
--- a/common-lisp/html-generator/com.informatimago.common-lisp.html-generator.asd
+++ b/common-lisp/html-generator/com.informatimago.common-lisp.html-generator.asd
@@ -44,7 +44,7 @@ Generation of HTML pages.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.html-generator/")
diff --git a/common-lisp/html-generator/com.informatimago.common-lisp.html-generator.test.asd b/common-lisp/html-generator/com.informatimago.common-lisp.html-generator.test.asd
index 6b94666..91d28e8 100644
--- a/common-lisp/html-generator/com.informatimago.common-lisp.html-generator.test.asd
+++ b/common-lisp/html-generator/com.informatimago.common-lisp.html-generator.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.html-generator")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/html-generator/html.lisp b/common-lisp/html-generator/html.lisp
index b73b1e2..3d3f1a0 100644
--- a/common-lisp/html-generator/html.lisp
+++ b/common-lisp/html-generator/html.lisp
@@ -815,7 +815,7 @@ RETURN:      The generated HTML.
   );;eval-when


-(defmacro generate (&body body)
+(defmacro generate ()
   (append (generate-elements *elements*)
           '('done)))

diff --git a/common-lisp/html-parser/com.informatimago.common-lisp.html-parser.asd b/common-lisp/html-parser/com.informatimago.common-lisp.html-parser.asd
index 4415369..df77e8c 100644
--- a/common-lisp/html-parser/com.informatimago.common-lisp.html-parser.asd
+++ b/common-lisp/html-parser/com.informatimago.common-lisp.html-parser.asd
@@ -44,7 +44,7 @@ A simple HTML 4.01 parser.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.html-parser/")
diff --git a/common-lisp/html-parser/com.informatimago.common-lisp.html-parser.test.asd b/common-lisp/html-parser/com.informatimago.common-lisp.html-parser.test.asd
index 9aad562..bd7eb7b 100644
--- a/common-lisp/html-parser/com.informatimago.common-lisp.html-parser.test.asd
+++ b/common-lisp/html-parser/com.informatimago.common-lisp.html-parser.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.html-parser")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/http/com.informatimago.common-lisp.http.asd b/common-lisp/http/com.informatimago.common-lisp.http.asd
index c96efca..32bb9da 100644
--- a/common-lisp/http/com.informatimago.common-lisp.http.asd
+++ b/common-lisp/http/com.informatimago.common-lisp.http.asd
@@ -44,7 +44,7 @@ A transaction manager for HTTP CGI.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes
-  :version "1.2.0"
+  :version "1.2.2"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.http/")
diff --git a/common-lisp/http/com.informatimago.common-lisp.http.test.asd b/common-lisp/http/com.informatimago.common-lisp.http.test.asd
index 5b8d3bb..24d35aa 100644
--- a/common-lisp/http/com.informatimago.common-lisp.http.test.asd
+++ b/common-lisp/http/com.informatimago.common-lisp.http.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.http")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/interactive/com.informatimago.common-lisp.interactive.asd b/common-lisp/interactive/com.informatimago.common-lisp.interactive.asd
index 6b081a6..fac99ff 100644
--- a/common-lisp/interactive/com.informatimago.common-lisp.interactive.asd
+++ b/common-lisp/interactive/com.informatimago.common-lisp.interactive.asd
@@ -46,7 +46,7 @@ CL specific commands such as: mkupack, lspack, pushp, popp, etc.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.interactive/")
diff --git a/common-lisp/interactive/com.informatimago.common-lisp.interactive.test.asd b/common-lisp/interactive/com.informatimago.common-lisp.interactive.test.asd
index 292a6bc..b5b8534 100644
--- a/common-lisp/interactive/com.informatimago.common-lisp.interactive.test.asd
+++ b/common-lisp/interactive/com.informatimago.common-lisp.interactive.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.interactive")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/invoice/com.informatimago.common-lisp.invoice.asd b/common-lisp/invoice/com.informatimago.common-lisp.invoice.asd
index 4b1cd24..b889be1 100644
--- a/common-lisp/invoice/com.informatimago.common-lisp.invoice.asd
+++ b/common-lisp/invoice/com.informatimago.common-lisp.invoice.asd
@@ -39,7 +39,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.invoice/")
diff --git a/common-lisp/invoice/com.informatimago.common-lisp.invoice.test.asd b/common-lisp/invoice/com.informatimago.common-lisp.invoice.test.asd
index fbe8fe4..e0cab15 100644
--- a/common-lisp/invoice/com.informatimago.common-lisp.invoice.test.asd
+++ b/common-lisp/invoice/com.informatimago.common-lisp.invoice.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.invoice"
                    "com.informatimago.common-lisp.cesarum")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/lisp-reader/com.informatimago.common-lisp.lisp-reader.asd b/common-lisp/lisp-reader/com.informatimago.common-lisp.lisp-reader.asd
index 233f6d5..d9f511e 100644
--- a/common-lisp/lisp-reader/com.informatimago.common-lisp.lisp-reader.asd
+++ b/common-lisp/lisp-reader/com.informatimago.common-lisp.lisp-reader.asd
@@ -46,7 +46,7 @@ Beane's zpack.lisp).
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Spring 2012")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.lisp-reader/")
diff --git a/common-lisp/lisp-reader/com.informatimago.common-lisp.lisp-reader.test.asd b/common-lisp/lisp-reader/com.informatimago.common-lisp.lisp-reader.test.asd
index 44cf090..baf599b 100644
--- a/common-lisp/lisp-reader/com.informatimago.common-lisp.lisp-reader.test.asd
+++ b/common-lisp/lisp-reader/com.informatimago.common-lisp.lisp-reader.test.asd
@@ -39,7 +39,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.0.0"
+  :version "1.0.2"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Winter 2015")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.lisp-reader-test/")
@@ -52,12 +52,12 @@
                "com.informatimago.common-lisp.lisp-reader")
   :components ((:file "reader-test"    :depends-on ())
                (:file "package-test"   :depends-on ()))
-  :perform (asdf:test-op
-            (o s)
-            (dolist (p '("COM.INFORMATIMAGO.COMMON-LISP.LISP-READER.READER.TEST"
-                         "COM.INFORMATIMAGO.COMMON-LISP.LISP-READER.PACKAGE.TEST"))
-              (let ((*package* (find-package p)))
-                (uiop:symbol-call p "TEST/ALL")))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (o s)
+                            (dolist (p '("COM.INFORMATIMAGO.COMMON-LISP.LISP-READER.READER.TEST"
+                                         "COM.INFORMATIMAGO.COMMON-LISP.LISP-READER.PACKAGE.TEST"))
+                              (let ((*package* (find-package p)))
+                                (uiop:symbol-call p "TEST/ALL")))))


 ;;;; THE END ;;;;
diff --git a/common-lisp/lisp-reader/package-fun.lisp b/common-lisp/lisp-reader/package-fun.lisp
index 6479ae3..332a9cb 100644
--- a/common-lisp/lisp-reader/package-fun.lisp
+++ b/common-lisp/lisp-reader/package-fun.lisp
@@ -1589,12 +1589,14 @@ IF-PACKAGE-EXISTS           The default is :PACKAGE
 ;;            (reduce 'union (cons (package-shadow-list p)
 ;;                                 (mapcar 'rest (package-shadowing-import-list p)))))

+(defgeneric package-shadow-list (package))
 (defmethod package-shadow-list (package)
   "Return the list of shadowed symbols (but not shadowing-imported ones)"
   (remove package (package-shadowing-symbols package)
           :test-not (function eql)
           :key (function symbol-package)))

+(defgeneric package-shadowing-import-list (package))
 (defmethod package-shadowing-import-list (package)
   "Return a list of lists of shadowing-imports.
 Each sublist contains the package followed by its imported symbols."
@@ -1607,7 +1609,7 @@ Each sublist contains the package followed by its imported symbols."
 ;;       package that used them, or that imported them, then we won't
 ;;       remember it, and will import them directly from their home.
 ;;       This is probably not good.
-
+(defgeneric package-import-from-list (package))
 (defmethod package-import-from-list (package)
   (let ((symbols '()))
     (with-package-iterator (it package :present)
@@ -1618,6 +1620,7 @@ Each sublist contains the package followed by its imported symbols."
               (unless (eq home package)  (push symbol symbols))
               (return (classify-per-package symbols))))))))

+(defgeneric package-symbols (package))
 (defmethod package-symbols (package)
   (let ((result '()))
     (with-package-iterator (it package :present)
@@ -1628,6 +1631,7 @@ Each sublist contains the package followed by its imported symbols."
               (when (eq home package) (push symbol result))
               (return result)))))))

+(defgeneric package-export-list (package))
 (defmethod package-export-list (package)
   (let ((result '()))
     (with-package-iterator (it package :external)
diff --git a/common-lisp/lisp-reader/reader-test.lisp b/common-lisp/lisp-reader/reader-test.lisp
index 9f753c3..95face8 100644
--- a/common-lisp/lisp-reader/reader-test.lisp
+++ b/common-lisp/lisp-reader/reader-test.lisp
@@ -105,8 +105,9 @@ License:


 (define-test test/proper-list-p ()
-  (map nil (lambda (test) (test eq (proper-list-p (second test)) (first test)
-                                ((first test) (second test))))
+  (map nil (lambda (test)
+             (check eq (proper-list-p (second test)) (first test)
+                    ((first test) (second test))))
     '((nil x)
       (t ())
       (t (a))
diff --git a/common-lisp/lisp-reader/reader.lisp b/common-lisp/lisp-reader/reader.lisp
index 006218f..e02face 100644
--- a/common-lisp/lisp-reader/reader.lisp
+++ b/common-lisp/lisp-reader/reader.lisp
@@ -286,8 +286,7 @@ they're GRAPHIC-CHAR-P or not.
 (defconstant +standard-characters-limit+ 128)


-(defmethod initialize-instance
-    :after ((self syntax-table) &key &allow-other-keys)
+(defmethod initialize-instance :after ((self syntax-table) &key &allow-other-keys)
   (let ((table        (make-array +standard-characters-limit+
                                   :initial-element *cd-invalid*)))
     (setf (aref table (char-code #\Backspace)) *cd-constituent-invalid*
@@ -1863,7 +1862,7 @@ NOTE:   terminates with any kind of list, dotted, circular, etc.
     (apply constructor arguments)))


-
+#-sbcl
 (defmethod initialize-instance :after ((self readtable) &rest rest &key &allow-other-keys)
   (unless (getf rest :syntax-table)
     (macrolet ((smc (&rest clauses)
@@ -1923,6 +1922,71 @@ NOTE:   terminates with any kind of list, dotted, circular, etc.
        ;; (#\# #\Y SYSTEM::CLOSURE-READER)
        ))))

+;; Working around sbcl bugs is always a pleasure…
+#+sbcl
+(defun init (self rest)
+  (unless (getf rest :syntax-table)
+    (macrolet ((smc (&rest clauses)
+                 `(progn
+                    ,@(mapcar (lambda (clause)
+                                `(set-macro-character
+                                  ,(first clause)
+                                  (function ,(second clause))
+                                  ,(third clause)
+                                  self))
+                              clauses))))
+      (smc
+       (#\; reader-macro-line-comment     nil)
+       (#\" reader-macro-string           nil)
+       (#\' reader-macro-quote            nil)
+       (#\` reader-macro-backquote        nil)
+       (#\, reader-macro-comma            nil)
+       (#\( reader-macro-left-parenthesis nil)
+       (#\) reader-macro-error-start      nil)))
+    (macrolet ((dmc (&rest clauses)
+                 `(progn
+                    ,@(mapcar (lambda (clause)
+                                `(set-dispatch-macro-character
+                                  ,(first  clause)
+                                  ,(second clause)
+                                  (function ,(third clause))
+                                  self))
+                              clauses))))
+      (make-dispatch-macro-character #\# t self)
+      (dmc
+       (#\# #\SPACE   reader-dispatch-macro-error-invalid)
+       (#\# #\NEWLINE reader-dispatch-macro-error-invalid)
+       (#\# #\# reader-dispatch-macro-label-reference)
+       (#\# #\' reader-dispatch-macro-function)
+       (#\# #\( reader-dispatch-macro-vector)
+       (#\# #\* reader-dispatch-macro-bit-vector)
+       (#\# #\+ reader-dispatch-macro-feature)
+       (#\# #\- reader-dispatch-macro-not-feature)
+       (#\# #\. reader-dispatch-macro-read-eval)
+       (#\# #\: reader-dispatch-macro-uninterned)
+       (#\# #\< reader-dispatch-macro-unreadable)
+       (#\# #\= reader-dispatch-macro-label-definition)
+       (#\# #\A reader-dispatch-macro-array)
+       (#\# #\B reader-dispatch-macro-binary)
+       (#\# #\C reader-dispatch-macro-complex)
+       (#\# #\O reader-dispatch-macro-octal)
+       (#\# #\P reader-dispatch-macro-pathname)
+       (#\# #\R reader-dispatch-macro-radix)
+       (#\# #\S reader-dispatch-macro-structure)
+       (#\# #\X reader-dispatch-macro-hexadecimal)
+       (#\# #\\ reader-dispatch-macro-char)
+       (#\# #\| reader-dispatch-macro-comment)
+       ;; clisp extensions:
+       ;; (#\# #\! reader-dispatch-macro-executable)
+       ;; (#\# #\" reader-dispatch-macro-clisp-pathname)
+       ;; (#\# #\, reader-dispatch-macro-load-eval)
+       ;; (#\# #\Y SYSTEM::CLOSURE-READER)
+       ))))
+
+#+sbcl
+(defmethod initialize-instance :after ((self readtable) &rest rest &key &allow-other-keys)
+  (init self rest))
+

 (setf *standard-readtable* (copy-readtable nil)
       *readtable*          (copy-readtable nil))
diff --git a/common-lisp/lisp-sexp/com.informatimago.common-lisp.lisp-sexp.asd b/common-lisp/lisp-sexp/com.informatimago.common-lisp.lisp-sexp.asd
index 4afa68f..6fbfef0 100644
--- a/common-lisp/lisp-sexp/com.informatimago.common-lisp.lisp-sexp.asd
+++ b/common-lisp/lisp-sexp/com.informatimago.common-lisp.lisp-sexp.asd
@@ -39,7 +39,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.lisp-sexp/")
diff --git a/common-lisp/lisp-sexp/com.informatimago.common-lisp.lisp-sexp.test.asd b/common-lisp/lisp-sexp/com.informatimago.common-lisp.lisp-sexp.test.asd
index 942ce6f..f47dbb0 100644
--- a/common-lisp/lisp-sexp/com.informatimago.common-lisp.lisp-sexp.test.asd
+++ b/common-lisp/lisp-sexp/com.informatimago.common-lisp.lisp-sexp.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.lisp-sexp")
   :components     ((:file "source-form-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.COMMON-LISP.LISP-SEXP.SOURCE-FORM.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.COMMON-LISP.LISP-SEXP.SOURCE-FORM.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.COMMON-LISP.LISP-SEXP.SOURCE-FORM.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.COMMON-LISP.LISP-SEXP.SOURCE-FORM.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/common-lisp/lisp-text/com.informatimago.common-lisp.lisp-text.asd b/common-lisp/lisp-text/com.informatimago.common-lisp.lisp-text.asd
index d32a1bd..acd414d 100644
--- a/common-lisp/lisp-text/com.informatimago.common-lisp.lisp-text.asd
+++ b/common-lisp/lisp-text/com.informatimago.common-lisp.lisp-text.asd
@@ -39,7 +39,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.lisp-text/")
diff --git a/common-lisp/lisp-text/com.informatimago.common-lisp.lisp-text.test.asd b/common-lisp/lisp-text/com.informatimago.common-lisp.lisp-text.test.asd
index 911fbc2..e2b99cb 100644
--- a/common-lisp/lisp-text/com.informatimago.common-lisp.lisp-text.test.asd
+++ b/common-lisp/lisp-text/com.informatimago.common-lisp.lisp-text.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.lisp-text")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/lisp/com.informatimago.common-lisp.lisp.asd b/common-lisp/lisp/com.informatimago.common-lisp.lisp.asd
index ae3d326..069f5a0 100644
--- a/common-lisp/lisp/com.informatimago.common-lisp.lisp.asd
+++ b/common-lisp/lisp/com.informatimago.common-lisp.lisp.asd
@@ -46,7 +46,7 @@ specialization.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes
-  :version "1.2.2"
+  :version "1.2.4"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.lisp/")
diff --git a/common-lisp/lisp/com.informatimago.common-lisp.lisp.ibcl.asd b/common-lisp/lisp/com.informatimago.common-lisp.lisp.ibcl.asd
index fc43b46..3fab385 100644
--- a/common-lisp/lisp/com.informatimago.common-lisp.lisp.ibcl.asd
+++ b/common-lisp/lisp/com.informatimago.common-lisp.lisp.ibcl.asd
@@ -48,7 +48,7 @@ COM.INFORMATIMAGO.COMMON-LISP.LISP.IBCL                IBCL package.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes
-  :version "1.0.0"
+  :version "1.0.2"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Summer 2012")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.lisp.ibcl/")
diff --git a/common-lisp/lisp/com.informatimago.common-lisp.lisp.ibcl.test.asd b/common-lisp/lisp/com.informatimago.common-lisp.lisp.ibcl.test.asd
index 8d6f898..3ce99c7 100644
--- a/common-lisp/lisp/com.informatimago.common-lisp.lisp.ibcl.test.asd
+++ b/common-lisp/lisp/com.informatimago.common-lisp.lisp.ibcl.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.lisp.ibcl")
   :components     ((:file "source-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.COMMON-LISP.LISP.SOURCE.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.COMMON-LISP.LISP.SOURCE.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.COMMON-LISP.LISP.SOURCE.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.COMMON-LISP.LISP.SOURCE.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/common-lisp/lisp/com.informatimago.common-lisp.lisp.stepper.asd b/common-lisp/lisp/com.informatimago.common-lisp.lisp.stepper.asd
index ce3437e..7688be5 100644
--- a/common-lisp/lisp/com.informatimago.common-lisp.lisp.stepper.asd
+++ b/common-lisp/lisp/com.informatimago.common-lisp.lisp.stepper.asd
@@ -44,7 +44,7 @@ This system implements a portable stepper.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes
-  :version "1.0.0"
+  :version "1.0.2"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Summer 2012")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.lisp.stepper/")
diff --git a/common-lisp/lisp/com.informatimago.common-lisp.lisp.stepper.test.asd b/common-lisp/lisp/com.informatimago.common-lisp.lisp.stepper.test.asd
index a13e102..6bf30ec 100644
--- a/common-lisp/lisp/com.informatimago.common-lisp.lisp.stepper.test.asd
+++ b/common-lisp/lisp/com.informatimago.common-lisp.lisp.stepper.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.lisp.stepper"
                    "com.informatimago.common-lisp.cesarum")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/lisp/com.informatimago.common-lisp.lisp.test.asd b/common-lisp/lisp/com.informatimago.common-lisp.lisp.test.asd
index 426f970..267091c 100644
--- a/common-lisp/lisp/com.informatimago.common-lisp.lisp.test.asd
+++ b/common-lisp/lisp/com.informatimago.common-lisp.lisp.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.lisp")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.COMMON-LISP.LISP.SOURCE.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.COMMON-LISP.LISP.SOURCE.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.COMMON-LISP.LISP.SOURCE.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.COMMON-LISP.LISP.SOURCE.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/common-lisp/parser/com.informatimago.common-lisp.parser.asd b/common-lisp/parser/com.informatimago.common-lisp.parser.asd
index f7fd978..6525277 100644
--- a/common-lisp/parser/com.informatimago.common-lisp.parser.asd
+++ b/common-lisp/parser/com.informatimago.common-lisp.parser.asd
@@ -39,7 +39,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.parser/")
diff --git a/common-lisp/parser/com.informatimago.common-lisp.parser.test.asd b/common-lisp/parser/com.informatimago.common-lisp.parser.test.asd
index 71a5077..c6d5e5f 100644
--- a/common-lisp/parser/com.informatimago.common-lisp.parser.test.asd
+++ b/common-lisp/parser/com.informatimago.common-lisp.parser.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.parser")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/parser/scanner.lisp b/common-lisp/parser/scanner.lisp
index 064d3fe..cd9906c 100644
--- a/common-lisp/parser/scanner.lisp
+++ b/common-lisp/parser/scanner.lisp
@@ -247,6 +247,7 @@ RETURN:       (scanner-current-token scanner).
 "))


+(defgeneric (setf scanner-source) (new-source scanner))
 (defmethod (setf scanner-source) (new-source (scanner scanner))
   (setf (slot-value scanner 'stream)
         (etypecase (setf (slot-value scanner 'source) new-source)
diff --git a/common-lisp/picture/com.informatimago.common-lisp.picture.asd b/common-lisp/picture/com.informatimago.common-lisp.picture.asd
index 558b66c..b8130bd 100644
--- a/common-lisp/picture/com.informatimago.common-lisp.picture.asd
+++ b/common-lisp/picture/com.informatimago.common-lisp.picture.asd
@@ -39,7 +39,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.picture/")
diff --git a/common-lisp/picture/com.informatimago.common-lisp.picture.test.asd b/common-lisp/picture/com.informatimago.common-lisp.picture.test.asd
index 468a982..d79e591 100644
--- a/common-lisp/picture/com.informatimago.common-lisp.picture.test.asd
+++ b/common-lisp/picture/com.informatimago.common-lisp.picture.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.picture")
   :components     ((:file "picture-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (dolist (p '("COM.INFORMATIMAGO.COMMON-LISP.PICTURE.PICTURE.TEST"))
-                     (let ((*package* (find-package p)))
-                       (uiop/package:symbol-call p "TEST/ALL")))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (dolist (p '("COM.INFORMATIMAGO.COMMON-LISP.PICTURE.PICTURE.TEST"))
+                              (let ((*package* (find-package p)))
+                                (uiop/package:symbol-call p "TEST/ALL")))))

 ;;;; THE END ;;;;
diff --git a/common-lisp/picture/picture.lisp b/common-lisp/picture/picture.lisp
index 100899d..b8122cf 100644
--- a/common-lisp/picture/picture.lisp
+++ b/common-lisp/picture/picture.lisp
@@ -223,6 +223,8 @@ DO:      Draws the frame FRAME of the SPRITE on the picture PICT,
 (defgeneric background (picture)
   (:documentation "The background character of the picture."))

+(defgeneric data (picture))
+
 (pjb-defclass picture nil
   (:att data        (array character 2)       "Picture data.")
   (:att background  character (character " ") "The background character.")
@@ -545,8 +547,6 @@ NOTE:    A future implementation won't use DRAW-POINT for performance.

 (defgeneric name (sprite)
   (:documentation "Name of this sprite."))
-(defgeneric data (sprite)
-  (:documentation "Sprite data."))
 (defgeneric spot-x (sprite)
   (:documentation "X coordinate of the spot of the sprite."))
 (defgeneric spot-y (sprite)
diff --git a/common-lisp/regexp/com.informatimago.common-lisp.regexp.test.asd b/common-lisp/regexp/com.informatimago.common-lisp.regexp.test.asd
index 9559cc4..5e4c44b 100644
--- a/common-lisp/regexp/com.informatimago.common-lisp.regexp.test.asd
+++ b/common-lisp/regexp/com.informatimago.common-lisp.regexp.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.regexp")
   :components     ((:file "regexp-posix-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.COMMON-LISP.REGEXP.REGEXP-POSIX.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.COMMON-LISP.REGEXP.REGEXP-POSIX.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.COMMON-LISP.REGEXP.REGEXP-POSIX.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.COMMON-LISP.REGEXP.REGEXP-POSIX.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/common-lisp/rfc2822/com.informatimago.common-lisp.rfc2822.asd b/common-lisp/rfc2822/com.informatimago.common-lisp.rfc2822.asd
index 12991dd..da05d9f 100644
--- a/common-lisp/rfc2822/com.informatimago.common-lisp.rfc2822.asd
+++ b/common-lisp/rfc2822/com.informatimago.common-lisp.rfc2822.asd
@@ -43,7 +43,7 @@ A few RFC0822/RFC2822 utility fucntions.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.rfc2822/")
diff --git a/common-lisp/rfc2822/com.informatimago.common-lisp.rfc2822.test.asd b/common-lisp/rfc2822/com.informatimago.common-lisp.rfc2822.test.asd
index ea9ceea..b2b8c83 100644
--- a/common-lisp/rfc2822/com.informatimago.common-lisp.rfc2822.test.asd
+++ b/common-lisp/rfc2822/com.informatimago.common-lisp.rfc2822.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.rfc2822")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/common-lisp/rfc3548/com.informatimago.common-lisp.rfc3548.asd b/common-lisp/rfc3548/com.informatimago.common-lisp.rfc3548.asd
index 9aa9ac3..b06e640 100644
--- a/common-lisp/rfc3548/com.informatimago.common-lisp.rfc3548.asd
+++ b/common-lisp/rfc3548/com.informatimago.common-lisp.rfc3548.asd
@@ -39,7 +39,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.2"
+  :version "1.2.4"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.rfc3548/")
diff --git a/common-lisp/rfc3548/com.informatimago.common-lisp.rfc3548.test.asd b/common-lisp/rfc3548/com.informatimago.common-lisp.rfc3548.test.asd
index c9c8cdc..6eafd1a 100644
--- a/common-lisp/rfc3548/com.informatimago.common-lisp.rfc3548.test.asd
+++ b/common-lisp/rfc3548/com.informatimago.common-lisp.rfc3548.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.rfc3548")
   :components     ((:file "rfc3548-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.COMMON-LISP.RFC3548.RFC3548.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.COMMON-LISP.RFC3548.RFC3548.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.COMMON-LISP.RFC3548.RFC3548.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.COMMON-LISP.RFC3548.RFC3548.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/common-lisp/rfc3548/rfc3548-test.lisp b/common-lisp/rfc3548/rfc3548-test.lisp
index ae80d48..eaf0627 100644
--- a/common-lisp/rfc3548/rfc3548-test.lisp
+++ b/common-lisp/rfc3548/rfc3548-test.lisp
@@ -105,8 +105,6 @@ publié en 1962 par MIT Press, un des maîtres­livres de l'Informatique.
 (define-test test/all-encodings ()
   (dolist (enc '(:base16 :base32 :base64 :filebase64))
     (dolist (line '(nil t))
-      (format t "~&TESTING ~A ~:[~;with lines~]" enc line)
-      (finish-output)
       (test/encoding enc :line-width (when line 40) :ignore-crlf line))))


diff --git a/common-lisp/telnet/com.informatimago.common-lisp.telnet.asd b/common-lisp/telnet/com.informatimago.common-lisp.telnet.asd
index fb92102..9a83a50 100644
--- a/common-lisp/telnet/com.informatimago.common-lisp.telnet.asd
+++ b/common-lisp/telnet/com.informatimago.common-lisp.telnet.asd
@@ -49,7 +49,7 @@ with a TCP/IP socket or other communication service.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "0.9.1"
+  :version "0.9.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Spring 2012")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.telnet/")
diff --git a/common-lisp/telnet/com.informatimago.common-lisp.telnet.test.asd b/common-lisp/telnet/com.informatimago.common-lisp.telnet.test.asd
index bf09a5f..56ac504 100644
--- a/common-lisp/telnet/com.informatimago.common-lisp.telnet.test.asd
+++ b/common-lisp/telnet/com.informatimago.common-lisp.telnet.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.telnet")
   :components     ((:file "telnet-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.COMMON-LISP.TELNET.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.COMMON-LISP.TELNET.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.COMMON-LISP.TELNET.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.COMMON-LISP.TELNET.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/common-lisp/unix/com.informatimago.common-lisp.unix.asd b/common-lisp/unix/com.informatimago.common-lisp.unix.asd
index d217df6..416345e 100644
--- a/common-lisp/unix/com.informatimago.common-lisp.unix.asd
+++ b/common-lisp/unix/com.informatimago.common-lisp.unix.asd
@@ -41,7 +41,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.2"
+  :version "1.2.4"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Winter 2012")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.unix/")
diff --git a/common-lisp/unix/com.informatimago.common-lisp.unix.test.asd b/common-lisp/unix/com.informatimago.common-lisp.unix.test.asd
index 43306c0..42b2c03 100644
--- a/common-lisp/unix/com.informatimago.common-lisp.unix.test.asd
+++ b/common-lisp/unix/com.informatimago.common-lisp.unix.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.common-lisp.unix")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/editor/com.informatimago.editor.asd b/editor/com.informatimago.editor.asd
index e2e4217..38a7c31 100644
--- a/editor/com.informatimago.editor.asd
+++ b/editor/com.informatimago.editor.asd
@@ -36,7 +36,7 @@
 (asdf:defsystem "com.informatimago.editor"
   :description "An emacs-like editor."
   :author "Pascal J. Bourguignon"
-  :version "1.0.4"
+  :version "1.0.6"
   :license "AGPL3"
   :depends-on ("com.informatimago.common-lisp.cesarum"
                "com.informatimago.common-lisp.lisp-sexp"
diff --git a/editor/com.informatimago.editor.test.asd b/editor/com.informatimago.editor.test.asd
index 0b058dc..961929d 100644
--- a/editor/com.informatimago.editor.test.asd
+++ b/editor/com.informatimago.editor.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.editor")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/editor/editor.lisp b/editor/editor.lisp
index 1633d3f..12deb6d 100644
--- a/editor/editor.lisp
+++ b/editor/editor.lisp
@@ -485,7 +485,10 @@ BINDING:    must be either a symbol (naming a command),
          (*old-terminal-io* *terminal-io*)
          (*debug-io*        io)
          (*terminal-io*     io))
-    (unwind-protect (invoke-debugger "Debugger invoked interactively")
+    (unwind-protect
+         (invoke-debugger
+          (make-condition 'simple-error
+                          :format-control "Debugger invoked interactively"))
       (close io))))


@@ -2072,7 +2075,10 @@ These commands include C-@ and M-x start-kbd-macro."
 #-mocl
 (defun reload ()
   (in-package "CL-USER")
-  (ql:quickload :com.informatimago.editor)
+  (funcall (when (find-package "QL")
+             (intern "QUICKLOAD" (find-package "QL"))
+             (function identity))
+           :com.informatimago.editor)
   (in-package "EDITOR"))


diff --git a/future/com.informatimago.future.asd b/future/com.informatimago.future.asd
index f27f36d..2eacfaf 100644
--- a/future/com.informatimago.future.asd
+++ b/future/com.informatimago.future.asd
@@ -36,7 +36,7 @@
 (asdf:defsystem "com.informatimago.future"
   :description "Future Informatimago Projects - Not ready for consumption."
   :author "Pascal J. Bourguignon"
-  :version "1.0.2"
+  :version "1.0.4"
   :license "AGPL3"
   :depends-on ()
   :components ()
diff --git a/future/com.informatimago.future.empty.asd b/future/com.informatimago.future.empty.asd
index 1ded3c5..5a8816b 100644
--- a/future/com.informatimago.future.empty.asd
+++ b/future/com.informatimago.future.empty.asd
@@ -35,11 +35,11 @@
 (asdf:defsystem "com.informatimago.future.empty"
   :description "Empty system."
   :author "Pascal J. Bourguignon"
-  :version "1.0.0"
+  :version "1.0.2"
   :license "AGPL3"
   :depends-on ()
   :components ()
-  "com.informatimago.future.empty.test")
+  :in-order-to ((asdf:test-op (asdf:test-op "com.informatimago.future.empty.test"))))


 ;;;; THE END ;;;;
diff --git a/future/com.informatimago.future.empty.test.asd b/future/com.informatimago.future.empty.test.asd
index 7a8682d..858bdc8 100644
--- a/future/com.informatimago.future.empty.test.asd
+++ b/future/com.informatimago.future.empty.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.future.empty")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/future/com.informatimago.future.test.asd b/future/com.informatimago.future.test.asd
index 7d724be..454d73e 100644
--- a/future/com.informatimago.future.test.asd
+++ b/future/com.informatimago.future.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.future")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/languages/cpp/c-string-reader-test.lisp b/languages/cpp/c-string-reader-test.lisp
new file mode 100644
index 0000000..829bef9
--- /dev/null
+++ b/languages/cpp/c-string-reader-test.lisp
@@ -0,0 +1,51 @@
+;;;; -*- mode:lisp;coding:utf-8 -*-
+;;;;**************************************************************************
+;;;;FILE:               c-string-reader-test.lisp
+;;;;LANGUAGE:           Common-Lisp
+;;;;SYSTEM:             Common-Lisp
+;;;;USER-INTERFACE:     NONE
+;;;;DESCRIPTION
+;;;;
+;;;;    Tests c-string-reader.
+;;;;
+;;;;AUTHORS
+;;;;    <PJB> Pascal J. Bourguignon <pjb@informatimago.com>
+;;;;MODIFICATIONS
+;;;;    2015-07-06 <PJB> Extracted from c-string-reader.lisp
+;;;;BUGS
+;;;;LEGAL
+;;;;    AGPL3
+;;;;
+;;;;    Copyright Pascal J. Bourguignon 2015 - 2015
+;;;;
+;;;;    This program is free software: you can redistribute it and/or modify
+;;;;    it under the terms of the GNU Affero General Public License as published by
+;;;;    the Free Software Foundation, either version 3 of the License, or
+;;;;    (at your option) any later version.
+;;;;
+;;;;    This program is distributed in the hope that it will be useful,
+;;;;    but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;;;    GNU Affero General Public License for more details.
+;;;;
+;;;;    You should have received a copy of the GNU Affero General Public License
+;;;;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+;;;;**************************************************************************
+(in-package "COM.INFORMATIMAGO.LANGUAGES.CPP")
+
+(define-test test/read-c-string ()
+ (let ((*readtable*
+        (let ((rt (copy-readtable nil)))
+          (set-macro-character #\" 'read-c-string nil rt)
+          (set-macro-character #\' 'read-c-string nil rt)
+          rt)))
+   (check equal (read-from-string "(\"Hello, bell=\\a, backspace=\\b, page=\\f, newline=\\n, return=\\r, tab=\\t, vt=\\v, \\
+\\\"double-quotes\\\", \\'single-quotes\\', question\\?, backslash=\\\\, \\
+hexa=\\x3BB, octal=\\101, \\7\\77\\107\\3071\" 'a' '\\xe9' '\\\\' '\\'' '\\n')")
+           '("Hello, bell=, backspace=, page=, newline=
+, return=
, tab=	, vt=, \"double-quotes\", 'single-quotes', question?, backslash=\\, hexa=λ, octal=A, ?GÇ1"
+             "a" "é" "\\" "'" "
+"))
+   :success))
+
+;;;; THE END ;;;;
diff --git a/languages/cpp/c-string-reader.lisp b/languages/cpp/c-string-reader.lisp
index 3951720..89b8adf 100644
--- a/languages/cpp/c-string-reader.lisp
+++ b/languages/cpp/c-string-reader.lisp
@@ -196,21 +196,4 @@ The initial delimited must have been read already."
      :finally (princ "\"" stream)))


-
-(defun test/read-c-string ()
- (let ((*readtable*
-        (let ((rt (copy-readtable nil)))
-          (set-macro-character #\" 'read-c-string nil rt)
-          (set-macro-character #\' 'read-c-string nil rt)
-          rt)))
-   (assert (equal  (read-from-string "(\"Hello, bell=\\a, backspace=\\b, page=\\f, newline=\\n, return=\\r, tab=\\t, vt=\\v, \\
-\\\"double-quotes\\\", \\'single-quotes\\', question\\?, backslash=\\\\, \\
-hexa=\\x3BB, octal=\\101, \\7\\77\\107\\3071\" 'a' '\\xe9' '\\\\' '\\'' '\\n')")
-                  '("Hello, bell=, backspace=, page=, newline=
-, return=
, tab=	, vt=, \"double-quotes\", 'single-quotes', question?, backslash=\\, hexa=λ, octal=A, ?GÇ1"
-                    "a" "é" "\\" "'" "
-")))
-   :success))
-
-
 ;;;; THE END ;;;;
diff --git a/languages/cpp/com.informatimago.languages.cpp.asd b/languages/cpp/com.informatimago.languages.cpp.asd
index 28d8f2b..f5d5131 100644
--- a/languages/cpp/com.informatimago.languages.cpp.asd
+++ b/languages/cpp/com.informatimago.languages.cpp.asd
@@ -39,7 +39,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component  attributes:
-  :version "0.9.0"
+  :version "0.9.2"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Summer 2015")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.languages.cpp/")
diff --git a/languages/cpp/com.informatimago.languages.cpp.test.asd b/languages/cpp/com.informatimago.languages.cpp.test.asd
new file mode 100644
index 0000000..0a0b4ae
--- /dev/null
+++ b/languages/cpp/com.informatimago.languages.cpp.test.asd
@@ -0,0 +1,62 @@
+;;;; -*- mode:lisp;coding:utf-8 -*-
+;;;;**************************************************************************
+;;;;FILE:               com.informatimago.languages.cpp.test.asd
+;;;;LANGUAGE:           Common-Lisp
+;;;;SYSTEM:             Common-Lisp
+;;;;USER-INTERFACE:     NONE
+;;;;DESCRIPTION
+;;;;
+;;;;    ASD file to test the com.informatimago.languages.cpp library.
+;;;;
+;;;;AUTHORS
+;;;;    <PJB> Pascal J. Bourguignon <pjb@informatimago.com>
+;;;;MODIFICATIONS
+;;;;    2015-06-28 <PJB> Created.
+;;;;BUGS
+;;;;LEGAL
+;;;;    AGPL3
+;;;;
+;;;;    Copyright Pascal J. Bourguignon 2015 - 2015
+;;;;
+;;;;    This program is free software: you can redistribute it and/or modify
+;;;;    it under the terms of the GNU Affero General Public License as published by
+;;;;    the Free Software Foundation, either version 3 of the License, or
+;;;;    (at your option) any later version.
+;;;;
+;;;;    This program is distributed in the hope that it will be useful,
+;;;;    but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;;;    GNU Affero General Public License for more details.
+;;;;
+;;;;    You should have received a copy of the GNU Affero General Public License
+;;;;    along with this program.  If not, see http://www.gnu.org/licenses/
+;;;;**************************************************************************
+
+(asdf:defsystem "com.informatimago.languages.cpp.test"
+  ;; system attributes:
+  :description "Tests of the implementation of the C Pre Processor with some GNU cpp extensions."
+  :author     "Pascal J. Bourguignon <pjb@informatimago.com>"
+  :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
+  :licence "AGPL3"
+  ;; component  attributes:
+  :version "0.9.2"
+  :properties ((#:author-email                   . "pjb@informatimago.com")
+               (#:date                           . "Summer 2015")
+               ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.languages.cpp/")
+               ((#:albert #:formats)             . ("docbook"))
+               ((#:albert #:docbook #:template)  . "book")
+               ((#:albert #:docbook #:bgcolor)   . "white")
+               ((#:albert #:docbook #:textcolor) . "black"))
+  #+asdf-unicode :encoding #+asdf-unicode :utf-8
+  :depends-on ("com.informatimago.common-lisp.cesarum"
+               "com.informatimago.languages.cpp")
+  :components ((:file "packages"             :depends-on  ())
+               (:file "c-string-reader-test" :depends-on  ("packages"))
+               (:file "cpp-test"             :depends-on  ("packages")))
+  #+asdf3 :perform #+asdf3 (asdf:test-op (o s)
+                                         (declare (ignore o s))
+                                         (dolist (p '("COM.INFORMATIMAGO.LANGUAGES.CPP"))
+                                           (let ((*package* (find-package p)))
+                                             (uiop:symbol-call p "TEST/ALL")))))
+
+;;;; THE END ;;;;
diff --git a/languages/cpp/cpp-macro.lisp b/languages/cpp/cpp-macro.lisp
index 2cbc51b..1f72a73 100644
--- a/languages/cpp/cpp-macro.lisp
+++ b/languages/cpp/cpp-macro.lisp
@@ -329,6 +329,7 @@ concatenation
                      (context-line *context*)
                      (context-file *context*))))))

+(defgeneric argument-stringified (argument))
 (defmethod argument-stringified ((argument argument))
   (or (argument-%stringified argument)
       (setf (argument-%stringified argument) (stringify (argument-tokens argument)))))
@@ -698,9 +699,11 @@ concatenation
 (defun option (context option)
   (cdr (assoc option (context-options context))))

+(defgeneric context-include-level (context))
 (defmethod context-include-level ((context context))
   (length (context-file-stack context)))

+(defgeneric context-push-file (context path directory input-lines))
 (defmethod context-push-file ((context context) path directory input-lines)
   (push (list (context-directory context)
               (context-file context)
@@ -721,6 +724,7 @@ concatenation
         (context-current-line context) nil)
   context)

+(defgeneric context-pop-file (context))
 (defmethod context-pop-file ((context context))
   (let ((data (pop (context-file-stack context))))
     (setf (context-directory context) (pop data)
@@ -733,11 +737,13 @@ concatenation
           (context-current-line context) (pop data)))
   context)

+
+(defgeneric update-context (context &key token line column file))
 (defmethod update-context ((context context) &key
-                          (token         nil tokenp)
-                          (line          nil linep)
-                          (column        nil columnp)
-                          (file          nil filep))
+                                               (token         nil tokenp)
+                                               (line          nil linep)
+                                               (column        nil columnp)
+                                               (file          nil filep))
   (when tokenp          (setf (context-token         context) token))
   (when linep           (setf (context-line          context) line))
   (when columnp         (setf (context-column        context) column))
@@ -817,6 +823,7 @@ concatenation
                 tokenized-lines)
         (values '() line tokenized-lines))))

+(defgeneric macro-expand-macros (context line tokenized-lines output-lines allow-defined already-expanded))
 (defmethod macro-expand-macros ((context context) line tokenized-lines output-lines allow-defined already-expanded)
   (loop
     :with environment = (context-environment context)
diff --git a/languages/cpp/cpp-test.lisp b/languages/cpp/cpp-test.lisp
new file mode 100644
index 0000000..0c5dd73
--- /dev/null
+++ b/languages/cpp/cpp-test.lisp
@@ -0,0 +1,304 @@
+;;;; -*- mode:lisp;coding:utf-8 -*-
+;;;;**************************************************************************
+;;;;FILE:               cpp-test.lisp
+;;;;LANGUAGE:           Common-Lisp
+;;;;SYSTEM:             Common-Lisp
+;;;;USER-INTERFACE:     NONE
+;;;;DESCRIPTION
+;;;;
+;;;;
+;;;;
+;;;;AUTHORS
+;;;;    <PJB> Pascal J. Bourguignon <pjb@informatimago.com>
+;;;;MODIFICATIONS
+;;;;    2015-07-06 <PJB> Extracted  from cpp.lisp
+;;;;BUGS
+;;;;LEGAL
+;;;;    AGPL3
+;;;;
+;;;;    Copyright Pascal J. Bourguignon 2015 - 2015
+;;;;
+;;;;    This program is free software: you can redistribute it and/or modify
+;;;;    it under the terms of the GNU Affero General Public License as published by
+;;;;    the Free Software Foundation, either version 3 of the License, or
+;;;;    (at your option) any later version.
+;;;;
+;;;;    This program is distributed in the hope that it will be useful,
+;;;;    but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;;;    GNU Affero General Public License for more details.
+;;;;
+;;;;    You should have received a copy of the GNU Affero General Public License
+;;;;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+;;;;**************************************************************************
+(in-package "COM.INFORMATIMAGO.LANGUAGES.CPP")
+
+(define-test test/substitute-trigraphs ()
+  (check equal (substitute-trigraphs (make-numbered-line :text (copy-seq "hello world")))
+          '("hello world" 1 "-"))
+  (check equal (substitute-trigraphs (make-numbered-line :text (copy-seq "??( brackets ??)???<braces??>??=??'a??!??-; (??\\?) (a==b???-c:'??/n')")))
+          '("[ brackets ]?{braces}#^a|~; (??\\?) (a==b?~c:'\\n')" 1 "-"))
+  :success)
+
+(define-test test/number-lines ()
+  (check equal (number-lines '("a" "b" "c") "file.c" :start 2)
+          '(("a" 2 #1="file.c") ("b" 3 #1#) ("c" 4 #1#)))
+  :success)
+
+(define-test test/merge-continued-lines ()
+  (check equal (merge-continued-lines '(("first line" 1 #1="file.c")
+                                         ("abc\\" 2 #1#)
+                                         ("def\\" 3 #1#)
+                                         ("ghi" 4 #1#)
+                                         ("middle line" 5 #1#)
+                                         ("abc \\" 6 #1#)
+                                         ("def \\  " 7 #1#)
+                                         ("ghi" 8 #1#)
+                                         ("last line" 9 #1#))
+                                       :warn-spaces-in-continued-lines nil)
+          '(("first line" 1 #2="file.c") ("abcdefghi" 2 #2#) ("middle line" 5 #2#) ("abc def ghi" 6 #2#) ("last line" 9 #2#)))
+  :success)
+
+(define-test test/remove-comments-in-line ()
+  (flet ((try (text &optional (state :top) comment-start)
+           (multiple-value-list (remove-comments-in-line comment-start
+                                                         (make-numbered-line :text text
+                                                                             :lino 42 :file "hw.c")
+                                                         state t))))
+    (check equal (try "Hello world")
+            '(("Hello world" 42 "hw.c") :top))
+    ;; comment in string
+    (check equal (try "Hello \"salut /* le */ monde\" world")
+           '(("Hello \"salut /* le */ monde\" world" 42 "hw.c") :top))
+    (check equal (try "Hello \"salut \\\"/* le */\\\" monde\" world")
+           '(("Hello \"salut \\\"/* le */\\\" monde\" world" 42 "hw.c") :top))
+    (assert-true (typep (nth-value 1 (ignore-errors (try "Hello \"salut"))) 'error))
+    (assert-true (typep (nth-value 1 (ignore-errors (try "Hello \"salut\\"))) 'error))
+    ;; comment in characters
+    (check equal (try "Hello 'salut /* le */ monde' world")
+           '(("Hello 'salut /* le */ monde' world" 42 "hw.c") :top))
+    (check equal (try "Hello 'salut \\'/* le */\\' monde' world")
+           '(("Hello 'salut \\'/* le */\\' monde' world" 42 "hw.c") :top))
+    (assert-true (typep (nth-value 1 (ignore-errors (try "Hello 'salut"))) 'error))
+    (assert-true (typep (nth-value 1 (ignore-errors (try "Hello 'salut\\"))) 'error))
+    ;; single line comment
+    (check equal (try "Hello//monde*/world")   '(("Hello" 42 "hw.c") :top))
+    ;; monoline block comment
+    (check equal (try "Hello/*monde*/world")   '(("Hello world" 42 "hw.c") :top))
+    (check equal (try "Hello/*mon//de*/world") '(("Hello world" 42 "hw.c") :top))
+    (check equal (try "Hello/*mon/*de*/world") '(("Hello world" 42 "hw.c") :top))
+    ;; multiline block comment first line
+    (check equal (try "Hello world/*salut") '(("Hello world" 42 "hw.c") :in-multiline-comment))
+    (check equal (try "Hello/*monde*/world/*salut") '(("Hello world" 42 "hw.c") :in-multiline-comment))
+    ;; multiline block comment in the middle lines
+    (check equal (try "in the middle comment" :in-multiline-comment '("Hello world" 42 "hw.c"))
+           '(("Hello world" 42 "hw.c") :in-multiline-comment))
+    (check equal (try "in /* the // middle comment" :in-multiline-comment '("Hello world" 42 "hw.c"))
+           '(("Hello world" 42 "hw.c") :in-multiline-comment))
+    ;; multiline block comment in the end line
+    (check equal (try "end comment */end line" :in-multiline-comment '("Hello world" 42 "hw.c"))
+           '(("Hello world end line" 42 "hw.c") :top))
+    (check equal (try "end comment */end/*fin*/line" :in-multiline-comment '("Hello world" 42 "hw.c"))
+           '(("Hello world end line" 42 "hw.c") :top))
+    (check equal (try "end // comment */end/*fin*/line" :in-multiline-comment '("Hello world" 42 "hw.c"))
+           '(("Hello world end line" 42 "hw.c") :top))
+    (check equal (try "end // comment */end/*fin*/line// c'est fini" :in-multiline-comment '("Hello world" 42 "hw.c"))
+           '(("Hello world end line" 42 "hw.c") :top))
+    :success))
+
+(define-test test/remove-comments ()
+  (check equal (remove-comments '(("Line one" 1 #1="test.c")
+                                  ("Line/**/two" 2 #1#)
+                                  ("Line/*three*/3" 3 #1#)
+                                  ("Line/*4*/four/*and*/some" 4 #1#)
+                                  ("Line/*-*/five/*a//nd*/some" 5 #1#)
+                                  ("Line/*/five/*a//nd some" 6 #1#)
+                                  ("Line//6 */seven" 7 #1#)
+                                  ("Line/*/eight/*a//nd some" 8 #1#)
+                                  ("Line nine" 9 #1#)
+                                  ("Line//9 */ten" 10 #1#)
+                                  ("Line \"ele/*v*/en\"--" 11 #1#)
+                                  ("Line 'tw//elv/*e*/'--" 12 #1#)))
+         '(("Line one" 1 #2="test.c")
+           ("Line two" 2 #2#)
+           ("Line 3" 3 #2#)
+           ("Line four some" 4 #2#)
+           ("Line five some" 5 #2#)
+           ("Line seven" 6 #2#)
+           ("Line ten" 8 #2#)
+           ("Line \"ele/*v*/en\"--" 11 #2#)
+           ("Line 'tw//elv/*e*/'--" 12 #2#)))
+  :success)
+
+(define-test test/scan-identifier ()
+  (check equal (multiple-value-list (scan-identifier '("   Hello world " 42 "t.c") 3 "_$" :accept-unicode-escapes t))
+         '("Hello" 8))
+  (check equal (multiple-value-list (scan-identifier '("   Hello _wo$rl42d "  42 "t.c") 9 "_$" :accept-unicode-escapes t))
+         '("_wo$rl42d" 18))
+  (check equal (multiple-value-list (scan-identifier '("   Hello _\\u0145teve "  42 "t.c") 9 "_$" :accept-unicode-escapes t))
+         '("_\\u0145teve" 20))
+  (check equal (multiple-value-list (scan-identifier '("   Hello _\\U0145BABEteve "  42 "t.c") 9 "_$" :accept-unicode-escapes t))
+         '("_\\U0145BABEteve" 24))
+  (check equal (multiple-value-list (scan-identifier '("   Hello _world\\u014 "  42 "t.c") 9 "_$" :accept-unicode-escapes t))
+         '("_world" 15))
+  (check equal (multiple-value-list (scan-identifier '("   Hello _world\\U0145BABXteve " 42 "t.c") 9 "_$" :accept-unicode-escapes t))
+         '("_world" 15))
+  :success)
+
+(define-test test/scan-number ()
+  (check equal (multiple-value-list (scan-number '("   123 " 42 "t.c") 3))
+         '("123" 6))
+  (check equal (multiple-value-list (scan-number '("   0xBABE42 _wo$rl42d " 42 "t.c") 3))
+         '("0xBABE42" 11))
+  (check equal (multiple-value-list (scan-number '("   0xBABE42+42 " 42 "t.c") 3))
+         '("0xBABE42" 11))
+  (check equal (multiple-value-list (scan-number '("   0xE+12/42 " 42 "t.c") 3))
+         '("0xE+12" 9))
+  (check equal (multiple-value-list (scan-number '("   0.123_4e-56*32 " 42 "t.c") 3))
+         '("0.123_4e-56" 14))
+  (check equal (multiple-value-list (scan-number '("   .9999+.1111 " 42 "t.c") 3))
+         '(".9999" 8))
+  :success)
+
+(define-test test/scan-punctuation ()
+  (check equal (multiple-value-list (scan-punctuation '("{&===>>==..." 42 "test.c") 0))
+         '("{" 1))
+  (check equal (multiple-value-list (scan-punctuation '("{&===>>==..." 42 "test.c") 1))
+         '("&=" 3))
+  (check equal (multiple-value-list (scan-punctuation '("{&===>>==..." 42 "test.c") 3))
+         '("==" 5))
+  (check equal (multiple-value-list (scan-punctuation '("{&===>>==..." 42 "test.c") 5))
+         '(">>=" 8))
+  (check equal (multiple-value-list (scan-punctuation '("{&===>>==..." 42 "test.c") 8))
+         '("=" 9))
+  (check equal (multiple-value-list (scan-punctuation '("{&===>>==..." 42 "test.c") 9))
+         '("..." 12))
+  :success)
+
+(define-test test/scan-delimited-literal ()
+  (check equal (multiple-value-list (scan-delimited-literal '("'e'" 42 "test.c") 0))
+         '("'e'" 3))
+  (check equal (multiple-value-list (scan-delimited-literal '("'\\x41'" 42 "test.c") 0))
+         '("'\\x41'" 6))
+  :success)
+
+(define-test text/skip-spaces ()
+  (check equal (skip-spaces "    xyz()" 0) 4)
+  (check equal (skip-spaces "    xyz()" 7) 7)
+  (check equal (skip-spaces "    xyz ()" 7) 8)
+  (check equal (skip-spaces-but-one "    xyz()" 0) 3)
+  (check equal (skip-spaces-but-one "    xyz()" 7) 7)
+  (check equal (skip-spaces-but-one "    xyz ()" 7) 7)
+  :success)
+
+(define-test test/extract-path ()
+  (check equal (multiple-value-list (extract-path "#include"
+                                                   (list (make-instance 'string-literal-token
+                                                                        :text "\"/usr/local/include/\\xe9t\\xe9.h\""))))
+          '("/usr/local/include/été.h" :quote nil))
+  (check equal (multiple-value-list (extract-path "#include"
+                                                   (list (make-instance 'string-literal-token
+                                                                        :text "</usr/local/include/\\xe9t\\xe9.h>"))))
+          '("/usr/local/include/\\xe9t\\xe9.h" :bracket nil))
+  (check equal (multiple-value-list (extract-path "#include"
+                                                   (list (make-instance 'punctuation-token :text "<")
+                                                         (make-instance 'string-literal-token
+                                                                        :text "/usr/local/include")
+                                                         (make-instance 'string-literal-token
+                                                                        :text "/file.h")
+                                                         (make-instance 'punctuation-token :text ">"))))
+          '("/usr/local/include/file.h" :bracket nil))
+  :success)
+
+(define-test test/parse-f-m-call-arguments ()
+  (let ((*context*       (make-instance 'context :base-file "test.c" :file "test.c"))
+        (tokenized-lines (list (list (make-instance 'identifier-token :text "next_line"))))
+        (after           (make-instance 'identifier-token :text "same_line"))
+        (foo             (make-instance 'identifier-token :text "FOO"))
+        (arg1            (make-instance 'identifier-token :text "arg1"))
+        (arg2            (make-instance 'identifier-token :text "arg2"))
+        (plus            (make-instance 'punctuation-token :text "+"))
+        (minus           (make-instance 'punctuation-token :text "-"))
+        (comma           (make-instance 'punctuation-token :text ","))
+        (left            (make-instance 'punctuation-token :text "("))
+        (right           (make-instance 'punctuation-token :text ")")))
+    (check equal
+           (multiple-value-list
+            (parse-function-macro-call-arguments foo (list left right after)
+                                                 tokenized-lines))
+           (list '(())
+                 (list after)
+                 tokenized-lines))
+
+    (check equal (multiple-value-list
+                  (parse-function-macro-call-arguments foo (list left comma right after)
+                                                       tokenized-lines))
+           (list '(() ())
+                 (list after)
+                 tokenized-lines))
+
+    (check equal (multiple-value-list
+                  (parse-function-macro-call-arguments foo (list left arg1 right after)
+                                                       tokenized-lines))
+           `(((,arg1))
+             (,after)
+             ,tokenized-lines))
+
+    (check equal (multiple-value-list
+                  (parse-function-macro-call-arguments foo (list left arg1 comma arg2 right after)
+                                                       tokenized-lines))
+           `(((,arg1) (,arg2))
+             (,after)
+             ,tokenized-lines))
+
+    (check equal (multiple-value-list
+                  (parse-function-macro-call-arguments foo (list left arg1 comma right after)
+                                                       tokenized-lines))
+           `(((,arg1) ())
+             (,after)
+             ,tokenized-lines))
+
+    (check equal (multiple-value-list
+                  (parse-function-macro-call-arguments foo (list left arg1 plus arg2 comma arg1 minus arg2 right after)
+                                                       tokenized-lines))
+           `(((,arg1 ,plus ,arg2) (,arg1 ,minus ,arg2))
+             (,after)
+             ,tokenized-lines))
+
+    (check equal (multiple-value-list
+                  (parse-function-macro-call-arguments foo (list left arg1 left arg2 right comma arg1 minus arg2 right after)
+                                                       tokenized-lines))
+           `(((,arg1 ,left ,arg2 ,right) (,arg1 ,minus ,arg2))
+             (,after)
+             ,tokenized-lines))
+
+    (check equal (multiple-value-list
+                  (parse-function-macro-call-arguments foo (list left arg1 left  comma arg2  comma right
+                                                                 comma arg1 minus arg2 right after)
+                                                       tokenized-lines))
+           `(((,arg1 ,left ,comma ,arg2 ,comma ,right) (,arg1 ,minus ,arg2))
+             (,after)
+             ,tokenized-lines)))
+  :success)
+
+(define-test test/all/cpp ()
+  (test/read-c-string)
+  (test/number-lines)
+  (test/substitute-trigraphs)
+  (test/merge-continued-lines)
+  (test/remove-comments-in-line)
+  (test/remove-comments)
+  (test/scan-identifier)
+  (test/scan-number)
+  (test/scan-punctuation)
+  (test/scan-delimited-literal)
+  (text/skip-spaces)
+  (test/extract-path)
+  (test/parse-f-m-call-arguments)
+  (test/character-value)
+  (test/integer-value))
+
+(defun test/all ()
+  (test/all/cpp))
+
+;;;; THE END ;;;;
diff --git a/languages/cpp/cpp.lisp b/languages/cpp/cpp.lisp
index f1d4b58..cceb808 100644
--- a/languages/cpp/cpp.lisp
+++ b/languages/cpp/cpp.lisp
@@ -650,6 +650,7 @@ RETURN: the token text; the end position."
                     :name name
                     :expansion (parse-object-macro-definition-body line)))))

+(defgeneric define (context))
 (defmethod define ((context context))
   (with-cpp-line (context-current-line context)
     (if (context-current-line context)
@@ -670,18 +671,19 @@ RETURN: the token text; the end position."
 ;;; #undef
 ;;; --------------------

+(defgeneric undef (context))
 (defmethod undef ((context context))
   (with-cpp-line (context-current-line context)
-   (if (context-current-line context)
-       (let ((name (pop (context-current-line context))))
-         (if (identifierp name)
-             (environment-macro-undefine (context-environment context) (token-text name))
-             (cpp-error name "Expected an identifier as macro name after #undef, not ~S" (token-text name)))
-         (when (context-current-line context)
-           (cpp-error (first (context-current-line context))
-                      "Didn't expect anything after the macro name after #undef, not ~S"
-                      (token-text (first (context-current-line context))))))
-       (cpp-error context "Missing macro name after #undef"))))
+    (if (context-current-line context)
+        (let ((name (pop (context-current-line context))))
+          (if (identifierp name)
+              (environment-macro-undefine (context-environment context) (token-text name))
+              (cpp-error name "Expected an identifier as macro name after #undef, not ~S" (token-text name)))
+          (when (context-current-line context)
+            (cpp-error (first (context-current-line context))
+                       "Didn't expect anything after the macro name after #undef, not ~S"
+                       (token-text (first (context-current-line context))))))
+        (cpp-error context "Missing macro name after #undef"))))



@@ -727,6 +729,7 @@ RETURN: the token text; the end position."
                 '())
             (remove-duplicates include-bracket-directories :test (function equal)))))

+(defgeneric perform-include (context include-file kind directive))
 (defmethod perform-include ((context context) include-file kind directive)
   ;; TODO: skip duplicate #import and #ifndef/#define #include
   (flet ((include (path directory)
@@ -785,6 +788,7 @@ RETURN: the token text; the end position."
                   directive (mapconcat (function token-text) line ""))
        (values nil nil nil)))))

+(defgeneric include-common (context directive))
 (defmethod include-common ((context context) directive)
   (with-cpp-line (context-current-line context)
     (if (context-current-line context)
@@ -800,12 +804,15 @@ RETURN: the token text; the end position."
         (cpp-error context "Missing path after #~(~A~)" directive)))
   context)

+(defgeneric include-next (context))
 (defmethod include-next ((context context))
   (include-common context :include-next))

+(defgeneric include (context))
 (defmethod include ((context context))
   (include-common context :include))

+(defgeneric import (context))
 (defmethod import ((context context))
   (include-common context :import))

@@ -840,6 +847,7 @@ RETURN: the token text; the end position."
 (define-cpp-line-predicate else-line-p   "else")
 (define-cpp-line-predicate endif-line-p  "endif")

+(defgeneric skip-if (context))
 (defmethod skip-if ((context context))
   ;; PRE: current line is #if #ifdef #ifndef #elif or #else
   ;; POST: current line is nil or #endif
@@ -863,6 +871,7 @@ RETURN: the token text; the end position."
                     (return nil))
       (decf (context-if-level context)))))

+(defgeneric skip-branch (context))
 (defmethod skip-branch ((context context))
   ;; skips a single branch
   ;; PRE:  current line is #if #ifdef #ifndef or #elif
@@ -885,6 +894,7 @@ RETURN: the token text; the end position."
                           (token-text (second if-line)))
                (return nil))))

+(defgeneric process-branch-and-skip (context &optional no-else))
 (defmethod process-branch-and-skip ((context context) &optional no-else)
   ;; current line is #if #ifdef #ifndef or #elif
   ;; processes the branch,
@@ -963,6 +973,7 @@ RETURN: the token text; the end position."
          )


+(defgeneric skip-branch-and-process (context))
 (defmethod skip-branch-and-process ((context context))
   ;; line is #if #ifdef #ifndef #elif
   ;; skip the branches,
@@ -984,6 +995,7 @@ RETURN: the token text; the end position."
         (when (else-line-p (context-current-line context))
           (process-branch-and-skip context :no-else)))))

+(defgeneric ifdef-common (context flip directive))
 (defmethod ifdef-common ((context context) flip directive)
   (incf (context-if-level context))
   (unwind-protect
@@ -997,9 +1009,11 @@ RETURN: the token text; the end position."
             (skip-branch-and-process context))))
     (decf (context-if-level context))))

+(defgeneric ifdef (context))
 (defmethod ifdef ((context context))
   (ifdef-common context (function identity) "#ifdef"))

+(defgeneric ifndef (context))
 (defmethod ifndef ((context context))
   (ifdef-common context (function not) "#ifndef"))

@@ -1008,6 +1022,7 @@ RETURN: the token text; the end position."
                                       (first (macro-expand-macros context line
                                                                   '() '() :allow-defined '())))))))

+(defgeneric cpp-if (context))
 (defmethod cpp-if ((context context))
   (incf (context-if-level context))
   (unwind-protect
@@ -1020,6 +1035,7 @@ RETURN: the token text; the end position."
 ;;; #line
 ;;; --------------------

+(defgeneric cpp-line (context))
 (defmethod cpp-line ((context context))
   (with-cpp-line (context-current-line context)
     (labels ((generate (n file)
@@ -1030,11 +1046,11 @@ RETURN: the token text; the end position."
                                file)
                          (context-output-lines context)))
                  (loop
-                  :for line :in (context-input-lines context)
-                  :do (loop :for token :in line
-                            :do (setf (token-line token) n
-                                      (token-file token) f))
-                      (incf n))))
+                   :for line :in (context-input-lines context)
+                   :do (loop :for token :in line
+                             :do (setf (token-line token) n
+                                       (token-file token) f))
+                       (incf n))))
              (process-line (line)
                (cond
                  ((null line)
@@ -1057,6 +1073,7 @@ RETURN: the token text; the end position."
 ;;; #pragma
 ;;; --------------------

+(defgeneric pragma (context))
 (defmethod pragma ((context context))
   ;; TODO: unrecognized pragmas could be passed along on the output for the compiler.
   (with-cpp-line (context-current-line context)
@@ -1071,6 +1088,7 @@ RETURN: the token text; the end position."
 ;;; #error
 ;;; --------------------

+(defgeneric cpp-error-line (context))
 (defmethod cpp-error-line ((context context))
   (cpp-message 'cpp-error (context-current-line context)))

@@ -1078,6 +1096,7 @@ RETURN: the token text; the end position."
 ;;; #warning
 ;;; --------------------

+(defgeneric cpp-warning-line (context))
 (defmethod cpp-warning-line ((context context))
   (cpp-message 'cpp-warning (context-current-line context)))

@@ -1105,28 +1124,29 @@ RETURN: the token text; the end position."
           (context-input-lines context) input)
     context))

+(defgeneric process-directive (context line))
 (defmethod process-directive ((context context) line)
   (cond
     ((identifierp (second line))
      (scase (token-text (second line))
-       (("define")         (define           context))
-       (("undef")          (undef            context))
-       (("include")        (include          context))
-       (("include_next")   (include-next     context))
-       (("import")         (import           context))
-       (("ifdef")          (ifdef            context))
-       (("ifndef")         (ifndef           context))
-       (("if")             (cpp-if           context))
-       (("elif" "else" "endif")
-        (if (plusp (context-if-level context))
-            (return-from process-directive nil)
-            (cpp-error (second line) "#~A without #if" (token-text (second line)))))
-       (("line")           (cpp-line         context))
-       (("pragma")         (pragma           context))
-       (("error")          (cpp-error-line   context))
-       (("warning")        (cpp-warning-line context))
-       (("ident" "sccs"))
-       (otherwise          (cpp-error line "invalid directive ~A" (token-text (second line))))))
+            (("define")         (define           context))
+            (("undef")          (undef            context))
+            (("include")        (include          context))
+            (("include_next")   (include-next     context))
+            (("import")         (import           context))
+            (("ifdef")          (ifdef            context))
+            (("ifndef")         (ifndef           context))
+            (("if")             (cpp-if           context))
+            (("elif" "else" "endif")
+             (if (plusp (context-if-level context))
+                 (return-from process-directive nil)
+                 (cpp-error (second line) "#~A without #if" (token-text (second line)))))
+            (("line")           (cpp-line         context))
+            (("pragma")         (pragma           context))
+            (("error")          (cpp-error-line   context))
+            (("warning")        (cpp-warning-line context))
+            (("ident" "sccs"))
+            (otherwise          (cpp-error line "invalid directive ~A" (token-text (second line))))))
     ((number-token-p (second line)) ;; skip # 1 "file"
      (push line (context-output-lines context)))
     ((rest line)
@@ -1135,6 +1155,7 @@ RETURN: the token text; the end position."
      ))
   t)

+(defgeneric process-file (context))
 (defmethod process-file ((context context))
   "Processes all the INPUT-LINES, pushing onto the OUTPUT-LINES."
   (loop
@@ -1149,6 +1170,7 @@ RETURN: the token text; the end position."
     :finally (setf (context-current-line context) nil))
   context)

+(defgeneric read-and-process-stream (context stream &optional path directory))
 (defmethod read-and-process-stream ((context context) stream &optional (path (pathname stream)) directory)
   (context-push-file context path directory
                      (read-cpp-tokens
@@ -1163,6 +1185,7 @@ RETURN: the token text; the end position."
   (unwind-protect (process-file context)
     (context-pop-file context)))

+(defgeneric read-and-process-file (context path &optional directory))
 (defmethod read-and-process-file ((context context) path &optional directory)
   (with-open-file (input path :external-format (option *context* :external-format))
     (read-and-process-stream context input path directory)))
@@ -1302,287 +1325,9 @@ Other keys shall be context option keys.
               (read-cpp-tokens in
                                :file-name file
                                :substitute-trigraphs t
-                               :warn-on-trigraph nil)))
-          )
-
-
-
-
-
+                               :warn-on-trigraph nil))))

 ;;; ---

-(defun test/substitute-trigraphs ()
-  (assert (equal (substitute-trigraphs (make-numbered-line :text (copy-seq "hello world")))
-                 '("hello world" 1 "-")))
-  (assert (equal (substitute-trigraphs (make-numbered-line :text (copy-seq "??( brackets ??)???<braces??>??=??'a??!??-; (??\\?) (a==b???-c:'??/n')")))
-                 '("[ brackets ]?{braces}#^a|~; (??\\?) (a==b?~c:'\\n')" 1 "-")))
-  :success)
-
-(defun test/number-lines ()
-  (assert (equal (number-lines '("a" "b" "c") "file.c" :start 2)
-                 '(("a" 2 #1="file.c") ("b" 3 #1#) ("c" 4 #1#))))
-  :success)
-
-(defun test/merge-continued-lines ()
-  (assert (equal (merge-continued-lines '(("first line" 1 #1="file.c")
-                                   ("abc\\" 2 #1#)
-                                   ("def\\" 3 #1#)
-                                   ("ghi" 4 #1#)
-                                   ("middle line" 5 #1#)
-                                   ("abc \\" 6 #1#)
-                                   ("def \\  " 7 #1#)
-                                   ("ghi" 8 #1#)
-                                   ("last line" 9 #1#))
-                                 :warn-spaces-in-continued-lines nil)
-                 '(("first line" 1 #2="file.c") ("abcdefghi" 2 #2#) ("middle line" 5 #2#) ("abc def ghi" 6 #2#) ("last line" 9 #2#))))
-  :success)
-
-(defun test/remove-comments-in-line ()
-  (flet ((check (text &optional (state :top) comment-start)
-           (multiple-value-list (remove-comments-in-line comment-start
-                                                         (make-numbered-line :text text
-                                                                             :lino 42 :file "hw.c")
-                                                         state t))))
-    (assert (equal (check "Hello world")
-                   '(("Hello world" 42 "hw.c") :top)))
-    ;; comment in string
-    (assert (equal (check "Hello \"salut /* le */ monde\" world")
-                   '(("Hello \"salut /* le */ monde\" world" 42 "hw.c") :top)))
-    (assert (equal (check "Hello \"salut \\\"/* le */\\\" monde\" world")
-                   '(("Hello \"salut \\\"/* le */\\\" monde\" world" 42 "hw.c") :top)))
-    (assert (typep (nth-value 1 (ignore-errors (check "Hello \"salut"))) 'error))
-    (assert (typep (nth-value 1 (ignore-errors (check "Hello \"salut\\"))) 'error))
-    ;; comment in characters
-    (assert (equal (check "Hello 'salut /* le */ monde' world")
-                   '(("Hello 'salut /* le */ monde' world" 42 "hw.c") :top)))
-    (assert (equal (check "Hello 'salut \\'/* le */\\' monde' world")
-                   '(("Hello 'salut \\'/* le */\\' monde' world" 42 "hw.c") :top)))
-    (assert (typep (nth-value 1 (ignore-errors (check "Hello 'salut"))) 'error))
-    (assert (typep (nth-value 1 (ignore-errors (check "Hello 'salut\\"))) 'error))
-    ;; single line comment
-    (assert (equal (check "Hello//monde*/world")   '(("Hello" 42 "hw.c") :top)))
-    ;; monoline block comment
-    (assert (equal (check "Hello/*monde*/world")   '(("Hello world" 42 "hw.c") :top)))
-    (assert (equal (check "Hello/*mon//de*/world") '(("Hello world" 42 "hw.c") :top)))
-    (assert (equal (check "Hello/*mon/*de*/world") '(("Hello world" 42 "hw.c") :top)))
-    ;; multiline block comment first line
-    (assert (equal (check "Hello world/*salut") '(("Hello world" 42 "hw.c") :in-multiline-comment)))
-    (assert (equal (check "Hello/*monde*/world/*salut") '(("Hello world" 42 "hw.c") :in-multiline-comment)))
-    ;; multiline block comment in the middle lines
-    (assert (equal (check "in the middle comment" :in-multiline-comment '("Hello world" 42 "hw.c"))
-                   '(("Hello world" 42 "hw.c") :in-multiline-comment)))
-    (assert (equal (check "in /* the // middle comment" :in-multiline-comment '("Hello world" 42 "hw.c"))
-                   '(("Hello world" 42 "hw.c") :in-multiline-comment)))
-    ;; multiline block comment in the end line
-    (assert (equal (check "end comment */end line" :in-multiline-comment '("Hello world" 42 "hw.c"))
-                   '(("Hello world end line" 42 "hw.c") :top)))
-    (assert (equal (check "end comment */end/*fin*/line" :in-multiline-comment '("Hello world" 42 "hw.c"))
-                   '(("Hello world end line" 42 "hw.c") :top)))
-    (assert (equal (check "end // comment */end/*fin*/line" :in-multiline-comment '("Hello world" 42 "hw.c"))
-                   '(("Hello world end line" 42 "hw.c") :top)))
-    (assert (equal (check "end // comment */end/*fin*/line// c'est fini" :in-multiline-comment '("Hello world" 42 "hw.c"))
-                   '(("Hello world end line" 42 "hw.c") :top)))
-    :success))
-
-(defun test/remove-comments ()
-  (assert (equal (remove-comments '(("Line one" 1 #1="test.c")
-                                    ("Line/**/two" 2 #1#)
-                                    ("Line/*three*/3" 3 #1#)
-                                    ("Line/*4*/four/*and*/some" 4 #1#)
-                                    ("Line/*-*/five/*a//nd*/some" 5 #1#)
-                                    ("Line/*/five/*a//nd some" 6 #1#)
-                                    ("Line//6 */seven" 7 #1#)
-                                    ("Line/*/eight/*a//nd some" 8 #1#)
-                                    ("Line nine" 9 #1#)
-                                    ("Line//9 */ten" 10 #1#)
-                                    ("Line \"ele/*v*/en\"--" 11 #1#)
-                                    ("Line 'tw//elv/*e*/'--" 12 #1#)))
-                 '(("Line one" 1 #2="test.c")
-                   ("Line two" 2 #2#)
-                   ("Line 3" 3 #2#)
-                   ("Line four some" 4 #2#)
-                   ("Line five some" 5 #2#)
-                   ("Line seven" 6 #2#)
-                   ("Line ten" 8 #2#)
-                   ("Line \"ele/*v*/en\"--" 11 #2#)
-                   ("Line 'tw//elv/*e*/'--" 12 #2#))))
-  :success)
-
-(defun test/scan-identifier ()
-  (assert (equal (multiple-value-list (scan-identifier '("   Hello world " 42 "t.c") 3 "_$" :accept-unicode-escapes t))
-                 '("Hello" 8)))
-  (assert (equal (multiple-value-list (scan-identifier '("   Hello _wo$rl42d "  42 "t.c") 9 "_$" :accept-unicode-escapes t))
-                 '("_wo$rl42d" 18)))
-  (assert (equal (multiple-value-list (scan-identifier '("   Hello _\\u0145teve "  42 "t.c") 9 "_$" :accept-unicode-escapes t))
-                 '("_\\u0145teve" 20)))
-  (assert (equal (multiple-value-list (scan-identifier '("   Hello _\\U0145BABEteve "  42 "t.c") 9 "_$" :accept-unicode-escapes t))
-                 '("_\\U0145BABEteve" 24)))
-  (assert (equal (multiple-value-list (scan-identifier '("   Hello _world\\u014 "  42 "t.c") 9 "_$" :accept-unicode-escapes t))
-                 '("_world" 15)))
-  (assert (equal (multiple-value-list (scan-identifier '("   Hello _world\\U0145BABXteve " 42 "t.c") 9 "_$" :accept-unicode-escapes t))
-                 '("_world" 15)))
-  :success)
-
-(defun test/scan-number ()
-  (assert (equal (multiple-value-list (scan-number '("   123 " 42 "t.c") 3))
-                 '("123" 6)))
-  (assert (equal (multiple-value-list (scan-number '("   0xBABE42 _wo$rl42d " 42 "t.c") 3))
-                 '("0xBABE42" 11)))
-  (assert (equal (multiple-value-list (scan-number '("   0xBABE42+42 " 42 "t.c") 3))
-                 '("0xBABE42" 11)))
-  (assert (equal (multiple-value-list (scan-number '("   0xE+12/42 " 42 "t.c") 3))
-                 '("0xE+12" 9)))
-  (assert (equal (multiple-value-list (scan-number '("   0.123_4e-56*32 " 42 "t.c") 3))
-                 '("0.123_4e-56" 14)))
-  (assert (equal (multiple-value-list (scan-number '("   .9999+.1111 " 42 "t.c") 3))
-                 '(".9999" 8)))
-  :success)
-
-(defun test/scan-punctuation ()
-  (assert (equal (multiple-value-list (scan-punctuation '("{&===>>==..." 42 "test.c") 0))
-                 '("{" 1)))
-  (assert (equal (multiple-value-list (scan-punctuation '("{&===>>==..." 42 "test.c") 1))
-                 '("&=" 3)))
-  (assert (equal (multiple-value-list (scan-punctuation '("{&===>>==..." 42 "test.c") 3))
-                 '("==" 5)))
-  (assert (equal (multiple-value-list (scan-punctuation '("{&===>>==..." 42 "test.c") 5))
-                 '(">>=" 8)))
-  (assert (equal (multiple-value-list (scan-punctuation '("{&===>>==..." 42 "test.c") 8))
-                 '("=" 9)))
-  (assert (equal (multiple-value-list (scan-punctuation '("{&===>>==..." 42 "test.c") 9))
-                 '("..." 12)))
-  :success)
-
-(defun test/scan-delimited-literal ()
-  (assert (equal (multiple-value-list (scan-delimited-literal '("'e'" 42 "test.c") 0))
-                 '("'e'" 3)))
-  (assert (equal (multiple-value-list (scan-delimited-literal '("'\\x41'" 42 "test.c") 0))
-                 '("'\\x41'" 6)))
-  :success)
-
-(defun text/skip-spaces ()
-  (assert (equal (skip-spaces "    xyz()" 0) 4))
-  (assert (equal (skip-spaces "    xyz()" 7) 7))
-  (assert (equal (skip-spaces "    xyz ()" 7) 8))
-  (assert (equal (skip-spaces-but-one "    xyz()" 0) 3))
-  (assert (equal (skip-spaces-but-one "    xyz()" 7) 7))
-  (assert (equal (skip-spaces-but-one "    xyz ()" 7) 7))
-  :success)
-
-(defun test/extract-path ()
-  (assert (equal (multiple-value-list (extract-path "#include"
-                                                    (list (make-instance 'string-literal-token
-                                                                         :text "\"/usr/local/include/\\xe9t\\xe9.h\""))))
-                 '("/usr/local/include/été.h" :quote nil)))
-  (assert (equal (multiple-value-list (extract-path "#include"
-                                                    (list (make-instance 'string-literal-token
-                                                                         :text "</usr/local/include/\\xe9t\\xe9.h>"))))
-                 '("/usr/local/include/\\xe9t\\xe9.h" :bracket nil)))
-  (assert (equal (multiple-value-list (extract-path "#include"
-                                                    (list (make-instance 'punctuation-token :text "<")
-                                                          (make-instance 'string-literal-token
-                                                                         :text "/usr/local/include")
-                                                          (make-instance 'string-literal-token
-                                                                         :text "/file.h")
-                                                          (make-instance 'punctuation-token :text ">"))))
-                 '("/usr/local/include/file.h" :bracket nil)))
-  :success)
-
-(defun test/parse-function-macro-call-arguments ()
-  (let ((*context*       (make-instance 'context :base-file "test.c" :file "test.c"))
-        (tokenized-lines (list (list (make-instance 'identifier-token :text "next_line"))))
-        (after           (make-instance 'identifier-token :text "same_line"))
-        (foo             (make-instance 'identifier-token :text "FOO"))
-        (arg1            (make-instance 'identifier-token :text "arg1"))
-        (arg2            (make-instance 'identifier-token :text "arg2"))
-        (plus            (make-instance 'punctuation-token :text "+"))
-        (minus           (make-instance 'punctuation-token :text "-"))
-        (comma           (make-instance 'punctuation-token :text ","))
-        (left            (make-instance 'punctuation-token :text "("))
-        (right           (make-instance 'punctuation-token :text ")")))
-    (flet ((check (result expected)
-             (assert (equal result expected)
-                     () "Assertion failed: equal ~%   result   = ~S~%   expected = ~S~%"
-                     result expected)))
-      (check (multiple-value-list
-              (parse-function-macro-call-arguments foo (list left right after)
-                                                   tokenized-lines))
-             (list '(())
-                   (list after)
-                   tokenized-lines))
-
-      (check (multiple-value-list
-              (parse-function-macro-call-arguments foo (list left comma right after)
-                                                   tokenized-lines))
-             (list '(() ())
-                   (list after)
-                   tokenized-lines))
-
-      (check (multiple-value-list
-              (parse-function-macro-call-arguments foo (list left arg1 right after)
-                                                   tokenized-lines))
-             `(((,arg1))
-               (,after)
-               ,tokenized-lines))
-
-      (check (multiple-value-list
-              (parse-function-macro-call-arguments foo (list left arg1 comma arg2 right after)
-                                                   tokenized-lines))
-             `(((,arg1) (,arg2))
-               (,after)
-               ,tokenized-lines))
-
-      (check (multiple-value-list
-              (parse-function-macro-call-arguments foo (list left arg1 comma right after)
-                                                   tokenized-lines))
-             `(((,arg1) ())
-               (,after)
-               ,tokenized-lines))
-
-      (check (multiple-value-list
-              (parse-function-macro-call-arguments foo (list left arg1 plus arg2 comma arg1 minus arg2 right after)
-                                                   tokenized-lines))
-             `(((,arg1 ,plus ,arg2) (,arg1 ,minus ,arg2))
-               (,after)
-               ,tokenized-lines))
-
-      (check (multiple-value-list
-              (parse-function-macro-call-arguments foo (list left arg1 left arg2 right comma arg1 minus arg2 right after)
-                                                   tokenized-lines))
-             `(((,arg1 ,left ,arg2 ,right) (,arg1 ,minus ,arg2))
-               (,after)
-               ,tokenized-lines))
-
-      (check (multiple-value-list
-              (parse-function-macro-call-arguments foo (list left arg1 left  comma arg2  comma right
-                                                             comma arg1 minus arg2 right after)
-                                                   tokenized-lines))
-             `(((,arg1 ,left ,comma ,arg2 ,comma ,right) (,arg1 ,minus ,arg2))
-               (,after)
-               ,tokenized-lines))))
-  :success)
-
-
-(defun test/all ()
-  (test/read-c-string)
-  (test/number-lines)
-  (test/substitute-trigraphs)
-  (test/merge-continued-lines)
-  (test/remove-comments-in-line)
-  (test/remove-comments)
-  (test/scan-identifier)
-  (test/scan-number)
-  (test/scan-punctuation)
-  (test/scan-delimited-literal)
-  (text/skip-spaces)
-  (test/extract-path)
-  (test/parse-function-macro-call-arguments)
-  (test/character-value)
-  (test/integer-value))
-
-(test/all)
-
-

 ;;;; THE END ;;;;
diff --git a/languages/cpp/expression-test.lisp b/languages/cpp/expression-test.lisp
new file mode 100644
index 0000000..613784a
--- /dev/null
+++ b/languages/cpp/expression-test.lisp
@@ -0,0 +1,55 @@
+;;;; -*- mode:lisp;coding:utf-8 -*-
+;;;;**************************************************************************
+;;;;FILE:               expression-test.lisp
+;;;;LANGUAGE:           Common-Lisp
+;;;;SYSTEM:             Common-Lisp
+;;;;USER-INTERFACE:     NONE
+;;;;DESCRIPTION
+;;;;
+;;;;    Tests expressions.
+;;;;
+;;;;AUTHORS
+;;;;    <PJB> Pascal J. Bourguignon <pjb@informatimago.com>
+;;;;MODIFICATIONS
+;;;;    2015-07-06 <PJB> Extracted from expression.lisp
+;;;;BUGS
+;;;;LEGAL
+;;;;    AGPL3
+;;;;
+;;;;    Copyright Pascal J. Bourguignon 2015 - 2015
+;;;;
+;;;;    This program is free software: you can redistribute it and/or modify
+;;;;    it under the terms of the GNU Affero General Public License as published by
+;;;;    the Free Software Foundation, either version 3 of the License, or
+;;;;    (at your option) any later version.
+;;;;
+;;;;    This program is distributed in the hope that it will be useful,
+;;;;    but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;;;    GNU Affero General Public License for more details.
+;;;;
+;;;;    You should have received a copy of the GNU Affero General Public License
+;;;;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+;;;;**************************************************************************
+(in-package "COM.INFORMATIMAGO.LANGUAGES.CPP")
+
+(define-test test/integer-value ()
+  (check equal (mapcar (function integer-value)
+                       (list (make-number "42"          0 0 "-")
+                             (make-number "0x42"        0 0 "-")
+                             (make-number "0b101010"    0 0 "-")
+                             (make-number "042"         0 0 "-")))
+         '(42 66 42 34))
+  :success)
+
+(define-test test/character-value ()
+  (check equal (mapcar (function character-value)
+                       (list (make-character-literal "'A'"      0 0 "-")
+                             (make-character-literal "'\\x41'"  0 0 "-")
+                             (make-character-literal "'\\n'"    0 0 "-")
+                             (make-character-literal "'λ'"      0 0 "-")))
+
+         '(65 65 10 955))
+  :success)
+
+;;;; THE END ;;;;
diff --git a/languages/cpp/expression.lisp b/languages/cpp/expression.lisp
index 2bacda9..77da3c3 100644
--- a/languages/cpp/expression.lisp
+++ b/languages/cpp/expression.lisp
@@ -168,6 +168,7 @@
 (defun right-shift (value offset)
   (ash value (- offset)))

+(defgeneric parse-expression (context line))
 (defmethod parse-expression ((context context) line)
   (with-binary-op-parsers ((expr12 expr11 (op-logior-p cpp-or))
                            (expr11 expr10 (op-logand-p cpp-and))
@@ -179,61 +180,61 @@
                            (expr5  expr4  (op-left-shift-p left-shift) (op-right-shift-p right-shift))
                            (expr4  expr3  (op-plus-p +) (op-minus-p -))
                            (expr3  expr2  (op-times-p *) (op-divides-p truncate)  (op-remainder-p mod)))
-      ((expr13 ()
-               (let ((test (expr12)))
-                 (if (op-question-p (peek))
-                     (progn
+    ((expr13 ()
+             (let ((test (expr12)))
+               (if (op-question-p (peek))
+                   (progn
+                     (eat)
+                     (let ((then (expr12)))
+                       (if (op-colon-p (peek))
+                           (progn
+                             (eat)
+                             `(if (zerop ,test) ,(expr12) ,then))
+                           (cpp-error (peek) "Expected a colon in ternary if expression, got ~S instead" (token-text (eat))))))
+                   test)))
+     (expr2 ()
+            (let ((op (peek)))
+              (cond ((op-plus-p op)   (eat) (expr1))
+                    ((op-minus-p op)  (eat) `(- ,(expr1)))
+                    ((op-lognot-p op) (eat) `(cpp-not ,(expr1)))
+                    ((op-bitnot-p op) (eat) `(lognot ,(expr1)))
+                    (t                      (expr1)))))
+     (expr1 ()
+            ;; expr2 ::= '_Pragma' '(' string ')'
+            ;;         | 'defined' '(' identifier ')'
+            ;;         | '(' expr12 ')'
+            ;;         | identifier [ '(' arguments… ')' ]
+            ;;         | integer
+            ;;         | character .
+            (let ((next (peek)))
+              (cond
+                ((openp next)
+                 (eat)
+                 (prog1 (expr13)
+                   (if (closep (peek))
                        (eat)
-                       (let ((then (expr12)))
-                         (if (op-colon-p (peek))
-                             (progn
-                               (eat)
-                               `(if (zerop ,test) ,(expr12) ,then))
-                             (cpp-error (peek) "Expected a colon in ternary if expression, got ~S instead" (token-text (eat))))))
-                     test)))
-       (expr2 ()
-              (let ((op (peek)))
-                (cond ((op-plus-p op)   (eat) (expr1))
-                      ((op-minus-p op)  (eat) `(- ,(expr1)))
-                      ((op-lognot-p op) (eat) `(cpp-not ,(expr1)))
-                      ((op-bitnot-p op) (eat) `(lognot ,(expr1)))
-                      (t                      (expr1)))))
-       (expr1 ()
-              ;; expr2 ::= '_Pragma' '(' string ')'
-              ;;         | 'defined' '(' identifier ')'
-              ;;         | '(' expr12 ')'
-              ;;         | identifier [ '(' arguments… ')' ]
-              ;;         | integer
-              ;;         | character .
-              (let ((next (peek)))
-                (cond
-                  ((openp next)
-                   (eat)
-                   (prog1 (expr13)
-                     (if (closep (peek))
-                         (eat)
-                         (progn (cpp-error next "Missing close parenthesis in #if expression, got ~S instead" (token-text (eat)))
-                                (return-from parse-expression 0)))))
-                  ((number-p next)
-                   (integer-value (eat)))
-                  ((character-literal-p next)
-                   (character-value (token-text (eat))))
-                  ((identifierp next)
-                   (let ((identifier (eat)))
-                     (scase (token-text identifier)
-                       (("_Pragma")
-                        (cpp-error identifier "_Pragma is forbidden in #if expressions")
-                        0)
-                       (otherwise ;; we've already macroexpanded
-                        (when (option context :warn-on-undefined-identifier)
-                          (cpp-warning identifier "~S is not defined" (token-text identifier)))
-                        0))))
-                  (t (if next
-                         (cpp-error next "token ~S is not valid in preprocessor expressions" (token-text next))
-                         (cpp-error context "end of line reached before the end of the preprocessor expressions"))
-                     (return-from parse-expression 0)))))
-       (eat  () (pop   line))
-       (peek () (first line)))
+                       (progn (cpp-error next "Missing close parenthesis in #if expression, got ~S instead" (token-text (eat)))
+                              (return-from parse-expression 0)))))
+                ((number-p next)
+                 (integer-value (eat)))
+                ((character-literal-p next)
+                 (character-value (token-text (eat))))
+                ((identifierp next)
+                 (let ((identifier (eat)))
+                   (scase (token-text identifier)
+                          (("_Pragma")
+                           (cpp-error identifier "_Pragma is forbidden in #if expressions")
+                           0)
+                          (otherwise ;; we've already macroexpanded
+                           (when (option context :warn-on-undefined-identifier)
+                             (cpp-warning identifier "~S is not defined" (token-text identifier)))
+                           0))))
+                (t (if next
+                       (cpp-error next "token ~S is not valid in preprocessor expressions" (token-text next))
+                       (cpp-error context "end of line reached before the end of the preprocessor expressions"))
+                   (return-from parse-expression 0)))))
+     (eat  () (pop   line))
+     (peek () (first line)))
     (prog1 (expr13)
       (unless (null (peek))
         (cpp-error (peek) "missing binary operator before token ~S" (eat))))))
diff --git a/languages/cpp/packages.lisp b/languages/cpp/packages.lisp
index 70df68f..562bdb7 100644
--- a/languages/cpp/packages.lisp
+++ b/languages/cpp/packages.lisp
@@ -37,7 +37,8 @@
         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STREAM"
         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING"
         "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.UTILITY"
-        "COM.INFORMATIMAGO.COMMON-LISP.PARSER.SCANNER")
+        "COM.INFORMATIMAGO.COMMON-LISP.PARSER.SCANNER"
+        #|temporarily|# "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.SIMPLE-TEST")
   (:shadow "IMPORT" "INCLUDE")
   (:shadowing-import-from "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.STRING"
                           "STRING-DESIGNATOR")
@@ -56,8 +57,7 @@
            "READ-CPP-TOKENS"
            "CPP-E"
            "*WHITESPACES*" "WHITESPACEP"
-           "STRING-VALUE" "CHARACTER-VALUE" "INTEGER-VALUE"
-           ))
+           "STRING-VALUE" "CHARACTER-VALUE" "INTEGER-VALUE"))

 ;;;; THE END ;;;;

diff --git a/languages/cxx/com.informatimago.languages.cxx.asd b/languages/cxx/com.informatimago.languages.cxx.asd
index 16678a7..59490dc 100644
--- a/languages/cxx/com.informatimago.languages.cxx.asd
+++ b/languages/cxx/com.informatimago.languages.cxx.asd
@@ -39,7 +39,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component  attributes:
-  :version "1.2.1"
+  :version "1.2.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Autumn 2010")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.languages.cxx/")
diff --git a/languages/cxx/com.informatimago.languages.cxx.test.asd b/languages/cxx/com.informatimago.languages.cxx.test.asd
index e74a758..8ac8a9d 100644
--- a/languages/cxx/com.informatimago.languages.cxx.test.asd
+++ b/languages/cxx/com.informatimago.languages.cxx.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.languages.cxx")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/languages/linc/com.informatimago.linc.asd b/languages/linc/com.informatimago.linc.asd
index ed525d6..3522449 100644
--- a/languages/linc/com.informatimago.linc.asd
+++ b/languages/linc/com.informatimago.linc.asd
@@ -54,7 +54,7 @@ generate a corresponding C source.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "0.0.0"
+  :version "0.0.2"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "2007")
                ((#:albert #:output-dir)          . "../documentation/com.informatimago.linc/")
diff --git a/languages/linc/com.informatimago.linc.test.asd b/languages/linc/com.informatimago.linc.test.asd
index 03f24da..dd759a0 100644
--- a/languages/linc/com.informatimago.linc.test.asd
+++ b/languages/linc/com.informatimago.linc.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.linc")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/languages/lua/com.informatimago.languages.lua.asd b/languages/lua/com.informatimago.languages.lua.asd
index 011b6a9..df18efb 100644
--- a/languages/lua/com.informatimago.languages.lua.asd
+++ b/languages/lua/com.informatimago.languages.lua.asd
@@ -45,7 +45,7 @@ This system provides tools to manipulate LUA programs.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.0.0"
+  :version "1.0.2"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Summer 2012")
                ((#:albert #:output-dir)          . "../documentation/com.informatimago.lua/")
diff --git a/languages/lua/com.informatimago.languages.lua.test.asd b/languages/lua/com.informatimago.languages.lua.test.asd
index 30dfa86..b0d4d5a 100644
--- a/languages/lua/com.informatimago.languages.lua.test.asd
+++ b/languages/lua/com.informatimago.languages.lua.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.languages.lua")
   :components     ((:file "lua-scanner-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.LANGUAGES.LUA.SCANNER.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.LANGUAGES.LUA.SCANNER.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.LANGUAGES.LUA.SCANNER.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.LANGUAGES.LUA.SCANNER.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/languages/lua/lua-scanner-test.lisp b/languages/lua/lua-scanner-test.lisp
index f68a007..dd9b690 100644
--- a/languages/lua/lua-scanner-test.lisp
+++ b/languages/lua/lua-scanner-test.lisp
@@ -68,7 +68,11 @@
                  (test/scan-file (load-time-value
                                   (merge-pathnames #P"test-1.lua"
                                                    *load-truename* nil))))))
-(define-test test/all ()
+
+(define-test test/all/lua-scanner ()
   (test/lua-scanner))

+(defun test/all ()
+  test/all/lua-scanner)
+
 ;;;; THE END ;;;;
diff --git a/lispdoc/com.informatimago.lispdoc.asd b/lispdoc/com.informatimago.lispdoc.asd
index 5371912..5b3e3af 100644
--- a/lispdoc/com.informatimago.lispdoc.asd
+++ b/lispdoc/com.informatimago.lispdoc.asd
@@ -45,7 +45,7 @@ This system would use closer-mop which is not available for MOCL.
     :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
     :licence "LLGPL"
     ;; component attributes:
-    :version "1.0.0"
+    :version "1.0.2"
     :properties ((#:author-email                   . "pjb@informatimago.com")
                  (#:date                           . "Spring 2012")
                  ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.lispdoc/")
@@ -65,7 +65,7 @@ This system would use closer-mop which is not available for MOCL.
     :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
     :licence "LLGPL"
     ;; component attributes:
-    :version "1.0.0"
+    :version "1.0.2"
     :properties ((#:author-email                   . "pjb@informatimago.com")
                  (#:date                           . "Spring 2012")
                  ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.lispdoc/")
diff --git a/lispdoc/com.informatimago.lispdoc.test.asd b/lispdoc/com.informatimago.lispdoc.test.asd
index 8e85071..cd5be38 100644
--- a/lispdoc/com.informatimago.lispdoc.test.asd
+++ b/lispdoc/com.informatimago.lispdoc.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,13 +58,13 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.lispdoc")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;

diff --git a/objcl/com.informatimago.objcl.asd b/objcl/com.informatimago.objcl.asd
index 79babab..669ffde 100644
--- a/objcl/com.informatimago.objcl.asd
+++ b/objcl/com.informatimago.objcl.asd
@@ -48,7 +48,7 @@ cover generic FFI to both Apple and GNUstep objc2 runtimes.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence    "AGPL3"
   ;; component attributes:
-  :version    "0.10.3"
+  :version    "0.10.5"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Spring 2014")
                ((#:albert #:output-dir)          . "../documentation/com.informatimago.objc/")
@@ -58,14 +58,15 @@ cover generic FFI to both Apple and GNUstep objc2 runtimes.
                ((#:albert #:docbook #:textcolor) . "black"))
   #+asdf-unicode :encoding #+asdf-unicode :utf-8
   :depends-on ("com.informatimago.common-lisp.cesarum")
-
-  #+(and ccl darwin)
-  :components #+(and ccl darwin) ((:file "objc-support"       :depends-on ())
-                                  (:file "packages"           :depends-on ("objc-support"))
-                                  (:file "mac-roman"          :depends-on ("packages"))
-                                  (:file "oclo-ccl"           :depends-on ("packages"))
-                                  (:file "oclo"               :depends-on ("packages" "oclo-ccl"))
-                                  (:file "objcl"              :depends-on ("packages" "oclo" "mac-roman"))) ; needs the NS package.
+  :components ((:file "objc-support"       :depends-on ())
+               (:file "packages"           :depends-on ("objc-support"))
+               (:file "mac-roman"          :depends-on ("packages"))
+               . #+(and ccl darwin)
+               ((:file "oclo-ccl"           :depends-on ("packages"))
+                (:file "oclo"               :depends-on ("packages" "oclo-ccl"))
+                (:file "objcl"              :depends-on ("packages" "oclo" "mac-roman")))
+               #-(and ccl darwin)
+               ())
   :in-order-to ((asdf:test-op
                  (asdf:test-op "com.informatimago.objcl.test"))))

diff --git a/objcl/com.informatimago.objcl.cocoa-playground.asd b/objcl/com.informatimago.objcl.cocoa-playground.asd
index e6dc3fd..b210763 100644
--- a/objcl/com.informatimago.objcl.cocoa-playground.asd
+++ b/objcl/com.informatimago.objcl.cocoa-playground.asd
@@ -45,7 +45,7 @@ Playground for Cocoa and ObjCL.
     :maitainer "Pascal J. Bourguignon <pjb@informatimago.com>"
     :licence "AGPL3"
     ;; component attributes:
-    :version "0.7.1"
+    :version "0.7.3"
     :properties ((#:author-email                   . "pjb@informatimago.com")
                  (#:date                           . "Spring 2011")
                  ((#:albert #:output-dir)          . "../documentation/com.informatimago.cocoa-playground/")
diff --git a/objcl/com.informatimago.objcl.cocoa-playground.test.asd b/objcl/com.informatimago.objcl.cocoa-playground.test.asd
index 8e0a49c..6f43534 100644
--- a/objcl/com.informatimago.objcl.cocoa-playground.test.asd
+++ b/objcl/com.informatimago.objcl.cocoa-playground.test.asd
@@ -46,7 +46,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -59,11 +59,11 @@
   :depends-on     ("com.informatimago.objcl.cocoa-playground"
                    "com.informatimago.common-lisp.cesarum")
   :components     ((:file "source-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "TESTED-PACKAGE")))
-                     (uiop/package:symbol-call "TESTED-PACKAGE"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "TESTED-PACKAGE")))
+                              (uiop/package:symbol-call "TESTED-PACKAGE"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/objcl/com.informatimago.objcl.test.asd b/objcl/com.informatimago.objcl.test.asd
index 3bda9f7..47df54f 100644
--- a/objcl/com.informatimago.objcl.test.asd
+++ b/objcl/com.informatimago.objcl.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -57,14 +57,14 @@
   #+asdf-unicode :encoding #+asdf-unicode :utf-8
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.objcl")
-  :components     ((:file "objcl-test" :depends-on ())
-                   (:file "mac-roman-test" :depends-on ()))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (dolist (p '("COM.INFORMATIMAGO.OBJCL.MAC-ROMAN.TEST"
-                                "COM.INFORMATIMAGO.OBJCL.TEST"))
-                     (let ((*package* (find-package p)))
-                       (uiop/package:symbol-call p "TEST/ALL")))))
+  :components     ((:file "mac-roman-test" :depends-on ())
+                   #+(and ccl darwin) (:file "objcl-test" :depends-on ()))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (dolist (p '("COM.INFORMATIMAGO.OBJCL.MAC-ROMAN.TEST"
+                                         #+(and ccl darwin) "COM.INFORMATIMAGO.OBJCL.TEST"))
+                              (let ((*package* (find-package p)))
+                                (uiop/package:symbol-call p "TEST/ALL")))))

 ;;;; THE END ;;;;
diff --git a/objcl/gnu/com.ogamita.swig.asd b/objcl/gnu/com.ogamita.swig.asd
index 7078969..398b222 100644
--- a/objcl/gnu/com.ogamita.swig.asd
+++ b/objcl/gnu/com.ogamita.swig.asd
@@ -7,7 +7,7 @@
 (asdf:defsystem "com.ogamita.swig"
     :description  "This systems gathers CFFI packages generated by Swig."
     :author "Pascal J. Bourguignon <pjb@informatimago.com>"
-    :version "0.0.3"
+    :version "0.0.5"
     :licence "AGPL3"
     :properties ((#:author-email                   . "pjb@informatimago.com")
                  (#:date                           . "Spring 2011")
diff --git a/objcl/gnu/com.ogamita.swig.test.asd b/objcl/gnu/com.ogamita.swig.test.asd
index 817e504..f36bccb 100644
--- a/objcl/gnu/com.ogamita.swig.test.asd
+++ b/objcl/gnu/com.ogamita.swig.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.ogamita.swig")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/objcl/mac-roman-test.lisp b/objcl/mac-roman-test.lisp
index 65096a2..e34013f 100644
--- a/objcl/mac-roman-test.lisp
+++ b/objcl/mac-roman-test.lisp
@@ -38,6 +38,22 @@
   (:export "TEST/ALL"))
 (in-package "COM.INFORMATIMAGO.OBJCL.MAC-ROMAN.TEST")

+(defparameter *mac-roman-codes*
+  '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
+    25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
+    48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
+    71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
+    94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
+    112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 160
+    161 162 163 164 165 167 168 169 170 171 172 174 175 176 177 180 181
+    182 183 184 186 187 191 192 193 194 195 196 197 198 199 200 201 202
+    203 204 205 206 207 209 210 211 212 213 214 216 217 218 219 220 223
+    224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 241
+    242 243 244 245 246 247 248 249 250 251 252 255 305 338 339 376 402
+    710 711 728 729 730 731 732 733 960 8211 8212 8216 8217 8218 8220
+    8221 8222 8224 8225 8226 8230 8240 8249 8250 8260 8482 8486 8706
+    8710 8719 8721 8730 8734 8747 8776 8800 8804 8805 9674 64257 64258))
+

 (defun equiv (a b) (eq (not a) (not b)))

diff --git a/objcl/mac-roman.lisp b/objcl/mac-roman.lisp
index a1e72cf..f38ac23 100644
--- a/objcl/mac-roman.lisp
+++ b/objcl/mac-roman.lisp
@@ -34,6 +34,7 @@
 ;;;;**************************************************************************

 (in-package "COM.INFORMATIMAGO.OBJCL.MAC-ROMAN")
+
 ;; or we could depend on "COM.INFORMATIMAGO.COMMON-LISP.CESARUM.CHARACTER-SETS"


diff --git a/objcl/objc-support.lisp b/objcl/objc-support.lisp
index 0703d50..8d4461e 100644
--- a/objcl/objc-support.lisp
+++ b/objcl/objc-support.lisp
@@ -32,7 +32,7 @@
 ;;;;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ;;;;**************************************************************************

-#+ccl
+#+(and ccl darwin); for now, not on non-darwin
 (eval-when (:compile-toplevel :load-toplevel :execute)
   ;; When we (require :objc-support) before (require :cocoa), ccl
   ;; can't find the main bundle.  So we must require :cocoa for the
diff --git a/objcl/objcl-test.lisp b/objcl/objcl-test.lisp
index ca8539c..59e9e72 100644
--- a/objcl/objcl-test.lisp
+++ b/objcl/objcl-test.lisp
@@ -65,7 +65,7 @@

 (define-test test/read-identifier ()
   (let ((*package* (find-package "COM.INFORMATIMAGO.OBJECTIVE-CL.TEST")))
-   (test string=
+   (check string=
          (with-string-check (*objc-readtable*
                              stream "hello42World:")
            (read-identifier stream))
@@ -77,7 +77,7 @@
     type-specifier :='(' type-identifier ')' .
 "
   (let ((*package* (find-package "COM.INFORMATIMAGO.OBJECTIVE-CL.TEST")))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "(int)arg")
            (read-type-specifier stream))
@@ -93,38 +93,38 @@
                         | [objcl-identifier] ':' '(' type-identifier ')' objcl-identifier .
 "
   (let ((*package* (find-package "COM.INFORMATIMAGO.OBJECTIVE-CL.TEST")))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "simpleSelector)")
            (read-method-signature stream))
          '("simpleSelector" nil nil))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "singleArgComplexSelector:(int)arg)")
            (read-method-signature stream))
          '("singleArgComplexSelector:" ((:int arg)) nil))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "multipleArg:(int)arg1 complexSelector:(int)arg2)")
            (read-method-signature stream))
          '("multipleArg:complexSelector:" ((:int arg1) (:int arg2)) nil))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "multipleArgWithEmptyPart:(int)arg1 :(int)arg2)")
            (read-method-signature stream))
          '("multipleArgWithEmptyPart::" ((:int arg1) (:int arg2)) nil))

-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "singleArgComplexSelector:(int)arg &rest others)")
            (read-method-signature stream))
          '("singleArgComplexSelector:" ((:int arg)) others))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "multipleArg:(int)arg1 complexSelector:(int)arg2  &rest others)")
            (read-method-signature stream))
          '("multipleArg:complexSelector:" ((:int arg1) (:int arg2)) others))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "multipleArgWithEmptyPart:(int)arg1 :(int)arg2  &rest others)")
            (read-method-signature stream))
@@ -138,22 +138,22 @@
     type-identifier    := symbol .
 "
   (let ((*package* (find-package "COM.INFORMATIMAGO.OBJECTIVE-CL.TEST")))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "]")
            (read-final-arguments stream))
          '())
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "(integer)(+ one 2)]")
            (read-final-arguments stream))
          '((:integer (+ one 2))))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "(integer)(+ 1 2) (float)(+ 1.0 2.0)]")
            (read-final-arguments stream))
          '((:integer (+ 1 2)) (:float (+ 1.0d0 2.0d0))))
-   (test eql
+   (check eql
          (handler-case
              (progn
                (with-string-check (*objc-readtable*
@@ -174,27 +174,27 @@
                         | [objcl-identifier] ':' objcl-expression .
 "
   (let ((*package* (find-package "COM.INFORMATIMAGO.OBJECTIVE-CL.TEST")))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "simpleSelector]")
            (read-message stream))
          '("simpleSelector" nil nil))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "singleArgComplexSelector:42]")
            (read-message stream))
          '("singleArgComplexSelector:" (42) nil))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "multipleArg:42 complexSelector:24]")
            (read-message stream))
          '("multipleArg:complexSelector:" (42 24) nil))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "multipleArg:(+ 4 2) complexSelector:(* 2 4)]")
            (read-message stream))
          '("multipleArg:complexSelector:" ((+ 4 2) (* 2 4)) nil))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "multipleArg:[self one] complexSelector:[self two]]")
            (read-message stream))
@@ -202,18 +202,18 @@
            (,(generate-message-send 'self '"one" 'nil 'nil)
              ,(generate-message-send 'self '"two" 'nil 'nil))
            nil))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "multipleArgWithEmptyPart:42 :24]")
            (read-message stream))
          '("multipleArgWithEmptyPart::" (42 24) nil))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "singleArgComplexSelectorWithFinalArgs:42
                                                     (int)1]")
            (read-message stream))
          '("singleArgComplexSelectorWithFinalArgs:" (42) ((:int 1))))
-   (test equal
+   (check equal
          (with-string-check (*objc-readtable*
                              stream "multipleArg:42
                                complexSelectorWithFinalArgs:24
@@ -224,27 +224,27 @@

 (define-test test/read-message-send ()
   (let ((*package* (find-package "COM.INFORMATIMAGO.OBJECTIVE-CL.TEST")))
-    (test equal
+    (check equal
           (with-string-check (*objc-readtable*
                               stream "simpleSelector]")
             (read-message-send stream 'self (function read-message)))
           '(self "simpleSelector" nil nil))
-    (test equal
+    (check equal
           (with-string-check (*objc-readtable*
                               stream "singleArgComplexSelector:42]")
             (read-message-send stream 'self (function read-message)))
           '(self "singleArgComplexSelector:" (42) nil))
-    (test equal
+    (check equal
           (with-string-check (*objc-readtable*
                               stream "multipleArg:42 complexSelector:24]")
             (read-message-send stream 'self (function read-message)))
           '(self "multipleArg:complexSelector:" (42 24) nil))
-    (test equal
+    (check equal
           (with-string-check (*objc-readtable*
                               stream "multipleArg:(+ 4 2) complexSelector:(* 2 4)]")
             (read-message-send stream 'self (function read-message)))
           '(self "multipleArg:complexSelector:" ((+ 4 2) (* 2 4)) nil))
-    (test equal
+    (check equal
           (with-string-check (*objc-readtable*
                               stream "multipleArg:[self one] complexSelector:[self two]]")
             (read-message-send stream 'self (function read-message)))
@@ -252,18 +252,18 @@
                  (,(generate-message-send 'self '"one" 'nil 'nil)
                    ,(generate-message-send 'self '"two" 'nil 'nil))
                  nil))
-    (test equal
+    (check equal
           (with-string-check (*objc-readtable*
                               stream "multipleArgWithEmptyPart:42 :24]")
             (read-message-send stream 'self (function read-message)))
           '(self "multipleArgWithEmptyPart::" (42 24) nil))
-    (test equal
+    (check equal
           (with-string-check (*objc-readtable*
                               stream "singleArgComplexSelectorWithFinalArgs:42
                                                     (int)1]")
             (read-message-send stream 'self (function read-message)))
           '(self "singleArgComplexSelectorWithFinalArgs:" (42) ((:int 1))))
-    (test equal
+    (check equal
           (with-string-check (*objc-readtable*
                               stream "multipleArg:42
                                complexSelectorWithFinalArgs:24
@@ -276,31 +276,31 @@
   (let ((*package* (find-package "COM.INFORMATIMAGO.OBJECTIVE-CL.TEST")))
    (flet ((gen (args) (apply (function generate-message-send) args)))
      (declare (inline gen))
-     (test equal
+     (check equal
            (gen '(self "simpleSelector" nil nil))
            '(oclo:send self 'simple-selector))
-     (test equal
+     (check equal
            (gen '(self "singleArgComplexSelector:" (42) nil))
            '(oclo:send self :single-arg-complex-selector 42))
-     (test equal
+     (check equal
            (gen '(self "multipleArg:complexSelector:" (42 24) nil))
            '(oclo:send self :multiple-arg 42 :complex-selector 24))
-     (test equal
+     (check equal
            (gen '(self "multipleArg:complexSelector:" ((+ 4 2) (* 2 4)) nil))
            '(oclo:send self :multiple-arg (+ 4 2) :complex-selector (* 2 4)))
-     (test equal
+     (check equal
            (gen `(self "multipleArg:complexSelector:"
                        (,(generate-message-send 'self '"one" 'nil 'nil)
                          ,(generate-message-send 'self '"two" 'nil 'nil))
                        nil))
            '(oclo:send self :multiple-arg (oclo:send self 'one) :complex-selector (oclo:send self 'two)))
-     (test equal
+     (check equal
            (gen '(self "multipleArgWithEmptyPart::" (42 24) nil))
            '(oclo:send self :multiple-arg-with-empty-part 42 :|| 24))
-     (test equal
+     (check equal
            (gen '(self "singleArgComplexSelectorWithFinalArgs:" (42) ((:int 1))))
            '(oclo:send self :single-arg-complex-selector-with-final-args 42 (:int 1)))
-     (test equal
+     (check equal
            (gen '(self "multipleArg:complexSelectorWithFinalArgs:" (42 24) ((:int 1) (:float 2.0d0))))
            '(oclo:send self :multiple-arg 42 :complex-selector-with-final-args 24 (:int 1 :float 2.0d0))))))

@@ -311,66 +311,66 @@
             (let ((*readtable* *objective-cl-readtable*))
               (read-from-string source))))
      (declare (inline read-objc))
-     (test equal
+     (check equal
            (read-objc "[self simpleSelector]")
            '(oclo:send self 'simple-selector))
-     (test equal
+     (check equal
            (read-objc "[[NSData alloc] init]")
            '(oclo:send (oclo:send ns:ns-data 'alloc) 'init))
-     (test equal
+     (check equal
            (read-objc "[[my-obj doSomething] doSomethingElse]")
            '(oclo:send (oclo:send my-obj 'do-something) 'do-something-else))
-     (test equal
+     (check equal
            (read-objc "[self singleArgComplexSelector:42]")
            '(oclo:send self :single-arg-complex-selector 42))
-     (test equal
+     (check equal
            (read-objc "[self singleArgComplexSelector:(+ 4 2)]")
            '(oclo:send self :single-arg-complex-selector (+ 4 2)))
-     (test equal
+     (check equal
            (read-objc "[self singleArgComplexSelector:(+ 4 XYZ)]")
            '(oclo:send self :single-arg-complex-selector (+ 4 xyz)))
-     (test equal
+     (check equal
            (read-objc "[self singleArgComplexSelector:abc]")
            '(oclo:send self :single-arg-complex-selector abc))
-     (test equal
+     (check equal
            (read-objc "[self multipleArg:42 complexSelector:24]")
            '(oclo:send self :multiple-arg 42 :complex-selector 24))
-     (test equal
+     (check equal
            (read-objc "[self multipleArg: (+ 4 2) complexSelector: (* 2 4) ]")
            '(oclo:send self :multiple-arg (+ 4 2) :complex-selector (* 2 4)))
-     (test equal
+     (check equal
            (read-objc "[self multipleArg:[self one]complexSelector:[self two]]")
            '(oclo:send self :multiple-arg (oclo:send self 'one) :complex-selector (oclo:send self 'two)))
-     (test equal
+     (check equal
            (read-objc "[self multipleArg:[self one]
              complexSelector:[self two]]")
            '(oclo:send self :multiple-arg (oclo:send self 'one) :complex-selector (oclo:send self 'two)))
-     (test equal
+     (check equal
            (read-objc "[self multipleArg: [self one]
              complexSelector: [self two]  ]")
            '(oclo:send self :multiple-arg (oclo:send self 'one) :complex-selector (oclo:send self 'two)))
-     (test equal
+     (check equal
            (read-objc "[self multipleArgWithEmptyPart:42 :24]")
            '(oclo:send self :multiple-arg-with-empty-part 42 :|| 24))
-     (test equal
+     (check equal
            (read-objc "[self multipleArgWithEmptyPart:42 : 24 ]")
            '(oclo:send self :multiple-arg-with-empty-part 42 :|| 24))
-     (test equal
+     (check equal
            (read-objc "[self multipleArgWithEmptyPart:ABC :DEF]")
            '(oclo:send self :multiple-arg-with-empty-part abc :|| def))
-     (test equal
+     (check equal
            (read-objc "[self singleArgComplexSelectorWithFinalArgs:42 (:int)1]")
            '(oclo:send self :single-arg-complex-selector-with-final-args 42 (:int 1)))
-     (test equal
+     (check equal
            (read-objc "[self singleArgComplexSelectorWithFinalArgs:42(:int)  1 ]")
            '(oclo:send self :single-arg-complex-selector-with-final-args 42 (:int 1)))
-     (test equal
+     (check equal
            (read-objc "[self multipleArg:42 complexSelectorWithFinalArgs:24 (:int)1 (:float)2.0]")
            '(oclo:send self
              :multiple-arg 42
              :complex-selector-with-final-args 24
              (:int 1 :float 2.0d0)))
-     (test equal
+     (check equal
            (read-objc "(progn [self simpleSelector]
                              [self multipleArg:42 complexSelector:24])")
            '(progn
@@ -384,7 +384,7 @@
             (let ((*readtable* *objective-cl-readtable*))
               (read-from-string source))))
      (declare (inline read-objc))
-     (test equal
+     (check equal
            (read-objc "@[NSObject subClass:Example slots:(
                          one
                          two
@@ -414,7 +414,7 @@
             (let ((*readtable* *objective-cl-readtable*))
               (read-from-string source))))
      (declare (inline read-objc))
-     (test equal-modulo-constant-strings
+     (check equal-modulo-constant-strings
            (read-objc "@[Example classMethod:(multipleArg:(:int)a complexSelector:(:int)b)
                                 resultType:(:id)
                                       body:
@@ -431,7 +431,7 @@
             (let ((*readtable* *objective-cl-readtable*))
               (read-from-string source))))
      (declare (inline read-objc))
-     (test equal-modulo-constant-strings
+     (check equal-modulo-constant-strings
            (read-objc "@[Example method:(multipleArg:(:int)a complexSelector:(:int)b)
                            resultType:(:id)
                                  body:
@@ -439,8 +439,7 @@
                          [[NSNumber alloc]initWithInteger:(+ a b)]]")
            '(oclo:define-objc-method ((:id :multiple-arg (:int a) :complex-selector (:int b)) example)
              (ns-log (\@ "Example %d %d") a b)
-             (oclo:send (oclo:send ns:ns-number 'alloc) :init-with-integer (+ a b))))
-     )))
+             (oclo:send (oclo:send ns:ns-number 'alloc) :init-with-integer (+ a b)))))))


 (define-test test/all ()
diff --git a/objcl/packages.lisp b/objcl/packages.lisp
index cedc305..bbfa250 100644
--- a/objcl/packages.lisp
+++ b/objcl/packages.lisp
@@ -167,6 +167,7 @@ single package exporting all these symbols.
   ;; also use "COM.INFORMATIMAGO.OBJECTIVE-C.LOWER" as "OCLO".
   (:export
    "*OBJECTIVE-CL-READTABLE*"
+   "*OBJC-READTABLE*"
    "DISABLE-OBJCL-READER-MACROS"
    "ENABLE-OBJCL-READER-MACROS"
    "SET-OBJECTIVE-CL-SYNTAX" ; deprecated; use (enable-objc-reader-macros).
diff --git a/rdp/com.informatimago.rdp.basic.asd b/rdp/com.informatimago.rdp.basic.asd
index 24dc4f3..1da40cb 100644
--- a/rdp/com.informatimago.rdp.basic.asd
+++ b/rdp/com.informatimago.rdp.basic.asd
@@ -44,7 +44,7 @@ Provides methods specialized on the :basic target-language, to emit a generator
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.0.2"
+  :version "1.0.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Summer 2011")
                ((#:albert #:output-dir)          . "../documentation/com.informatimago.rdp.basic/")
diff --git a/rdp/com.informatimago.rdp.basic.example.asd b/rdp/com.informatimago.rdp.basic.example.asd
index c55fc77..c7ab751 100644
--- a/rdp/com.informatimago.rdp.basic.example.asd
+++ b/rdp/com.informatimago.rdp.basic.example.asd
@@ -46,7 +46,7 @@ target-language method will let the RDPG generate a parser in BASIC.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.0.2"
+  :version "1.0.3"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Summer 2011")
                ((#:albert #:output-dir)          . "../documentation/com.informatimago.rdp.basic.example/")
diff --git a/rdp/com.informatimago.rdp.basic.example.test.asd b/rdp/com.informatimago.rdp.basic.example.test.asd
index ba77278..fdad676 100644
--- a/rdp/com.informatimago.rdp.basic.example.test.asd
+++ b/rdp/com.informatimago.rdp.basic.example.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.1"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.rdp.basic.example")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/rdp/com.informatimago.rdp.basic.test.asd b/rdp/com.informatimago.rdp.basic.test.asd
index 92182d9..82c2578 100644
--- a/rdp/com.informatimago.rdp.basic.test.asd
+++ b/rdp/com.informatimago.rdp.basic.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.1"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.rdp.basic")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/rdp/com.informatimago.rdp.example.asd b/rdp/com.informatimago.rdp.example.asd
index 78b0f37..196f79d 100644
--- a/rdp/com.informatimago.rdp.example.asd
+++ b/rdp/com.informatimago.rdp.example.asd
@@ -47,7 +47,7 @@ both producing parsers in Lips.
     :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
     :licence "AGPL3"
     ;; component attributes:
-    :version "1.0.2"
+    :version "1.0.3"
     :properties ((#:author-email                   . "pjb@informatimago.com")
                  (#:date                           . "Summer 2011")
                  ((#:albert #:output-dir)          . "../documentation/com.informatimago.rdp.example/")
diff --git a/rdp/com.informatimago.rdp.example.test.asd b/rdp/com.informatimago.rdp.example.test.asd
index f29c2e7..de607c6 100644
--- a/rdp/com.informatimago.rdp.example.test.asd
+++ b/rdp/com.informatimago.rdp.example.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.1"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.rdp.example")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/rdp/com.informatimago.rdp.test.asd b/rdp/com.informatimago.rdp.test.asd
index 28da2f7..3a0fb3e 100644
--- a/rdp/com.informatimago.rdp.test.asd
+++ b/rdp/com.informatimago.rdp.test.asd
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.rdp")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/small-cl-pgms/botihn/com.informatimago.small-cl-pgms.botihn.asd b/small-cl-pgms/botihn/com.informatimago.small-cl-pgms.botihn.asd
index 81aa6f0..ef83d62 100644
--- a/small-cl-pgms/botihn/com.informatimago.small-cl-pgms.botihn.asd
+++ b/small-cl-pgms/botihn/com.informatimago.small-cl-pgms.botihn.asd
@@ -35,7 +35,7 @@
 (asdf:defsystem "com.informatimago.small-cl-pgms.botihn"
   :description "An IRC bot monitoring Hacker News."
   :author "Pascal J. Bourguignon"
-  :version "1.0.0"
+  :version "1.0.2"
   :license "AGPL3"
   :depends-on ("com.informatimago.common-lisp.cesarum"
                "cl-irc" "cl-json" "drakma")
diff --git a/small-cl-pgms/brainfuck/com.informatimago.small-cl-pgms.brainfuck.asd b/small-cl-pgms/brainfuck/com.informatimago.small-cl-pgms.brainfuck.asd
index 8f565fc..c47ba49 100644
--- a/small-cl-pgms/brainfuck/com.informatimago.small-cl-pgms.brainfuck.asd
+++ b/small-cl-pgms/brainfuck/com.informatimago.small-cl-pgms.brainfuck.asd
@@ -35,7 +35,7 @@
 (asdf:defsystem "com.informatimago.small-cl-pgms.brainfuck"
   :description "Brainfuck Compiler."
   :author "Pascal J. Bourguignon"
-  :version "1.0.0"
+  :version "1.0.2"
   :license "GPL3"
   :depends-on ()
   :components ((:file "bf"))
diff --git a/small-cl-pgms/brainfuck/com.informatimago.small-cl-pgms.brainfuck.test.asd b/small-cl-pgms/brainfuck/com.informatimago.small-cl-pgms.brainfuck.test.asd
index 2378c3f..4ea9158 100644
--- a/small-cl-pgms/brainfuck/com.informatimago.small-cl-pgms.brainfuck.test.asd
+++ b/small-cl-pgms/brainfuck/com.informatimago.small-cl-pgms.brainfuck.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "GPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.small-cl-pgms.brainfuck")
   :components     ((:file "bf-test" :depends-on ()))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (dolist (p '("COM.INFORMATIMAGO.SMALL-CL-PGMS.BRAINFUCK.TEST"))
-                     (let ((*package* (find-package p)))
-                       (uiop/package:symbol-call p "TEST/ALL")))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (dolist (p '("COM.INFORMATIMAGO.SMALL-CL-PGMS.BRAINFUCK.TEST"))
+                              (let ((*package* (find-package p)))
+                                (uiop/package:symbol-call p "TEST/ALL")))))

 ;;;; THE END ;;;;
diff --git a/small-cl-pgms/com.informatimago.small-cl-pgms.asd b/small-cl-pgms/com.informatimago.small-cl-pgms.asd
index f21de80..9ae465b 100644
--- a/small-cl-pgms/com.informatimago.small-cl-pgms.asd
+++ b/small-cl-pgms/com.informatimago.small-cl-pgms.asd
@@ -35,7 +35,7 @@
 (asdf:defsystem "com.informatimago.small-cl-pgms"
   :description "Small Common Lisp Programs"
   :author "Pascal J. Bourguignon"
-  :version "1.0.0"
+  :version "1.0.2"
   :license "GPL3"
   :depends-on ("com.informatimago.small-cl-pgms.brainfuck"
                "com.informatimago.small-cl-pgms.what-implementation"
diff --git a/small-cl-pgms/com.informatimago.small-cl-pgms.life.asd b/small-cl-pgms/com.informatimago.small-cl-pgms.life.asd
index e1b1243..8f83b10 100644
--- a/small-cl-pgms/com.informatimago.small-cl-pgms.life.asd
+++ b/small-cl-pgms/com.informatimago.small-cl-pgms.life.asd
@@ -35,7 +35,7 @@
 (asdf:defsystem "com.informatimago.small-cl-pgms.life"
   :description "A simple Conway's Life game."
   :author "Pascal J. Bourguignon"
-  :version "1.0.0"
+  :version "1.0.2"
   :license "GPL3"
   :depends-on ()
   :components ((:file "life"))
diff --git a/small-cl-pgms/com.informatimago.small-cl-pgms.life.test.asd b/small-cl-pgms/com.informatimago.small-cl-pgms.life.test.asd
index 5bca9b5..6491bf8 100644
--- a/small-cl-pgms/com.informatimago.small-cl-pgms.life.test.asd
+++ b/small-cl-pgms/com.informatimago.small-cl-pgms.life.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "GPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.small-cl-pgms.life")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/small-cl-pgms/com.informatimago.small-cl-pgms.quine.asd b/small-cl-pgms/com.informatimago.small-cl-pgms.quine.asd
index a9eece6..28dd6f7 100644
--- a/small-cl-pgms/com.informatimago.small-cl-pgms.quine.asd
+++ b/small-cl-pgms/com.informatimago.small-cl-pgms.quine.asd
@@ -35,7 +35,7 @@
 (asdf:defsystem "com.informatimago.small-cl-pgms.quine"
   :description "A few Quines."
   :author "Pascal J. Bourguignon"
-  :version "1.0.0"
+  :version "1.0.2"
   :license "GPL3"
   :depends-on ()
   :components ((:file "quine"))
diff --git a/small-cl-pgms/com.informatimago.small-cl-pgms.quine.test.asd b/small-cl-pgms/com.informatimago.small-cl-pgms.quine.test.asd
index 7cbd467..7e59e97 100644
--- a/small-cl-pgms/com.informatimago.small-cl-pgms.quine.test.asd
+++ b/small-cl-pgms/com.informatimago.small-cl-pgms.quine.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "GPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.small-cl-pgms.quine")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/small-cl-pgms/com.informatimago.small-cl-pgms.test.asd b/small-cl-pgms/com.informatimago.small-cl-pgms.test.asd
index 6dd289e..4cf396a 100644
--- a/small-cl-pgms/com.informatimago.small-cl-pgms.test.asd
+++ b/small-cl-pgms/com.informatimago.small-cl-pgms.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "GPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
diff --git a/small-cl-pgms/com.informatimago.small-cl-pgms.what-implementation.asd b/small-cl-pgms/com.informatimago.small-cl-pgms.what-implementation.asd
index ea9ed5b..d1114fc 100644
--- a/small-cl-pgms/com.informatimago.small-cl-pgms.what-implementation.asd
+++ b/small-cl-pgms/com.informatimago.small-cl-pgms.what-implementation.asd
@@ -35,7 +35,7 @@
 (asdf:defsystem "com.informatimago.small-cl-pgms.what-implementation"
   :description "A tool to help choosing a Common Lisp implementation."
   :author "Pascal J. Bourguignon"
-  :version "1.0.0"
+  :version "1.0.2"
   :license "GPL3"
   :depends-on ()
   :components ((:file "what-implementation"))
diff --git a/small-cl-pgms/com.informatimago.small-cl-pgms.what-implementation.test.asd b/small-cl-pgms/com.informatimago.small-cl-pgms.what-implementation.test.asd
index e42ab48..552e2bf 100644
--- a/small-cl-pgms/com.informatimago.small-cl-pgms.what-implementation.test.asd
+++ b/small-cl-pgms/com.informatimago.small-cl-pgms.what-implementation.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "GPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.small-cl-pgms.what-implementation"
                    "com.informatimago.common-lisp.cesarum")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "COM.INFORMATIMAGO.SMALL-CL-PGMS.WHAT-IMPLEMENTATION.TEST")))
-                   ;;   (uiop/package:symbol-call "COM.INFORMATIMAGO.SMALL-CL-PGMS.WHAT-IMPLEMENTATION.TEST"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "COM.INFORMATIMAGO.SMALL-CL-PGMS.WHAT-IMPLEMENTATION.TEST")))
+                            ;;   (uiop/package:symbol-call "COM.INFORMATIMAGO.SMALL-CL-PGMS.WHAT-IMPLEMENTATION.TEST"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/susv3/com.informatimago.susv3.asd b/susv3/com.informatimago.susv3.asd
index 47ddaf0..e32b24a 100644
--- a/susv3/com.informatimago.susv3.asd
+++ b/susv3/com.informatimago.susv3.asd
@@ -45,7 +45,7 @@ Currently implemented: DIRENT, IPC and PROCESS APIs.
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.2.2"
+  :version "1.2.4"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Spring 2014")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.susv3/")
diff --git a/susv3/com.informatimago.susv3.test.asd b/susv3/com.informatimago.susv3.test.asd
index 86b42d5..33b7bff 100644
--- a/susv3/com.informatimago.susv3.test.asd
+++ b/susv3/com.informatimago.susv3.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,12 +58,12 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.susv3")
   :components     ()
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   ;; (let ((*package* (find-package "TESTED-PACKAGE")))
-                   ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
-                   ;;                             "TEST/ALL"))
-                   ))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            ;; (let ((*package* (find-package "TESTED-PACKAGE")))
+                            ;;   (uiop/package:symbol-call "TESTED-PACKAGE"
+                            ;;                             "TEST/ALL"))
+                            ))

 ;;;; THE END ;;;;
diff --git a/tools/check-asdf.lisp b/tools/check-asdf.lisp
index 957a3a1..d5fe8e4 100644
--- a/tools/check-asdf.lisp
+++ b/tools/check-asdf.lisp
@@ -152,7 +152,7 @@ RETURN: A hash-table mapping file paths to ASDF-FILE structures.

 (defun dependencies  (p q) (member q (asdf-file-reachable p)))

-
+(defgeneric generate-dot (object))
 (defmethod generate-dot ((file asdf-file))
   (let ((style     "filled")
         (color     "black")
diff --git a/tools/com.informatimago.tools.asd b/tools/com.informatimago.tools.asd
index 772d1e1..12927e5 100644
--- a/tools/com.informatimago.tools.asd
+++ b/tools/com.informatimago.tools.asd
@@ -39,7 +39,7 @@
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.0.3"
+  :version "1.0.5"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Spring 2014")
                ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.tools/")
diff --git a/tools/com.informatimago.tools.bad-system-with-cycles.asd b/tools/com.informatimago.tools.bad-system-with-cycles.asd
index b369d8b..f499e00 100644
--- a/tools/com.informatimago.tools.bad-system-with-cycles.asd
+++ b/tools/com.informatimago.tools.bad-system-with-cycles.asd
@@ -32,10 +32,11 @@
 ;;;;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ;;;;**************************************************************************

+#+testing
 (asdf:defsystem "com.informatimago.tools.bad-system-with-cycles"
     :description "A bad system with cycles, to test check-asdf"
     :author "Pascal J. Bourguignon"
-    :version "1.0.1"
+    :version "1.0.3"
     :license "GPL3"
     :depends-on ("com.informatimago.common-lisp.cesarum"
                  "com.informatimago.clext")
diff --git a/tools/com.informatimago.tools.check-asdf.asd b/tools/com.informatimago.tools.check-asdf.asd
index 1ae1fc8..761ba8b 100644
--- a/tools/com.informatimago.tools.check-asdf.asd
+++ b/tools/com.informatimago.tools.check-asdf.asd
@@ -35,7 +35,7 @@
 (asdf:defsystem "com.informatimago.tools.check-asdf"
   :description "Checks ASD Files and reports circular dependencies."
   :author "Pascal J. Bourguignon"
-  :version "1.1.2"
+  :version "1.1.4"
   :license "AGPL3"
   :depends-on ("com.informatimago.common-lisp.cesarum"
                "com.informatimago.clext"
diff --git a/tools/com.informatimago.tools.check-asdf.test.asd b/tools/com.informatimago.tools.check-asdf.test.asd
index 6430b17..ce82063 100644
--- a/tools/com.informatimago.tools.check-asdf.test.asd
+++ b/tools/com.informatimago.tools.check-asdf.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.1"
+  :version        "1.0.3"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -60,12 +60,12 @@
                    "com.informatimago.tools.script")
   :components     ((:file "check-asdf-test" :depends-on nil)
                    (:file "dependency-cycles-test" :depends-on nil))
-  :perform        (asdf:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (dolist (p '("COM.INFORMATIMAGO.TOOLS.DEPENDENCY-CYCLES.TEST"
-                                "COM.INFORMATIMAGO.TOOLS.CHECK-ASDF.TEST"))
-                     (let ((*package* (find-package p)))
-                       (uiop/package:symbol-call p "TEST/ALL")))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (dolist (p '("COM.INFORMATIMAGO.TOOLS.DEPENDENCY-CYCLES.TEST"
+                                         "COM.INFORMATIMAGO.TOOLS.CHECK-ASDF.TEST"))
+                              (let ((*package* (find-package p)))
+                                (uiop/package:symbol-call p "TEST/ALL")))))

 ;;;; THE END ;;;;
diff --git a/tools/com.informatimago.tools.make-depends.asd b/tools/com.informatimago.tools.make-depends.asd
index 579397c..385b148 100644
--- a/tools/com.informatimago.tools.make-depends.asd
+++ b/tools/com.informatimago.tools.make-depends.asd
@@ -46,7 +46,7 @@ translations and ad-hoc processing.
     :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
     :licence "AGPL3"
     ;; component attributes:
-    :version "1.2.1"
+    :version "1.2.3"
     :properties ((#:author-email                   . "pjb@informatimago.com")
                  (#:date                           . "Autumn 2010")
                  ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.make-depends/")
diff --git a/tools/com.informatimago.tools.make-depends.test.asd b/tools/com.informatimago.tools.make-depends.test.asd
index 34e643a..b26c2e9 100644
--- a/tools/com.informatimago.tools.make-depends.test.asd
+++ b/tools/com.informatimago.tools.make-depends.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.tools.make-depends")
   :components     ((:file "make-depends-test" :depends-on nil))
-  :perform        (asdf:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (dolist (p '("COM.INFORMATIMAGO.TOOLS.MAKE-DEPENDS.TEST"))
-                     (let ((*package* (find-package p)))
-                       (uiop/package:symbol-call p "TEST/ALL")))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (dolist (p '("COM.INFORMATIMAGO.TOOLS.MAKE-DEPENDS.TEST"))
+                              (let ((*package* (find-package p)))
+                                (uiop/package:symbol-call p "TEST/ALL")))))

 ;;;; THE END ;;;;
diff --git a/tools/com.informatimago.tools.manifest.asd b/tools/com.informatimago.tools.manifest.asd
index f8d0828..94c1096 100644
--- a/tools/com.informatimago.tools.manifest.asd
+++ b/tools/com.informatimago.tools.manifest.asd
@@ -35,7 +35,7 @@
 (asdf:defsystem "com.informatimago.tools.manifest"
   :description "Produces a manifest of asdf systems."
   :author "Pascal J. Bourguignon"
-  :version "1.0.0"
+  :version "1.0.2"
   :license "AGPL3"
   :depends-on ("com.informatimago.common-lisp.cesarum"
                "split-sequence")
diff --git a/tools/com.informatimago.tools.manifest.test.asd b/tools/com.informatimago.tools.manifest.test.asd
index 27a15d1..2c50979 100644
--- a/tools/com.informatimago.tools.manifest.test.asd
+++ b/tools/com.informatimago.tools.manifest.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.tools.manifest")
   :components     ((:file "manifest-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.MANIFEST.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.MANIFEST.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.MANIFEST.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.MANIFEST.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/tools/com.informatimago.tools.pathname.asd b/tools/com.informatimago.tools.pathname.asd
index b8fd7b7..e08e207 100644
--- a/tools/com.informatimago.tools.pathname.asd
+++ b/tools/com.informatimago.tools.pathname.asd
@@ -35,7 +35,7 @@
 (asdf:defsystem "com.informatimago.tools.pathname"
     :description "Pathname tools."
     :author "Pascal J. Bourguignon"
-    :version "1.0.0"
+    :version "1.0.2"
     :license "GPL3"
     :depends-on ()
     :components ((:file "pathname")))
diff --git a/tools/com.informatimago.tools.pathname.test.asd b/tools/com.informatimago.tools.pathname.test.asd
index a05c3ab..519ef56 100644
--- a/tools/com.informatimago.tools.pathname.test.asd
+++ b/tools/com.informatimago.tools.pathname.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "GPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.tools.pathname")
   :components     ((:file "pathname-test" :depends-on nil))
-  :perform        (asdf:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (dolist (p '("COM.INFORMATIMAGO.TOOLS.PATHNAME.TEST"))
-                     (let ((*package* (find-package p)))
-                       (uiop/package:symbol-call p "TEST/ALL")))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (dolist (p '("COM.INFORMATIMAGO.TOOLS.PATHNAME.TEST"))
+                              (let ((*package* (find-package p)))
+                                (uiop/package:symbol-call p "TEST/ALL")))))

 ;;;; THE END ;;;;
diff --git a/tools/com.informatimago.tools.quicklisp.asd b/tools/com.informatimago.tools.quicklisp.asd
index a20acc3..c5bc27b 100644
--- a/tools/com.informatimago.tools.quicklisp.asd
+++ b/tools/com.informatimago.tools.quicklisp.asd
@@ -35,7 +35,7 @@
 (asdf:defsystem "com.informatimago.tools.quicklisp"
     :description "Quicklisp tools."
     :author "Pascal J. Bourguignon"
-    :version "1.0.0"
+    :version "1.0.2"
     :license "GPL3"
     :depends-on (;; assumed ;; "quicklisp"
                  "com.informatimago.tools.pathname")
diff --git a/tools/com.informatimago.tools.quicklisp.test.asd b/tools/com.informatimago.tools.quicklisp.test.asd
index 672717a..65d04fc 100644
--- a/tools/com.informatimago.tools.quicklisp.test.asd
+++ b/tools/com.informatimago.tools.quicklisp.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "GPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -59,14 +59,14 @@
                    "com.informatimago.tools.quicklisp")
   :components     ((:file "quicklisp-test" :depends-on ())
                    (:file "asdf-test" :depends-on ()))
-  :perform        (asdf:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.QUICKLISP.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.QUICKLISP.TEST"
-                                               "TEST/ALL"))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.ASDF.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.ASDF.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.QUICKLISP.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.QUICKLISP.TEST"
+                                                        "TEST/ALL"))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.ASDF.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.ASDF.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/tools/com.informatimago.tools.script.asd b/tools/com.informatimago.tools.script.asd
index bdbe5a3..3a611d8 100644
--- a/tools/com.informatimago.tools.script.asd
+++ b/tools/com.informatimago.tools.script.asd
@@ -35,7 +35,7 @@
 (asdf:defsystem "com.informatimago.tools.script"
   :description "Utilities for scripts."
   :author "Pascal J. Bourguignon"
-  :version "1.0.0"
+  :version "1.0.2"
   :license "AGPL3"
   :depends-on ()
   :components ((:file "script" :depends-on ()))
diff --git a/tools/com.informatimago.tools.script.test.asd b/tools/com.informatimago.tools.script.test.asd
index 814deb2..d8c8405 100644
--- a/tools/com.informatimago.tools.script.test.asd
+++ b/tools/com.informatimago.tools.script.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -55,13 +55,14 @@
                    ((#:albert #:docbook #:bgcolor) . "white")
                    ((#:albert #:docbook #:textcolor) . "black"))
   #+asdf-unicode :encoding #+asdf-unicode :utf-8
-  :depends-on     ("com.informatimago.common-lisp.cesarum") ; simple-test
+  :depends-on     ("com.informatimago.common-lisp.cesarum" ; simple-test
+                   "com.informatimago.tools.script")
   :components     ((:file "script-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (dolist (p '("COM.INFORMATIMAGO.TOOLS.SCRIPT.TEST"))
-                     (let ((*package* (find-package p)))
-                       (uiop/package:symbol-call p "TEST/ALL")))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (dolist (p '("COM.INFORMATIMAGO.TOOLS.SCRIPT.TEST"))
+                              (let ((*package* (find-package p)))
+                                (uiop/package:symbol-call p "TEST/ALL")))))

 ;;;; THE END ;;;;
diff --git a/tools/com.informatimago.tools.source.asd b/tools/com.informatimago.tools.source.asd
index 8f18e3f..2d16a57 100644
--- a/tools/com.informatimago.tools.source.asd
+++ b/tools/com.informatimago.tools.source.asd
@@ -41,7 +41,7 @@ This system would use closer-mop which is not available on MOCL.

 "
   :author "Pascal J. Bourguignon"
-  :version "1.0.0"
+  :version "1.0.2"
   :license "GPL3"
   :depends-on ()
   :components ())
@@ -50,13 +50,14 @@ This system would use closer-mop which is not available on MOCL.
 (asdf:defsystem "com.informatimago.tools.source"
   :description "Reads sources and headers to perform some analysis."
   :author "Pascal J. Bourguignon"
-  :version "1.0.1"
+  :version "1.0.3"
   :license "GPL3"
   :depends-on ("com.informatimago.common-lisp.cesarum"
                "com.informatimago.common-lisp.picture"
                "com.informatimago.common-lisp.graphviz" ; used by dependency-cycles
                "com.informatimago.clext"
-               "closer-mop")
+               "closer-mop"
+               "split-sequence")
   :components ((:file "source")
                (:file "dependency-cycles")
                (:file "asdf-file"  :depends-on ("dependency-cycles" "source"))
diff --git a/tools/com.informatimago.tools.source.test.asd b/tools/com.informatimago.tools.source.test.asd
index 939c94b..108887b 100644
--- a/tools/com.informatimago.tools.source.test.asd
+++ b/tools/com.informatimago.tools.source.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "GPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -59,14 +59,14 @@
                    "com.informatimago.tools.source")
   :components     ((:file "source-test"    :depends-on ())
                    (:file "asdf-file-test" :depends-on ()))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.SOURCE.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.SOURCE.TEST"
-                                               "TEST/ALL"))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.ASDF-FILE.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.ASDF-FILE.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.SOURCE.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.SOURCE.TEST"
+                                                        "TEST/ALL"))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.ASDF-FILE.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.ASDF-FILE.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/tools/com.informatimago.tools.summary.asd b/tools/com.informatimago.tools.summary.asd
index e2afe44..391e782 100644
--- a/tools/com.informatimago.tools.summary.asd
+++ b/tools/com.informatimago.tools.summary.asd
@@ -45,7 +45,7 @@ Since summary depends on source which is disabled on MoCL, we are therefore disa
     :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
     :licence "AGPL3"
     ;; component attributes:
-    :version "1.0.0"
+    :version "1.0.2"
     :properties ((#:author-email                   . "pjb@informatimago.com")
                  (#:date                           . "Autumn 2010")
                  ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.summary/")
@@ -71,7 +71,7 @@ This program generates an HTML summary page for packages.
     :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
     :licence "AGPL3"
     ;; component attributes:
-    :version "1.0.0"
+    :version "1.0.2"
     :properties ((#:author-email                   . "pjb@informatimago.com")
                  (#:date                           . "Autumn 2010")
                  ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.summary/")
diff --git a/tools/com.informatimago.tools.summary.test.asd b/tools/com.informatimago.tools.summary.test.asd
index 103c31c..b6ad92d 100644
--- a/tools/com.informatimago.tools.summary.test.asd
+++ b/tools/com.informatimago.tools.summary.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.tools.summary")
   :components     ((:file "summary-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.SUMMARY.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.SUMMARY.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.SUMMARY.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.SUMMARY.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/tools/com.informatimago.tools.symbol.asd b/tools/com.informatimago.tools.symbol.asd
index aec68ff..3a09d03 100644
--- a/tools/com.informatimago.tools.symbol.asd
+++ b/tools/com.informatimago.tools.symbol.asd
@@ -35,7 +35,7 @@
 (asdf:defsystem "com.informatimago.tools.symbol"
     :description "Symbol tools."
     :author "Pascal J. Bourguignon"
-    :version "1.0.0"
+    :version "1.0.2"
     :license "GPL3"
     :depends-on ("com.informatimago.common-lisp.cesarum")
     :components ((:file "symbol")))
diff --git a/tools/com.informatimago.tools.symbol.test.asd b/tools/com.informatimago.tools.symbol.test.asd
index 99e63e9..a4025cd 100644
--- a/tools/com.informatimago.tools.symbol.test.asd
+++ b/tools/com.informatimago.tools.symbol.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon"
   :licence        "GPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.common-lisp.cesarum"
                    "com.informatimago.tools.symbol")
   :components     ((:file "symbol-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.SYMBOL.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.SYMBOL.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.SYMBOL.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.SYMBOL.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/tools/com.informatimago.tools.test.asd b/tools/com.informatimago.tools.test.asd
index 4d2cc76..323c43e 100644
--- a/tools/com.informatimago.tools.test.asd
+++ b/tools/com.informatimago.tools.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
diff --git a/tools/com.informatimago.tools.thread.asd b/tools/com.informatimago.tools.thread.asd
index af5e5e0..f9be1e8 100644
--- a/tools/com.informatimago.tools.thread.asd
+++ b/tools/com.informatimago.tools.thread.asd
@@ -44,7 +44,7 @@ Interactive commands to manipulate threads.
     :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
     :licence "AGPL3"
     ;; component attributes:
-    :version "1.0.0"
+    :version "1.0.2"
     :properties ((#:author-email                   . "pjb@informatimago.com")
                  (#:date                           . "Winter 2015")
                  ((#:albert #:output-dir)          . "/tmp/documentation/com.informatimago.common-lisp.thread/")
diff --git a/tools/com.informatimago.tools.undefmethod.asd b/tools/com.informatimago.tools.undefmethod.asd
index c97a3bc..497cd82 100644
--- a/tools/com.informatimago.tools.undefmethod.asd
+++ b/tools/com.informatimago.tools.undefmethod.asd
@@ -35,7 +35,7 @@
 (asdf:defsystem "com.informatimago.tools.undefmethod"
     :description "A macro that undefines the method instead of defining it."
     :author "irc://Shinmera@irc.freenode.org"
-    :version "1.0.0"
+    :version "1.0.2"
     :license "GPL3"
     :depends-on ()
     :components ((:file "undefmethod")))
diff --git a/tools/com.informatimago.tools.undefmethod.test.asd b/tools/com.informatimago.tools.undefmethod.test.asd
index 52ba18d..c72bf10 100644
--- a/tools/com.informatimago.tools.undefmethod.test.asd
+++ b/tools/com.informatimago.tools.undefmethod.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -58,11 +58,11 @@
   :depends-on     ("com.informatimago.tools.undefmethod"
                    "com.informatimago.common-lisp.cesarum")
   :components     ((:file "undefmethod-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op
-                   (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.UNDEFMETHOD.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.UNDEFMETHOD.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op
+                            (operation system)
+                            (declare (ignore operation system))
+                            (let ((*package* (find-package "COM.INFORMATIMAGO.TOOLS.UNDEFMETHOD.TEST")))
+                              (uiop/package:symbol-call "COM.INFORMATIMAGO.TOOLS.UNDEFMETHOD.TEST"
+                                                        "TEST/ALL"))))

 ;;;; THE END ;;;;
diff --git a/tools/manifest.lisp b/tools/manifest.lisp
index d6d59b1..be2c53a 100644
--- a/tools/manifest.lisp
+++ b/tools/manifest.lisp
@@ -144,7 +144,8 @@ stdout in a string (going thru a file)."
           options))

 (declaim (inline trim))
-(defun trim  (string) (string-trim #(#\space #\tab #\newline) string))
+(defun trim  (string)
+  (and string (string-trim #(#\space #\tab #\newline) string)))

 (defun uname (&rest options)
   "Without OPTIONS, return a keyword naming the system (:LINUX, :DARWIN, etc).
@@ -225,14 +226,17 @@ System and distrib are keywords, release is a string."
        (:darwin
         (when (probe-file "/System/Library/Frameworks/AppKit.framework/AppKit")
           (setf distrib :apple))
-        (setf release (with-input-from-string (inp (shell-command-to-string "hostinfo"))
-                        (loop
-                          :for line = (read-line inp nil nil)
-                          :while line
-                          :when (search "Darwin Kernel Version" line)
-                          :return (let ((release (fourth (words line))))
-                                    (subseq release 0 (position #\: release)))
-                          :finally (return :unknown)))))
+        (let ((hostinfo (shell-command-to-string "hostinfo")))
+          (when hostinfo
+           (setf release (with-input-from-string (inp hostinfo)
+                           (loop
+                             :for line = (read-line inp nil nil)
+                             :while line
+                             :when (search "Darwin Kernel Version" line)
+                               :return (let ((release (fourth (words line))))
+                                         (subseq release 0 (position #\: release)))
+                             :finally (return :unknown))))
+           (setf release :unknown))))
        (:unknown
         (let ((host (trim (shell-command-to-string "hostinfo"))))
           (cond
diff --git a/tools/quicklisp.lisp b/tools/quicklisp.lisp
index bc45816..892e711 100644
--- a/tools/quicklisp.lisp
+++ b/tools/quicklisp.lisp
@@ -31,13 +31,39 @@
 ;;;;    You should have received a copy of the GNU Affero General Public License
 ;;;;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ;;;;**************************************************************************
+(in-package "COMMON-LISP-USER")

 #-quicklisp
 (defpackage "QUICKLISP"
-  (:nickname "QL-DIST" "QL")
-  (:export "NAME" "PROJECT-NAME" "DIST" "PROVIDED-SYSTEMS"
-           "PROVIDED-RELEASES" "UPDATE-CLIENT" "UPDATE-ALL-DISTS"
-           "CLEAN" "WHERE-IS-SYSTEM" "QUICKLOAD" "REGISTER-LOCAL-PROJECTS"))
+  (:nicknames "QL-DIST" "QL" "QUICKLISP-CLIENT")
+  (:export "CLEAN" "DIST" "ENABLED-DISTS" "ENSURE-INSTALLED"
+           "INSTALLED-RELEASES" "NAME" "PROJECT-NAME"
+           "PROVIDED-RELEASES" "PROVIDED-SYSTEMS" "QUICKLOAD"
+           "REGISTER-LOCAL-PROJECTS" "RELEASE" "UNINSTALL"
+           "UPDATE-ALL-DISTS" "UPDATE-CLIENT" "WHERE-IS-SYSTEM"))
+
+#-quicklisp
+(defmacro generate-dummy-functions (&rest funames)
+  `(progn ,@(mapcar (lambda (funame)
+                      `(defun ,funame (&rest args) (declare (ignore args)) nil))
+                    funames)))
+
+#-quicklisp
+(generate-dummy-functions
+ QUICKLISP:DIST
+ QUICKLISP:ENABLED-DISTS
+ QUICKLISP:ENSURE-INSTALLED
+ QUICKLISP:INSTALLED-RELEASES
+ QUICKLISP:PROVIDED-RELEASES
+ QUICKLISP:PROVIDED-SYSTEMS
+ QUICKLISP:QUICKLOAD
+ QUICKLISP:REGISTER-LOCAL-PROJECTS
+ QUICKLISP:RELEASE
+ QUICKLISP:UNINSTALL
+ QUICKLISP:UPDATE-ALL-DISTS
+ QUICKLISP:UPDATE-CLIENT
+ QUICKLISP:WHERE-IS-SYSTEM)
+

 (defpackage "COM.INFORMATIMAGO.TOOLS.QUICKLISP"
   (:use "COMMON-LISP"
diff --git a/tools/source.lisp b/tools/source.lisp
index 2fd9a5d..b02f591 100644
--- a/tools/source.lisp
+++ b/tools/source.lisp
@@ -560,6 +560,7 @@ Any other will go to the tail file variables.")
 (defvar *line-length* 79
   "Maximum number of character per line.")

+#-sbcl
 (defun write-source-header (headers stream
                             &key (comment-start ";;;;") (comment-end) (line-char #\*))
   "Write a source header in a comment.
@@ -620,6 +621,76 @@ Possible keys are:
             (format-line "~:@(~A~):~V<~>~A" key (max 1 (- 20 (length (string key)))) val)))))
      (line))))

+#+sbcl
+(defun wsb-line (stream comment-start line-char comment-end)
+  (format stream "~@[~A~]~V,,,V<~>~@[~A~]~%"
+          comment-start
+          (- *line-length* (length comment-start) (length comment-end))
+          line-char
+          comment-end))
+#+sbcl
+(defun wsb-format-line (stream comment-start comment-end control-string &rest arguments)
+  (format stream "~@[~A~]~?~@[ ~A~]~%" comment-start control-string arguments comment-end))
+
+#+sbcl
+(defun wsb-indent-non-date-line (line)
+  (if (and (< 16 (length line))
+           (char= #\- (aref line 4))
+           (char= #\- (aref line 7))
+           (let ((s (subseq line 0 4)))  (loop for ch across s always (digit-char-p ch)))
+           (let ((s (subseq line 5 7)))  (loop for ch across s always (digit-char-p ch)))
+           (let ((s (subseq line 8 10))) (loop for ch across s always (digit-char-p ch))))
+      line
+      (concatenate 'string "                 " line)))
+
+#+sbcl
+(defun wsb (headers stream comment-start comment-end line-char)
+  (let ((sections-with-spacer '(:description :usage :bugs :legal)))
+    (wsb-line stream comment-start line-char comment-end)
+    (dolist (key *file-headers*)
+      (let ((val (header-slot headers key)))
+        (etypecase val
+          (list
+           (wsb-format-line stream comment-start comment-end "~:@(~A~):" key)
+           (when (member key sections-with-spacer)
+             (wsb-format-line stream comment-start comment-end ""))
+           (if (eql key :modifications)
+               (dolist (line val)
+                 (wsb-format-line stream comment-start comment-end "    ~A" (indent-non-date-line line)))
+               (dolist (line val)
+                 (wsb-format-line stream comment-start comment-end "    ~A" line)))
+           (when (and val (member key sections-with-spacer))
+             (wsb-format-line stream comment-start comment-end "")))
+          (string
+           (wsb-format-line stream comment-start comment-end "~:@(~A~):~V<~>~A" key (max 1 (- 20 (length (string key)))) val)))))
+    (wsb-line stream comment-start line-char comment-end)))
+
+#+sbcl
+(defun write-source-header (headers stream
+                            &key (comment-start ";;;;") (comment-end) (line-char #\*))
+  "Write a source header in a comment.
+
+HEADERS:           A P-list containing the header data.
+COMMENT-START:     NIL or a string containing the start of comment lines.
+COMMENT-END:       NIL or a string containing the end of comment lines.
+LINE-CHAR:         A filler character used to draw a line in a comment.
+*LINE-LENGTH*      The length of the line comment lines generated.
+
+The values may be strings or list of strings (lines).
+Possible keys are:
+- :file            name of the file.
+- :language        the programming language in the file.
+- :system          the operating system this source runs on.
+- :user-interface  the user interface framework this source uses.
+- :description     a multi-line description of this source file.
+- :usage           usage indications.
+- :authors         a list of authors.
+- :modifications   a changelog list.
+- :bugs            a list of bugs.
+- :legal           the license section.
+"
+  (wsb headers stream comment-start comment-end line-char))
+

 (defun read-source-header (stream
                            &key (comment-start #+clisp "^[;]\\+" #-clisp ";")
diff --git a/tools/undefmethod-test.lisp b/tools/undefmethod-test.lisp
index 1b01b4d..b88ecb4 100644
--- a/tools/undefmethod-test.lisp
+++ b/tools/undefmethod-test.lisp
@@ -39,6 +39,7 @@
 (in-package "COM.INFORMATIMAGO.TOOLS.UNDEFMETHOD.TEST")

 (defclass c () ())
+(defgeneric m (o))

 (define-test test/undefmethod ()
   (eval `(defmethod m ((self c)) 'hi))
diff --git a/xcode/com.informatimago.xcode.asd b/xcode/com.informatimago.xcode.asd
index ed40eaf..50a0b40 100644
--- a/xcode/com.informatimago.xcode.asd
+++ b/xcode/com.informatimago.xcode.asd
@@ -46,7 +46,7 @@ Various Xcode related tools.  For now:
   :maintainer "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence "AGPL3"
   ;; component attributes:
-  :version "1.0.0"
+  :version "1.0.2"
   :properties ((#:author-email                   . "pjb@informatimago.com")
                (#:date                           . "Winter 2012")
                ((#:albert #:output-dir)          . "../documentation/com.informatimago.xcode/")
diff --git a/xcode/com.informatimago.xcode.test.asd b/xcode/com.informatimago.xcode.test.asd
index e5da6b3..76b62cb 100644
--- a/xcode/com.informatimago.xcode.test.asd
+++ b/xcode/com.informatimago.xcode.test.asd
@@ -45,7 +45,7 @@
   :maintainer     "Pascal J. Bourguignon <pjb@informatimago.com>"
   :licence        "AGPL3"
   ;; component attributes:
-  :version        "1.0.0"
+  :version        "1.0.2"
   :properties     ((#:author-email . "pjb@informatimago.com")
                    (#:date . "Winter 2015")
                    ((#:albert #:output-dir)
@@ -59,10 +59,10 @@
                    "com.informatimago.rdp"
                    "com.informatimago.common-lisp.cesarum")
   :components     ((:file "pbxproj-test" :depends-on nil))
-  :perform        (asdf/lisp-action:test-op (operation system)
-                   (declare (ignore operation system))
-                   (let ((*package* (find-package "COM.INFORMATIMAGO.XCODE.TEST")))
-                     (uiop/package:symbol-call "COM.INFORMATIMAGO.XCODE.TEST"
-                                               "TEST/ALL"))))
+  #+asdf3 :perform #+asdf3 (asdf:test-op (operation system)
+                                         (declare (ignore operation system))
+                                         (let ((*package* (find-package "COM.INFORMATIMAGO.XCODE.TEST")))
+                                           (uiop/package:symbol-call "COM.INFORMATIMAGO.XCODE.TEST"
+                                                                     "TEST/ALL"))))

 ;;;; THE END ;;;;
ViewGit