diff --git a/.gitignore b/.gitignore
index dd88ea04014aac1c41f616ecd5d375c0e8d128eb..1e5320720a454377103b6ac58b116ef9c1a3e64a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,3 +13,7 @@
 Thumbs.db
 /locale
 /resources/email_templates/email-test.html
+/automation-tests/bid_selenium
+/automation-tests/results
+/automation-tests/credentials.yaml
+/automation-tests/sauce.yaml
diff --git a/automation-tests/README.md b/automation-tests/README.md
index a7440ac3e27f9d99a054a028490b30981c53fe87..a78a9dd1f47a04158d1e94bc9536354f64962d85 100644
--- a/automation-tests/README.md
+++ b/automation-tests/README.md
@@ -15,13 +15,15 @@ If you want to run that single test against your ephemeral instance called 'foo'
 
 If you want to run all the tests, create a dummy user, put its info in credentials.yaml, then do ```run.py --all``` to run all the tests, including 123done and myfavoritebeer tests.
 
+If you want to run all the tests against all the browsers, using sauce labs credentials, then do ```run.py --everywhere```.
+
 # I've got time. Tell me more!
 
 OK, sure...
 
 ## how to run selenium tests inside the automation-tests directory against ephemeral, stage, or prod environments
 
-Node bindings don't exist for Selenium 2 API (webdriver), so we're using python bindings instead. This requires some python-centric setup, but it shouldn't take more than 15 minutes or so to get up and running.
+Node bindings aren't as mature as python for Selenium 2 API (webdriver), so we're using python bindings instead. This requires some python-centric setup, but it shouldn't take more than 15 minutes or so to get up and running.
 
 These tests currently only hit myfavoritebeers and 123done domains. For example, to test an ephemeral install named foo.personatest.org, you can pass 'foo.123done.org' into the py.test baseurl parameter (this is covered again in the examples section).
 
diff --git a/automation-tests/credentials.yaml b/automation-tests/credentials.yaml.example
similarity index 95%
rename from automation-tests/credentials.yaml
rename to automation-tests/credentials.yaml.example
index 2ce53331519a6d23f8f9eb276f5f2dd69c8d3c23..1366d16b2d45ff15d7e6a07631c4fd40a8b23212 100644
--- a/automation-tests/credentials.yaml
+++ b/automation-tests/credentials.yaml.example
@@ -33,5 +33,5 @@
 
 default:
     email: <value>
-    password: <value>
-    name: <value>
+    passord: <value>
+    name: <value>
\ No newline at end of file
diff --git a/automation-tests/run.py b/automation-tests/run.py
index 7cb1d55a64dd6cf77f1b74c4ecd666282e34f191..72affbffc425dc2dd24b46569aa332170877c858 100755
--- a/automation-tests/run.py
+++ b/automation-tests/run.py
@@ -25,7 +25,7 @@ def which(program):
 
 
 def main():
-    # virtualenv location differs on windows
+    # get path to python: virtualenv location differs on windows
     # TODO platform detection is brittle. is there a better way?
     if platform.system() == 'Windows':
         env_path = 'bid_selenium\Scripts\\'
@@ -44,14 +44,26 @@ def main():
                       default="dev", help='run tests against an ephemeral' +
                       ' instance. Specify your instance\'s hostname ("foo"),' +
                       ' not the full domain name ("foo.123done.org")')
-    # TODO add other options
+    parser.add_option('--everywhere', '-e', dest='run_everywhere', action='store_true',
+                      help='like --all, but run all tests on all supported' +
+                           ' browsers using sauce labs credentials either' +
+                           ' specified in sauce.yaml or in environment' +
+                           ' variables PERSONA_SAUCE_USER, PERSONA_SAUCE_PASSWORD,' +
+                           ' and PERSONA_SAUCE_APIKEY.')
     options, arguments = parser.parse_args()
 
-    # 1. check that python is the right version TODO: would 2.6 actually work?
+    # you can't specify both --all and --everywhere
+    if options.run_everywhere and options.run_all:
+            sys.stderr.write("either use --all or --everywhere, not both")
+            exit(1)
+
+    # 1. check that python is the right version 
+    # TODO: would 2.6 actually work?
     if sys.version_info < (2,7,0):
         sys.stderr.write('python 2.7 or later is required to run the tests\n')
         exit(1)
-    # 2. TODO check that virtualenv and pip exist. if not, bail.
+
+    # 2. check that virtualenv and pip exist. if not, bail.
     if not which('pip'):
         sys.stderr.write('pip must be installed; do "easy_install pip", ' +
                          ' then try again\n')
@@ -60,6 +72,7 @@ def main():
         sys.stderr.write('virtualenv must be installed; do "pip install ' +
                          'virtualenv", then try again\n')
         exit(1)
+
     # 3. create the virtualenv if they asked you to install it or it's missing
     if options.install or not os.path.exists(env_py):
         subprocess.call('virtualenv bid_selenium', shell=True)
@@ -67,31 +80,75 @@ def main():
         subprocess.call(env_path + 'pip install -Ur requirements.txt', 
                         shell=True)
 
-    # 4 1/2. check the ephemeral instance to hit.
+    # 4. check the ephemeral instance to hit.
     host = options.target_hostname
 
-    # 5. run the tests
-    # TODO parse arguments to know which tests to run
-    # TODO right now we only run one 123done test in the default case
-    if options.run_all:
-        subprocess.call(env_py + ' -m py.test --destructive ' +
-                        '--credentials=credentials.yaml ' +
-                        '--baseurl=http://' + host + '.123done.org ' +
-                        '--driver=firefox -q browserid', shell=True);
-        subprocess.call(env_py + ' -m py.test --destructive ' +
-                        '--credentials=credentials.yaml ' +
-                        '--baseurl=http://' + host + '.myfavoritebeer.org ' +
-                        '--driver=firefox -q myfavoritebeer', shell=True);
-        tests_123 = '123done'
+    # 5. check for/create sauce.yaml, if necessary
+    if options.run_everywhere:
+        # if sauce.yaml does not exist,
+        if not os.path.isfile('sauce.yaml'):
+            # look for environmental variables PERSONA_SAUCE_*
+            try:
+                username = os.environ['PERSONA_SAUCE_USER']
+                password = os.environ['PERSONA_SAUCE_PASSWORD']
+                api_key  = os.environ['PERSONA_SAUCE_APIKEY']
+            # if they are missing, bail
+            except KeyError:
+                sys.stderr.write('Sauce labs credentials are needed to run' +
+                    ' tests everywhere. Add credentials to sauce.yaml or, if' +
+                    ' you have access to persona dev secrets, check that' +
+                    ' the PERSONA_SAUCE_USER, PERSONA_SAUCE_PASSWORD, and' +
+                    ' PERSONA_SAUCE_APIKEY environmental variables are set.\n')
+                exit(1)
+            # if they are present, write them out to sauce.yaml
+            try:
+                saucefile = open('sauce.yaml', 'w')
+                saucefile.write('username: ' + username + '\n')
+                saucefile.write('password: ' + password + '\n')
+                saucefile.write('api-key: ' + api_key + '\n')
+                saucefile.close()
+            # if you can't open the file for editing, bail
+            except IOError:
+                sys.stderr.write('Unable to open sauce.yaml to write out' +
+                    ' credentials. Either create sauce.yaml manually, or' +
+                    ' ensure the test process has permission to create the file.\n')
+                exit(1)
+
+    # 6. run the tests
+
+    # TODO move the run_everywhere list into a config file?
+    if options.run_everywhere:
+        browsers = ['--platform=LINUX --browsername=firefox --browserver=13 ',
+            '--platform=LINUX --browsername=opera   --browserver=12 ',
+            '--platform=MAC   --browsername=firefox --browserver=14 ',
+            '--platform=VISTA --browsername=chrome ',
+            '--platform=VISTA --browsername=firefox --browserver=13 ',
+            '--platform=VISTA --browsername="internet explorer" --browserver=9 ',
+            '--platform=XP    --browsername="internet explorer" --browserver=8 ']
+        sauce = '--saucelabs=sauce.yaml '
     else:
-        tests_123 = '123done/tests/test_new_user.py'
-    # the 123done tests always run
-    subprocess.call(env_py + ' -m py.test --destructive ' + 
-                    '--credentials=credentials.yaml ' +
-                    '--baseurl=http://' + host + '.123done.org ' +
-                    '--driver=firefox -q ' + tests_123, shell=True);
-
-    # 6. TODO deactivate/destroy virtualenv?? maybe '--cleanup' argument?
+        browsers = ['--driver=firefox ']
+        sauce = ''
+
+    for browser in browsers:
+        if options.run_everywhere or options.run_all:
+            subprocess.call(env_py + ' -m py.test --destructive ' +
+                '--credentials=credentials.yaml ' + sauce + browser + 
+                ' --baseurl=http://' + host + '.123done.org -q browserid', shell=True)
+            subprocess.call(env_py + ' -m py.test --destructive ' +
+                '--credentials=credentials.yaml ' + sauce + browser + 
+                ' --baseurl=http://' + host + '.123done.org -q 123done', shell=True)
+            subprocess.call(env_py + ' -m py.test --destructive ' +
+                '--credentials=credentials.yaml ' + sauce + browser + 
+                ' --baseurl=http://' + host + '.myfavoritebeer.org -q myfavoritebeer', shell=True)
+        # only run one test in the default case
+        else:
+            subprocess.call(env_py + ' -m py.test --destructive ' +
+                '--credentials=credentials.yaml ' + sauce + browser +
+                ' --baseurl=http://' + host + '.123done.org ' +
+                '-q 123done/tests/test_new_user.py', shell=True)
+
+    # 7. TODO deactivate/destroy virtualenv?? maybe '--cleanup' argument?
 
 
 if __name__ == '__main__':
diff --git a/automation-tests/sauce.yaml.example b/automation-tests/sauce.yaml.example
new file mode 100644
index 0000000000000000000000000000000000000000..4dbdd163a9301dd34c08495b363f45bdeb2cf669
--- /dev/null
+++ b/automation-tests/sauce.yaml.example
@@ -0,0 +1,8 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# insert your sauce labs credentials here and save as sauce.yaml
+username: <value>
+password: <value>
+api-key: <value>
\ No newline at end of file