diff --git a/distro-source/linux/src/benchmarkViewer b/distro-source/linux/src/benchmarkViewer
index 1735d0a..7b308d7 100755
--- a/distro-source/linux/src/benchmarkViewer
+++ b/distro-source/linux/src/benchmarkViewer
@@ -1,3 +1,3 @@
 #!/bin/sh
 APPDIR=`dirname $0`;
-java -Dcom.google.gwt.junit.reportPath="$1" -cp "$APPDIR/gwt-user.jar:$APPDIR/gwt-dev-linux.jar:$APPDIR/gwt-benchmark-viewer.jar" com.google.gwt.dev.GWTShell -port auto com.google.gwt.junit.viewer.ReportViewer/ReportViewer.html?gwt.hybrid;
+java -Dcom.google.gwt.junit.reportPath="$1" -cp "$APPDIR/gwt-user.jar:$APPDIR/gwt-dev-linux.jar:$APPDIR/gwt-benchmark-viewer.jar" com.google.gwt.dev.GWTShell -port auto com.google.gwt.benchmarks.viewer.ReportViewer/ReportViewer.html?gwt.hybrid;
diff --git a/distro-source/mac/src/benchmarkViewer b/distro-source/mac/src/benchmarkViewer
index e6dd9a6..acf4b22 100755
--- a/distro-source/mac/src/benchmarkViewer
+++ b/distro-source/mac/src/benchmarkViewer
@@ -1,3 +1,3 @@
 #!/bin/sh
 APPDIR=`dirname $0`;
-java  -Dcom.google.gwt.junit.reportPath="$1" -XstartOnFirstThread -cp "$APPDIR/gwt-user.jar:$APPDIR/gwt-dev-mac.jar:$APPDIR/gwt-benchmark-viewer.jar" com.google.gwt.dev.GWTShell -port auto com.google.gwt.junit.viewer.ReportViewer/ReportViewer.html?gwt.hybrid;
+java  -Dcom.google.gwt.junit.reportPath="$1" -XstartOnFirstThread -cp "$APPDIR/gwt-user.jar:$APPDIR/gwt-dev-mac.jar:$APPDIR/gwt-benchmark-viewer.jar" com.google.gwt.dev.GWTShell -port auto com.google.gwt.benchmarks.viewer.ReportViewer/ReportViewer.html?gwt.hybrid;
diff --git a/distro-source/windows/src/benchmarkViewer.cmd b/distro-source/windows/src/benchmarkViewer.cmd
index 28ae3b7..bddc9d9 100755
--- a/distro-source/windows/src/benchmarkViewer.cmd
+++ b/distro-source/windows/src/benchmarkViewer.cmd
@@ -1 +1 @@
-@java -Dcom.google.gwt.junit.reportPath="%1" -cp "%~dp0/gwt-user.jar;%~dp0/gwt-dev-windows.jar;%~dp0/gwt-benchmark-viewer.jar" com.google.gwt.dev.GWTShell -port auto com.google.gwt.junit.viewer.ReportViewer/ReportViewer.html?gwt.hybrid;
+@java -Dcom.google.gwt.junit.reportPath="%1" -cp "%~dp0/gwt-user.jar;%~dp0/gwt-dev-windows.jar;%~dp0/gwt-benchmark-viewer.jar" com.google.gwt.dev.GWTShell -port auto com.google.gwt.benchmarks.viewer.ReportViewer/ReportViewer.html?gwt.hybrid;
diff --git a/tools/benchmark-viewer/build.xml b/tools/benchmark-viewer/build.xml
index 431f444..bf460e9 100755
--- a/tools/benchmark-viewer/build.xml
+++ b/tools/benchmark-viewer/build.xml
@@ -15,8 +15,8 @@
 	<import file="${gwt.root}/common.ant.xml" />
 
         <property name="tools.build" value="${gwt.build.out}/${project.tail}" />
-        <property name="tools.module" value="com.google.gwt.junit.viewer.ReportViewer" />
-        <property name="tools.module.path" value="com/google/gwt/junit/viewer/public" />
+        <property name="tools.module" value="com.google.gwt.benchmarks.viewer.ReportViewer" />
+        <property name="tools.module.path" value="com/google/gwt/benchmarks/viewer/public" />
 
 	<!--
 		Default hosted mode test cases
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/ReportViewer.gwt.xml b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/ReportViewer.gwt.xml
similarity index 83%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/ReportViewer.gwt.xml
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/ReportViewer.gwt.xml
index 3017acf..96ab3a2 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/ReportViewer.gwt.xml
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/ReportViewer.gwt.xml
@@ -20,10 +20,10 @@
 
   <source path="client"/>
 
-  <entry-point class="com.google.gwt.junit.viewer.client.ReportViewer"/>
+  <entry-point class="com.google.gwt.benchmarks.viewer.client.ReportViewer"/>
 
-  <servlet path='/test_reports' class='com.google.gwt.junit.viewer.server.ReportServerImpl'/>
-  <servlet path='/test_images' class='com.google.gwt.junit.viewer.server.ReportImageServer'/>
+  <servlet path='/test_reports' class='com.google.gwt.benchmarks.viewer.server.ReportServerImpl'/>
+  <servlet path='/test_images' class='com.google.gwt.benchmarks.viewer.server.ReportImageServer'/>
 
   <stylesheet src="ReportViewer.css"/>
 </module>
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Benchmark.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Benchmark.java
similarity index 84%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Benchmark.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Benchmark.java
index d150928..421ad8a 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Benchmark.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Benchmark.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.client;
+package com.google.gwt.benchmarks.viewer.client;
 
 import com.google.gwt.user.client.rpc.IsSerializable;
 
@@ -30,10 +30,7 @@
 
   private String name;
 
-  /**
-   * @gwt.typeArgs <com.google.gwt.junit.viewer.client.Result>
-   */
-  private List/* <Result> */results;
+  private List<Result> results;
 
   private String sourceCode;
 
@@ -49,7 +46,7 @@
     return name;
   }
 
-  public List/* <Result> */getResults() {
+  public List<Result> getResults() {
     return results;
   }
 
@@ -69,7 +66,7 @@
     this.name = name;
   }
 
-  public void setResults(List results) {
+  public void setResults(List<Result> results) {
     this.results = results;
   }
 
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/BrowserInfo.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/BrowserInfo.java
similarity index 98%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/BrowserInfo.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/BrowserInfo.java
index dd627f5..33bbe91 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/BrowserInfo.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/BrowserInfo.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.client;
+package com.google.gwt.benchmarks.viewer.client;
 
 /**
  * Provides information about a browser (vendor,version,operating system,etc...)
@@ -39,6 +39,7 @@
    * @return A pretty-printed version of the browser including the a) vendor b)
    *         version c) and operating system
    */
+  @SuppressWarnings("unused")
   public static String getBrowser(String userAgent) {
 
     userAgent = userAgent.toLowerCase();
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Category.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Category.java
similarity index 81%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Category.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Category.java
index 8b94ae9..2748aff 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Category.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Category.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.client;
+package com.google.gwt.benchmarks.viewer.client;
 
 import com.google.gwt.user.client.rpc.IsSerializable;
 
@@ -24,16 +24,13 @@
  */
 public class Category implements IsSerializable {
 
-  /**
-   * @gwt.typeArgs <com.google.gwt.junit.viewer.client.Benchmark>
-   */
-  private List benchmarks;
+  private List<Benchmark> benchmarks;
 
   private String description;
 
   private String name;
 
-  public List getBenchmarks() {
+  public List<Benchmark> getBenchmarks() {
     return benchmarks;
   }
 
@@ -45,7 +42,7 @@
     return name;
   }
 
-  public void setBenchmarks(List benchmarks) {
+  public void setBenchmarks(List<Benchmark> benchmarks) {
     this.benchmarks = benchmarks;
   }
 
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Report.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Report.java
similarity index 78%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Report.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Report.java
index 187bbfc..b179ab4 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Report.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Report.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.client;
+package com.google.gwt.benchmarks.viewer.client;
 
 import com.google.gwt.user.client.rpc.IsSerializable;
 
@@ -25,21 +25,19 @@
  */
 public class Report implements IsSerializable {
 
-  /**
-   * @gwt.typeArgs <com.google.gwt.junit.viewer.client.Category>
-   */
-  private List/* <Category> */categories;
+  private List<Category> categories;
 
   private Date date;
 
-  private String dateString; // Temporary addition until we get better date
+  // Temporary addition until we get better date
+  private String dateString;
 
   // formatting in GWT
   private String gwtVersion;
 
   private String id;
 
-  public List/* <Category> */getCategories() {
+  public List<Category> getCategories() {
     return categories;
   }
 
@@ -64,15 +62,15 @@
     boolean testsPassed = true;
 
     for (int i = 0; i < categories.size(); ++i) {
-      Category c = (Category) categories.get(i);
-      List benchmarks = c.getBenchmarks();
+      Category c = categories.get(i);
+      List<Benchmark> benchmarks = c.getBenchmarks();
       numTests += benchmarks.size();
     }
 
     return new ReportSummary(id, date, dateString, numTests, testsPassed);
   }
 
-  public void setCategories(List categories) {
+  public void setCategories(List<Category> categories) {
     this.categories = categories;
   }
 
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/ReportServer.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/ReportServer.java
similarity index 86%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/ReportServer.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/ReportServer.java
index f21fe6f..74f554b 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/ReportServer.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/ReportServer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.client;
+package com.google.gwt.benchmarks.viewer.client;
 
 import com.google.gwt.user.client.rpc.RemoteService;
 
@@ -40,8 +40,6 @@
    * Returns a list of summaries of all the Benchmark reports.
    * 
    * @return a non-null list of ReportSummary
-   * 
-   * @gwt.typeArgs <com.google.gwt.junit.viewer.client.ReportSummary>
    */
-  public List/* <ReportSummary> */getReportSummaries();
+  public List<ReportSummary> getReportSummaries();
 }
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/ReportServerAsync.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/ReportServerAsync.java
similarity index 74%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/ReportServerAsync.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/ReportServerAsync.java
index e669e19..03d7bac 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/ReportServerAsync.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/ReportServerAsync.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,10 +13,12 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.client;
+package com.google.gwt.benchmarks.viewer.client;
 
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
+import java.util.List;
+
 /**
  * The asynchronous interface for ReportServer.
  * 
@@ -24,7 +26,7 @@
  */
 public interface ReportServerAsync {
 
-  public void getReport(String reportId, AsyncCallback callback);
+  public void getReport(String reportId, AsyncCallback<Report> callback);
 
-  public void getReportSummaries(AsyncCallback callback);
+  public void getReportSummaries(AsyncCallback<List<ReportSummary>> callback);
 }
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/ReportSummary.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/ReportSummary.java
similarity index 94%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/ReportSummary.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/ReportSummary.java
index 889861e..2d944ed 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/ReportSummary.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/ReportSummary.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.client;
+package com.google.gwt.benchmarks.viewer.client;
 
 import com.google.gwt.user.client.rpc.IsSerializable;
 
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/ReportViewer.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/ReportViewer.java
similarity index 83%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/ReportViewer.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/ReportViewer.java
index 6d9583b..d6e2bca 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/ReportViewer.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/ReportViewer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.client;
+package com.google.gwt.benchmarks.viewer.client;
 
 import com.google.gwt.core.client.EntryPoint;
 import com.google.gwt.core.client.GWT;
@@ -60,7 +60,7 @@
  * 
  * You can configure the location where ReportServer reads the benchmark reports
  * from by setting the system property named in
- * {@link com.google.gwt.junit.client.Benchmark#REPORT_PATH}.
+ * {@link com.google.gwt.benchmarks.client.Benchmark#REPORT_PATH}.
  */
 public class ReportViewer implements EntryPoint {
 
@@ -75,20 +75,20 @@
 
   private class SummariesTableListener implements TableListener {
 
-    private FlexTable summariesTable;
+    private final FlexTable mySummariesTable;
 
     SummariesTableListener(FlexTable summariesTable) {
-      this.summariesTable = summariesTable;
+      this.mySummariesTable = summariesTable;
     }
 
     public void onCellClicked(SourcesTableEvents sender, int row, int col) {
       if (currentSelectedRow != -1) {
-        summariesTable.getRowFormatter().removeStyleName(currentSelectedRow,
+        mySummariesTable.getRowFormatter().removeStyleName(currentSelectedRow,
             "viewer-SelectedRow");
       }
       currentSelectedRow = row;
-      summariesTable.getRowFormatter().addStyleName(row, "viewer-SelectedRow");
-      ReportSummary summary = (ReportSummary) summaries.get(row - 1);
+      mySummariesTable.getRowFormatter().addStyleName(row, "viewer-SelectedRow");
+      ReportSummary summary = summaries.get(row - 1);
       getReportDetails(summary.getId());
     }
   }
@@ -109,7 +109,7 @@
 
   HTML statusLabel;
 
-  List/* <ReportSummary> */summaries;
+  List<ReportSummary> summaries;
 
   VerticalPanel summariesPanel;
 
@@ -128,23 +128,21 @@
     target.setServiceEntryPoint(GWT.getModuleBaseURL() + "test_reports");
     reportServer = (ReportServerAsync) target;
 
-    reportServer.getReportSummaries(new AsyncCallback() {
+    reportServer.getReportSummaries(new AsyncCallback<List<ReportSummary>>() {
       public void onFailure(Throwable caught) {
         String msg = "<p>" + caught.toString() + "</p>"
             + "<p>Is your path to the reports correct?</p>";
         statusLabel.setHTML(msg);
       }
 
-      public void onSuccess(Object result) {
-        summaries = (List/* <ReportSummary> */) result;
+      public void onSuccess(List<ReportSummary> result) {
+        summaries = result;
         if (summaries != null) {
           if (summaries.size() == 0) {
             statusLabel.setText("There are no benchmark reports available in this folder.");
           }
-          Collections.sort(summaries, new Comparator() {
-            public int compare(Object o1, Object o2) {
-              ReportSummary r1 = (ReportSummary) o1;
-              ReportSummary r2 = (ReportSummary) o2;
+          Collections.sort(summaries, new Comparator<ReportSummary>() {
+            public int compare(ReportSummary r1, ReportSummary r2) {
               return r2.getDate().compareTo(r1.getDate()); // most recent first
             }
           });
@@ -178,16 +176,14 @@
     // topTable.setWidget( 0, 0, tempReportTable );
     int currentRow = 1;
 
-    Collections.sort(report.getCategories(), new Comparator() {
-      public int compare(Object o1, Object o2) {
-        Category c1 = (Category) o1;
-        Category c2 = (Category) o2;
+    Collections.sort(report.getCategories(), new Comparator<Category>() {
+      public int compare(Category c1, Category c2) {
         return c1.getName().compareTo(c2.getName());
       }
     }); // Should be done once in the RPC
 
     for (int i = 0; i < report.getCategories().size(); ++i) {
-      Category c = (Category) report.getCategories().get(i);
+      Category c = report.getCategories().get(i);
 
       if (!c.getName().equals("")) {
         FlexTable categoryTable = new FlexTable();
@@ -204,16 +200,14 @@
         topTable.setWidget(currentRow++, 0, categoryTable);
       }
 
-      Collections.sort(c.getBenchmarks(), new Comparator() {
-        public int compare(Object o1, Object o2) {
-          Benchmark b1 = (Benchmark) o1;
-          Benchmark b2 = (Benchmark) o2;
+      Collections.sort(c.getBenchmarks(), new Comparator<Benchmark>() {
+        public int compare(Benchmark b1, Benchmark b2) {
           return b1.getName().compareTo(b2.getName());
         }
       }); // Should be done once in the RPC
 
       for (int j = 0; j < c.getBenchmarks().size(); ++j) {
-        Benchmark benchmark = (Benchmark) c.getBenchmarks().get(j);
+        Benchmark benchmark = c.getBenchmarks().get(j);
 
         FlexTable benchmarkTable = new FlexTable();
         benchmarkTable.setBorderWidth(0);
@@ -258,19 +252,26 @@
         FlexTable.FlexCellFormatter resultsFormatter = resultsTable.getFlexCellFormatter();
         topTable.setWidget(currentRow++, 0, resultsTable);
 
-        Collections.sort(benchmark.getResults(), new Comparator() {
-          public int compare(Object o1, Object o2) {
-            Result r1 = (Result) o1;
-            Result r2 = (Result) o2;
+        Collections.sort(benchmark.getResults(), new Comparator<Result>() {
+          public int compare(Result r1, Result r2) {
             return r1.getAgent().compareTo(r2.getAgent());
           }
         }); // Should be done once in the RPC
 
-        final List trialsTables = new ArrayList();
+        final List<FlexTable> trialsTables = new ArrayList<FlexTable>();
 
-        Result sampleResult = (Result) benchmark.getResults().get(0);
-        Trial sampleTrial = (Trial) sampleResult.getTrials().get(0);
-        int numVariables = sampleTrial.getVariables().size();
+        int numVariables = 0;
+        List<String> variableNames = null;
+        if (benchmark.getResults().size() > 0) {
+          Result sampleResult = benchmark.getResults().get(0);
+          if (sampleResult.getTrials().size() > 0) {
+            Trial sampleTrial = sampleResult.getTrials().get(0);
+            numVariables = sampleTrial.getVariables().size();
+            Map<String, String> variables = sampleTrial.getVariables();
+            variableNames = new ArrayList<String>(variables.keySet());
+            Collections.sort(variableNames);
+          }
+        }
         final MutableBool isVisible = new MutableBool(numVariables > 2);
         String buttonName = isVisible.value ? "Hide Data" : "Show Data";
 
@@ -278,7 +279,7 @@
           public void onClick(Widget sender) {
             isVisible.value = !isVisible.value;
             for (int i = 0; i < trialsTables.size(); ++i) {
-              Widget w = (Widget) trialsTables.get(i);
+              Widget w = trialsTables.get(i);
               w.setVisible(isVisible.value);
             }
             String name = isVisible.value ? "Hide Data" : "Show Data";
@@ -287,8 +288,7 @@
         });
 
         for (int k = 0; k < benchmark.getResults().size(); ++k) {
-          Result result = (Result) benchmark.getResults().get(k);
-          List trials = result.getTrials();
+          Result result = benchmark.getResults().get(k);
 
           // Currently only support graphs for results of 2 variables or less
           if (numVariables <= 2) {
@@ -335,15 +335,9 @@
 
           resultsTable.setWidget(2, k, trialsTable);
 
-          int numTrials = trials.size();
-
-          Map variables = sampleTrial.getVariables();
-          List variableNames = new ArrayList(variables.keySet());
-          Collections.sort(variableNames);
-
           // Write out the variable column headers
           for (int varIndex = 0; varIndex < numVariables; ++varIndex) {
-            String varName = (String) variableNames.get(varIndex);
+            String varName = variableNames.get(varIndex);
             trialsTable.setHTML(0, varIndex, varName);
           }
 
@@ -351,24 +345,23 @@
           trialsTable.setHTML(0, numVariables, "Timing (ms)");
 
           // Write out all the trial data
-          for (int l = 0; l < numTrials; ++l) {
-            Trial trial = (Trial) trials.get(l);
-
+          int l = 0;
+          for (Trial trial : result.getTrials()) {
             // Write the variable values
             for (int varIndex = 0; varIndex < numVariables; ++varIndex) {
-              String varName = (String) variableNames.get(varIndex);
-              String varValue = (String) trial.getVariables().get(varName);
+              String varName = variableNames.get(varIndex);
+              String varValue = trial.getVariables().get(varName);
               trialsTable.setHTML(l + 1, varIndex, varValue);
             }
 
             // Write out the timing data
-            String data = null;
-            if (trial.getException() != null) {
-              data = trial.getException();
-            } else {
-              data = trial.getRunTimeMillis() + "";
-            }
+            String data = trial.getRunTimeMillis() + "";
             trialsTable.setHTML(l + 1, numVariables, data);
+            ++l;
+          }
+          
+          if (result.getException() != null) {
+            trialsTable.setHTML(l + 1, numVariables, result.getException());
           }
         }
       }
@@ -396,7 +389,7 @@
     }
 
     for (int i = 0; i < summaries.size(); ++i) {
-      ReportSummary summary = (ReportSummary) summaries.get(i);
+      ReportSummary summary = summaries.get(i);
       int index = i + 1;
       tempSummariesTable.setHTML(index, 0, "<a href=\"javascript:void(0)\">"
           + summary.getId() + "</a>");
@@ -445,13 +438,13 @@
    */
   private void getReportDetails(String id) {
     statusLabel.setText("Retrieving the report...");
-    reportServer.getReport(id, new AsyncCallback() {
+    reportServer.getReport(id, new AsyncCallback<Report>() {
       public void onFailure(Throwable caught) {
         statusLabel.setText(caught.toString());
       }
 
-      public void onSuccess(Object result) {
-        report = (Report) result;
+      public void onSuccess(Report result) {
+        report = result;
         statusLabel.setText("Finished fetching report details.");
         displayReport();
       }
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Result.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Result.java
similarity index 75%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Result.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Result.java
index 7ee6efa..d6add52 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Result.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Result.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.client;
+package com.google.gwt.benchmarks.viewer.client;
 
 import com.google.gwt.user.client.rpc.IsSerializable;
 
@@ -26,12 +26,11 @@
 
   private String agent;
 
+  private String exception;
+
   private String host;
 
-  /**
-   * @gwt.typeArgs <com.google.gwt.junit.viewer.client.Trial>
-   */
-  private List trials;
+  private List<Trial> trials;
 
   public Result() {
   }
@@ -40,11 +39,15 @@
     return agent;
   }
 
+  public String getException() {
+    return exception;
+  }
+
   public String getHost() {
     return host;
   }
 
-  public List getTrials() {
+  public List<Trial> getTrials() {
     return trials;
   }
 
@@ -52,11 +55,15 @@
     this.agent = agent;
   }
 
+  public void setException(String exception) {
+    this.exception = exception;
+  }
+
   public void setHost(String host) {
     this.host = host;
   }
 
-  public void setTrials(List trials) {
+  public void setTrials(List<Trial> trials) {
     this.trials = trials;
   }
 }
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Trial.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Trial.java
similarity index 70%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Trial.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Trial.java
index 5bd3a54..604dfc1 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/client/Trial.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/client/Trial.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.client;
+package com.google.gwt.benchmarks.viewer.client;
 
 import com.google.gwt.user.client.rpc.IsSerializable;
 
@@ -25,22 +25,9 @@
  */
 public class Trial implements IsSerializable {
 
-  String exception;
+  private double runTimeMillis;
 
-  double runTimeMillis;
-
-  /**
-   * @gwt.typeArgs <java.lang.String,java.lang.String>
-   */
-  Map/* <String,String> */variables;
-
-  public Trial() {
-    this.variables = new HashMap();
-  }
-
-  public String getException() {
-    return exception;
-  }
+  private Map<String, String> variables = new HashMap<String, String>();
 
   public double getRunTimeMillis() {
     return runTimeMillis;
@@ -50,14 +37,10 @@
    * Returns the names and values of the variables used in the test. If there
    * were no variables, the map is empty.
    */
-  public Map getVariables() {
+  public Map<String, String> getVariables() {
     return variables;
   }
 
-  public void setException(String exception) {
-    this.exception = exception;
-  }
-
   public void setRunTimeMillis(double runTimeMillis) {
     this.runTimeMillis = runTimeMillis;
   }
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/public/ReportViewer.css b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/public/ReportViewer.css
similarity index 100%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/public/ReportViewer.css
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/public/ReportViewer.css
diff --git a/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/public/ReportViewer.html b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/public/ReportViewer.html
new file mode 100644
index 0000000..d58fc13
--- /dev/null
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/public/ReportViewer.html
@@ -0,0 +1,8 @@
+<html>
+  <head>
+    <title>ReportViewer</title>
+  </head>
+  <body bgcolor="white">
+    <script language="javascript" src="com.google.gwt.benchmarks.viewer.ReportViewer.nocache.js"></script>
+  </body>
+</html>
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/public/gradient.gif b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/public/gradient.gif
similarity index 100%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/public/gradient.gif
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/public/gradient.gif
Binary files differ
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/BenchmarkXml.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/BenchmarkXml.java
similarity index 75%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/BenchmarkXml.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/BenchmarkXml.java
index b47ae72..933788a 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/BenchmarkXml.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/BenchmarkXml.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,9 +13,10 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.server;
+package com.google.gwt.benchmarks.viewer.server;
 
-import com.google.gwt.junit.viewer.client.Benchmark;
+import com.google.gwt.benchmarks.viewer.client.Benchmark;
+import com.google.gwt.benchmarks.viewer.client.Result;
 
 import org.w3c.dom.Element;
 
@@ -34,10 +35,10 @@
     benchmark.setName(element.getAttribute("name"));
     benchmark.setDescription(element.getAttribute("description"));
 
-    List children = ReportXml.getElementChildren(element, "result");
-    benchmark.setResults(new ArrayList/* <Result> */(children.size()));
+    List<Element> children = ReportXml.getElementChildren(element, "result");
+    benchmark.setResults(new ArrayList<Result>(children.size()));
     for (int i = 0; i < children.size(); ++i) {
-      benchmark.getResults().add(ResultXml.fromXml((Element) children.get(i)));
+      benchmark.getResults().add(ResultXml.fromXml(children.get(i)));
     }
 
     Element code = ReportXml.getElementChild(element, "source_code");
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/CategoryXml.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/CategoryXml.java
similarity index 70%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/CategoryXml.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/CategoryXml.java
index 2c10a64..1ca5ffa 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/CategoryXml.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/CategoryXml.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,9 +13,10 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.server;
+package com.google.gwt.benchmarks.viewer.server;
 
-import com.google.gwt.junit.viewer.client.Category;
+import com.google.gwt.benchmarks.viewer.client.Benchmark;
+import com.google.gwt.benchmarks.viewer.client.Category;
 
 import org.w3c.dom.Element;
 
@@ -32,12 +33,10 @@
     category.setName(element.getAttribute("name"));
     category.setDescription(element.getAttribute("description"));
 
-    List/* <Element> */children = ReportXml.getElementChildren(element,
-        "benchmark");
-    category.setBenchmarks(new ArrayList/* <Benchmark> */(children.size()));
+    List<Element> children = ReportXml.getElementChildren(element, "benchmark");
+    category.setBenchmarks(new ArrayList<Benchmark>(children.size()));
     for (int i = 0; i < children.size(); ++i) {
-      category.getBenchmarks().add(
-          BenchmarkXml.fromXml((Element) children.get(i)));
+      category.getBenchmarks().add(BenchmarkXml.fromXml(children.get(i)));
     }
 
     return category;
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ReportDatabase.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ReportDatabase.java
similarity index 83%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ReportDatabase.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ReportDatabase.java
index 63fde7e..8d3160b 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ReportDatabase.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ReportDatabase.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,11 +13,11 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.server;
+package com.google.gwt.benchmarks.viewer.server;
 
-import com.google.gwt.junit.client.Benchmark;
-import com.google.gwt.junit.viewer.client.Report;
-import com.google.gwt.junit.viewer.client.ReportSummary;
+import com.google.gwt.benchmarks.client.Benchmark;
+import com.google.gwt.benchmarks.viewer.client.Report;
+import com.google.gwt.benchmarks.viewer.client.ReportSummary;
 
 import org.w3c.dom.Document;
 
@@ -59,9 +59,9 @@
   }
 
   private static class ReportEntry {
-    private ReportSummary summary;
-    private Report report;
     private long lastModified;
+    private Report report;
+    private ReportSummary summary;
 
     public ReportEntry(Report report, ReportSummary summary, long lastModified) {
       this.report = report;
@@ -80,13 +80,13 @@
     }
   }
 
+  private static ReportDatabase database = new ReportDatabase();
+
   /**
    * The amount of time to go between report updates.
    */
   private static final int UPDATE_DURATION_MILLIS = 30000;
 
-  private static ReportDatabase database = new ReportDatabase();
-
   public static ReportDatabase getInstance() {
     return database;
   }
@@ -96,16 +96,26 @@
   }
 
   /**
-   * A list of all reports by id.
-   */
-  private Map/* <String,ReportEntry> */reports = new HashMap/* <String,ReportEntry> */();
-
-  /**
    * The last time we updated our reports.
    */
   private long lastUpdateMillis = -1L;
 
   /**
+   * The path to read benchmark reports from.
+   */
+  private final String reportPath;
+
+  /**
+   * A list of all reports by id.
+   */
+  private Map<String, ReportEntry> reports = new HashMap<String, ReportEntry>();
+
+  /**
+   * Lock for reports.
+   */
+  private Object reportsLock = new Object();
+
+  /**
    * Lock for updating from file system. (Guarantees a single update while not
    * holding reportsLock open).
    */
@@ -116,16 +126,6 @@
    */
   private boolean updating = false;
 
-  /**
-   * Lock for reports.
-   */
-  private Object reportsLock = new Object();
-
-  /**
-   * The path to read benchmark reports from.
-   */
-  private final String reportPath;
-
   private ReportDatabase() throws BadPathException {
     String path = System.getProperty(Benchmark.REPORT_PATH);
     if (path == null || path.trim().equals("")) {
@@ -140,12 +140,12 @@
 
   public Report getReport(String reportId) {
     synchronized (reportsLock) {
-      ReportEntry entry = (ReportEntry) reports.get(reportId);
+      ReportEntry entry = reports.get(reportId);
       return entry == null ? null : entry.report;
     }
   }
 
-  public List/* <ReportSummary> */getReportSummaries() {
+  public List<ReportSummary> getReportSummaries() {
 
     /**
      * There are probably ways to make this faster, but I've taken basic
@@ -171,10 +171,9 @@
     }
 
     synchronized (reportsLock) {
-      List/* <ReportSummary> */summaries = new ArrayList/* <ReportSummary> */(
+      List<ReportSummary> summaries = new ArrayList<ReportSummary>(
           reports.size());
-      for (Iterator it = reports.values().iterator(); it.hasNext();) {
-        ReportEntry entry = (ReportEntry) it.next();
+      for (ReportEntry entry : reports.values()) {
         summaries.add(entry.summary);
       }
       return summaries;
@@ -191,8 +190,8 @@
       }
     });
 
-    Map filesToUpdate = new HashMap();
-    Map filesById = new HashMap();
+    Map<String, ReportEntry> filesToUpdate = new HashMap<String, ReportEntry>();
+    Map<String, ReportFile> filesById = new HashMap<String, ReportFile>();
     for (int i = 0; i < files.length; ++i) {
       File f = files[i];
       filesById.put(getReportId(f), new ReportFile(f));
@@ -207,16 +206,15 @@
       for (int i = 0; i < files.length; ++i) {
         File file = files[i];
         String reportId = getReportId(file);
-        ReportEntry entry = (ReportEntry) reports.get(reportId);
+        ReportEntry entry = reports.get(reportId);
         if (entry == null || entry.lastModified < file.lastModified()) {
           filesToUpdate.put(reportId, null);
         }
       }
 
       // Remove reports which no longer exist
-      for (Iterator it = reports.keySet().iterator(); it.hasNext();) {
-        String id = (String) it.next();
-        if (filesById.get(id) == null) {
+      for (Iterator<String> it = reports.keySet().iterator(); it.hasNext();) {
+        if (filesById.get(it.next()) == null) {
           it.remove();
         }
       }
@@ -228,9 +226,8 @@
       factory.setIgnoringComments(true);
       DocumentBuilder builder = factory.newDocumentBuilder();
 
-      for (Iterator it = filesToUpdate.keySet().iterator(); it.hasNext();) {
-        String id = (String) it.next();
-        ReportFile reportFile = (ReportFile) filesById.get(id);
+      for (String id : filesToUpdate.keySet()) {
+        ReportFile reportFile = filesById.get(id);
         String filePath = reportFile.file.getAbsolutePath();
         Document doc = builder.parse(filePath);
         Report report = ReportXml.fromXml(doc.getDocumentElement());
@@ -242,8 +239,7 @@
 
       // Update the reports
       synchronized (reportsLock) {
-        for (Iterator it = filesToUpdate.keySet().iterator(); it.hasNext();) {
-          String id = (String) it.next();
+        for (String id : filesToUpdate.keySet()) {
           reports.put(id, filesToUpdate.get(id));
         }
       }
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ReportImageServer.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ReportImageServer.java
similarity index 74%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ReportImageServer.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ReportImageServer.java
index 0e90015..07ca35d 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ReportImageServer.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ReportImageServer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,48 +13,46 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.server;
+package com.google.gwt.benchmarks.viewer.server;
 
-import com.google.gwt.junit.viewer.client.Benchmark;
-import com.google.gwt.junit.viewer.client.BrowserInfo;
-import com.google.gwt.junit.viewer.client.Category;
-import com.google.gwt.junit.viewer.client.Report;
-import com.google.gwt.junit.viewer.client.Result;
-import com.google.gwt.junit.viewer.client.Trial;
+import com.google.gwt.benchmarks.viewer.client.Benchmark;
+import com.google.gwt.benchmarks.viewer.client.BrowserInfo;
+import com.google.gwt.benchmarks.viewer.client.Category;
+import com.google.gwt.benchmarks.viewer.client.Report;
+import com.google.gwt.benchmarks.viewer.client.Result;
+import com.google.gwt.benchmarks.viewer.client.Trial;
 
 import org.jfree.chart.ChartFactory;
 import org.jfree.chart.JFreeChart;
 import org.jfree.chart.axis.ValueAxis;
-import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
 import org.jfree.chart.encoders.EncoderUtil;
 import org.jfree.chart.encoders.ImageFormat;
+import org.jfree.chart.plot.CategoryPlot;
+import org.jfree.chart.plot.DefaultDrawingSupplier;
+import org.jfree.chart.plot.DrawingSupplier;
+import org.jfree.chart.plot.Plot;
 import org.jfree.chart.plot.PlotOrientation;
 import org.jfree.chart.plot.XYPlot;
-import org.jfree.chart.plot.Plot;
-import org.jfree.chart.plot.DrawingSupplier;
-import org.jfree.chart.plot.DefaultDrawingSupplier;
-import org.jfree.chart.plot.CategoryPlot;
+import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
 import org.jfree.data.category.DefaultCategoryDataset;
+import org.jfree.data.xy.XYDataItem;
 import org.jfree.data.xy.XYSeries;
 import org.jfree.data.xy.XYSeriesCollection;
 
-import java.awt.image.BufferedImage;
+import java.awt.BasicStroke;
 import java.awt.Color;
 import java.awt.Font;
 import java.awt.GradientPaint;
-import java.awt.BasicStroke;
-import java.awt.Shape;
 import java.awt.Polygon;
-import java.awt.geom.Rectangle2D;
+import java.awt.Shape;
 import java.awt.geom.Ellipse2D;
-import java.io.ByteArrayInputStream;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -93,30 +91,23 @@
 
   private static final String charset = "UTF-8";
 
-  private static void copy(InputStream in, OutputStream out) throws IOException {
-    byte[] buf = new byte[512];
-
-    while (true) {
-      int bytesRead = in.read(buf);
-      if (bytesRead == -1) {
-        break;
-      }
-      out.write(buf, 0, bytesRead);
-    }
-  }
-
+  @Override
   public void doGet(HttpServletRequest request, HttpServletResponse response) {
     try {
       handleRequest(request, response);
     } catch (Exception e) {
-      logException("An error occured while trying to create the chart.", e,
-          response);
+      if (e.getClass().getName().endsWith("ClientAbortException")) {
+        // No big deal, the client browser terminated a download.
+      } else {
+        logException("An error occured while trying to create the chart.", e,
+            response);
+      }
       return;
     }
   }
 
   private JFreeChart createChart(String testName, Result result, String title,
-      List comparativeResults) {
+      List<Result> comparativeResults) {
 
     // Find the maximum values across both axes for all of the results
     // (this chart's own results, plus all comparative results).
@@ -127,20 +118,20 @@
 
     double maxTime = 0;
 
-    for (int i = 0; i < comparativeResults.size(); ++i) {
-      Result r = (Result) comparativeResults.get(i);
-      List resultTrials = r.getTrials();
-
-      for (int j = 0; j < resultTrials.size(); ++j) {
-        Trial t = (Trial) resultTrials.get(j);
+    for (Result r : comparativeResults) {
+      for (Trial t : r.getTrials()) {
         maxTime = Math.max(maxTime, t.getRunTimeMillis());
       }
     }
 
     // Determine the number of variables in this benchmark method
-    List trials = result.getTrials();
-    Trial firstTrial = (Trial) trials.get(0);
-    int numVariables = firstTrial.getVariables().size();
+    List<Trial> trials = result.getTrials();
+    Trial firstTrial = new Trial();
+    int numVariables = 0;
+    if (trials.size() > 0) {
+      firstTrial = trials.get(0);
+      numVariables = firstTrial.getVariables().size();
+    }
 
     // Display the trial data.
     //
@@ -154,52 +145,47 @@
     String domainVariable = null;
     String seriesVariable = null;
 
-    Map/* <String,Set<String>> */variableValues = null;
+    Map<String, Set<String>> variableValues = null;
 
     if (numVariables == 1) {
-      domainVariable = (String) firstTrial.getVariables().keySet().iterator().next();
+      domainVariable = firstTrial.getVariables().keySet().iterator().next();
     } else {
       // TODO(tobyr): Do something smarter, like allow the user to specify which
       // variables are domain and series, along with the variables which are
       // held constant.
 
-      variableValues = new HashMap();
+      variableValues = new HashMap<String, Set<String>>();
 
       for (int i = 0; i < trials.size(); ++i) {
-        Trial trial = (Trial) trials.get(i);
-        Map variables = trial.getVariables();
+        Trial trial = trials.get(i);
+        Map<String, String> variables = trial.getVariables();
 
-        for (Iterator it = variables.entrySet().iterator(); it.hasNext();) {
-          Map.Entry entry = (Map.Entry) it.next();
-          String variable = (String) entry.getKey();
-          String value = (String) entry.getValue();
-          Set set = (Set) variableValues.get(variable);
+        for (Map.Entry<String, String> entry : variables.entrySet()) {
+          String variable = entry.getKey();
+          Set<String> set = variableValues.get(variable);
           if (set == null) {
-            set = new TreeSet();
+            set = new TreeSet<String>();
             variableValues.put(variable, set);
           }
-          set.add(value);
+          set.add(entry.getValue());
         }
       }
 
-      TreeMap numValuesMap = new TreeMap();
+      TreeMap<Integer, List<String>> numValuesMap = new TreeMap<Integer, List<String>>();
 
-      for (Iterator it = variableValues.entrySet().iterator(); it.hasNext();) {
-        Map.Entry entry = (Map.Entry) it.next();
-        String variable = (String) entry.getKey();
-        Set values = (Set) entry.getValue();
-        Integer numValues = new Integer(values.size());
-        List variables = (List) numValuesMap.get(numValues);
+      for (Map.Entry<String, Set<String>> entry : variableValues.entrySet()) {
+        Integer numValues = new Integer(entry.getValue().size());
+        List<String> variables = numValuesMap.get(numValues);
         if (variables == null) {
-          variables = new ArrayList();
+          variables = new ArrayList<String>();
           numValuesMap.put(numValues, variables);
         }
-        variables.add(variable);
+        variables.add(entry.getKey());
       }
 
       if (numValuesMap.values().size() > 0) {
-        domainVariable = (String) ((List) numValuesMap.get(numValuesMap.lastKey())).get(0);
-        seriesVariable = (String) ((List) numValuesMap.get(numValuesMap.firstKey())).get(0);
+        domainVariable = numValuesMap.get(numValuesMap.lastKey()).get(0);
+        seriesVariable = numValuesMap.get(numValuesMap.firstKey()).get(0);
       }
     }
 
@@ -208,10 +194,8 @@
     if (numVariables == 0) {
       // Show a bar graph, with a single centered simple bar
       // 0 variables means there is only 1 trial
-      Trial trial = (Trial) trials.iterator().next();
-
       DefaultCategoryDataset data = new DefaultCategoryDataset();
-      data.addValue(trial.getRunTimeMillis(), "result", "result");
+      data.addValue(firstTrial.getRunTimeMillis(), "result", "result");
 
       JFreeChart chart = ChartFactory.createBarChart(title, testName,
           valueTitle, data, PlotOrientation.VERTICAL, false, false, false);
@@ -229,13 +213,9 @@
 
       XYSeries series = new XYSeries(domainVariable);
 
-      for (Iterator it = trials.iterator(); it.hasNext();) {
-        Trial trial = (Trial) it.next();
-        if (trial.getException() != null) {
-          continue;
-        }
+      for (Trial trial : trials) {
         double time = trial.getRunTimeMillis();
-        String domainValue = (String) trial.getVariables().get(domainVariable);
+        String domainValue = trial.getVariables().get(domainVariable);
         series.add(Double.parseDouble(domainValue), time);
       }
 
@@ -252,22 +232,16 @@
       // Show a line graph with two series
       XYSeriesCollection data = new XYSeriesCollection();
 
-      Set seriesValues = (Set) variableValues.get(seriesVariable);
+      Set<String> seriesValues = variableValues.get(seriesVariable);
 
-      for (Iterator it = seriesValues.iterator(); it.hasNext();) {
-        String seriesValue = (String) it.next();
+      for (String seriesValue : seriesValues) {
         XYSeries series = new XYSeries(seriesValue);
 
-        for (Iterator trialsIt = trials.iterator(); trialsIt.hasNext();) {
-          Trial trial = (Trial) trialsIt.next();
-          if (trial.getException() != null) {
-            continue;
-          }
-          Map variables = trial.getVariables();
+        for (Trial trial : trials) {
+          Map<String, String> variables = trial.getVariables();
           if (variables.get(seriesVariable).equals(seriesValue)) {
             double time = trial.getRunTimeMillis();
-            String domainValue = (String) trial.getVariables().get(
-                domainVariable);
+            String domainValue = trial.getVariables().get(domainVariable);
             series.add(Double.parseDouble(domainValue), time);
           }
         }
@@ -329,9 +303,8 @@
      */
   }
 
-  private Benchmark getBenchmarkByName(List benchmarks, String name) {
-    for (Iterator it = benchmarks.iterator(); it.hasNext();) {
-      Benchmark benchmark = (Benchmark) it.next();
+  private Benchmark getBenchmarkByName(List<Benchmark> benchmarks, String name) {
+    for (Benchmark benchmark : benchmarks) {
       if (benchmark.getName().equals(name)) {
         return benchmark;
       }
@@ -339,9 +312,9 @@
     return null;
   }
 
-  private Category getCategoryByName(List categories, String categoryName) {
-    for (Iterator catIt = categories.iterator(); catIt.hasNext();) {
-      Category category = (Category) catIt.next();
+  private Category getCategoryByName(List<Category> categories,
+      String categoryName) {
+    for (Category category : categories) {
       if (category.getName().equals(categoryName)) {
         return category;
       }
@@ -377,27 +350,26 @@
             circle, square, triangle, diamond, ellipse});
   }
 
-  private double getMaxValue(List results, String variable) {
+  private double getMaxValue(List<Result> results, String variable) {
     double value = 0.0;
 
     for (int i = 0; i < results.size(); ++i) {
-      Result r = (Result) results.get(i);
-      List resultTrials = r.getTrials();
+      Result r = results.get(i);
+      List<Trial> resultTrials = r.getTrials();
 
       for (int j = 0; j < resultTrials.size(); ++j) {
-        Trial t = (Trial) resultTrials.get(j);
-        Map variables = t.getVariables();
-        value = Math.max(value,
-            Double.parseDouble((String) variables.get(variable)));
+        Trial t = resultTrials.get(j);
+        Map<String, String> variables = t.getVariables();
+        value = Math.max(value, Double.parseDouble(variables.get(variable)));
       }
     }
 
     return value;
   }
 
-  private Result getResultsByAgent(List results, String agent) {
-    for (Iterator it = results.iterator(); it.hasNext();) {
-      Result result = (Result) it.next();
+  private Result getResultsByAgent(List<Result> results, String agent) {
+    for (Object element : results) {
+      Result result = (Result) element;
       if (result.getAgent().equals(agent)) {
         return result;
       }
@@ -420,11 +392,11 @@
 
     ReportDatabase db = ReportDatabase.getInstance();
     Report report = db.getReport(reportName);
-    List categories = report.getCategories();
+    List<Category> categories = report.getCategories();
     Category category = getCategoryByName(categories, categoryName);
-    List benchmarks = category.getBenchmarks();
+    List<Benchmark> benchmarks = category.getBenchmarks();
     Benchmark benchmark = getBenchmarkByName(benchmarks, testName);
-    List results = benchmark.getResults();
+    List<Result> results = benchmark.getResults();
     Result result = getResultsByAgent(results, agent);
 
     String title = BrowserInfo.getBrowser(agent);
@@ -462,10 +434,14 @@
     BufferedImage img = chart.createBufferedImage(graphWidth, 240);
     byte[] image = EncoderUtil.encode(img, ImageFormat.PNG);
 
+    // The images have unique URLs; might as well set them to never expire.
+    response.setHeader("Cache-Control", "max-age=0");
+    response.setHeader("Expires", "Fri, 2 Jan 1970 00:00:00 GMT");
     response.setContentType("image/png");
+    response.setContentLength(image.length);
 
     OutputStream output = response.getOutputStream();
-    copy(new ByteArrayInputStream(image), output);
+    output.write(image);
   }
 
   private void logException(String msg, Exception e,
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ReportServerImpl.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ReportServerImpl.java
similarity index 75%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ReportServerImpl.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ReportServerImpl.java
index 1a0a8e8..a6bae6b 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ReportServerImpl.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ReportServerImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,10 +13,11 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.server;
+package com.google.gwt.benchmarks.viewer.server;
 
-import com.google.gwt.junit.viewer.client.Report;
-import com.google.gwt.junit.viewer.client.ReportServer;
+import com.google.gwt.benchmarks.viewer.client.Report;
+import com.google.gwt.benchmarks.viewer.client.ReportServer;
+import com.google.gwt.benchmarks.viewer.client.ReportSummary;
 import com.google.gwt.user.server.rpc.RemoteServiceServlet;
 
 import java.util.List;
@@ -31,10 +32,7 @@
     return ReportDatabase.getInstance().getReport(reportId);
   }
 
-  /**
-   * @gwt.typeArgs <com.google.gwt.junit.viewer.client.ReportSummary>
-   */
-  public List/* <ReportSummary> */getReportSummaries() {
+  public List<ReportSummary> getReportSummaries() {
     return ReportDatabase.getInstance().getReportSummaries();
   }
 }
\ No newline at end of file
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ReportXml.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ReportXml.java
similarity index 80%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ReportXml.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ReportXml.java
index 8ce5ddd..bcccbd8 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ReportXml.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ReportXml.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,9 +13,10 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.server;
+package com.google.gwt.benchmarks.viewer.server;
 
-import com.google.gwt.junit.viewer.client.Report;
+import com.google.gwt.benchmarks.viewer.client.Category;
+import com.google.gwt.benchmarks.viewer.client.Report;
 
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -54,10 +55,10 @@
 
     report.setGwtVersion(element.getAttribute("gwt_version"));
 
-    List/* <Element> */children = getElementChildren(element, "category");
-    report.setCategories(new ArrayList/* <Category> */(children.size()));
+    List<Element> children = getElementChildren(element, "category");
+    report.setCategories(new ArrayList<Category>(children.size()));
     for (int i = 0; i < children.size(); ++i) {
-      report.getCategories().add(CategoryXml.fromXml((Element) children.get(i)));
+      report.getCategories().add(CategoryXml.fromXml(children.get(i)));
     }
 
     return report;
@@ -68,10 +69,10 @@
     return children.getLength() == 0 ? null : (Element) children.item(0);
   }
 
-  static List/* <Element> */getElementChildren(Element e, String name) {
+  static List<Element> getElementChildren(Element e, String name) {
     NodeList children = e.getElementsByTagName(name);
     int numElements = children.getLength();
-    List/* <Element> */elements = new ArrayList/* <Element> */(numElements);
+    List<Element> elements = new ArrayList<Element>(numElements);
     for (int i = 0; i < children.getLength(); ++i) {
       Node n = children.item(i);
       elements.add((Element) n);
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ResultXml.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ResultXml.java
similarity index 66%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ResultXml.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ResultXml.java
index c15aaa2..4365cca 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/ResultXml.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/ResultXml.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,9 +13,10 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.server;
+package com.google.gwt.benchmarks.viewer.server;
 
-import com.google.gwt.junit.viewer.client.Result;
+import com.google.gwt.benchmarks.viewer.client.Result;
+import com.google.gwt.benchmarks.viewer.client.Trial;
 
 import org.w3c.dom.Element;
 
@@ -24,21 +25,24 @@
 
 /**
  * Hydrates a benchmark Result from an XML Element.
- * 
  */
 public class ResultXml {
   public static Result fromXml(Element element) {
     Result result = new Result();
     result.setAgent(element.getAttribute("agent"));
     result.setHost(element.getAttribute("host"));
+    Element exception = ReportXml.getElementChild(element, "exception");
+    if (exception != null) {
+      result.setException(ReportXml.getText(exception));
+    }
 
-    List/* <Element> */children = ReportXml.getElementChildren(element, "trial");
+    List<Element> children = ReportXml.getElementChildren(element, "trial");
 
-    ArrayList trials = new ArrayList(children.size());
+    ArrayList<Trial> trials = new ArrayList<Trial>(children.size());
     result.setTrials(trials);
 
     for (int i = 0; i < children.size(); ++i) {
-      trials.add(TrialXml.fromXml((Element) children.get(i)));
+      trials.add(TrialXml.fromXml(children.get(i)));
     }
 
     // TODO(tobyr) Put some type information in here for the variables
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/TrialXml.java b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/TrialXml.java
similarity index 67%
rename from tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/TrialXml.java
rename to tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/TrialXml.java
index 001c13f..d9ad3d0 100644
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/server/TrialXml.java
+++ b/tools/benchmark-viewer/src/com/google/gwt/benchmarks/viewer/server/TrialXml.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * 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
@@ -13,19 +13,17 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.junit.viewer.server;
+package com.google.gwt.benchmarks.viewer.server;
 
-import com.google.gwt.junit.viewer.client.Trial;
+import com.google.gwt.benchmarks.viewer.client.Trial;
 
 import org.w3c.dom.Element;
 
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
 /**
  * Hydrates a benchmark Trial from an XML Element.
- * 
  */
 class TrialXml {
 
@@ -38,17 +36,11 @@
       trial.setRunTimeMillis(Double.parseDouble(timing));
     }
 
-    Element exception = ReportXml.getElementChild(element, "exception");
-    if (exception != null) {
-      trial.setException(ReportXml.getText(exception));
-    }
+    List<Element> elements = ReportXml.getElementChildren(element, "variable");
 
-    List elements = ReportXml.getElementChildren(element, "variable");
+    Map<String, String> variables = trial.getVariables();
 
-    Map variables = trial.getVariables();
-
-    for (Iterator it = elements.iterator(); it.hasNext();) {
-      Element e = (Element) it.next();
+    for (Element e : elements) {
       String name = e.getAttribute("name");
       String value = e.getAttribute("value");
       variables.put(name, value);
diff --git a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/public/ReportViewer.html b/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/public/ReportViewer.html
deleted file mode 100644
index 0d43991..0000000
--- a/tools/benchmark-viewer/src/com/google/gwt/junit/viewer/public/ReportViewer.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<html>
-        <head>
-                <meta name='gwt:module' content='com.google.gwt.junit.viewer.ReportViewer'>
-                <title>ReportViewer</title>
-        </head>
-        <body bgcolor="white">
-                <script language="javascript" src="gwt.js"></script>
-        </body>
-</html>
