diff --git a/dev/core/src/com/google/gwt/core/ext/linker/ArtifactSet.java b/dev/core/src/com/google/gwt/core/ext/linker/ArtifactSet.java
index 747899f..c04ad6d 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/ArtifactSet.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/ArtifactSet.java
@@ -87,7 +87,7 @@
    */
   public <A extends Artifact<?>, T extends A> SortedSet<A> find(
       Class<T> artifactType) {
-    // TODO make this sub-linear
+    // TODO make this sub-linear (but must retain order for styles/scripts!)
     SortedSet<A> toReturn = new TreeSet<A>();
     for (Artifact<?> artifact : this) {
       if (artifactType.isInstance(artifact)) {
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/ScriptReference.java b/dev/core/src/com/google/gwt/core/ext/linker/ScriptReference.java
index 789397f..1e28710 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/ScriptReference.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/ScriptReference.java
@@ -18,14 +18,18 @@
 import com.google.gwt.core.ext.Linker;
 
 /**
- * An external script file referenced in the module manifest.
+ * An external script file referenced in the module manifest. The index is
+ * important because output order must match module declaration order.
  */
 public abstract class ScriptReference extends Artifact<ScriptReference> {
+  private final int index;
   private final String src;
 
-  protected ScriptReference(Class<? extends Linker> linkerType, String src) {
+  protected ScriptReference(Class<? extends Linker> linkerType, String src,
+      int index) {
     super(linkerType);
     this.src = src;
+    this.index = index;
   }
 
   /**
@@ -48,7 +52,7 @@
 
   @Override
   protected final int compareToComparableArtifact(ScriptReference o) {
-    return getSrc().compareTo(o.getSrc());
+    return index - o.index;
   }
 
   @Override
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/StylesheetReference.java b/dev/core/src/com/google/gwt/core/ext/linker/StylesheetReference.java
index a35b4ac..6d3aeb0 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/StylesheetReference.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/StylesheetReference.java
@@ -18,14 +18,18 @@
 import com.google.gwt.core.ext.Linker;
 
 /**
- * An external stylesheet referenced in the module manifest.
+ * An external stylesheet referenced in the module manifest. The index is
+ * important because output order must match module declaration order.
  */
 public abstract class StylesheetReference extends Artifact<StylesheetReference> {
   private final String src;
+  private final int index;
 
-  protected StylesheetReference(Class<? extends Linker> linkerType, String src) {
+  protected StylesheetReference(Class<? extends Linker> linkerType, String src,
+      int index) {
     super(linkerType);
     this.src = src;
+    this.index = index;
   }
 
   /**
@@ -48,7 +52,7 @@
 
   @Override
   protected final int compareToComparableArtifact(StylesheetReference o) {
-    return getSrc().compareTo(o.getSrc());
+    return index - o.index;
   }
 
   @Override
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
index a6dee8e..eff8325 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
@@ -175,14 +175,20 @@
     }
     properties = Collections.unmodifiableSortedSet(mutableProperties);
 
-    for (Script script : module.getScripts()) {
-      artifacts.add(new StandardScriptReference(script.getSrc()));
-      logger.log(TreeLogger.SPAM, "Added script " + script.getSrc(), null);
+    {
+      int index = 0;
+      for (Script script : module.getScripts()) {
+        artifacts.add(new StandardScriptReference(script.getSrc(), index++));
+        logger.log(TreeLogger.SPAM, "Added script " + script.getSrc(), null);
+      }
     }
 
-    for (String style : module.getStyles()) {
-      artifacts.add(new StandardStylesheetReference(style));
-      logger.log(TreeLogger.SPAM, "Added style " + style, null);
+    {
+      int index = 0;
+      for (String style : module.getStyles()) {
+        artifacts.add(new StandardStylesheetReference(style, index++));
+        logger.log(TreeLogger.SPAM, "Added style " + style, null);
+      }
     }
 
     // Generated files should be passed in via addArtifacts()
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardScriptReference.java b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardScriptReference.java
index 79cc00a..456d381 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardScriptReference.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardScriptReference.java
@@ -22,7 +22,7 @@
  */
 public class StandardScriptReference extends ScriptReference {
 
-  public StandardScriptReference(String src) {
-    super(StandardLinkerContext.class, src);
+  public StandardScriptReference(String src, int index) {
+    super(StandardLinkerContext.class, src, index);
   }
 }
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardStylesheetReference.java b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardStylesheetReference.java
index 49211fa..3534663 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardStylesheetReference.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardStylesheetReference.java
@@ -22,7 +22,7 @@
  */
 public class StandardStylesheetReference extends StylesheetReference {
 
-  public StandardStylesheetReference(String src) {
-    super(StandardLinkerContext.class, src);
+  public StandardStylesheetReference(String src, int index) {
+    super(StandardLinkerContext.class, src, index);
   }
 }
diff --git a/dev/core/test/com/google/gwt/core/ext/linker/ArtifactSetTest.java b/dev/core/test/com/google/gwt/core/ext/linker/ArtifactSetTest.java
new file mode 100644
index 0000000..0121abf
--- /dev/null
+++ b/dev/core/test/com/google/gwt/core/ext/linker/ArtifactSetTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2008 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.core.ext.linker;
+
+import com.google.gwt.core.ext.linker.impl.StandardScriptReference;
+import com.google.gwt.core.ext.linker.impl.StandardStylesheetReference;
+
+import junit.framework.TestCase;
+
+import java.util.SortedSet;
+
+/**
+ * Tests for {@link ArtifactSet}.
+ */
+public class ArtifactSetTest extends TestCase {
+
+  public void testScriptOrder() {
+    StandardScriptReference fooScript = new StandardScriptReference("foo", 0);
+    StandardScriptReference barScript = new StandardScriptReference("bar", 1);
+    assertTrue(fooScript.compareTo(barScript) < 0);
+    assertTrue(barScript.compareTo(fooScript) > 0);
+    assertTrue(fooScript.compareTo(fooScript) == 0);
+    assertTrue(barScript.compareTo(barScript) == 0);
+
+    {
+      ArtifactSet set = new ArtifactSet();
+      // Add in order.
+      set.add(fooScript);
+      set.add(barScript);
+      assertEquals(2, set.size());
+      assertSame(fooScript, set.first());
+      assertSame(barScript, set.last());
+
+      SortedSet<StandardScriptReference> found = set.find(StandardScriptReference.class);
+      assertEquals(2, found.size());
+      assertSame(fooScript, found.first());
+      assertSame(barScript, found.last());
+    }
+    {
+      ArtifactSet set = new ArtifactSet();
+      // Reversed add order.
+      set.add(barScript);
+      set.add(fooScript);
+      assertEquals(2, set.size());
+      assertSame(fooScript, set.first());
+      assertSame(barScript, set.last());
+
+      SortedSet<StandardScriptReference> found = set.find(StandardScriptReference.class);
+      assertEquals(2, found.size());
+      assertSame(fooScript, found.first());
+      assertSame(barScript, found.last());
+    }
+
+  }
+
+  public void testStyleOrder() {
+    StandardStylesheetReference fooStyle = new StandardStylesheetReference(
+        "foo", 0);
+    StandardStylesheetReference barStyle = new StandardStylesheetReference(
+        "bar", 1);
+    assertTrue(fooStyle.compareTo(barStyle) < 0);
+    assertTrue(barStyle.compareTo(fooStyle) > 0);
+    assertTrue(fooStyle.compareTo(fooStyle) == 0);
+    assertTrue(barStyle.compareTo(barStyle) == 0);
+
+    {
+      ArtifactSet set = new ArtifactSet();
+      // Add in order.
+      set.add(fooStyle);
+      set.add(barStyle);
+      assertEquals(2, set.size());
+      assertSame(fooStyle, set.first());
+      assertSame(barStyle, set.last());
+
+      SortedSet<StandardStylesheetReference> found = set.find(StandardStylesheetReference.class);
+      assertEquals(2, found.size());
+      assertSame(fooStyle, found.first());
+      assertSame(barStyle, found.last());
+    }
+    {
+      ArtifactSet set = new ArtifactSet();
+      // Reversed add order.
+      set.add(barStyle);
+      set.add(fooStyle);
+      assertEquals(2, set.size());
+      assertSame(fooStyle, set.first());
+      assertSame(barStyle, set.last());
+
+      SortedSet<StandardStylesheetReference> found = set.find(StandardStylesheetReference.class);
+      assertEquals(2, found.size());
+      assertSame(fooStyle, found.first());
+      assertSame(barStyle, found.last());
+    }
+
+  }
+}
