diff --git a/extra/bubble-chamber/bubble-chamber-docs.factor b/extra/bubble-chamber/bubble-chamber-docs.factor
new file mode 100644
index 0000000000..47331efd7e
--- /dev/null
+++ b/extra/bubble-chamber/bubble-chamber-docs.factor
@@ -0,0 +1,102 @@
+
+USING: help.syntax help.markup ;
+
+USING: bubble-chamber.particle.muon
+       bubble-chamber.particle.quark
+       bubble-chamber.particle.hadron
+       bubble-chamber.particle.axion ;
+
+IN: bubble-chamber
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+HELP: muon
+
+  { $class-description
+    "The muon is a colorful particle with an entangled friend."
+    "It draws both itself and its horizontally symmetric partner."
+    "A high range of speed and almost no speed decay allow the"
+    "muon to reach the extents of the window, often forming rings"
+    "where theta has decayed but speed remains stable. The result"
+    "is color almost everywhere in the general direction of collision,"
+    "stabilized into fuzzy rings." } ;
+
+HELP: quark
+
+  { $class-description
+    "The quark draws as a translucent black. Their large numbers"
+    "create fields of blackness overwritten only by the glowing shadows of "
+    "Hadrons. "
+    "quarks are allowed to accelerate away with speed decay values above 1.0. "
+    "Each quark has an entangled friend. Both particles are drawn identically,"
+    "mirrored along the y-axis." } ;
+
+HELP: hadron
+
+  { $class-description
+    "Hadrons collide from totally random directions. "
+    "Those hadrons that do not exit the drawing area, "
+    "tend to stabilize into perfect circular orbits. "
+    "Each hadron draws with a slight glowing emboss. "
+    "The hadron itself is not drawn." } ;
+
+HELP: axion
+
+  { $class-description
+    "The axion particle draws a bold black path. Axions exist "
+    "in a slightly higher dimension and as such are drawn with "
+    "elevated embossed shadows. Axions are quick to stabilize "
+    "and fall into single pixel orbits axions automatically "
+    "recollide themselves after stabilizing." } ;
+
+{ muon quark hadron axion } related-words
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+ARTICLE: "bubble-chamber" "Bubble Chamber"
+
+  { $subsection "bubble-chamber-introduction" }
+  { $subsection "bubble-chamber-particles" }
+  { $subsection "bubble-chamber-author" }
+  { $subsection "bubble-chamber-running" } ;
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+ARTICLE: "bubble-chamber-introduction" "Introduction"
+
+"The Bubble Chamber is a generative painting system of imaginary "
+"colliding particles. A single super-massive collision produces a "
+"discrete universe of four particle types. Particles draw their "
+"positions over time as pixel exposures. " ;
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+ARTICLE: "bubble-chamber-particles" "Particles"
+
+"Four types of particles exist. The behavior and graphic appearance of "
+"each particle type is unique."
+
+  { $subsection muon }
+  { $subsection quark }
+  { $subsection hadron }
+  { $subsection axion } ;
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+ARTICLE: "bubble-chamber-author" "Author"
+
+  "Bubble Chamber was created by Jared Tarbell. "
+  "It was originally implemented in Processing. "
+  "It was ported to Factor by Eduardo Cavazos. "
+  "The original work is on display here: "
+  { $url
+  "http://www.complexification.net/gallery/machines/bubblechamber/" } ;
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+ARTICLE: "bubble-chamber-running" "How to use"
+
+  "After you run the vocabulary, a window will appear. Click the "
+  "mouse in a random area to fire 11 particles of each type. "
+  "Another way to fire particles is to press the "
+  "spacebar. This fires all the particles." ;
\ No newline at end of file
diff --git a/extra/builder/builder.factor b/extra/builder/builder.factor
index 0e3a794e24..d81b934f2c 100644
--- a/extra/builder/builder.factor
+++ b/extra/builder/builder.factor
@@ -166,7 +166,7 @@ SYMBOL: build-status
 
       "benchmarks" ".." copy-file-into
 
-      maybe-release
+      release
     ]
   with-file-writer
 
diff --git a/extra/builder/common/common.factor b/extra/builder/common/common.factor
index 6ebe1d625a..2fe2aa06ab 100644
--- a/extra/builder/common/common.factor
+++ b/extra/builder/common/common.factor
@@ -16,3 +16,4 @@ SYMBOL: builds-dir
 
 VAR: stamp
 
+SYMBOL: upload-to-factorcode
\ No newline at end of file
diff --git a/extra/builder/release/archive/archive.factor b/extra/builder/release/archive/archive.factor
new file mode 100644
index 0000000000..9b239da586
--- /dev/null
+++ b/extra/builder/release/archive/archive.factor
@@ -0,0 +1,58 @@
+
+USING: kernel combinators system sequences io.files io.launcher prettyprint
+       builder.util
+       builder.common ;
+
+IN: builder.release.archive
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+: base-name ( -- string )
+  { "factor" [ os unparse ] cpu- stamp> } to-strings "-" join ;
+
+: extension ( -- extension )
+  {
+    { [ os winnt?  ] [ ".zip"    ] }  
+    { [ os macosx? ] [ ".dmg"    ] }
+    { [ os unix?   ] [ ".tar.gz" ] }
+  }
+  cond ;
+
+: archive-name ( -- string ) base-name extension append ;
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+: windows-archive-cmd ( -- cmd ) { "zip" "-r" archive-name "factor" } ;
+
+: macosx-archive-cmd ( -- cmd )
+  { "hdiutil" "create"
+              "-srcfolder" "factor"
+              "-fs" "HFS+"
+              "-volname" "factor"
+              archive-name } ;
+
+: unix-archive-cmd ( -- cmd ) { "tar" "-cvzf" archive-name "factor" } ;
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+: archive-cmd ( -- cmd )
+  {
+    { [ os windows? ] [ windows-archive-cmd ] }
+    { [ os macosx?  ] [ macosx-archive-cmd  ] }
+    { [ os unix?    ] [ unix-archive-cmd    ] }
+  }
+  cond ;
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+: make-archive ( -- ) archive-cmd to-strings try-process ;
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+: releases ( -- path )
+  builds "releases" append-path
+  dup exists? not
+    [ dup make-directory ]
+  when ;
+
+: save-archive ( -- ) archive-name releases move-file-into ;
\ No newline at end of file
diff --git a/extra/builder/release/branch/branch.factor b/extra/builder/release/branch/branch.factor
new file mode 100644
index 0000000000..838a74394b
--- /dev/null
+++ b/extra/builder/release/branch/branch.factor
@@ -0,0 +1,40 @@
+
+USING: kernel system namespaces sequences prettyprint io.files io.launcher
+       bootstrap.image
+       builder.util
+       builder.common ;
+
+IN: builder.release.branch
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+: branch-name ( -- string ) "clean-" platform append ;
+
+: refspec ( -- string ) "master:" branch-name append ;
+
+: push-to-clean-branch ( -- )
+  { "git" "push" "factorcode.org:/git/factor.git" refspec }
+  to-strings
+  try-process ;
+
+: upload-clean-image ( -- )
+  {
+    "scp"
+    my-boot-image-name
+    "factorcode.org:/var/www/factorcode.org/newsite/images/clean"
+  }
+  to-strings
+  try-process ;
+
+: (update-clean-branch) ( -- )
+  "factor"
+    [
+      push-to-clean-branch
+      upload-clean-image
+    ]
+  with-directory ;
+
+: update-clean-branch ( -- )
+  upload-to-factorcode get
+    [ update-clean-branch ]
+  when ;
diff --git a/extra/builder/release/release.factor b/extra/builder/release/release.factor
index 9b449a51c5..33e5edfbf9 100644
--- a/extra/builder/release/release.factor
+++ b/extra/builder/release/release.factor
@@ -1,144 +1,26 @@
 
 USING: kernel system namespaces sequences splitting combinators
-       io io.files io.launcher prettyprint
-       bake combinators.cleave builder.common builder.util ;
+       io io.files io.launcher prettyprint bootstrap.image
+       bake combinators.cleave
+       builder.util
+       builder.common
+       builder.release.branch
+       builder.release.tidy
+       builder.release.archive
+       builder.release.upload ;
 
 IN: builder.release
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
-: releases ( -- path )
-  builds "releases" append-path
-  dup exists? not
-    [ dup make-directory ]
-  when ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-: common-files ( -- seq )
-  {
-    "boot.x86.32.image"
-    "boot.x86.64.image"
-    "boot.macosx-ppc.image"
-    "boot.linux-ppc.image"
-    "vm"
-    "temp"
-    "logs"
-    ".git"
-    ".gitignore"
-    "Makefile"
-    "unmaintained"
-    "build-support"
-  } ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-: cpu- ( -- cpu ) cpu unparse "." split "-" join ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-: base-name ( -- string )
-  { "factor" [ os unparse ] cpu- stamp> } to-strings "-" join ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-: extension ( -- extension )
-  {
-    { [ os winnt?  ] [ ".zip"    ] }  
-    { [ os macosx? ] [ ".dmg"    ] }
-    { [ os unix?   ] [ ".tar.gz" ] }
-  }
-  cond ;
-
-: archive-name ( -- string ) base-name extension append ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-: windows-archive-cmd ( -- cmd ) { "zip" "-r" archive-name "factor" } ;
-
-: macosx-archive-cmd ( -- cmd )
-  { "hdiutil" "create"
-              "-srcfolder" "factor"
-              "-fs" "HFS+"
-              "-volname" "factor"
-              archive-name } ;
-
-: unix-archive-cmd ( -- cmd ) { "tar" "-cvzf" archive-name "factor" } ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-: archive-cmd ( -- cmd )
-  {
-    { [ os windows? ] [ windows-archive-cmd ] }
-    { [ os macosx?  ] [ macosx-archive-cmd  ] }
-    { [ os unix?    ] [ unix-archive-cmd    ] }
-  }
-  cond ;
-
-: make-archive ( -- ) archive-cmd to-strings try-process ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-: remove-common-files ( -- )
-  { "rm" "-rf" common-files } to-strings try-process ;
-
-: remove-factor-app ( -- )
-  os macosx? not [ { "rm" "-rf" "Factor.app" } try-process ] when ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-SYMBOL: upload-to-factorcode
-
-: platform ( -- string ) { [ os unparse ] cpu- } to-strings "-" join ;
-
-: remote-location ( -- dest )
-  "factorcode.org:/var/www/factorcode.org/newsite/downloads"
-  platform
-  append-path ;
-    
-: upload ( -- )
-  { "scp" archive-name remote-location } to-strings
-  [ "Error uploading binary to factorcode" print ]
-  run-or-bail ;
-
-: maybe-upload ( -- )
-  upload-to-factorcode get
-    [ upload ]
-  when ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-! : release ( -- )
-!   "factor"
-!     [
-!       remove-factor-app
-!       remove-common-files
-!     ]
-!   with-directory
-!   make-archive
-!   archive-name releases move-file-into ;
-
-: release ( -- )
-  "factor"
-    [
-      remove-factor-app
-      remove-common-files
-    ]
-  with-directory
+: (release) ( -- )
+  update-clean-branch
+  tidy
   make-archive
-  maybe-upload
-  archive-name releases move-file-into ;
+  upload
+  save-archive ;
 
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+: clean-build? ( -- ? )
+  { "load-everything-vocabs" "test-all-vocabs" } [ eval-file empty? ] all? ;
 
-: release? ( -- ? )
-  {
-    "./load-everything-vocabs"
-    "./test-all-vocabs"
-  }
-    [ eval-file empty? ]
-  all? ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-: maybe-release ( -- ) release? [ release ] when ;
\ No newline at end of file
+: release ( -- ) clean-build? [ (release) ] when ;
\ No newline at end of file
diff --git a/extra/builder/release/tidy/tidy.factor b/extra/builder/release/tidy/tidy.factor
new file mode 100644
index 0000000000..f8f27e75f2
--- /dev/null
+++ b/extra/builder/release/tidy/tidy.factor
@@ -0,0 +1,29 @@
+
+USING: kernel system io.files io.launcher builder.util ;
+
+IN: builder.release.tidy
+
+: common-files ( -- seq )
+  {
+    "boot.x86.32.image"
+    "boot.x86.64.image"
+    "boot.macosx-ppc.image"
+    "boot.linux-ppc.image"
+    "vm"
+    "temp"
+    "logs"
+    ".git"
+    ".gitignore"
+    "Makefile"
+    "unmaintained"
+    "build-support"
+  } ;
+
+: remove-common-files ( -- )
+  { "rm" "-rf" common-files } to-strings try-process ;
+
+: remove-factor-app ( -- )
+  os macosx? not [ { "rm" "-rf" "Factor.app" } try-process ] when ;
+
+: tidy ( -- )
+  "factor" [ remove-factor-app remove-common-files ] with-directory ;
diff --git a/extra/builder/release/upload/upload.factor b/extra/builder/release/upload/upload.factor
new file mode 100644
index 0000000000..38f6dcb133
--- /dev/null
+++ b/extra/builder/release/upload/upload.factor
@@ -0,0 +1,24 @@
+
+USING: kernel namespaces io io.files
+       builder.util
+       builder.common
+       builder.release.archive ;
+
+IN: builder.release.upload
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+: remote-location ( -- dest )
+  "factorcode.org:/var/www/factorcode.org/newsite/downloads"
+  platform
+  append-path ;
+
+: (upload) ( -- )
+  { "scp" archive-name remote-location } to-strings
+  [ "Error uploading binary to factorcode" print ]
+  run-or-bail ;
+
+: upload ( -- )
+  upload-to-factorcode get
+    [ (upload) ]
+  when ;
diff --git a/extra/builder/util/util.factor b/extra/builder/util/util.factor
index 92b9af41ef..e80d83e24c 100644
--- a/extra/builder/util/util.factor
+++ b/extra/builder/util/util.factor
@@ -2,6 +2,7 @@
 USING: kernel words namespaces classes parser continuations
        io io.files io.launcher io.sockets
        math math.parser
+       system
        combinators sequences splitting quotations arrays strings tools.time
        sequences.deep accessors assocs.lib
        io.encodings.utf8
@@ -40,21 +41,6 @@ DEFER: to-strings
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
-! TUPLE: process* arguments stdin stdout stderr timeout ;
-
-! : <process*> process* construct-empty ;
-
-! : >desc ( process* -- desc )
-!   H{ } clone
-!     over arguments>> [ +arguments+ swap put-at ] when*
-!     over stdin>>     [ +stdin+     swap put-at ] when*
-!     over stdout>>    [ +stdout+    swap put-at ] when*
-!     over stderr>>    [ +stderr+    swap put-at ] when*
-!     over timeout>>   [ +timeout+   swap put-at ] when*
-!   nip ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
 : host-name* ( -- name ) host-name "." split first ;
 
 : datestamp ( -- string )
@@ -109,4 +95,6 @@ USE: prettyprint
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
-: failsafe ( quot -- ) [ drop ] recover ;
+: cpu- ( -- cpu ) cpu unparse "." split "-" join ;
+
+: platform ( -- string ) { [ os unparse ] cpu- } to-strings "-" join ;
\ No newline at end of file
diff --git a/extra/newfx/newfx.factor b/extra/newfx/newfx.factor
index 3df3b3ed05..6a191f0e07 100644
--- a/extra/newfx/newfx.factor
+++ b/extra/newfx/newfx.factor
@@ -74,6 +74,10 @@ METHOD: mutate-as { sequence object  number }      rot set-nth ;
 METHOD: at-mutate { number object  sequence } swapd set-nth ;
 METHOD: as-mutate { object  number sequence }       set-nth ;
 
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+
+
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 ! assoc
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!