diff --git a/ansi-tests/format-p.lsp b/ansi-tests/format-p.lsp
new file mode 100644
index 0000000000000000000000000000000000000000..f8512b6b41ea937ea15806f08e1cfd4dd71d6a4e
--- /dev/null
+++ b/ansi-tests/format-p.lsp
@@ -0,0 +1,92 @@
+;-*- Mode:     Lisp -*-
+;;;; Author:   Paul Dietz
+;;;; Created:  Sun Oct 17 21:32:45 2004
+;;;; Contains: Tests of the ~P format directives
+
+(in-package :cl-test)
+
+(compile-and-load "printer-aux.lsp")
+
+(deftest format.p.1
+  (format nil "~p" 1)
+  "")
+
+(deftest format.p.2
+  (format nil "~P" 2)
+  "s")
+
+(deftest format.p.3
+  (format nil "~p" 0)
+  "s")
+
+(deftest format.p.4
+  (format nil "~P" 1.0)
+  "s")
+
+(deftest format.p.5
+  (loop for x in *universe*
+	for s = (format nil "~p" x)
+	unless (or (eql x 1) (string= s "s"))
+	collect (list x s))
+  nil)
+
+;;; :p
+
+(deftest format.p.6
+  (format nil "~D cat~:P" 1)
+  "1 cat")
+
+(deftest format.p.7
+  (format nil "~D cat~:p" 2)
+  "2 cats")
+
+(deftest format.p.8
+  (format nil "~D cat~:P" 0)
+  "0 cats")
+
+(deftest format.p.9
+  (format nil "~D cat~:p" "No")
+  "No cats")
+
+;;; :@p
+
+(deftest format.p.10
+  (format nil "~D penn~:@P" 1)
+  "1 penny")
+
+(deftest format.p.11
+  (format nil "~D penn~:@p" 2)
+  "2 pennies")
+
+(deftest format.p.12
+  (format nil "~D penn~@:P" 0)
+  "0 pennies")
+
+(deftest format.p.13
+  (format nil "~D penn~@:p" "No")
+  "No pennies")
+
+;;; @p
+
+(deftest format.p.14
+  (format nil "~@p" 1)
+  "y")
+
+(deftest format.p.15
+  (format nil "~@P" 2)
+  "ies")
+
+(deftest format.p.16
+  (format nil "~@p" 0)
+  "ies")
+
+(deftest format.p.17
+  (format nil "~@P" 1.0)
+  "ies")
+
+(deftest format.p.18
+  (loop for x in *universe*
+	for s = (format nil "~@p" x)
+	unless (or (eql x 1) (string= s "ies"))
+	collect (list x s))
+  nil)
diff --git a/ansi-tests/format-paren.lsp b/ansi-tests/format-paren.lsp
new file mode 100644
index 0000000000000000000000000000000000000000..1e9c52685c20a6971a793be70685c3ff635ac98d
--- /dev/null
+++ b/ansi-tests/format-paren.lsp
@@ -0,0 +1,139 @@
+;-*- Mode:     Lisp -*-
+;;;; Author:   Paul Dietz
+;;;; Created:  Sun Oct 17 20:28:24 2004
+;;;; Contains: Tests of the ~( format directives
+
+(in-package :cl-test)
+
+(compile-and-load "printer-aux.lsp")
+
+(deftest format.paren.1
+  (format nil "~(XXyy~AuuVV~)" "ABc dEF ghI")
+  "xxyyabc def ghiuuvv")
+
+;;; Conversion of simple characters to downcase
+(deftest format.paren.2
+  (loop for i from 0 below (min char-code-limit (ash 1 16))
+	for c = (code-char i)
+	when (and c
+		  (eql (char-code c) (char-int c))
+		  (upper-case-p c)
+		  (let ((s1 (format nil "~(~c~)" c))
+			(s2 (string (char-downcase c))))
+		    (if
+			(or (not (eql (length s1) 1))
+			    (not (eql (length s2) 1))
+			    (not (eql (elt s1 0)
+				      (elt s2 0))))
+			(list i c s1 s2)
+		      nil)))
+	collect it)
+  nil)
+
+(deftest format.paren.3
+  (format nil "~@(this is a TEST.~)")
+  "This is a test.")
+
+(deftest format.paren.4
+  (format nil "~@(!@#$%^&*this is a TEST.~)")
+  "!@#$%^&*This is a test.")
+
+(deftest format.paren.5
+  (format nil "~:(this is a TEST.~)")
+  "This Is A Test.")
+			
+(deftest format.paren.6
+  (format nil "~:(this is7a TEST.~)")
+  "This Is7a Test.")
+
+(deftest format.paren.7
+  (format nil "~:@(this is AlSo A teSt~)")
+  "THIS IS ALSO A TEST")
+
+(deftest format.paren.8
+  (loop for i from 0 below (min char-code-limit (ash 1 16))
+	for c = (code-char i)
+	when (and c
+		  (eql (char-code c) (char-int c))
+		  (lower-case-p c)
+		  (let ((s1 (format nil "~@:(~c~)" c))
+			(s2 (string (char-upcase c))))
+		    (if
+			(or (not (eql (length s1) 1))
+			    (not (eql (length s2) 1))
+			    (not (eql (elt s1 0)
+				      (elt s2 0))))
+			(list i c s1 s2)
+		      nil)))
+	collect it)
+  nil)
+
+;;; Nested conversion
+
+(deftest format.paren.9
+  (format nil "~(aBc ~:(def~) GHi~)")
+  "abc def ghi")
+
+(deftest format.paren.10
+  (format nil "~(aBc ~(def~) GHi~)")
+  "abc def ghi")
+
+(deftest format.paren.11
+  (format nil "~@(aBc ~:(def~) GHi~)")
+  "Abc def ghi")
+
+(deftest format.paren.12
+  (format nil "~(aBc ~@(def~) GHi~)")
+  "abc def ghi")
+
+(deftest format.paren.13
+  (format nil "~(aBc ~:(def~) GHi~)")
+  "abc def ghi")
+
+(deftest format.paren.14
+  (format nil "~:(aBc ~(def~) GHi~)")
+  "Abc Def Ghi")
+
+(deftest format.paren.15
+  (format nil "~:(aBc ~:(def~) GHi~)")
+  "Abc Def Ghi")
+
+(deftest format.paren.16
+  (format nil "~:(aBc ~@(def~) GHi~)")
+  "Abc Def Ghi")
+
+(deftest format.paren.17
+  (format nil "~:(aBc ~@:(def~) GHi~)")
+  "Abc Def Ghi")
+
+(deftest format.paren.18
+  (format nil "~@(aBc ~(def~) GHi~)")
+  "Abc def ghi")
+
+(deftest format.paren.19
+  (format nil "~@(aBc ~:(def~) GHi~)")
+  "Abc def ghi")
+
+(deftest format.paren.20
+  (format nil "~@(aBc ~@(def~) GHi~)")
+  "Abc def ghi")
+
+(deftest format.paren.21
+  (format nil "~@(aBc ~@:(def~) GHi~)")
+  "Abc def ghi")
+
+(deftest format.paren.22
+  (format nil "~:@(aBc ~(def~) GHi~)")
+  "ABC DEF GHI")
+
+(deftest format.paren.23
+  (format nil "~@:(aBc ~:(def~) GHi~)")
+  "ABC DEF GHI")
+
+(deftest format.paren.24
+  (format nil "~:@(aBc ~@(def~) GHi~)")
+  "ABC DEF GHI")
+
+(deftest format.paren.25
+  (format nil "~@:(aBc ~@:(def~) GHi~)")
+  "ABC DEF GHI")
diff --git a/ansi-tests/format-question.lsp b/ansi-tests/format-question.lsp
new file mode 100644
index 0000000000000000000000000000000000000000..b7abb59e34d533b8a972b32db536a6d67b171de7
--- /dev/null
+++ b/ansi-tests/format-question.lsp
@@ -0,0 +1,50 @@
+;-*- Mode:     Lisp -*-
+;;;; Author:   Paul Dietz
+;;;; Created:  Sun Oct 17 20:08:18 2004
+;;;; Contains: Tests of the ~? and ~@? format directives
+
+(in-package :cl-test)
+
+(compile-and-load "printer-aux.lsp")
+
+(deftest format.?.1
+  (format nil "~?" "" nil)
+  "")
+
+(deftest format.?.2
+  (format nil "~?" "~A" '(1))
+  "1")
+
+(deftest format.?.3
+  (format nil "~?" "" '(1))
+  "")
+
+(deftest format.?.4
+  (format nil "~? ~A" "" '(1) 2)
+  " 2")
+
+(deftest format.?.5
+  (format nil "a~?z" "b~?y" '("c~?x" ("~A" (1))))
+  "abc1xyz")
+
+;;; Tests of ~@?
+
+(deftest format.@?.1
+  (format nil "~@?" "")
+  "")
+
+(deftest format.@?.2
+  (format nil "~@?" "~A" 1)
+  "1")
+
+(deftest format.@?.3
+  (format nil "~@? ~A" "<~A>" 1 2)
+  "<1> 2")
+
+(deftest format.@?.4
+  (format nil "a~@?z" "b~@?y" "c~@?x" "~A" 1)
+  "abc1xyz")
+
+(deftest format.@?.5
+  (format nil "~{~A~@?~A~}" '(1 "~4*" 2 3 4 5 6))
+  "16")
diff --git a/ansi-tests/load-format.lsp b/ansi-tests/load-format.lsp
index d96c0147f684656795c20bf75f75b5d44cd9f42a..4177cd4e5ca3afaf7b926f6ecd50792c165e5765 100644
--- a/ansi-tests/load-format.lsp
+++ b/ansi-tests/load-format.lsp
@@ -42,3 +42,8 @@
 (load "format-goto.lsp")
 (load "format-conditional.lsp")
 (load "format-brace.lsp")
+(load "format-question.lsp")
+
+;;; 22.3.8
+(load "format-paren.lsp")
+(load "format-p.lsp")