diff --git a/doc/core/man/trial.1 b/doc/core/man/trial.1
index f01934d..1b89412 100644
--- a/doc/core/man/trial.1
+++ b/doc/core/man/trial.1
@@ -13,7 +13,8 @@ packages and files listed on the command line.
 trial will take either filenames or fully qualified Python names as
 arguments.  Thus `trial myproject/foo.py', `trial myproject.foo' and
 `trial myproject.foo.SomeTestCase.test_method' are all valid ways to
-invoke trial.
+invoke trial. Multiple such arguments are also accepted, and their order will
+determine the order in which the corresponding tests are run.
 .PP
 After running the given test suite, the default test reporter prints a summary
 of the test run. This consists of the word "PASSED" (if all tests ran as
diff --git a/twisted/scripts/trial.py b/twisted/scripts/trial.py
index 349b0c6..0f9ab98 100644
--- a/twisted/scripts/trial.py
+++ b/twisted/scripts/trial.py
@@ -93,6 +93,7 @@ def _reporterAction():
     return usage.CompleteList([p.longOpt for p in
                                plugin.getPlugins(itrial.IReporter)])
 
+
 class Options(usage.Options, app.ReactorSelectionMixin):
     synopsis = """%s [options] [[file|package|module|TestCase|testmethod]...]
     """ % (os.path.basename(sys.argv[0]),)
@@ -146,7 +147,7 @@ class Options(usage.Options, app.ReactorSelectionMixin):
     tracer = None
 
     def __init__(self):
-        self['tests'] = set()
+        self['tests'] = []
         usage.Options.__init__(self)
 
 
@@ -190,9 +191,9 @@ class Options(usage.Options, app.ReactorSelectionMixin):
             return
         filename = os.path.abspath(filename)
         if isTestFile(filename):
-            self['tests'].add(filename)
+            self['tests'].append(filename)
         else:
-            self['tests'].update(getTestModules(filename))
+            self['tests'].extend(getTestModules(filename))
 
 
     def opt_spew(self):
@@ -287,9 +288,9 @@ class Options(usage.Options, app.ReactorSelectionMixin):
 
 
     def parseArgs(self, *args):
-        self['tests'].update(args)
+        self['tests'].extend(args)
         if self.extra is not None:
-            self['tests'].update(self.extra)
+            self['tests'].extend(self.extra)
 
 
     def _loadReporterByName(self, name):
diff --git a/twisted/trial/test/test_script.py b/twisted/trial/test/test_script.py
index 6c93ebe..16d4b2c 100644
--- a/twisted/trial/test/test_script.py
+++ b/twisted/trial/test/test_script.py
@@ -480,3 +480,26 @@ class ExtraTests(unittest.TestCase):
         self.assertDeprecationWarning(self.config.opt_extra,
                                       self.flushWarnings([self.test_xDeprecation]))
 
+
+
+class TestArgumentOrderTests(unittest.TestCase):
+    def setUp(self):
+        self.config = trial.Options()
+        self.loader = runner.TestLoader()
+
+    def test_preserveArgumentOrder(self):
+        """
+        Multiple tests passed on the command line are not reordered.
+
+        """
+
+        tests = ["foo", "bar", "quux", "baz"]
+        self.config.parseOptions(tests)
+
+        suite = trial._getSuite(self.config)
+        names = testNames(suite)
+
+        expectedSuite = runner.TestSuite(map(self.loader.loadByName, tests))
+        expectedNames = testNames(expectedSuite)
+
+        self.assertEqual(names, expectedNames)
