diff --git a/basis/checksums/md5/md5.factor b/basis/checksums/md5/md5.factor
index 89ff5d46a2..c74aa550d2 100644
--- a/basis/checksums/md5/md5.factor
+++ b/basis/checksums/md5/md5.factor
@@ -5,7 +5,7 @@ math.functions math.parser namespaces splitting grouping strings
 sequences byte-arrays locals sequences.private macros fry
 io.encodings.binary math.bitwise checksums accessors
 checksums.common checksums.stream combinators combinators.smart
-specialized-arrays.uint literals ;
+specialized-arrays.uint literals hints ;
 IN: checksums.md5
 
 SINGLETON: md5
@@ -28,7 +28,7 @@ M: md5 initialize-checksum-state drop <md5-state> ;
 
 : update-md5 ( md5 -- )
     [ state>> ] [ old-state>> v-w+ dup clone ] [ ] tri
-    [ (>>old-state) ] [ (>>state) ] bi ; inline
+    [ (>>old-state) ] [ (>>state) ] bi ;
 
 CONSTANT: T
     $[
@@ -106,7 +106,7 @@ MACRO: with-md5-round ( ops quot -- )
         [ d a b c 13 S12 14 ]
         [ c d a b 14 S13 15 ]
         [ b c d a 15 S14 16 ]
-    } [ F ] with-md5-round ; inline
+    } [ F ] with-md5-round ;
 
 : (process-md5-block-G) ( block state -- )
     {
@@ -126,7 +126,7 @@ MACRO: with-md5-round ( ops quot -- )
         [ d a b c 2  S22 30 ]
         [ c d a b 7  S23 31 ]
         [ b c d a 12 S24 32 ]
-    } [ G ] with-md5-round ; inline
+    } [ G ] with-md5-round ;
 
 : (process-md5-block-H) ( block state -- )
     {
@@ -146,7 +146,7 @@ MACRO: with-md5-round ( ops quot -- )
         [ d a b c 12 S32 46 ]
         [ c d a b 15 S33 47 ]
         [ b c d a 2  S34 48 ]
-    } [ H ] with-md5-round ; inline
+    } [ H ] with-md5-round ;
 
 : (process-md5-block-I) ( block state -- )
     {
@@ -166,7 +166,12 @@ MACRO: with-md5-round ( ops quot -- )
         [ d a b c 11 S42 62 ]
         [ c d a b 2  S43 63 ]
         [ b c d a 9  S44 64 ]
-    } [ I ] with-md5-round ; inline
+    } [ I ] with-md5-round ;
+
+HINTS: (process-md5-block-F) { uint-array md5-state } ;
+HINTS: (process-md5-block-G) { uint-array md5-state } ;
+HINTS: (process-md5-block-H) { uint-array md5-state } ;
+HINTS: (process-md5-block-I) { uint-array md5-state } ;
 
 M: md5-state checksum-block ( block state -- )
     [
diff --git a/basis/html/templates/fhtml/fhtml-tests.factor b/basis/html/templates/fhtml/fhtml-tests.factor
index 55cf90c2dd..427b3215c1 100644
--- a/basis/html/templates/fhtml/fhtml-tests.factor
+++ b/basis/html/templates/fhtml/fhtml-tests.factor
@@ -1,5 +1,5 @@
 USING: io io.files io.streams.string io.encodings.utf8
-html.templates html.templates.fhtml kernel
+html.templates html.templates.fhtml kernel multiline
 tools.test sequences parser splitting prettyprint ;
 IN: html.templates.fhtml.tests
 
@@ -17,3 +17,14 @@ IN: html.templates.fhtml.tests
 [
     [ ] [ "<%\n%>" parse-template drop ] unit-test
 ] with-file-vocabs
+
+[
+    [ ] [
+        <"
+            <%
+            IN: html.templates.fhtml.tests
+            : test-word ( -- ) ;
+            %>
+        "> parse-template drop
+    ] unit-test
+] with-file-vocabs
diff --git a/basis/html/templates/fhtml/fhtml.factor b/basis/html/templates/fhtml/fhtml.factor
index 6c5e78e917..ceb2e72478 100644
--- a/basis/html/templates/fhtml/fhtml.factor
+++ b/basis/html/templates/fhtml/fhtml.factor
@@ -4,7 +4,7 @@
 USING: continuations sequences kernel namespaces debugger
 combinators math quotations generic strings splitting accessors
 assocs fry vocabs.parser parser parser.notes lexer io io.files
-io.streams.string io.encodings.utf8 html.templates ;
+io.streams.string io.encodings.utf8 html.templates compiler.units ;
 IN: html.templates.fhtml
 
 ! We use a custom lexer so that %> ends a token even if not
@@ -58,11 +58,13 @@ SYNTAX: %> lexer get parse-%> ;
 
 : parse-template ( string -- quot )
     [
+        [
         "quiet" on
         parser-notes off
         "html.templates.fhtml" use-vocab
         string-lines parse-template-lines
-    ] with-file-vocabs ;
+        ] with-file-vocabs
+    ] with-compilation-unit ;
 
 : eval-template ( string -- )
     parse-template call( -- ) ;
diff --git a/basis/math/vectors/vectors.factor b/basis/math/vectors/vectors.factor
index bad2733bbf..0fe1404516 100644
--- a/basis/math/vectors/vectors.factor
+++ b/basis/math/vectors/vectors.factor
@@ -58,6 +58,10 @@ IN: math.vectors
 : vnlerp ( a b t -- a_t )
     [ lerp ] curry 2map ;
 
+: vbilerp ( aa ba ab bb {t,u} -- a_tu )
+    [ first vnlerp ] [ second vnlerp ] bi-curry
+    [ 2bi@ ] [ call ] bi* ;
+
 HINTS: vneg { array } ;
 HINTS: norm-sq { array } ;
 HINTS: norm { array } ;
diff --git a/core/make/make-docs.factor b/core/make/make-docs.factor
index 7808872588..6a77ef65fc 100644
--- a/core/make/make-docs.factor
+++ b/core/make/make-docs.factor
@@ -27,7 +27,7 @@ $nl
 { $heading "Utilities for simple make patterns" }
 "Sometimes, an existing word already implements a specific " { $link make } " usage. For example, " { $link suffix } " is equivalent to the following, with the added caveat that the below example always outputs an array:"
 { $code "[ , % ] { } make" }
-"The existing utility words can in some cases express intent better than an arbitrary-looking string or " { $link , } " and " { $link % } "."
+"The existing utility words can in some cases express intent better than a bunch of " { $link , } " and " { $link % } "."
 { $heading "Constructing quotations" }
 "Simple quotation construction can often be accomplished using " { $link "fry" } " and " { $link "compositional-combinators" } "."
 $nl
diff --git a/extra/grid-meshes/grid-meshes.factor b/extra/grid-meshes/grid-meshes.factor
new file mode 100644
index 0000000000..19c4568b7c
--- /dev/null
+++ b/extra/grid-meshes/grid-meshes.factor
@@ -0,0 +1,48 @@
+! (c)2009 Joe Groff bsd license
+USING: accessors arrays destructors kernel math opengl
+opengl.gl sequences sequences.product specialized-arrays.float ;
+IN: grid-meshes
+
+TUPLE: grid-mesh dim buffer row-length ;
+
+<PRIVATE
+
+: vertex-array-vertex ( dim x z -- vertex )
+    [ swap first /f ]
+    [ swap second /f ] bi-curry* bi
+    [ 0 ] dip float-array{ } 3sequence ;
+
+: vertex-array-row ( dim z -- vertices )
+    dup 1 + 2array
+    over first 1 + iota
+    2array [ first2 swap vertex-array-vertex ] with product-map
+    concat ;
+
+: vertex-array ( dim -- vertices )
+    dup second iota
+    [ vertex-array-row ] with map concat ;
+
+: >vertex-buffer ( bytes -- buffer )
+    [ GL_ARRAY_BUFFER ] dip GL_STATIC_DRAW <gl-buffer> ;
+
+: draw-vertex-buffer-row ( grid-mesh i -- )
+    swap [ GL_TRIANGLE_STRIP ] 2dip
+    row-length>> [ * ] keep
+    glDrawArrays ;
+
+PRIVATE>
+
+: draw-grid-mesh ( grid-mesh -- )
+    GL_ARRAY_BUFFER over buffer>> [
+        [ 3 GL_FLOAT 0 f glVertexPointer ] dip
+        dup dim>> second iota [ draw-vertex-buffer-row ] with each
+    ] with-gl-buffer ;
+
+: <grid-mesh> ( dim -- grid-mesh )
+    [ ] [ vertex-array >vertex-buffer ] [ first 1 + 2 * ] tri
+    grid-mesh boa ;
+
+M: grid-mesh dispose
+    [ [ delete-gl-buffer ] when* f ] change-buffer
+    drop ;
+
diff --git a/extra/spheres/spheres.factor b/extra/spheres/spheres.factor
index 1a8f41b4a2..b07b7a5ad1 100755
--- a/extra/spheres/spheres.factor
+++ b/extra/spheres/spheres.factor
@@ -3,7 +3,6 @@ opengl.shaders opengl.framebuffers opengl.capabilities multiline
 ui.gadgets accessors sequences ui.render ui math locals arrays
 generalizations combinators ui.gadgets.worlds
 literals ui.pixel-formats ;
-FROM: opengl.demo-support => rect-vertices ;
 IN: spheres
 
 STRING: plane-vertex-shader
@@ -117,11 +116,11 @@ TUPLE: spheres-world < demo-world
     reflection-framebuffer reflection-depthbuffer
     reflection-texture ;
 
-M: spheres-world near-plane ( gadget -- z )
+M: spheres-world near-plane
     drop 1.0 ;
-M: spheres-world far-plane ( gadget -- z )
+M: spheres-world far-plane
     drop 512.0 ;
-M: spheres-world distance-step ( gadget -- dz )
+M: spheres-world distance-step
     drop 0.5 ;
 
 : (reflection-dim) ( -- w h )
@@ -175,6 +174,9 @@ M: spheres-world distance-step ( gadget -- dz )
 M: spheres-world begin-world
     "2.0" { "GL_ARB_shader_objects" } require-gl-version-or-extensions
     { "GL_EXT_framebuffer_object" } require-gl-extensions
+    GL_DEPTH_TEST glEnable
+    GL_VERTEX_ARRAY glEnableClientState
+    0.15 0.15 1.0 1.0 glClearColor 
     20.0 10.0 20.0 set-demo-orientation
     (plane-program) >>plane-program
     (solid-sphere-program) >>solid-sphere-program
@@ -194,13 +196,13 @@ M: spheres-world end-world
         [ plane-program>> [ delete-gl-program ] when* ]
     } cleave ;
 
-M: spheres-world pref-dim* ( gadget -- dim )
+M: spheres-world pref-dim*
     drop { 640 480 } ;
 
 :: (draw-sphere) ( program center radius -- )
     program "center" glGetAttribLocation center first3 glVertexAttrib3f
     program "radius" glGetAttribLocation radius glVertexAttrib1f
-    { -1.0 -1.0 } { 1.0 1.0 } rect-vertices ;
+    { -1.0 -1.0 } { 2.0 2.0 } gl-fill-rect ;
     
 :: (draw-colored-sphere) ( program center radius surfacecolor -- )
     program "surface_color" glGetAttribLocation surfacecolor first4 glVertexAttrib4f
@@ -283,9 +285,7 @@ M: spheres-world pref-dim* ( gadget -- dim )
     } cleave ] with-framebuffer ;
 
 M: spheres-world draw-world*
-    GL_DEPTH_TEST glEnable
-    GL_SCISSOR_TEST glDisable
-    0.15 0.15 1.0 1.0 glClearColor {
+    {
         [ (draw-reflection-texture) ]
         [ demo-world-set-matrix ]
         [ sphere-scene ]
diff --git a/extra/terrain/authors.txt b/extra/terrain/authors.txt
new file mode 100644
index 0000000000..0bc3c5ad4d
--- /dev/null
+++ b/extra/terrain/authors.txt
@@ -0,0 +1,2 @@
+Joe Groff
+Doug Coleman
diff --git a/extra/terrain/summary.txt b/extra/terrain/summary.txt
new file mode 100644
index 0000000000..3244803592
--- /dev/null
+++ b/extra/terrain/summary.txt
@@ -0,0 +1 @@
+Walk around on procedurally generated terrain
diff --git a/extra/terrain/terrain.factor b/extra/terrain/terrain.factor
index cfacfeb700..5847426fae 100644
--- a/extra/terrain/terrain.factor
+++ b/extra/terrain/terrain.factor
@@ -1,3 +1,4 @@
+! (c)2009 Joe Groff, Doug Coleman. bsd license
 USING: accessors arrays combinators game-input game-loop
 game-input.scancodes grouping kernel literals locals
 math math.constants math.functions math.matrices math.order
@@ -6,7 +7,8 @@ opengl.shaders opengl.textures opengl.textures.private
 sequences sequences.product specialized-arrays.float
 terrain.generation terrain.shaders ui ui.gadgets
 ui.gadgets.worlds ui.pixel-formats game-worlds method-chains
-math.affine-transforms noise ui.gestures combinators.short-circuit ;
+math.affine-transforms noise ui.gestures combinators.short-circuit
+destructors grid-meshes ;
 IN: terrain
 
 CONSTANT: FOV $[ 2.0 sqrt 1+ ]
@@ -26,8 +28,6 @@ CONSTANT: SKY-PERIOD 1200
 CONSTANT: SKY-SPEED 0.0005
 
 CONSTANT: terrain-vertex-size { 512 512 }
-CONSTANT: terrain-vertex-distance { $[ 1.0 512.0 / ] $[ 1.0 512.0 / ] }
-CONSTANT: terrain-vertex-row-length $[ 512 1 + 2 * ]
 
 TUPLE: player
     location yaw pitch velocity velocity-modifier
@@ -37,7 +37,7 @@ TUPLE: terrain-world < game-world
     player
     sky-image sky-texture sky-program
     terrain terrain-segment terrain-texture terrain-program
-    terrain-vertex-buffer
+    terrain-mesh
     history ;
 
 : <player> ( -- player )
@@ -65,35 +65,6 @@ M: terrain-world tick-length
     [ yaw>> 0.0 1.0 0.0 glRotatef ]
     [ location>> vneg first3 glTranslatef ] tri ;
 
-: vertex-array-vertex ( x z -- vertex )
-    [ terrain-vertex-distance first * ]
-    [ terrain-vertex-distance second * ] bi*
-    [ 0 ] dip float-array{ } 3sequence ;
-
-: vertex-array-row ( z -- vertices )
-    dup 1 + 2array
-    terrain-vertex-size first 1 + iota
-    2array [ first2 swap vertex-array-vertex ] product-map
-    concat ;
-
-: vertex-array ( -- vertices )
-    terrain-vertex-size second iota
-    [ vertex-array-row ] map concat ;
-
-: >vertex-buffer ( bytes -- buffer )
-    [ GL_ARRAY_BUFFER ] dip GL_STATIC_DRAW <gl-buffer> ;
-
-: draw-vertex-buffer-row ( i -- )
-    [ GL_TRIANGLE_STRIP ] dip
-    terrain-vertex-row-length * terrain-vertex-row-length
-    glDrawArrays ;
-
-: draw-vertex-buffer ( buffer -- )
-    [ GL_ARRAY_BUFFER ] dip [
-        3 GL_FLOAT 0 f glVertexPointer
-        terrain-vertex-size second iota [ draw-vertex-buffer-row ] each
-    ] with-gl-buffer ;
-
 : degrees ( deg -- rad )
     pi 180.0 / * ;
 
@@ -119,7 +90,6 @@ M: terrain-world tick-length
 : clamp-pitch ( pitch -- pitch' )
     90.0 min -90.0 max ;
 
-
 : walk-forward ( player -- )
     dup forward-vector [ v+ ] curry change-velocity drop ;
 : walk-backward ( player -- )
@@ -274,12 +244,12 @@ BEFORE: terrain-world begin-world
     >>sky-program
     terrain-vertex-shader terrain-pixel-shader <simple-gl-program>
     >>terrain-program
-    vertex-array >vertex-buffer >>terrain-vertex-buffer
+    terrain-vertex-size <grid-mesh> >>terrain-mesh
     drop ;
 
 AFTER: terrain-world end-world
     {
-        [ terrain-vertex-buffer>> delete-gl-buffer ]
+        [ terrain-mesh>> dispose ]
         [ terrain-program>> delete-gl-program ]
         [ terrain-texture>> delete-texture ]
         [ sky-program>> delete-gl-program ]
@@ -306,7 +276,7 @@ M: terrain-world draw-world*
         [ GL_DEPTH_TEST glEnable dup terrain-program>> [
             [ "heightmap" glGetUniformLocation 0 glUniform1i ]
             [ "component_scale" glGetUniformLocation COMPONENT-SCALE first4 glUniform4f ] bi
-            terrain-vertex-buffer>> draw-vertex-buffer
+            terrain-mesh>> draw-grid-mesh
         ] with-gl-program ]
     } cleave gl-error ;
 
diff --git a/extra/webapps/mason/mason.factor b/extra/webapps/mason/mason.factor
index ea7040ac6e..74c459e38e 100644
--- a/extra/webapps/mason/mason.factor
+++ b/extra/webapps/mason/mason.factor
@@ -2,14 +2,14 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays combinators db db.tuples furnace.actions
 http.server.responses kernel mason.platform mason.notify.server
-math.order sequences sorting splitting xml.syntax xml.writer
-io.pathnames io.encodings.utf8 io.files ;
+mason.report math.order sequences sorting splitting xml.syntax
+xml.writer io.pathnames io.encodings.utf8 io.files ;
 IN: webapps.mason
 
 : log-file ( -- path ) home "mason.log" append-path ;
 
 : recent-events ( -- xml )
-    log-file utf8 file-lines 10 short tail* "\n" join [XML <pre><-></pre> XML] ;
+    log-file utf8 10 file-tail [XML <pre><-></pre> XML] ;
 
 : git-link ( id -- link )
     [ "http://github.com/slavapestov/factor/commit/" prepend ] keep
@@ -21,8 +21,9 @@ IN: webapps.mason
 
 : current-status ( builder -- xml )
     dup status>> {
-        { "dirty" [ drop "Dirty" ] }
-        { "clean" [ drop "Clean" ] }
+        { "status-dirty" [ drop "Dirty" ] }
+        { "status-clean" [ drop "Clean" ] }
+        { "status-error" [ drop "Error" ] }
         { "starting" [ "Starting" building ] }
         { "make-vm" [ "Compiling VM" building ] }
         { "boot" [ "Bootstrapping" building ] }
diff --git a/misc/factor.vim.fgen b/misc/factor.vim.fgen
index b0d61b8dd0..af1e9e600a 100644
--- a/misc/factor.vim.fgen
+++ b/misc/factor.vim.fgen
@@ -1,15 +1,26 @@
-<% USING: kernel io prettyprint vocabs sequences ;
-%>" Vim syntax file
-" Language:	factor
-" Maintainer:	Alex Chapman <chapman.alex@gmail.com>
-" Last Change:	2008 Apr 28
+<%
+USING: kernel io prettyprint vocabs sequences multiline ;
+IN: factor.vim.fgen
+
+: print-keywords ( vocab -- )
+    words [
+        "syn keyword factorKeyword " write
+        [ bl ] [ pprint ] interleave nl
+    ] when* ;
+
+%>
+" Vim syntax file
+" Language: factor
+" Maintainer: Alex Chapman <chapman.alex@gmail.com>
+" Last Change: 2009 May 19
+" To run: USE: html.templates.fhtml "resource:misc/factor.vim.fgen" <fhtml> call-template
 
 " For version 5.x: Clear all syntax items
 " For version 6.x: Quit when a syntax file was already loaded
 if version < 600
-  syntax clear
+    syntax clear
 elseif exists("b:current_syntax")
-  finish
+    finish
 endif
 
 " factor is case sensitive.
@@ -47,25 +58,27 @@ syn keyword factorBoolean boolean f general-t t
 syn keyword factorCompileDirective inline foldable parsing
 
 <%
+
 ! uncomment this if you want all words from all vocabularies highlighted. Note
 ! that this changes factor.vim from around 8k to around 100k (and is a bit
 ! broken)
 
-! vocabs [ words [ "syn keyword factorKeyword " write [ pprint " " write ] each "\n" write ] when* ] each
+! vocabs [ print-keywords ] each
+
+    {
+        "kernel" "assocs" "combinators" "math" "sequences"
+        "namespaces" "arrays" "io" "strings" "vectors"
+        "continuations"
+    } [ print-keywords ] each
 %>
 
-" kernel vocab keywords
-<% { "kernel" "assocs" "combinators" "math" "sequences" "namespaces" "arrays" "io" "strings" "vectors" "continuations" } [
-       words "syn keyword factorKeyword " write [ pprint " " write ] each "\n" write
-   ] each %>
-
-syn cluster factorReal   contains=factorInt,factorFloat,factorRatio,factorBinary,factorHex,factorOctal
-syn cluster factorNumber contains=@factorReal,factorComplex
-syn cluster factorNumErr contains=factorBinErr,factorHexErr,factorOctErr
-syn match   factorInt 		/\<-\=\d\+\>/
-syn match   factorFloat		/\<-\=\d*\.\d\+\>/
-syn match   factorRatio		/\<-\=\d*\.*\d\+\/-\=\d*\.*\d\+\>/
-syn region  factorComplex	start=/\<C{\>/ end=/\<}\>/ contains=@factorReal
+syn cluster factorReal          contains=factorInt,factorFloat,factorRatio,factorBinary,factorHex,factorOctal
+syn cluster factorNumber        contains=@factorReal,factorComplex
+syn cluster factorNumErr        contains=factorBinErr,factorHexErr,factorOctErr
+syn match   factorInt           /\<-\=\d\+\>/
+syn match   factorFloat         /\<-\=\d*\.\d\+\>/
+syn match   factorRatio         /\<-\=\d*\.*\d\+\/-\=\d*\.*\d\+\>/
+syn region  factorComplex       start=/\<C{\>/ end=/\<}\>/ contains=@factorReal
 syn match   factorBinErr        /\<BIN:\s\+[01]*[^\s01]\S*\>/
 syn match   factorBinary        /\<BIN:\s\+[01]\+\>/
 syn match   factorHexErr        /\<HEX:\s\+\x*[^\x\s]\S*\>/
@@ -73,31 +86,36 @@ syn match   factorHex           /\<HEX:\s\+\x\+\>/
 syn match   factorOctErr        /\<OCT:\s\+\o*[^\o\s]\S*\>/
 syn match   factorOctal         /\<OCT:\s\+\o\+\>/
 
-syn match factorIn /\<IN:\s\+\S\+\>/
-syn match factorUse /\<USE:\s\+\S\+\>/
+syn match   factorIn            /\<IN:\s\+\S\+\>/
+syn match   factorUse           /\<USE:\s\+\S\+\>/
+syn match   factorUnuse         /\<UNUSE:\s\+\S\+\>/
 
-syn match factorCharErr /\<CHAR:\s\+\S\+/
-syn match factorChar /\<CHAR:\s\+\\\=\S\>/
+syn match   factorCharErr       /\<CHAR:\s\+\S\+/
+syn match   factorChar          /\<CHAR:\s\+\\\=\S\>/
 
-syn match factorBackslash /\<\\\>\s\+\S\+\>/
+syn match   factorBackslash     /\<\\\>\s\+\S\+\>/
 
-syn region factorUsing start=/\<USING:\>/ end=/;/
-syn region factorRequires start=/\<REQUIRES:\>/ end=/;/
+syn region  factorUsing         start=/\<USING:\>/       end=/;/
+syn region  factorSingletons    start=/\<SINGLETONS:\>/  end=/;/
+syn match   factorSymbol        /\<SYMBOL:\s\+\S\+\>/
+syn region  factorSymbols       start=/\<SYMBOLS:\>/     end=/;/
+syn region  factorConstructor2  start=/\<CONSTRUCTOR:\?/ end=/;/
+syn region  factorTuple         start=/\<TUPLE:\>/ end=/\<;\>/
 
-syn cluster factorWordOps contains=factorSymbol,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain,factorConstructor
-syn match factorSymbol /\<SYMBOL:\s\+\S\+\>/
-syn match factorPostpone /\<POSTPONE:\s\+\S\+\>/
-syn match factorDefer /\<DEFER:\s\+\S\+\>/
-syn match factorForget /\<FORGET:\s\+\S\+\>/
-syn match factorMixin /\<MIXIN:\s\+\S\+\>/
-syn match factorInstance /\<INSTANCE:\s\+\S\+\s\+\S\+\>/
-syn match factorHook /\<HOOK:\s\+\S\+\s\+\S\+\>/
-syn match factorMain /\<MAIN:\s\+\S\+\>/
-syn match factorConstructor /\<C:\s\+\S\+\s\+\S\+\>/
+syn match   factorConstant      /\<CONSTANT:\s\+\S\+\>/
+syn match   factorSingleton     /\<SINGLETON:\s\+\S\+\>/
+syn match   factorPostpone      /\<POSTPONE:\s\+\S\+\>/
+syn match   factorDefer         /\<DEFER:\s\+\S\+\>/
+syn match   factorForget        /\<FORGET:\s\+\S\+\>/
+syn match   factorMixin         /\<MIXIN:\s\+\S\+\>/
+syn match   factorInstance      /\<INSTANCE:\s\+\S\+\s\+\S\+\>/
+syn match   factorHook          /\<HOOK:\s\+\S\+\s\+\S\+\>/
+syn match   factorMain          /\<MAIN:\s\+\S\+\>/
+syn match   factorConstructor   /\<C:\s\+\S\+\s\+\S\+\>/
+syn match   factorAlien         /\<ALIEN:\s\+\d\+\>/
 
-syn match factorAlien /\<ALIEN:\s\+\d\+\>/
+syn cluster factorWordOps       contains=factorSymbol,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain,factorConstructor
 
-syn region factorTuple start=/\<TUPLE:\>/ end=/\<;\>/
 
 "TODO:
 "misc:
@@ -116,6 +134,12 @@ syn region factorTuple start=/\<TUPLE:\>/ end=/\<;\>/
 " TYPEDEF:
 " LIBRARY:
 " C-UNION:
+"QUALIFIED:
+"QUALIFIED-WITH:
+"FROM:
+"ALIAS:
+"! POSTPONE: "
+"#\ "
 
 syn region factorString start=/"/ skip=/\\"/ end=/"/ oneline
 syn region factorSbuf start=/SBUF" / skip=/\\"/ end=/"/ oneline
@@ -165,88 +189,92 @@ syn sync lines=100
 
 if version >= 508 || !exists("did_factor_syn_inits")
     if version <= 508
-	let did_factor_syn_inits = 1
-	command -nargs=+ HiLink hi link <args>
+        let did_factor_syn_inits = 1
+        command -nargs=+ HiLink hi link <args>
     else
-	command -nargs=+ HiLink hi def link <args>
+        command -nargs=+ HiLink hi def link <args>
     endif
 
-    HiLink factorComment	Comment
-    HiLink factorStackEffect	Typedef
-    HiLink factorTodo		Todo
-    HiLink factorInclude	Include
-    HiLink factorRepeat		Repeat
-    HiLink factorConditional	Conditional
-    HiLink factorKeyword	Keyword
-    HiLink factorOperator	Operator
-    HiLink factorBoolean	Boolean
-    HiLink factorDefnDelims	Typedef
-    HiLink factorMethodDelims	Typedef
-    HiLink factorGenericDelims        Typedef
-    HiLink factorGenericNDelims        Typedef
-    HiLink factorConstructor	Typedef
-    HiLink factorPrivate	Special
-    HiLink factorPrivateDefnDelims	Special
-    HiLink factorPrivateMethodDelims	Special
-    HiLink factorPGenericDelims        Special
+    HiLink factorComment                Comment
+    HiLink factorStackEffect            Typedef
+    HiLink factorTodo                   Todo
+    HiLink factorInclude                Include
+    HiLink factorRepeat                 Repeat
+    HiLink factorConditional            Conditional
+    HiLink factorKeyword                Keyword
+    HiLink factorOperator               Operator
+    HiLink factorBoolean                Boolean
+    HiLink factorDefnDelims             Typedef
+    HiLink factorMethodDelims           Typedef
+    HiLink factorGenericDelims          Typedef
+    HiLink factorGenericNDelims         Typedef
+    HiLink factorConstructor            Typedef
+    HiLink factorConstructor2           Typedef
+    HiLink factorPrivate                Special
+    HiLink factorPrivateDefnDelims      Special
+    HiLink factorPrivateMethodDelims    Special
+    HiLink factorPGenericDelims         Special
     HiLink factorPGenericNDelims        Special
-    HiLink factorString		String
-    HiLink factorSbuf		String
-    HiLink factorMultiStringContents		String
-    HiLink factorMultiStringDelims Typedef
-    HiLink factorBracketErr     Error
-    HiLink factorComplex	Number
-    HiLink factorRatio          Number
-    HiLink factorBinary         Number
-    HiLink factorBinErr         Error
-    HiLink factorHex            Number
-    HiLink factorHexErr         Error
-    HiLink factorOctal          Number
-    HiLink factorOctErr         Error
-    HiLink factorFloat		Float
-    HiLink factorInt		Number
-    HiLink factorUsing          Include
-    HiLink factorUse            Include
-    HiLink factorRequires       Include
-    HiLink factorIn             Define
-    HiLink factorChar           Character
-    HiLink factorCharErr        Error
-    HiLink factorDelimiter      Delimiter
-    HiLink factorBackslash      Special
-    HiLink factorCompileDirective Typedef
-    HiLink factorSymbol         Define
-    HiLink factorMixin         Typedef
-    HiLink factorInstance         Typedef
-    HiLink factorHook         Typedef
-    HiLink factorMain         Define
-    HiLink factorPostpone       Define
-    HiLink factorDefer          Define
-    HiLink factorForget         Define
-    HiLink factorAlien          Define
-    HiLink factorTuple          Typedef
+    HiLink factorString                 String
+    HiLink factorSbuf                   String
+    HiLink factorMultiStringContents    String
+    HiLink factorMultiStringDelims      Typedef
+    HiLink factorBracketErr             Error
+    HiLink factorComplex                Number
+    HiLink factorRatio                  Number
+    HiLink factorBinary                 Number
+    HiLink factorBinErr                 Error
+    HiLink factorHex                    Number
+    HiLink factorHexErr                 Error
+    HiLink factorOctal                  Number
+    HiLink factorOctErr                 Error
+    HiLink factorFloat                  Float
+    HiLink factorInt                    Number
+    HiLink factorUsing                  Include
+    HiLink factorUse                    Include
+    HiLink factorUnuse                  Include
+    HiLink factorIn                     Define
+    HiLink factorChar                   Character
+    HiLink factorCharErr                Error
+    HiLink factorDelimiter              Delimiter
+    HiLink factorBackslash              Special
+    HiLink factorCompileDirective       Typedef
+    HiLink factorSymbol                 Define
+    HiLink factorConstant               Define
+    HiLink factorSingleton              Define
+    HiLink factorSingletons             Define
+    HiLink factorMixin                  Typedef
+    HiLink factorInstance               Typedef
+    HiLink factorHook                   Typedef
+    HiLink factorMain                   Define
+    HiLink factorPostpone               Define
+    HiLink factorDefer                  Define
+    HiLink factorForget                 Define
+    HiLink factorAlien                  Define
+    HiLink factorTuple                  Typedef
 
     if &bg == "dark"
-	hi   hlLevel0 ctermfg=red         guifg=red1
-	hi   hlLevel1 ctermfg=yellow      guifg=orange1
-	hi   hlLevel2 ctermfg=green       guifg=yellow1
-	hi   hlLevel3 ctermfg=cyan        guifg=greenyellow
-	hi   hlLevel4 ctermfg=magenta     guifg=green1
-	hi   hlLevel5 ctermfg=red         guifg=springgreen1
-	hi   hlLevel6 ctermfg=yellow      guifg=cyan1
-	hi   hlLevel7 ctermfg=green       guifg=slateblue1
-	hi   hlLevel8 ctermfg=cyan        guifg=magenta1
-	hi   hlLevel9 ctermfg=magenta     guifg=purple1
+        hi   hlLevel0 ctermfg=red         guifg=red1
+        hi   hlLevel1 ctermfg=yellow      guifg=orange1
+        hi   hlLevel2 ctermfg=green       guifg=yellow1
+        hi   hlLevel3 ctermfg=cyan        guifg=greenyellow
+        hi   hlLevel4 ctermfg=magenta     guifg=green1
+        hi   hlLevel5 ctermfg=red         guifg=springgreen1
+        hi   hlLevel6 ctermfg=yellow      guifg=cyan1
+        hi   hlLevel7 ctermfg=green       guifg=slateblue1
+        hi   hlLevel8 ctermfg=cyan        guifg=magenta1
+        hi   hlLevel9 ctermfg=magenta     guifg=purple1
     else
-	hi   hlLevel0 ctermfg=red         guifg=red3
-	hi   hlLevel1 ctermfg=darkyellow  guifg=orangered3
-	hi   hlLevel2 ctermfg=darkgreen   guifg=orange2
-	hi   hlLevel3 ctermfg=blue        guifg=yellow3
-	hi   hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
-	hi   hlLevel5 ctermfg=red         guifg=green4
-	hi   hlLevel6 ctermfg=darkyellow  guifg=paleturquoise3
-	hi   hlLevel7 ctermfg=darkgreen   guifg=deepskyblue4
-	hi   hlLevel8 ctermfg=blue        guifg=darkslateblue
-	hi   hlLevel9 ctermfg=darkmagenta guifg=darkviolet
+        hi   hlLevel0 ctermfg=red         guifg=red3
+        hi   hlLevel1 ctermfg=darkyellow  guifg=orangered3
+        hi   hlLevel2 ctermfg=darkgreen   guifg=orange2
+        hi   hlLevel3 ctermfg=blue        guifg=yellow3
+        hi   hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
+        hi   hlLevel5 ctermfg=red         guifg=green4
+        hi   hlLevel6 ctermfg=darkyellow  guifg=paleturquoise3
+        hi   hlLevel7 ctermfg=darkgreen   guifg=deepskyblue4
+        hi   hlLevel8 ctermfg=blue        guifg=darkslateblue
+        hi   hlLevel9 ctermfg=darkmagenta guifg=darkviolet
     endif
 
     delcommand HiLink
diff --git a/misc/vim/syntax/factor.vim b/misc/vim/syntax/factor.vim
index 7d847c7238..86f4f19147 100755
--- a/misc/vim/syntax/factor.vim
+++ b/misc/vim/syntax/factor.vim
@@ -1,14 +1,15 @@
 " Vim syntax file
-" Language:	factor
-" Maintainer:	Alex Chapman <chapman.alex@gmail.com>
-" Last Change:	2008 Apr 28
+" Language: factor
+" Maintainer: Alex Chapman <chapman.alex@gmail.com>
+" Last Change: 2009 May 19
+" To run: USE: html.templates.fhtml "resource:misc/factor.vim.fgen" <fhtml> call-template
 
 " For version 5.x: Clear all syntax items
 " For version 6.x: Quit when a syntax file was already loaded
 if version < 600
-  syntax clear
+    syntax clear
 elseif exists("b:current_syntax")
-  finish
+    finish
 endif
 
 " factor is case sensitive.
@@ -45,29 +46,26 @@ syn region None matchgroup=factorPrivate start=/\<<PRIVATE\>/ end=/\<PRIVATE>\>/
 syn keyword factorBoolean boolean f general-t t
 syn keyword factorCompileDirective inline foldable parsing
 
+syn keyword factorKeyword or tuck 2bi 2tri while wrapper nip 4dip wrapper? bi* callstack>array both? hashcode die dupd callstack callstack? 3dup tri@ pick curry build ?execute 3bi prepose >boolean ?if clone eq? tri* ? = swapd call-clear 2over 2keep 3keep clear 2dup when not tuple? dup 2bi* 2tri* call tri-curry object bi@ do unless* if* loop bi-curry* drop when* assert= retainstack assert? -rot execute 2bi@ 2tri@ boa with either? 3drop bi curry? datastack until 3dip over 3curry roll tri-curry* swap tri-curry@ 2nip and throw set-retainstack bi-curry (clone) hashcode* compose spin 2dip if 3tri unless compose? tuple keep 2curry equal? set-datastack assert tri 2drop most <wrapper> boolean? identity-tuple? null new set-callstack dip bi-curry@ rot -roll xor identity-tuple boolean
+syn keyword factorKeyword ?at assoc? assoc-clone-like assoc= delete-at* assoc-partition extract-keys new-assoc value? assoc-size map>assoc push-at assoc-like key? assoc-intersect update assoc-union assoc-combine at* assoc-empty? at+ set-at assoc-all? assoc-subset? assoc-hashcode change-at assoc-each assoc-diff zip values value-at rename-at inc-at enum? at cache assoc>map <enum> assoc assoc-map enum value-at* remove-all assoc-map-as >alist assoc-filter-as substitute-here clear-assoc assoc-stack substitute assoc-filter 2cache delete-at assoc-find keys assoc-any? at-default unzip
+syn keyword factorKeyword case execute-effect dispatch-case-quot <buckets> no-cond no-case? 3cleave>quot contiguous-range? 2cleave cond>quot wrong-values? no-cond? cleave>quot no-case hash-dispatch-quot case>quot 3cleave wrong-values alist>quot hash-case-table hash-case-quot case-find (distribute-buckets) cond cleave distribute-buckets call-effect 2cleave>quot recursive-hashcode linear-case-quot spread spread>quot
+syn keyword factorKeyword byte-array>bignum sgn >bignum next-float number= each-integer next-power-of-2 ?1+ fp-special? imaginary-part mod recip float>bits rational >float number? 2^ bignum? integer fixnum? neg fixnum sq bignum fp-snan? fp-infinity? denominator (all-integers?) times find-last-integer (each-integer) bit? * + fp-bitwise= - fp-qnan? / power-of-2? >= bitand find-integer complex <fp-nan> < log2 > integer? real number bits>double double>bits bitor 2/ zero? rem fp-nan-payload all-integers? (find-integer) real-part prev-float align bits>float float? shift float 1+ 1- fp-nan? abs bitxor ratio? even? <= /mod odd? >integer ratio rational? bitnot real? >fixnum complex? /i numerator /f
+syn keyword factorKeyword append assert-sequence= find-last-from trim-head-slice clone-like 3sequence assert-sequence? map-as filter-here last-index-from prepare-index reversed index-from cut* pad-tail (indices) concat-as remq but-last snip trim-tail nths nth 2pusher sequence slice? <slice> partition remove-nth tail-slice empty? tail* if-empty find-from virtual-sequence? member? set-length delq drop-prefix unclip iota unclip-last-slice bounds-error? sequence-hashcode-step map start midpoint@ rest-slice prepend fourth sift delete sigma new-sequence follow like delete-nth first4 1sequence reverse slice unless-empty padding virtual@ repetition? index 4sequence max-length set-second immutable-sequence first2 first3 replicate-as reduce-index unclip-slice supremum insert-nth trim-tail-slice tail 3append short count suffix concat flip filter sum immutable? 2sequence delete-all start* indices snip-slice check-slice sequence? head map-find reduce append-as reverse-here sequence= halves collapse-slice interleave 2map binary-reduce virtual-seq slice-error? product bounds-check? bounds-check harvest immutable find produce remove pad-head replicate set-fourth peek shorten reversed? map-find-last 3map-as 2unclip-slice shorter? 3map find-last head-slice pop* 2map-as tail-slice* but-last-slice 2map-reduce iota? accumulate each pusher cut-slice new-resizable each-index head-slice* 2reverse-each sequence-hashcode memq? pop set-nth ?nth <flat-slice> second change-each join when-empty accumulator immutable-sequence? <reversed> all? 3append-as virtual-sequence subseq? push-either new-like length last-index push-if 2all? lengthen assert-sequence copy map-reduce move third first 3each tail? set-first prefix bounds-error any? <repetition> trim-slice exchange surround 2reduce cut change-nth min-length set-third produce-as push-all head? delete-slice rest sum-lengths 2each head* infimum glue slice-error subseq replace-slice push repetition map-index trim-head unclip-last mismatch trim
+syn keyword factorKeyword global +@ change set-namestack change-global init-namespaces on off set-global namespace set with-scope bind with-variable inc dec counter initialize namestack get get-global make-assoc
+syn keyword factorKeyword <array> 2array 3array pair >array 1array 4array pair? array resize-array array?
+syn keyword factorKeyword +character+ bad-seek-type? readln stream-seek read print with-output-stream contents write1 stream-write1 stream-copy stream-element-type with-input-stream stream-print stream-read stream-contents bl seek-output bad-seek-type nl stream-nl write flush stream-lines +byte+ stream-flush read1 seek-absolute? stream-read1 lines stream-readln stream-read-until each-line seek-end with-output-stream* seek-absolute with-streams seek-input seek-relative? input-stream stream-write read-partial seek-end? seek-relative error-stream read-until with-input-stream* with-streams* each-block output-stream stream-read-partial
+syn keyword factorKeyword resize-string >string <string> 1string string string?
+syn keyword factorKeyword vector? <vector> ?push vector >vector 1vector
+syn keyword factorKeyword with-return restarts return-continuation with-datastack recover rethrow-restarts <restart> ifcc set-catchstack >continuation< cleanup ignore-errors restart? compute-restarts attempt-all-error error-thread continue <continuation> attempt-all-error? condition? <condition> throw-restarts error catchstack continue-with thread-error-hook continuation rethrow callcc1 error-continuation callcc0 attempt-all condition continuation? restart return
 
 
-" kernel vocab keywords
-syn keyword factorKeyword or construct-delegate set-slots tuck 2bi 2tri while wrapper nip bi* wrapper? hashcode callstack>array both? die set-delegate dupd callstack callstack? 3dup tri@ pick curry build prepose 3bi >boolean ?if clone eq? tri* ? = swapd call-clear 2over 2keep 3keep construct clear 2dup when not tuple? 3compose dup 2bi* call object bi@ wrapped unless* if* >r curry-quot drop when* retainstack -rot 2bi@ delegate boa with 3slip slip compose-first compose-second 3drop either? bi curry? datastack curry-obj over 3curry roll throw swap and 2nip set-retainstack (clone) hashcode* get-slots compose spin if 3tri unless compose? tuple keep 2curry equal? set-datastack 2slip tri 2drop most <wrapper> identity-tuple? null r> new set-callstack dip xor rot -roll identity-tuple 
-syn keyword factorKeyword assoc? assoc-clone-like delete-any assoc= delete-at* new-assoc subassoc? assoc-size map>assoc search-alist assoc-like key? assoc-intersect update assoc-union at* assoc-empty? at+ set-enum-seq set-at assoc-all? assoc-hashcode change-at assoc-each assoc-diff zip values value-at rename-at (assoc-stack) enum? at cache assoc>map assoc-any? <enum> assoc assoc-map assoc-pusher (assoc>map) enum assoc-push-if remove-all >alist (substitute) substitute-here clear-assoc assoc-stack substitute assoc-filter delete-at assoc-find enum-seq keys 
-syn keyword factorKeyword case dispatch-case-quot with-datastack <buckets> no-cond no-case? 3cleave>quot (distribute-buckets) contiguous-range? 2cleave cond>quot no-cond? cleave>quot no-case recursive-hashcode case>quot 3cleave alist>quot dispatch-case hash-case-table hash-case-quot case-find cond cleave distribute-buckets 2cleave>quot linear-case-quot spread spread>quot hash-dispatch-quot 
-syn keyword factorKeyword byte-array>bignum sgn >bignum number= each-integer next-power-of-2 ?1+ imaginary-part mod recip float>bits rational >float number? 2^ bignum? integer fixnum? neg fixnum sq bignum (all-integers?) times denominator find-last-integer (each-integer) bit? * + power-of-2? - / >= bitand find-integer complex < real > log2 integer? number bits>double double>bits bitor 2/ zero? rem all-integers? (find-integer) real-part align bits>float float? shift float 1+ 1- fp-nan? ratio? bitxor even? ratio <= /mod >integer odd? rational? bitnot real? >fixnum complex? (next-power-of-2) /i numerator /f 
-syn keyword factorKeyword slice-to append left-trim find-last-from clone-like 3sequence map-as last-index-from reversed index-from pad-left cut* nth sequence slice? <slice> tail-slice empty? tail* find-from member? virtual-sequence? unclip set-length drop-prefix bounds-error? set-slice-seq map start open-slice midpoint@ set-immutable-seq move-forward rest-slice prepend fourth delete set-slice-to new-sequence follow all-eq? monotonic? set-reversed-seq like delete-nth first4 repetition-len (open-slice) reverse slice padding virtual@ repetition? index 4sequence max-length set-second first2 first3 (3append) supremum unclip-slice move-backward tail 3append sequence-hashcode-step right-trim reversed-seq pad-right suffix concat set-slice-from flip filter sum immutable? 2sequence delete-all start* immutable-sequence? (append) check-slice sequence? head set-slice-error-reason reduce set-bounds-error-index reverse-here sequence= halves collapse-slice interleave 2map binary-reduce virtual-seq slice-error? product bounds-check? bounds-check immutable find remove ((append)) set-fourth peek any? reversed? shorter? push-new find-last head-slice pop* immutable-seq tail-slice* accumulate each pusher all-equal? new-resizable cut-slice head-slice* 2reverse-each pop memq? set-nth ?nth <flat-slice> second change-each join set-repetition-len <reversed> all? virtual-sequence set-repetition-elt subseq? immutable-sequence slice-error-reason new-like length last-index push-if 2all? lengthen joined-length copy set-bounds-error-seq cache-nth move third first slice-from repetition-elt tail? set-first prefix bounds-error bounds-error-seq bounds-error-index <repetition> unfold exchange slice-seq cut 2reduce change-nth min-length set-third (delete) push-all head? delete-slice rest sum-lengths 2each head* infimum sequence-hashcode slice-error subseq replace-slice repetition push trim mismatch 
-syn keyword factorKeyword global +@ set-namestack with-variable on set bind dec namestack get get-global change init-namespaces with-scope off set-global namespace % make , inc counter building make-assoc 
-syn keyword factorKeyword <array> 3array >array 4array pair? array pair 2array 1array resize-array array? 
-syn keyword factorKeyword readln stream-read-until stream-read-partial stderr with-stream read with-stream* print contents make-span-stream write1 stream-write1 stream-format make-block-stream stream-copy with-cell stream-write format with-row stream-print stream-read with-nesting (stream-copy) bl write-object nl stream-nl write stdio flush read-until tabular-output make-cell-stream write-cell stream-flush read1 lines stream-read1 stream-write-table with-style stream-readln 
-syn keyword factorKeyword resize-string >string <string> 1string string string? 
-syn keyword factorKeyword vector? <vector> ?push vector >vector 1vector 
-syn keyword factorKeyword rethrow-restarts restarts recover set-restart-name set-continuation-name condition-continuation <restart> ifcc continuation-name condition-error set-restart-continuation ignore-errors continuation-retain continue <continuation> restart-continuation with-disposal set-continuation-catch set-condition-error restart-obj error thread-error-hook set-continuation-retain continuation rethrow callcc1 callcc0 condition continuation? continuation-call continuation-data set-condition-restarts set-catchstack >continuation< error-continuation cleanup restart? compute-restarts condition? error-thread set-continuation-call set-condition-continuation <condition> set-restart-obj dispose set-continuation-data throw-restarts catchstack continue-with attempt-all restart restart-name continuation-catch condition-restarts 
-
-
-syn cluster factorReal   contains=factorInt,factorFloat,factorRatio,factorBinary,factorHex,factorOctal
-syn cluster factorNumber contains=@factorReal,factorComplex
-syn cluster factorNumErr contains=factorBinErr,factorHexErr,factorOctErr
-syn match   factorInt 		/\<-\=\d\+\>/
-syn match   factorFloat		/\<-\=\d*\.\d\+\>/
-syn match   factorRatio		/\<-\=\d*\.*\d\+\/-\=\d*\.*\d\+\>/
-syn region  factorComplex	start=/\<C{\>/ end=/\<}\>/ contains=@factorReal
+syn cluster factorReal          contains=factorInt,factorFloat,factorRatio,factorBinary,factorHex,factorOctal
+syn cluster factorNumber        contains=@factorReal,factorComplex
+syn cluster factorNumErr        contains=factorBinErr,factorHexErr,factorOctErr
+syn match   factorInt           /\<-\=\d\+\>/
+syn match   factorFloat         /\<-\=\d*\.\d\+\>/
+syn match   factorRatio         /\<-\=\d*\.*\d\+\/-\=\d*\.*\d\+\>/
+syn region  factorComplex       start=/\<C{\>/ end=/\<}\>/ contains=@factorReal
 syn match   factorBinErr        /\<BIN:\s\+[01]*[^\s01]\S*\>/
 syn match   factorBinary        /\<BIN:\s\+[01]\+\>/
 syn match   factorHexErr        /\<HEX:\s\+\x*[^\x\s]\S*\>/
@@ -75,31 +73,36 @@ syn match   factorHex           /\<HEX:\s\+\x\+\>/
 syn match   factorOctErr        /\<OCT:\s\+\o*[^\o\s]\S*\>/
 syn match   factorOctal         /\<OCT:\s\+\o\+\>/
 
-syn match factorIn /\<IN:\s\+\S\+\>/
-syn match factorUse /\<USE:\s\+\S\+\>/
+syn match   factorIn            /\<IN:\s\+\S\+\>/
+syn match   factorUse           /\<USE:\s\+\S\+\>/
+syn match   factorUnuse         /\<UNUSE:\s\+\S\+\>/
 
-syn match factorCharErr /\<CHAR:\s\+\S\+/
-syn match factorChar /\<CHAR:\s\+\\\=\S\>/
+syn match   factorCharErr       /\<CHAR:\s\+\S\+/
+syn match   factorChar          /\<CHAR:\s\+\\\=\S\>/
 
-syn match factorBackslash /\<\\\>\s\+\S\+\>/
+syn match   factorBackslash     /\<\\\>\s\+\S\+\>/
 
-syn region factorUsing start=/\<USING:\>/ end=/;/
-syn region factorRequires start=/\<REQUIRES:\>/ end=/;/
+syn region  factorUsing         start=/\<USING:\>/       end=/;/
+syn region  factorSingletons    start=/\<SINGLETONS:\>/  end=/;/
+syn match   factorSymbol        /\<SYMBOL:\s\+\S\+\>/
+syn region  factorSymbols       start=/\<SYMBOLS:\>/     end=/;/
+syn region  factorConstructor2  start=/\<CONSTRUCTOR:\?/ end=/;/
+syn region  factorTuple         start=/\<TUPLE:\>/ end=/\<;\>/
 
-syn cluster factorWordOps contains=factorSymbol,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain,factorConstructor
-syn match factorSymbol /\<SYMBOL:\s\+\S\+\>/
-syn match factorPostpone /\<POSTPONE:\s\+\S\+\>/
-syn match factorDefer /\<DEFER:\s\+\S\+\>/
-syn match factorForget /\<FORGET:\s\+\S\+\>/
-syn match factorMixin /\<MIXIN:\s\+\S\+\>/
-syn match factorInstance /\<INSTANCE:\s\+\S\+\s\+\S\+\>/
-syn match factorHook /\<HOOK:\s\+\S\+\s\+\S\+\>/
-syn match factorMain /\<MAIN:\s\+\S\+\>/
-syn match factorConstructor /\<C:\s\+\S\+\s\+\S\+\>/
+syn match   factorConstant      /\<CONSTANT:\s\+\S\+\>/
+syn match   factorSingleton     /\<SINGLETON:\s\+\S\+\>/
+syn match   factorPostpone      /\<POSTPONE:\s\+\S\+\>/
+syn match   factorDefer         /\<DEFER:\s\+\S\+\>/
+syn match   factorForget        /\<FORGET:\s\+\S\+\>/
+syn match   factorMixin         /\<MIXIN:\s\+\S\+\>/
+syn match   factorInstance      /\<INSTANCE:\s\+\S\+\s\+\S\+\>/
+syn match   factorHook          /\<HOOK:\s\+\S\+\s\+\S\+\>/
+syn match   factorMain          /\<MAIN:\s\+\S\+\>/
+syn match   factorConstructor   /\<C:\s\+\S\+\s\+\S\+\>/
+syn match   factorAlien         /\<ALIEN:\s\+\d\+\>/
 
-syn match factorAlien /\<ALIEN:\s\+\d\+\>/
+syn cluster factorWordOps       contains=factorSymbol,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain,factorConstructor
 
-syn region factorTuple start=/\<TUPLE:\>/ end=/\<;\>/
 
 "TODO:
 "misc:
@@ -118,6 +121,12 @@ syn region factorTuple start=/\<TUPLE:\>/ end=/\<;\>/
 " TYPEDEF:
 " LIBRARY:
 " C-UNION:
+"QUALIFIED:
+"QUALIFIED-WITH:
+"FROM:
+"ALIAS:
+"! POSTPONE: "
+"#\ "
 
 syn region factorString start=/"/ skip=/\\"/ end=/"/ oneline
 syn region factorSbuf start=/SBUF" / skip=/\\"/ end=/"/ oneline
@@ -131,18 +140,18 @@ syn region factorStackEffect start=/\<(\>/ end=/\<)\>/ contained
 
 "adapted from lisp.vim
 if exists("g:factor_norainbow") 
-    syn region factorQuotation0 matchgroup=factorDelimiter start=/\<\'\?\[\>/ matchgroup=factorDelimiter end=/\<\]\>/ contains=ALL
+    syn region factorQuotation matchgroup=factorDelimiter start=/\<\[\>/ matchgroup=factorDelimiter end=/\<\]\>/ contains=ALL
 else
-    syn region factorQuotation0           matchgroup=hlLevel0 start=/\<\'\?\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation1,factorArray1
-    syn region factorQuotation1 contained matchgroup=hlLevel1 start=/\<\'\?\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation2,factorArray2
-    syn region factorQuotation2 contained matchgroup=hlLevel2 start=/\<\'\?\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation3,factorArray3
-    syn region factorQuotation3 contained matchgroup=hlLevel3 start=/\<\'\?\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation4,factorArray4
-    syn region factorQuotation4 contained matchgroup=hlLevel4 start=/\<\'\?\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation5,factorArray5
-    syn region factorQuotation5 contained matchgroup=hlLevel5 start=/\<\'\?\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation6,factorArray6
-    syn region factorQuotation6 contained matchgroup=hlLevel6 start=/\<\'\?\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation7,factorArray7
-    syn region factorQuotation7 contained matchgroup=hlLevel7 start=/\<\'\?\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation8,factorArray8
-    syn region factorQuotation8 contained matchgroup=hlLevel8 start=/\<\'\?\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation9,factorArray9
-    syn region factorQuotation9 contained matchgroup=hlLevel9 start=/\<\'\?\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation0,factorArray0
+    syn region factorQuotation0           matchgroup=hlLevel0 start=/\<\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation1,factorArray1
+    syn region factorQuotation1 contained matchgroup=hlLevel1 start=/\<\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation2,factorArray2
+    syn region factorQuotation2 contained matchgroup=hlLevel2 start=/\<\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation3,factorArray3
+    syn region factorQuotation3 contained matchgroup=hlLevel3 start=/\<\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation4,factorArray4
+    syn region factorQuotation4 contained matchgroup=hlLevel4 start=/\<\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation5,factorArray5
+    syn region factorQuotation5 contained matchgroup=hlLevel5 start=/\<\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation6,factorArray6
+    syn region factorQuotation6 contained matchgroup=hlLevel6 start=/\<\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation7,factorArray7
+    syn region factorQuotation7 contained matchgroup=hlLevel7 start=/\<\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation8,factorArray8
+    syn region factorQuotation8 contained matchgroup=hlLevel8 start=/\<\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation9,factorArray9
+    syn region factorQuotation9 contained matchgroup=hlLevel9 start=/\<\[\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation0,factorArray0
 endif
 
 if exists("g:factor_norainbow") 
@@ -167,88 +176,92 @@ syn sync lines=100
 
 if version >= 508 || !exists("did_factor_syn_inits")
     if version <= 508
-	let did_factor_syn_inits = 1
-	command -nargs=+ HiLink hi link <args>
+        let did_factor_syn_inits = 1
+        command -nargs=+ HiLink hi link <args>
     else
-	command -nargs=+ HiLink hi def link <args>
+        command -nargs=+ HiLink hi def link <args>
     endif
 
-    HiLink factorComment	Comment
-    HiLink factorStackEffect	Typedef
-    HiLink factorTodo		Todo
-    HiLink factorInclude	Include
-    HiLink factorRepeat		Repeat
-    HiLink factorConditional	Conditional
-    HiLink factorKeyword	Keyword
-    HiLink factorOperator	Operator
-    HiLink factorBoolean	Boolean
-    HiLink factorDefnDelims	Typedef
-    HiLink factorMethodDelims	Typedef
-    HiLink factorGenericDelims        Typedef
-    HiLink factorGenericNDelims        Typedef
-    HiLink factorConstructor	Typedef
-    HiLink factorPrivate	Special
-    HiLink factorPrivateDefnDelims	Special
-    HiLink factorPrivateMethodDelims	Special
-    HiLink factorPGenericDelims        Special
+    HiLink factorComment                Comment
+    HiLink factorStackEffect            Typedef
+    HiLink factorTodo                   Todo
+    HiLink factorInclude                Include
+    HiLink factorRepeat                 Repeat
+    HiLink factorConditional            Conditional
+    HiLink factorKeyword                Keyword
+    HiLink factorOperator               Operator
+    HiLink factorBoolean                Boolean
+    HiLink factorDefnDelims             Typedef
+    HiLink factorMethodDelims           Typedef
+    HiLink factorGenericDelims          Typedef
+    HiLink factorGenericNDelims         Typedef
+    HiLink factorConstructor            Typedef
+    HiLink factorConstructor2           Typedef
+    HiLink factorPrivate                Special
+    HiLink factorPrivateDefnDelims      Special
+    HiLink factorPrivateMethodDelims    Special
+    HiLink factorPGenericDelims         Special
     HiLink factorPGenericNDelims        Special
-    HiLink factorString		String
-    HiLink factorSbuf		String
-    HiLink factorMultiStringContents		String
-    HiLink factorMultiStringDelims Typedef
-    HiLink factorBracketErr     Error
-    HiLink factorComplex	Number
-    HiLink factorRatio          Number
-    HiLink factorBinary         Number
-    HiLink factorBinErr         Error
-    HiLink factorHex            Number
-    HiLink factorHexErr         Error
-    HiLink factorOctal          Number
-    HiLink factorOctErr         Error
-    HiLink factorFloat		Float
-    HiLink factorInt		Number
-    HiLink factorUsing          Include
-    HiLink factorUse            Include
-    HiLink factorRequires       Include
-    HiLink factorIn             Define
-    HiLink factorChar           Character
-    HiLink factorCharErr        Error
-    HiLink factorDelimiter      Delimiter
-    HiLink factorBackslash      Special
-    HiLink factorCompileDirective Typedef
-    HiLink factorSymbol         Define
-    HiLink factorMixin         Typedef
-    HiLink factorInstance         Typedef
-    HiLink factorHook         Typedef
-    HiLink factorMain         Define
-    HiLink factorPostpone       Define
-    HiLink factorDefer          Define
-    HiLink factorForget         Define
-    HiLink factorAlien          Define
-    HiLink factorTuple          Typedef
+    HiLink factorString                 String
+    HiLink factorSbuf                   String
+    HiLink factorMultiStringContents    String
+    HiLink factorMultiStringDelims      Typedef
+    HiLink factorBracketErr             Error
+    HiLink factorComplex                Number
+    HiLink factorRatio                  Number
+    HiLink factorBinary                 Number
+    HiLink factorBinErr                 Error
+    HiLink factorHex                    Number
+    HiLink factorHexErr                 Error
+    HiLink factorOctal                  Number
+    HiLink factorOctErr                 Error
+    HiLink factorFloat                  Float
+    HiLink factorInt                    Number
+    HiLink factorUsing                  Include
+    HiLink factorUse                    Include
+    HiLink factorUnuse                  Include
+    HiLink factorIn                     Define
+    HiLink factorChar                   Character
+    HiLink factorCharErr                Error
+    HiLink factorDelimiter              Delimiter
+    HiLink factorBackslash              Special
+    HiLink factorCompileDirective       Typedef
+    HiLink factorSymbol                 Define
+    HiLink factorConstant               Define
+    HiLink factorSingleton              Define
+    HiLink factorSingletons             Define
+    HiLink factorMixin                  Typedef
+    HiLink factorInstance               Typedef
+    HiLink factorHook                   Typedef
+    HiLink factorMain                   Define
+    HiLink factorPostpone               Define
+    HiLink factorDefer                  Define
+    HiLink factorForget                 Define
+    HiLink factorAlien                  Define
+    HiLink factorTuple                  Typedef
 
     if &bg == "dark"
-	hi   hlLevel0 ctermfg=red         guifg=red1
-	hi   hlLevel1 ctermfg=yellow      guifg=orange1
-	hi   hlLevel2 ctermfg=green       guifg=yellow1
-	hi   hlLevel3 ctermfg=cyan        guifg=greenyellow
-	hi   hlLevel4 ctermfg=magenta     guifg=green1
-	hi   hlLevel5 ctermfg=red         guifg=springgreen1
-	hi   hlLevel6 ctermfg=yellow      guifg=cyan1
-	hi   hlLevel7 ctermfg=green       guifg=slateblue1
-	hi   hlLevel8 ctermfg=cyan        guifg=magenta1
-	hi   hlLevel9 ctermfg=magenta     guifg=purple1
+        hi   hlLevel0 ctermfg=red         guifg=red1
+        hi   hlLevel1 ctermfg=yellow      guifg=orange1
+        hi   hlLevel2 ctermfg=green       guifg=yellow1
+        hi   hlLevel3 ctermfg=cyan        guifg=greenyellow
+        hi   hlLevel4 ctermfg=magenta     guifg=green1
+        hi   hlLevel5 ctermfg=red         guifg=springgreen1
+        hi   hlLevel6 ctermfg=yellow      guifg=cyan1
+        hi   hlLevel7 ctermfg=green       guifg=slateblue1
+        hi   hlLevel8 ctermfg=cyan        guifg=magenta1
+        hi   hlLevel9 ctermfg=magenta     guifg=purple1
     else
-	hi   hlLevel0 ctermfg=red         guifg=red3
-	hi   hlLevel1 ctermfg=darkyellow  guifg=orangered3
-	hi   hlLevel2 ctermfg=darkgreen   guifg=orange2
-	hi   hlLevel3 ctermfg=blue        guifg=yellow3
-	hi   hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
-	hi   hlLevel5 ctermfg=red         guifg=green4
-	hi   hlLevel6 ctermfg=darkyellow  guifg=paleturquoise3
-	hi   hlLevel7 ctermfg=darkgreen   guifg=deepskyblue4
-	hi   hlLevel8 ctermfg=blue        guifg=darkslateblue
-	hi   hlLevel9 ctermfg=darkmagenta guifg=darkviolet
+        hi   hlLevel0 ctermfg=red         guifg=red3
+        hi   hlLevel1 ctermfg=darkyellow  guifg=orangered3
+        hi   hlLevel2 ctermfg=darkgreen   guifg=orange2
+        hi   hlLevel3 ctermfg=blue        guifg=yellow3
+        hi   hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
+        hi   hlLevel5 ctermfg=red         guifg=green4
+        hi   hlLevel6 ctermfg=darkyellow  guifg=paleturquoise3
+        hi   hlLevel7 ctermfg=darkgreen   guifg=deepskyblue4
+        hi   hlLevel8 ctermfg=blue        guifg=darkslateblue
+        hi   hlLevel9 ctermfg=darkmagenta guifg=darkviolet
     endif
 
     delcommand HiLink
@@ -262,4 +275,3 @@ set expandtab
 set autoindent " annoying?
 
 " vim: syntax=vim
-