diff --git a/basis/disjoint-sets/disjoint-sets-docs.factor b/basis/disjoint-sets/disjoint-sets-docs.factor
index 73de932a30..589f99f6dc 100644
--- a/basis/disjoint-sets/disjoint-sets-docs.factor
+++ b/basis/disjoint-sets/disjoint-sets-docs.factor
@@ -23,7 +23,7 @@ HELP: equate
 
 HELP: assoc>disjoint-set
 { $values { "assoc" assoc } { "disjoint-set" disjoint-set } }
-{ $description "Given an assoc representation of a graph where the keys are vertices and key/value pairs are edges, creates a disjoint set whose elements are the keys of assoc, and two keys are equvalent if they belong to the same connected component of the graph." }
+{ $description "Given an assoc representation of a graph where the keys are vertices and key/value pairs are edges, creates a disjoint set whose elements are the keys of assoc, and two keys are equivalent if they belong to the same connected component of the graph." }
 { $examples
     { $example
         "USING: disjoint-sets kernel prettyprint ;"
diff --git a/basis/help/tutorial/tutorial.factor b/basis/help/tutorial/tutorial.factor
index ce9c4b4676..b3e306ac56 100644
--- a/basis/help/tutorial/tutorial.factor
+++ b/basis/help/tutorial/tutorial.factor
@@ -102,7 +102,7 @@ $nl
 "For example, we'd like it to identify the following as a palindrome:"
 { $code "\"A man, a plan, a canal: Panama.\"" }
 "However, right now, the simplistic algorithm we use says this is not a palindrome:"
-{ $unchecked-example "\"A man, a plan, a canal: Panama.\" palindrome?" "f" }
+{ $unchecked-example "\"A man, a plan, a canal: Panama.\" palindrome? ." "f" }
 "We would like it to output " { $link t } " there. We can encode this requirement with a unit test that we add to " { $snippet "palindrome-tests.factor" } ":"
 { $code "[ t ] [ \"A man, a plan, a canal: Panama.\" palindrome? ] unit-test" }
 "If you now run unit tests, you will see a unit test failure:"
diff --git a/basis/math/intervals/intervals-docs.factor b/basis/math/intervals/intervals-docs.factor
index 7e0a9a3b51..fd6a72807f 100644
--- a/basis/math/intervals/intervals-docs.factor
+++ b/basis/math/intervals/intervals-docs.factor
@@ -184,23 +184,23 @@ HELP: interval-max
 
 HELP: interval-mod
 { $values { "i1" interval } { "i2" interval } { "i3" interval } }
-{ $description "Outputs an interval containing all possible values obtained by aplying " { $link mod } " to elements of " { $snippet "i1" } " and " { $snippet "i2" } "." } ;
+{ $description "Outputs an interval containing all possible values obtained by applying " { $link mod } " to elements of " { $snippet "i1" } " and " { $snippet "i2" } "." } ;
 
 HELP: interval-rem
 { $values { "i1" interval } { "i2" interval } { "i3" interval } }
-{ $description "Outputs an interval containing all possible values obtained by aplying " { $link rem } " to elements of " { $snippet "i1" } " and " { $snippet "i2" } "." } ;
+{ $description "Outputs an interval containing all possible values obtained by applying " { $link rem } " to elements of " { $snippet "i1" } " and " { $snippet "i2" } "." } ;
 
 HELP: interval-bitand
 { $values { "i1" interval } { "i2" interval } { "i3" interval } }
-{ $description "Outputs an interval containing all possible values obtained by aplying " { $link bitand } " to elements of " { $snippet "i1" } " and " { $snippet "i2" } "." } ;
+{ $description "Outputs an interval containing all possible values obtained by applying " { $link bitand } " to elements of " { $snippet "i1" } " and " { $snippet "i2" } "." } ;
 
 HELP: interval-bitor
 { $values { "i1" interval } { "i2" interval } { "i3" interval } }
-{ $description "Outputs an interval containing all possible values obtained by aplying " { $link bitor } " to elements of " { $snippet "i1" } " and " { $snippet "i2" } "." } ;
+{ $description "Outputs an interval containing all possible values obtained by applying " { $link bitor } " to elements of " { $snippet "i1" } " and " { $snippet "i2" } "." } ;
 
 HELP: interval-bitxor
 { $values { "i1" interval } { "i2" interval } { "i3" interval } }
-{ $description "Outputs an interval containing all possible values obtained by aplying " { $link bitxor } " to elements of " { $snippet "i1" } " and " { $snippet "i2" } "." } ;
+{ $description "Outputs an interval containing all possible values obtained by applying " { $link bitxor } " to elements of " { $snippet "i1" } " and " { $snippet "i2" } "." } ;
 
 HELP: interval-min
 { $values { "i1" interval } { "i2" interval } { "i3" interval } }
diff --git a/basis/math/polynomials/polynomials-docs.factor b/basis/math/polynomials/polynomials-docs.factor
index dd55c3dd3f..ce00fcb495 100644
--- a/basis/math/polynomials/polynomials-docs.factor
+++ b/basis/math/polynomials/polynomials-docs.factor
@@ -62,7 +62,7 @@ HELP: n*p
 
 HELP: pextend-conv
 { $values { "p" "a polynomial" } { "q" "a polynomial" } { "p'" "a polynomial" } { "q'" "a polynomial" } }
-{ $description "Convulution, extending to " { $snippet "p_m + q_n - 1" } "." }
+{ $description "Convolution, extending to " { $snippet "p_m + q_n - 1" } "." }
 { $examples { $example "USING: kernel math.polynomials prettyprint ;" "{ 1 0 1 } { 0 1 } pextend-conv [ . ] bi@" "{ 1 0 1 0 }\n{ 0 1 0 0 }" } } ;
 
 HELP: p*
diff --git a/basis/math/statistics/statistics-docs.factor b/basis/math/statistics/statistics-docs.factor
index f7d108dddb..63263e603c 100644
--- a/basis/math/statistics/statistics-docs.factor
+++ b/basis/math/statistics/statistics-docs.factor
@@ -34,7 +34,7 @@ HELP: range
 { $description "Computes the difference of the maximum and minimum values in " { $snippet "seq" } "." }
 { $examples
   { $example "USING: math.statistics prettyprint ;" "{ 1 2 3 } range ." "2" }
-  { $example "USING: math.statistics prettyprint ;" "{ 1 2 3 4 } range ." "3" } }  ;
+  { $example "USING: math.statistics prettyprint ;" "{ 1 2 3 4 } range ." "3" } } ;
 
 HELP: minmax
 { $values { "seq" sequence } { "min" real } { "max" real } }
@@ -75,34 +75,34 @@ HELP: histogram
     { "seq" sequence }
     { "hashtable" hashtable }
 }
-{ $examples 
+{ $description "Returns a hashtable where the keys are the elements of the sequence and the values are the number of times they appeared in that sequence." }
+{ $examples
     { $example "! Count the number of times an element appears in a sequence."
                "USING: prettyprint math.statistics ;"
                "\"aaabc\" histogram ."
                "H{ { 97 3 } { 98 1 } { 99 1 } }"
     }
-}
-{ $description "Returns a hashtable where the keys are the elements of the sequence and the values are the number of times they appeared in that sequence." } ;
+} ;
 
 HELP: histogram!
 { $values
     { "hashtable" hashtable } { "seq" sequence }
 }
-{ $examples 
+{ $description "Takes an existing hashtable and uses " { $link histogram } " to continue counting the number of occurrences of each element." }
+{ $examples
     { $example "! Count the number of times the elements of two sequences appear."
                "USING: prettyprint math.statistics ;"
                "\"aaabc\" histogram \"aaaaaabc\" histogram! ."
                "H{ { 97 9 } { 98 2 } { 99 2 } }"
     }
-}
-{ $description "Takes an existing hashtable and uses " { $link histogram } " to continue counting the number of occurences of each element." } ;
+} ;
 
 HELP: sorted-histogram
 { $values
     { "seq" sequence }
     { "alist" "an array of key/value pairs" }
 }
-{ $description "Outputs a " { $link histogram } " of a sequence sorted by number of occurences from lowest to highest." }
+{ $description "Outputs a " { $link histogram } " of a sequence sorted by number of occurrences from lowest to highest." }
 { $examples
     { $example "USING: prettyprint math.statistics ;"
         """"abababbbbbbc" sorted-histogram ."""
@@ -115,41 +115,41 @@ HELP: sequence>assoc
     { "seq" sequence } { "quot" quotation } { "exemplar" "an exemplar assoc" }
     { "assoc" assoc }
 }
-{ $examples 
+{ $description "Iterates over a sequence, allowing elements of the sequence to be added to a newly created " { $snippet "assoc" } " according to the passed quotation." }
+{ $examples
     { $example "! Iterate over a sequence and increment the count at each element"
                "USING: assocs prettyprint math.statistics ;"
                "\"aaabc\" [ inc-at ] H{ } sequence>assoc ."
                "H{ { 97 3 } { 98 1 } { 99 1 } }"
     }
-}
-{ $description "Iterates over a sequence, allowing elements of the sequence to be added to a newly created " { $snippet "assoc" } " according to the passed quotation." } ;
+} ;
 
 HELP: sequence>assoc!
 { $values
     { "assoc" assoc } { "seq" sequence } { "quot" quotation }
 }
-{ $examples 
+{ $description "Iterates over a sequence, allowing elements of the sequence to be added to an existing " { $snippet "assoc" } " according to the passed quotation." }
+{ $examples
     { $example "! Iterate over a sequence and add the counts to an existing assoc"
                "USING: assocs prettyprint math.statistics kernel ;"
                "H{ { 97 2 } { 98 1 } } clone \"aaabc\" [ inc-at ] sequence>assoc! ."
                "H{ { 97 5 } { 98 2 } { 99 1 } }"
     }
-}
-{ $description "Iterates over a sequence, allowing elements of the sequence to be added to an existing " { $snippet "assoc" } " according to the passed quotation." } ;
+} ;
 
 HELP: sequence>hashtable
 { $values
     { "seq" sequence } { "quot" quotation }
     { "hashtable" hashtable }
 }
-{ $examples 
+{ $description "Iterates over a sequence, allowing elements of the sequence to be added to a hashtable according to the passed quotation." }
+{ $examples
     { $example "! Count the number of times an element occurs in a sequence"
                "USING: assocs prettyprint math.statistics ;"
                "\"aaabc\" [ inc-at ] sequence>hashtable ."
                "H{ { 97 3 } { 98 1 } { 99 1 } }"
     }
-}
-{ $description "Iterates over a sequence, allowing elements of the sequence to be added to a hashtable according to the passed quotation." } ;
+} ;
 
 ARTICLE: "histogram" "Computing histograms"
 "Counting elements in a sequence:"
diff --git a/basis/memoize/memoize-docs.factor b/basis/memoize/memoize-docs.factor
index 58ba60af7c..426bd2916c 100644
--- a/basis/memoize/memoize-docs.factor
+++ b/basis/memoize/memoize-docs.factor
@@ -22,7 +22,8 @@ HELP: define-memoized
 { $description "Defines the given word at run time as one which memoizes its outputs given a particular input." } ;
 
 HELP: MEMO:
-{ $syntax "MEMO: word ( stack -- effect ) definition ;" }
+{ $syntax "MEMO: word ( stack -- effect ) definition... ;" }
+{ $values { "word" "a new word to define" } { "definition" "a word definition" } }
 { $description "Defines the given word at parse time as one which memoizes its output given a particular input. The stack effect is mandatory." } ;
 
 { define-memoized POSTPONE: MEMO: } related-words
diff --git a/basis/peg/ebnf/ebnf-docs.factor b/basis/peg/ebnf/ebnf-docs.factor
index 2ffc7e0b29..7b740a4dc3 100644
--- a/basis/peg/ebnf/ebnf-docs.factor
+++ b/basis/peg/ebnf/ebnf-docs.factor
@@ -274,7 +274,7 @@ ARTICLE: "peg.ebnf.variable" "Variable"
 ;
 
 ARTICLE: "peg.ebnf.foreign-rules" "Foreign Rules"
-"Rules can call outto other peg.ebnf defined parsers. The result of "
+"Rules can call out to other peg.ebnf defined parsers. The result of "
 "the foreign call then becomes the AST of the successful parse. Foreign rules "
 "are invoked using '<foreign word-name>' or '<foreign word-name rule>'. The "
 "latter allows calling a specific rule in a previously designed peg.ebnf parser. "
diff --git a/basis/stack-checker/stack-checker-docs.factor b/basis/stack-checker/stack-checker-docs.factor
index 4fa66f7f38..6b3bdd354f 100644
--- a/basis/stack-checker/stack-checker-docs.factor
+++ b/basis/stack-checker/stack-checker-docs.factor
@@ -91,9 +91,10 @@ $nl
 "However a small change can be made:"
 { $example ": good ( ? quot: ( ? -- ) -- ) [ good ] 2keep [ not ] dip call ; inline recursive" "[ [ drop ] good ] infer." "( x -- )" }
 "An inline recursive word must have a fixed stack effect in its base case. The following will not infer:"
-{ $code
+{ $example
     ": foo ( quot ? -- ) [ f foo ] [ call ] if ; inline"
     "[ [ 5 ] t foo ] infer."
+    "The inline recursive word “foo” must be declared recursive\nword foo"
 } ;
 
 ARTICLE: "tools.inference" "Stack effect tools"
diff --git a/basis/tools/deploy/deploy-tests.factor b/basis/tools/deploy/deploy-tests.factor
index 1da32f3f42..0d0dba325f 100644
--- a/basis/tools/deploy/deploy-tests.factor
+++ b/basis/tools/deploy/deploy-tests.factor
@@ -135,4 +135,11 @@ os macosx? [
 
 [ ] [ "tools.deploy.test.19" shake-and-bake run-temp-image ] unit-test
 
+[ ] [ "tools.deploy.test.20" shake-and-bake ] unit-test
+
+[ "<?xml version=\"1.0\" encoding=\"UTF-8\"?><foo>Factor</foo>\n" ]
+[ deploy-test-command ascii [ contents ] with-process-reader ] unit-test
+
+[ ] [ 800000 small-enough? ] unit-test
+
 [ ] [ "benchmark.ui-panes" shake-and-bake run-temp-image ] unit-test
diff --git a/basis/tools/deploy/test/20/20.factor b/basis/tools/deploy/test/20/20.factor
new file mode 100644
index 0000000000..7e9a0631b7
--- /dev/null
+++ b/basis/tools/deploy/test/20/20.factor
@@ -0,0 +1,10 @@
+USING: io xml.syntax xml.writer ;
+IN: tools.deploy.test.20
+
+: test-xml ( str -- str' )
+    <XML <foo><-></foo> XML> xml>string ;
+
+: main ( -- )
+    "Factor" test-xml print ;
+
+MAIN: main
diff --git a/basis/tools/deploy/test/20/deploy.factor b/basis/tools/deploy/test/20/deploy.factor
new file mode 100644
index 0000000000..90487ad6fa
--- /dev/null
+++ b/basis/tools/deploy/test/20/deploy.factor
@@ -0,0 +1,14 @@
+USING: tools.deploy.config ;
+H{
+    { deploy-name "tools.deploy.test.20" }
+    { deploy-ui? f }
+    { deploy-c-types? f }
+    { deploy-console? t }
+    { deploy-unicode? f }
+    { deploy-io 2 }
+    { deploy-reflection 1 }
+    { deploy-word-props? f }
+    { deploy-math? f }
+    { deploy-threads? f }
+    { deploy-word-defs? f }
+}
diff --git a/basis/xml/data/data-docs.factor b/basis/xml/data/data-docs.factor
index feb035d37a..97aa362c17 100644
--- a/basis/xml/data/data-docs.factor
+++ b/basis/xml/data/data-docs.factor
@@ -139,7 +139,7 @@ HELP: closer
 { $class-description "Describes a closing tag, like " { $snippet "</a>" } ". Contains one slot, " { $snippet "name" } ", containing the closer's name." } ;
 
 HELP: contained
-{ $class-description "Represents a self-closing tag, like " { $snippet "<a/>" } ". Contains two slots," { $snippet "name" } " and " { $snippet "attrs" } " containing, respectively, the name of the tag and its attributes." } ;
+{ $class-description "Represents a self-closing tag, like " { $snippet "<a/>" } ". Contains two slots, " { $snippet "name" } " and " { $snippet "attrs" } " containing, respectively, the name of the tag and its attributes." } ;
 
 { opener closer contained } related-words
 
diff --git a/basis/xml/errors/debugger/authors.txt b/basis/xml/errors/debugger/authors.txt
new file mode 100644
index 0000000000..f990dd0ed2
--- /dev/null
+++ b/basis/xml/errors/debugger/authors.txt
@@ -0,0 +1 @@
+Daniel Ehrenberg
diff --git a/basis/xml/errors/debugger/debugger.factor b/basis/xml/errors/debugger/debugger.factor
new file mode 100644
index 0000000000..01d0a9268a
--- /dev/null
+++ b/basis/xml/errors/debugger/debugger.factor
@@ -0,0 +1,150 @@
+! Copyright (C) 2005, 2006 Daniel Ehrenberg
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors debugger io kernel prettyprint sequences
+xml.errors xml.writer ;
+IN: xml.errors.debugger
+
+M: xml-error-at error.
+    "XML parsing error" print
+    "Line: " write dup line>> .
+    "Column: " write column>> . ;
+
+M: expected error.
+    dup call-next-method
+    "Token expected: " write dup should-be>> print
+    "Token present: " write was>> print ;
+
+M: unexpected-end error.
+    call-next-method
+    "File unexpectedly ended." print ;
+
+M: missing-close error.
+    call-next-method
+    "Missing closing token." print ;
+
+M: disallowed-char error.
+    dup call-next-method
+    "Disallowed character in XML document: " write
+    char>> write1 nl ;
+
+M: multitags error.
+    drop "XML document contains multiple main tags" print ;
+
+M: pre/post-content error.
+    "The text string:" print
+    dup string>> .
+    "was used " write
+    pre?>> "before" "after" ? write
+    " the main tag." print ;
+
+M: no-entity error.
+    dup call-next-method
+    "Entity does not exist: &" write thing>> write ";" print ;
+
+M: mismatched error.
+    dup call-next-method
+    "Mismatched tags" print
+    "Opening tag: <" write dup open>> print-name ">" print
+    "Closing tag: </" write close>> print-name ">" print ;
+
+M: unclosed error.
+    dup call-next-method
+    "Unclosed tags" print
+    "Tags: " print
+    tags>> [ "  <" write print-name ">" print ] each ;
+
+M: bad-uri error.
+    dup call-next-method
+    "Bad URI:" print string>> . ;
+
+M: nonexist-ns error.
+    dup call-next-method
+    "Namespace " write name>> write " has not been declared" print ;
+
+M: unopened error.
+    call-next-method
+    "Closed an unopened tag" print ;
+
+M: not-yes/no error.
+    dup call-next-method
+    "standalone must be either yes or no, not \"" write
+    text>> write "\"." print ;
+
+M: extra-attrs error.
+    dup call-next-method
+    "Extra attributes included in xml version declaration:" print
+    attrs>> . ;
+
+M: bad-version error.
+    "XML version must be \"1.0\" or \"1.1\". Version here was " write
+    num>> . ;
+
+M: notags error.
+    drop "XML document lacks a main tag" print ;
+
+M: bad-prolog error.
+    dup call-next-method
+    "Misplaced XML prolog" print
+    prolog>> write-xml nl ;
+
+M: capitalized-prolog error.
+    dup call-next-method
+    "XML prolog name was partially or totally capitalized, using" print
+    "<?" write name>> write "...?>" write
+    " instead of <?xml...?>" print ;
+
+M: versionless-prolog error.
+    call-next-method
+    "XML prolog lacks a version declaration" print ;
+
+M: bad-directive error.
+    dup call-next-method
+    "Unknown directive:" print
+    dir>> print ;
+
+M: bad-decl error.
+    call-next-method "Extra content in directive" print ;
+
+M: bad-external-id error.
+    call-next-method "Bad external ID" print ;
+
+M: misplaced-directive error.
+    dup call-next-method
+    "Misplaced directive:" print
+    dir>> write-xml nl ;
+
+M: bad-name error.
+    dup call-next-method
+    "Invalid name: " write name>> print ;
+
+M: unclosed-quote error.
+    call-next-method
+    "XML document ends with quote still open" print ;
+
+M: quoteless-attr error.
+    call-next-method "Attribute lacks quotes around value" print ;
+
+M: attr-w/< error.
+    call-next-method
+    "Attribute value contains literal <" print ;
+
+M: text-w/]]> error.
+    call-next-method
+    "Text node contains ']]>'" print ;
+
+M: duplicate-attr error.
+    call-next-method "Duplicate attribute" print ;
+
+M: bad-cdata error.
+    call-next-method "CDATA occurs before or after main tag" print ;
+
+M: not-enough-characters error.
+    call-next-method
+    "Not enough characters" print ;
+
+M: bad-doctype error.
+    call-next-method "DTD contains invalid object" print ;
+
+M: bad-encoding error.
+    call-next-method
+    "Encoding in XML document does not exist" print ;
diff --git a/basis/xml/errors/errors.factor b/basis/xml/errors/errors.factor
index 7be7e074c3..bd79f480f8 100644
--- a/basis/xml/errors/errors.factor
+++ b/basis/xml/errors/errors.factor
@@ -1,8 +1,7 @@
 ! Copyright (C) 2005, 2006 Daniel Ehrenberg
 ! See http://factorcode.org/license.txt for BSD license.
-USING: xml.data xml.writer kernel generic io prettyprint math 
-debugger sequences xml.state accessors summary
-namespaces io.streams.string ;
+USING: accessors kernel namespaces sequences vocabs.loader
+xml.state ;
 IN: xml.errors
 
 TUPLE: xml-error-at line column ;
@@ -11,91 +10,41 @@ TUPLE: xml-error-at line column ;
     new
         get-line >>line
         get-column >>column ;
-M: xml-error-at summary ( obj -- str )
-    [
-        "XML parsing error" print
-        "Line: " write dup line>> .
-        "Column: " write column>> .
-    ] with-string-writer ;
 
 TUPLE: expected < xml-error-at should-be was ;
+
 : expected ( should-be was -- * )
     \ expected xml-error-at
         swap >>was
         swap >>should-be throw ;
-M: expected summary ( obj -- str )
-    [
-        dup call-next-method write
-        "Token expected: " write dup should-be>> print
-        "Token present: " write was>> print
-    ] with-string-writer ;
 
 TUPLE: unexpected-end < xml-error-at ;
+
 : unexpected-end ( -- * ) \ unexpected-end xml-error-at throw ;
-M: unexpected-end summary ( obj -- str )
-    [
-        call-next-method write
-        "File unexpectedly ended." print
-    ] with-string-writer ;
 
 TUPLE: missing-close < xml-error-at ;
+
 : missing-close ( -- * ) \ missing-close xml-error-at throw ;
-M: missing-close summary ( obj -- str )
-    [
-        call-next-method write
-        "Missing closing token." print
-    ] with-string-writer ;
 
 TUPLE: disallowed-char < xml-error-at char ;
 
 : disallowed-char ( char -- * )
     \ disallowed-char xml-error-at swap >>char throw ;
 
-M: disallowed-char summary
-    [ call-next-method ]
-    [ char>> "Disallowed character in XML document: " swap suffix ] bi
-    append ;
-
 ERROR: multitags ;
 
-M: multitags summary ( obj -- str )
-    drop "XML document contains multiple main tags" ;
-
 ERROR: pre/post-content string pre? ;
 
-M: pre/post-content summary ( obj -- str )
-    [
-        "The text string:" print
-        dup string>> .
-        "was used " write
-        pre?>> "before" "after" ? write
-        " the main tag." print
-    ] with-string-writer ;
-
 TUPLE: no-entity < xml-error-at thing ;
 
 : no-entity ( string -- * )
     \ no-entity xml-error-at swap >>thing throw ;
 
-M: no-entity summary ( obj -- str )
-    [
-        dup call-next-method write
-        "Entity does not exist: &" write thing>> write ";" print
-    ] with-string-writer ;
-
 TUPLE: mismatched < xml-error-at open close ;
 
 : mismatched ( open close -- * )
     \ mismatched xml-error-at swap >>close swap >>open throw ;
 
-M: mismatched summary ( obj -- str )
-    [
-        dup call-next-method write
-        "Mismatched tags" print
-        "Opening tag: <" write dup open>> print-name ">" print
-        "Closing tag: </" write close>> print-name ">" print
-    ] with-string-writer ;
-
 TUPLE: unclosed < xml-error-at tags ;
 
 : unclosed ( -- * )
@@ -103,249 +52,129 @@ TUPLE: unclosed < xml-error-at tags ;
         xml-stack get rest-slice [ first name>> ] map >>tags
     throw ;
 
-M: unclosed summary ( obj -- str )
-    [
-        dup call-next-method write
-        "Unclosed tags" print
-        "Tags: " print
-        tags>> [ "  <" write print-name ">" print ] each
-    ] with-string-writer ;
-
 TUPLE: bad-uri < xml-error-at string ;
 
 : bad-uri ( string -- * )
     \ bad-uri xml-error-at swap >>string throw ;
 
-M: bad-uri summary ( obj -- str )
-    [
-        dup call-next-method write
-        "Bad URI:" print string>> .
-    ] with-string-writer ;
-
 TUPLE: nonexist-ns < xml-error-at name ;
 
 : nonexist-ns ( name-string -- * )
     \ nonexist-ns xml-error-at swap >>name throw ;
 
-M: nonexist-ns summary ( obj -- str )
-    [
-        dup call-next-method write
-        "Namespace " write name>> write " has not been declared" print
-    ] with-string-writer ;
-
-TUPLE: unopened < xml-error-at ; ! this should give which tag was unopened
+! this should give which tag was unopened
+TUPLE: unopened < xml-error-at ;
 
 : unopened ( -- * )
     \ unopened xml-error-at throw ;
 
-M: unopened summary ( obj -- str )
-    [
-        call-next-method write
-        "Closed an unopened tag" print
-    ] with-string-writer ;
-
 TUPLE: not-yes/no < xml-error-at text ;
 
 : not-yes/no ( text -- * )
     \ not-yes/no xml-error-at swap >>text throw ;
 
-M: not-yes/no summary ( obj -- str )
-    [
-        dup call-next-method write
-        "standalone must be either yes or no, not \"" write
-        text>> write "\"." print
-    ] with-string-writer ;
-
 ! this should actually print the names
 TUPLE: extra-attrs < xml-error-at attrs ;
 
 : extra-attrs ( attrs -- * )
     \ extra-attrs xml-error-at swap >>attrs throw ;
 
-M: extra-attrs summary ( obj -- str )
-    [
-        dup call-next-method write
-        "Extra attributes included in xml version declaration:" print
-        attrs>> .
-    ] with-string-writer ;
-
 TUPLE: bad-version < xml-error-at num ;
 
 : bad-version ( num -- * )
     \ bad-version xml-error-at swap >>num throw ;
 
-M: bad-version summary ( obj -- str )
-    [
-        "XML version must be \"1.0\" or \"1.1\". Version here was " write
-        num>> .
-    ] with-string-writer ;
-
 ERROR: notags ;
 
-M: notags summary ( obj -- str )
-    drop "XML document lacks a main tag" ;
-
 TUPLE: bad-prolog < xml-error-at prolog ;
 
 : bad-prolog ( prolog -- * )
     \ bad-prolog xml-error-at swap >>prolog throw ;
 
-M: bad-prolog summary ( obj -- str )
-    [
-        dup call-next-method write
-        "Misplaced XML prolog" print
-        prolog>> write-xml nl
-    ] with-string-writer ;
-
 TUPLE: capitalized-prolog < xml-error-at name ;
 
 : capitalized-prolog ( name -- capitalized-prolog )
     \ capitalized-prolog xml-error-at swap >>name throw ;
 
-M: capitalized-prolog summary ( obj -- str )
-    [
-        dup call-next-method write
-        "XML prolog name was partially or totally capitalized, using" print
-        "<?" write name>> write "...?>" write
-        " instead of <?xml...?>" print
-    ] with-string-writer ;
-
 TUPLE: versionless-prolog < xml-error-at ;
 
 : versionless-prolog ( -- * )
     \ versionless-prolog xml-error-at throw ;
 
-M: versionless-prolog summary ( obj -- str )
-    [
-        call-next-method write
-        "XML prolog lacks a version declaration" print
-    ] with-string-writer ;
-
 TUPLE: bad-directive < xml-error-at dir ;
 
 : bad-directive ( directive -- * )
     \ bad-directive xml-error-at swap >>dir throw ;
 
-M: bad-directive summary ( obj -- str )
-    [
-        dup call-next-method write
-        "Unknown directive:" print
-        dir>> write
-    ] with-string-writer ;
-
 TUPLE: bad-decl < xml-error-at ;
 
 : bad-decl ( -- * )
     \ bad-decl xml-error-at throw ;
 
-M: bad-decl summary ( obj -- str )
-    call-next-method "\nExtra content in directive" append ;
-
 TUPLE: bad-external-id < xml-error-at ;
 
 : bad-external-id ( -- * )
     \ bad-external-id xml-error-at throw ;
 
-M: bad-external-id summary ( obj -- str )
-    call-next-method "\nBad external ID" append ;
-
 TUPLE: misplaced-directive < xml-error-at dir ;
 
 : misplaced-directive ( directive -- * )
     \ misplaced-directive xml-error-at swap >>dir throw ;
 
-M: misplaced-directive summary ( obj -- str )
-    [
-        dup call-next-method write
-        "Misplaced directive:" print
-        dir>> write-xml nl
-    ] with-string-writer ;
-
 TUPLE: bad-name < xml-error-at name ;
 
 : bad-name ( name -- * )
     \ bad-name xml-error-at swap >>name throw ;
 
-M: bad-name summary ( obj -- str )
-    [ call-next-method ]
-    [ "Invalid name: " swap name>> "\n" 3append ]
-    bi append ;
-
 TUPLE: unclosed-quote < xml-error-at ;
 
 : unclosed-quote ( -- * )
     \ unclosed-quote xml-error-at throw ;
 
-M: unclosed-quote summary
-    call-next-method
-    "XML document ends with quote still open\n" append ;
-
 TUPLE: quoteless-attr < xml-error-at ;
 
 : quoteless-attr ( -- * )
     \ quoteless-attr xml-error-at throw ;
 
-M: quoteless-attr summary
-    call-next-method "Attribute lacks quotes around value\n" append ;
-
 TUPLE: attr-w/< < xml-error-at ;
 
 : attr-w/< ( -- * )
     \ attr-w/< xml-error-at throw ;
 
-M: attr-w/< summary
-    call-next-method
-    "Attribute value contains literal <" append ;
-
 TUPLE: text-w/]]> < xml-error-at ;
 
 : text-w/]]> ( -- * )
     \ text-w/]]> xml-error-at throw ;
 
-M: text-w/]]> summary
-    call-next-method
-    "Text node contains ']]>'" append ;
-
 TUPLE: duplicate-attr < xml-error-at key values ;
 
 : duplicate-attr ( key values -- * )
     \ duplicate-attr xml-error-at
     swap >>values swap >>key throw ;
 
-M: duplicate-attr summary
-    call-next-method "\nDuplicate attribute" append ;
-
 TUPLE: bad-cdata < xml-error-at ;
 
 : bad-cdata ( -- * )
     \ bad-cdata xml-error-at throw ;
 
-M: bad-cdata summary
-    call-next-method "\nCDATA occurs before or after main tag" append ;
-
 TUPLE: not-enough-characters < xml-error-at ;
+
 : not-enough-characters ( -- * )
     \ not-enough-characters xml-error-at throw ;
-M: not-enough-characters summary ( obj -- str )
-    [
-        call-next-method write
-        "Not enough characters" print
-    ] with-string-writer ;
 
 TUPLE: bad-doctype < xml-error-at contents ;
+
 : bad-doctype ( contents -- * )
     \ bad-doctype xml-error-at swap >>contents throw ;
-M: bad-doctype summary
-    call-next-method "\nDTD contains invalid object" append ;
 
 TUPLE: bad-encoding < xml-error-at encoding ;
+
 : bad-encoding ( encoding -- * )
     \ bad-encoding xml-error-at
         swap >>encoding
     throw ;
-M: bad-encoding summary
-    call-next-method
-    "\nEncoding in XML document does not exist" append ;
 
 UNION: xml-error
     multitags notags pre/post-content xml-error-at ;
+
+{ "xml.errors" "debugger" } "xml.errors.debugger" require-when
diff --git a/basis/xml/traversal/traversal.factor b/basis/xml/traversal/traversal.factor
index c1c4ba670b..6342f96e42 100644
--- a/basis/xml/traversal/traversal.factor
+++ b/basis/xml/traversal/traversal.factor
@@ -1,7 +1,7 @@
 ! Copyright (C) 2005, 2009 Daniel Ehrenberg
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel namespaces sequences words io assocs
-quotations strings parser lexer arrays xml.data xml.writer debugger
+quotations strings parser lexer arrays xml.data xml.writer
 splitting vectors sequences.deep combinators fry memoize ;
 IN: xml.traversal
 
diff --git a/core/classes/tuple/tuple-docs.factor b/core/classes/tuple/tuple-docs.factor
index 7443e02cc5..6de3ed2957 100644
--- a/core/classes/tuple/tuple-docs.factor
+++ b/core/classes/tuple/tuple-docs.factor
@@ -444,7 +444,7 @@ HELP: boa
 { $values { "slots..." "slot values" } { "class" tuple-class } { "tuple" tuple } }
 { $description "Creates a new instance of " { $snippet "class" } " and fill in the slots from the stack, with the top-most stack element being stored in the right-most slot." }
 { $notes "The name " { $snippet "boa" } " is shorthand for “by order of arguments”, and “BOA constructor” is a pun on “boa constrictor”." }
-{ $errors "Throws an error if the slot values do not match class declarations on slots (see" { $link "tuple-declarations" } ")." } ;
+{ $errors "Throws an error if the slot values do not match class declarations on slots (see " { $link "tuple-declarations" } ")." } ;
 
 HELP: bad-superclass
 { $error-description "Thrown if an attempt is made to subclass a class that is not a tuple class, or a tuple class declared " { $link POSTPONE: final } "." } ;
diff --git a/core/effects/effects-docs.factor b/core/effects/effects-docs.factor
index 44d216f872..7cd21a004e 100644
--- a/core/effects/effects-docs.factor
+++ b/core/effects/effects-docs.factor
@@ -143,4 +143,4 @@ HELP: effect>string
 
 HELP: stack-effect
 { $values { "word" word } { "effect/f" { $maybe effect } } }
-{ $description "Outputs the stack effect of a word; either a stack effect declared with " { $link POSTPONE: ( } ", or an inferred stack effect (see " { $link "inference" } "." } ;
+{ $description "Outputs the stack effect of a word; either a stack effect declared with " { $link POSTPONE: ( } ", or an inferred stack effect (see " { $link "inference" } ")." } ;
diff --git a/core/sequences/sequences-docs.factor b/core/sequences/sequences-docs.factor
index ea3e4cf4d3..22e1eede41 100644
--- a/core/sequences/sequences-docs.factor
+++ b/core/sequences/sequences-docs.factor
@@ -83,10 +83,12 @@ HELP: empty?
 HELP: if-empty
 { $values { "seq" sequence } { "quot1" quotation } { "quot2" quotation } }
 { $description "Makes an implicit check if the sequence is empty. An empty sequence is dropped and " { $snippet "quot1" } " is called. Otherwise, if the sequence has any elements, " { $snippet "quot2" } " is called on it." }
-{ $example
-    "USING: kernel prettyprint sequences ;"
-    "{ 1 2 3 } [ \"empty sequence\" ] [ sum ] if-empty ."
-    "6"
+{ $examples
+    { $example
+        "USING: kernel prettyprint sequences ;"
+        "{ 1 2 3 } [ \"empty sequence\" ] [ sum ] if-empty ."
+        "6"
+    }
 } ;
 
 HELP: when-empty
diff --git a/core/sequences/sequences-tests.factor b/core/sequences/sequences-tests.factor
index 175ab252e1..586e312edb 100644
--- a/core/sequences/sequences-tests.factor
+++ b/core/sequences/sequences-tests.factor
@@ -255,6 +255,8 @@ unit-test
 [ { "a" "b" "c" "d" } ] [ { 0 1 2 3 } { "a" "b" "c" "d" } nths ] unit-test
 [ { "d" "c" "b" "a" } ] [ { 3 2 1 0 } { "a" "b" "c" "d" } nths ] unit-test
 [ { "d" "a" "b" "c" } ] [ { 3 0 1 2 } { "a" "b" "c" "d" } nths ] unit-test
+
+[ "dac" ] [ { 3 0 2 } "abcd" nths ] unit-test
                           
 TUPLE: bogus-hashcode ;
 
diff --git a/core/sequences/sequences.factor b/core/sequences/sequences.factor
index 55398ff02b..493365db1a 100644
--- a/core/sequences/sequences.factor
+++ b/core/sequences/sequences.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2005, 2010 Slava Pestov, Daniel Ehrenberg.
+! Copyright (C) 2005, 2011 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel kernel.private slots.private math
 math.private math.order ;
@@ -559,7 +559,7 @@ PRIVATE>
     [ [ (indices) ] 2curry each-index ] keep ;
 
 : nths ( indices seq -- seq' )
-    [ nth ] curry map ;
+    [ [ nth ] curry ] keep map-as ;
 
 : any? ( ... seq quot: ( ... elt -- ... ? ) -- ... ? )
     find drop >boolean ; inline
diff --git a/core/sets/sets-docs.factor b/core/sets/sets-docs.factor
index 5197e57ad0..220de91942 100644
--- a/core/sets/sets-docs.factor
+++ b/core/sets/sets-docs.factor
@@ -190,3 +190,7 @@ HELP: null?
 HELP: cardinality
 { $values { "set" set } { "n" "a non-negative integer" } }
 { $description "Returns the number of elements in the set. All sets support this operation." } ;
+
+HELP: combine
+{ $values { "sets" "a sequence of sets" } { "set" set } }
+{ $description "Outputs the union of a sequence of sets, or " { $link f } " if the sequence is empty." } ;
diff --git a/core/sets/sets.factor b/core/sets/sets.factor
index 5dcee675f9..06f6e04655 100644
--- a/core/sets/sets.factor
+++ b/core/sets/sets.factor
@@ -109,7 +109,7 @@ M: sequence null?
 M: sequence cardinality
     length ;
 
-: combine ( sets -- set/f )
+: combine ( sets -- set )
     [ f ]
     [ [ [ members ] map concat ] [ first ] bi set-like ]
     if-empty ;