diff --git a/fabfile.py b/fabfile.py
index 99b15285091a5487fe5951a982c896984fdee5c9..6d5c3309f6ef85df7d95fd677966b3a37c888516 100644
--- a/fabfile.py
+++ b/fabfile.py
@@ -5,14 +5,20 @@ A fabric deployment script for Helios that assumes the following:
 - locally, development is /web/helios-server
 - remotely, production is /web/production/helios-server
 - remotely, staging is /web/staging/helios-server
+- all of these directories are git checkouts that have a proper origin pointer
 
-Deployment is git and tag based, so
+Other assumptions that should probably change:
+- both staging and production run under the same apache instance
+
+Deployment is git and tag based, so:
 
 fab staging_deploy:tag=v3.0.4,hosts="vote.heliosvoting.org"
 fab production_deploy:tag=v3.0.5,hosts="vote.heliosvoting.org"
+
+IMPORTANT: settings file may need to be tweaked manually
 """
 
-from fabric.api import local, settings, abort, cd, run
+from fabric.api import local, settings, abort, cd, run, sudo
 from fabric.contrib.console import confirm
 
 STAGING_DIR = "/web/staging/helios-server"
@@ -34,16 +40,32 @@ def check_tag(tag, path):
             abort("no remote tag %s" % tag)
 
 def checkout_tag(tag, path):
-    pass
+    with cd(path):
+        result = run('git checkout %s' % tag)
+        if result.failed:
+            abort("on remote: could not check out tag %s" % tag)
 
 def migrate_db(path):
-    pass
+    with cd(path):
+        result = run('python manage.py migrate')
+        if result.failed:
+            abort("could not migrate")
 
 def restart_apache():
-    pass
+    result = sudo('/etc/init.d/apache2 restart')
+    if result.failed:
+        abort("could not restart apache")
 
-def deploy_staging(tag):
-    confirm("Ready to deploy %s to staging?" % tag)
+def deploy(tag, path):
+    confirm("Ready to deploy %s to %s?" % (tag,path))
     run_tests()
-    check_tag(tag, path=STAGING_DIR)
+    check_tag(tag, path=path)
+    checkout_tag(tag, path=path)
+    #migrate_db(path=path)
+    restart_apache()
     
+def staging_deploy(tag):
+    deploy(tag, path=STAGING_DIR)
+
+def production_deploy(tag):
+    deploy(tag, path=PRODUCTION_DIR)