diff --git a/extra/webapps/mason/docs-update/authors.txt b/extra/webapps/mason/docs-update/authors.txt
new file mode 100644
index 0000000000..1901f27a24
--- /dev/null
+++ b/extra/webapps/mason/docs-update/authors.txt
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/extra/webapps/mason/docs-update/docs-update.factor b/extra/webapps/mason/docs-update/docs-update.factor
new file mode 100644
index 0000000000..e7c0ecda9b
--- /dev/null
+++ b/extra/webapps/mason/docs-update/docs-update.factor
@@ -0,0 +1,29 @@
+! Copyright (C) 2010 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors continuations furnace.actions help.html
+http.server.responses io.directories io.directories.hierarchy
+io.launcher io.files io.pathnames kernel memoize
+webapps.mason.utils ;
+IN: webapps.mason.docs-update
+
+: update-docs ( -- )
+    home [
+        "newdocs" make-directory
+        "newdocs" [ { "tar" "xvf" "../docs.tar.gz" } try-process ] with-directory
+
+        "docs" exists? [ "docs" "docs.old" move-file ] when
+        "newdocs/docs" "docs" move-file
+
+        "newdocs" delete-directory
+        "docs.old" exists? [ "docs.old" delete-tree ] when
+
+        \ load-index reset-memoized
+    ] with-directory ;
+
+: <docs-update-action> ( -- action )
+    <action>
+    [ validate-secret ] >>validate
+    [
+        update-docs
+        "OK" "text/plain" <content>
+    ] >>submit ;
diff --git a/extra/webapps/mason/mason.factor b/extra/webapps/mason/mason.factor
index a878513594..9e871c48a9 100644
--- a/extra/webapps/mason/mason.factor
+++ b/extra/webapps/mason/mason.factor
@@ -4,8 +4,9 @@ USING: accessors furnace.actions furnace.auth furnace.db
 http.server.dispatchers mason.server webapps.mason.grids
 webapps.mason.package webapps.mason.release webapps.mason.report
 webapps.mason.downloads webapps.mason.counter
-webapps.mason.status-update webapps.mason.dashboard
-webapps.mason.make-release webapps.mason.increment-counter ;
+webapps.mason.status-update webapps.mason.docs-update
+webapps.mason.dashboard webapps.mason.make-release
+webapps.mason.increment-counter ;
 IN: webapps.mason
 
 TUPLE: mason-app < dispatcher ;
@@ -39,6 +40,9 @@ build-engineer? define-capability
     <status-update-action>
         "status-update" add-responder
 
+    <docs-update-action>
+        "docs-update" add-responder
+
     <counter-action>
         "counter" add-responder
 
diff --git a/extra/webapps/mason/status-update/status-update.factor b/extra/webapps/mason/status-update/status-update.factor
index 94965dc4dd..2344218856 100644
--- a/extra/webapps/mason/status-update/status-update.factor
+++ b/extra/webapps/mason/status-update/status-update.factor
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors calendar combinators db.tuples furnace.actions
 furnace.redirection html.forms http.server.responses io kernel
-mason.config mason.server namespaces validators ;
+mason.server namespaces validators webapps.mason.utils ;
 IN: webapps.mason.status-update
 
 : find-builder ( -- builder )
@@ -59,7 +59,7 @@ IN: webapps.mason.status-update
             { "secret" [ v-one-line ] }
         } validate-params
 
-        "secret" value status-secret get = [ validation-failed ] unless
+        validate-secret
     ] >>validate
 
     [
diff --git a/extra/webapps/mason/utils/utils.factor b/extra/webapps/mason/utils/utils.factor
index b26fd5e5bb..e7c88eaec0 100644
--- a/extra/webapps/mason/utils/utils.factor
+++ b/extra/webapps/mason/utils/utils.factor
@@ -1,8 +1,9 @@
 ! Copyright (C) 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays assocs db.tuples furnace.actions
-furnace.utilities html.forms kernel mason.server
-mason.version.data sequences validators xml.syntax urls ;
+furnace.utilities html.forms kernel mason.config mason.server
+mason.version.data namespaces sequences validators xml.syntax
+urls ;
 IN: webapps.mason.utils
 
 : link ( url label -- xml )
@@ -53,3 +54,7 @@ IN: webapps.mason.utils
     [ os>> "os" set-query-param ]
     [ cpu>> "cpu" set-query-param ] bi
     adjust-url ;
+
+: validate-secret ( -- )
+    "secret" value status-secret get =
+    [ validation-failed ] unless ;