diff --git a/pom.xml b/pom.xml
index cae665a..ba44425 100644
--- a/pom.xml
+++ b/pom.xml
@@ -442,6 +442,13 @@
     </dependency>
 
     <dependency>
+      <groupId>gwtexpui</groupId>
+      <artifactId>gwtexpui</artifactId>
+      <version>1.0-SNAPSHOT</version>
+      <scope>compile</scope>
+    </dependency>
+
+    <dependency>
       <groupId>gerrit</groupId>
       <artifactId>executablewar</artifactId>
       <version>1.0</version>
diff --git a/src/main/java/com/google/gerrit/Gerrit.gwt.xml b/src/main/java/com/google/gerrit/Gerrit.gwt.xml
index 31a53ea..97f19ba 100644
--- a/src/main/java/com/google/gerrit/Gerrit.gwt.xml
+++ b/src/main/java/com/google/gerrit/Gerrit.gwt.xml
@@ -2,6 +2,10 @@
   <inherits name='com.google.gwt.user.User'/>
   <inherits name='com.google.gwtjsonrpc.GWTJSONRPC'/>
   <inherits name='com.google.gwtorm.GWTORM'/>
+  <inherits name='com.google.gwtexpui.clippy.Clippy'/>
+  <inherits name='com.google.gwtexpui.progress.Progress'/>
+  <inherits name='com.google.gwtexpui.safehtml.SafeHtml'/>
+
   <inherits name='com.google.gwt.user.theme.chrome.Chrome'/>
   <inherits name='com.google.gerrit.UserAgent'/>
   <extend-property name="locale" values="en"/>
diff --git a/src/main/java/com/google/gerrit/client/ErrorDialog.java b/src/main/java/com/google/gerrit/client/ErrorDialog.java
index c5467e4..a95e49d 100644
--- a/src/main/java/com/google/gerrit/client/ErrorDialog.java
+++ b/src/main/java/com/google/gerrit/client/ErrorDialog.java
@@ -15,12 +15,12 @@
 package com.google.gerrit.client;
 
 import com.google.gerrit.client.rpc.Common;
-import com.google.gerrit.client.ui.AutoCenterDialogBox;
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.ClickListener;
 import com.google.gwt.user.client.ui.FlowPanel;
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.Widget;
+import com.google.gwtexpui.user.client.AutoCenterDialogBox;
 import com.google.gwtjsonrpc.client.RemoteJsonException;
 
 /** A dialog box showing an error message, when bad things happen. */
diff --git a/src/main/java/com/google/gerrit/client/SignInDialog.java b/src/main/java/com/google/gerrit/client/SignInDialog.java
index d7046c1..eaa61b8 100644
--- a/src/main/java/com/google/gerrit/client/SignInDialog.java
+++ b/src/main/java/com/google/gerrit/client/SignInDialog.java
@@ -20,7 +20,6 @@
 import com.google.gerrit.client.reviewdb.Account;
 import com.google.gerrit.client.rpc.Common;
 import com.google.gerrit.client.rpc.GerritCallback;
-import com.google.gerrit.client.ui.AutoCenterDialogBox;
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DeferredCommand;
@@ -29,6 +28,7 @@
 import com.google.gwt.user.client.ui.FlowPanel;
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.Widget;
+import com.google.gwtexpui.user.client.AutoCenterDialogBox;
 import com.google.gwtjsonrpc.client.CallbackHandle;
 
 /**
diff --git a/src/main/java/com/google/gerrit/client/account/ContactPanel.java b/src/main/java/com/google/gerrit/client/account/ContactPanel.java
index 6714156..55b6681 100644
--- a/src/main/java/com/google/gerrit/client/account/ContactPanel.java
+++ b/src/main/java/com/google/gerrit/client/account/ContactPanel.java
@@ -20,7 +20,6 @@
 import com.google.gerrit.client.reviewdb.ContactInformation;
 import com.google.gerrit.client.rpc.Common;
 import com.google.gerrit.client.rpc.GerritCallback;
-import com.google.gerrit.client.ui.AutoCenterDialogBox;
 import com.google.gerrit.client.ui.TextSaveButtonListener;
 import com.google.gwt.i18n.client.LocaleInfo;
 import com.google.gwt.user.client.ui.Button;
@@ -40,6 +39,7 @@
 import com.google.gwt.user.client.ui.TextBox;
 import com.google.gwt.user.client.ui.VerticalPanel;
 import com.google.gwt.user.client.ui.Widget;
+import com.google.gwtexpui.user.client.AutoCenterDialogBox;
 import com.google.gwtjsonrpc.client.VoidResult;
 
 import java.sql.Timestamp;
diff --git a/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java b/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java
index a11921b..da085e7 100644
--- a/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java
+++ b/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java
@@ -21,12 +21,12 @@
 import com.google.gerrit.client.reviewdb.Change;
 import com.google.gerrit.client.ui.AccountDashboardLink;
 import com.google.gerrit.client.ui.ChangeLink;
-import com.google.gerrit.client.ui.CopyableText;
 import com.google.gerrit.client.ui.ProjectOpenLink;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.FlowPanel;
 import com.google.gwt.user.client.ui.Grid;
 import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
+import com.google.gwtexpui.clippy.client.CopyableLabel;
 
 public class ChangeInfoBlock extends Composite {
   private static final int R_OWNER = 0;
@@ -84,7 +84,7 @@
 
     final FlowPanel fp = new FlowPanel();
     fp.add(new ChangeLink(Util.C.changePermalink(), chg.getId()));
-    fp.add(new CopyableText(ChangeLink.permalink(chg.getId()), false));
+    fp.add(new CopyableLabel(ChangeLink.permalink(chg.getId()), false));
     table.setWidget(R_PERMALINK, 1, fp);
   }
 }
diff --git a/src/main/java/com/google/gerrit/client/changes/PatchSetPanel.java b/src/main/java/com/google/gerrit/client/changes/PatchSetPanel.java
index af95b25..34b7c0a 100644
--- a/src/main/java/com/google/gerrit/client/changes/PatchSetPanel.java
+++ b/src/main/java/com/google/gerrit/client/changes/PatchSetPanel.java
@@ -31,7 +31,6 @@
 import com.google.gerrit.client.reviewdb.UserIdentity;
 import com.google.gerrit.client.rpc.Common;
 import com.google.gerrit.client.rpc.GerritCallback;
-import com.google.gerrit.client.ui.CopyableText;
 import com.google.gerrit.client.ui.DomUtil;
 import com.google.gerrit.client.ui.RefreshListener;
 import com.google.gwt.user.client.Window;
@@ -45,6 +44,7 @@
 import com.google.gwt.user.client.ui.Panel;
 import com.google.gwt.user.client.ui.Widget;
 import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
+import com.google.gwtexpui.clippy.client.CopyableLabel;
 import com.google.gwtjsonrpc.client.VoidResult;
 
 import java.util.ArrayList;
@@ -181,7 +181,7 @@
       r.append(changeDetail.getChange().getChangeId());
       r.append("/");
       r.append(patchSet.getPatchSetId());
-      downloads.add(new CopyableText(r.toString()));
+      downloads.add(new CopyableLabel(r.toString()));
     }
 
     if (changeDetail.isAllowsAnonymous()
@@ -196,7 +196,7 @@
       r.append(projectName);
       r.append(" ");
       r.append(patchSet.getRefName());
-      downloads.add(new CopyableText(r.toString()));
+      downloads.add(new CopyableLabel(r.toString()));
 
     } else if (Gerrit.isSignedIn() && Gerrit.getUserAccount() != null
         && Gerrit.getUserAccount().getSshUserName() != null
@@ -216,7 +216,7 @@
       r.append(projectName);
       r.append(" ");
       r.append(patchSet.getRefName());
-      downloads.add(new CopyableText(r.toString()));
+      downloads.add(new CopyableLabel(r.toString()));
     }
 
     infoTable.setWidget(R_DOWNLOAD, 1, downloads);
diff --git a/src/main/java/com/google/gerrit/client/changes/PatchTable.java b/src/main/java/com/google/gerrit/client/changes/PatchTable.java
index e5c073c..3c60775 100644
--- a/src/main/java/com/google/gerrit/client/changes/PatchTable.java
+++ b/src/main/java/com/google/gerrit/client/changes/PatchTable.java
@@ -19,12 +19,12 @@
 import com.google.gerrit.client.reviewdb.PatchSet;
 import com.google.gerrit.client.ui.DomUtil;
 import com.google.gerrit.client.ui.FancyFlexTable;
-import com.google.gerrit.client.ui.ProgressMeter;
 import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.History;
 import com.google.gwt.user.client.IncrementalCommand;
 import com.google.gwt.user.client.ui.SourcesTableEvents;
 import com.google.gwt.user.client.ui.TableListener;
+import com.google.gwtexpui.progress.client.ProgressBar;
 
 import java.util.List;
 
@@ -160,7 +160,7 @@
     private int stage;
     private int row;
     private double start;
-    private ProgressMeter meter;
+    private ProgressBar meter;
 
     private DisplayCommand(final List<Patch> list) {
       this.list = list;
@@ -216,7 +216,7 @@
     void initMeter() {
       if (meter == null) {
         resetHtml("<tr><td></td></tr>");
-        meter = new ProgressMeter(Util.M.loadingPatchSet(psid.get()));
+        meter = new ProgressBar(Util.M.loadingPatchSet(psid.get()));
         table.setWidget(0, 0, meter);
       }
       updateMeter();
diff --git a/src/main/java/com/google/gerrit/client/ui/AutoCenterDialogBox.java b/src/main/java/com/google/gerrit/client/ui/AutoCenterDialogBox.java
deleted file mode 100644
index e10cf72..0000000
--- a/src/main/java/com/google/gerrit/client/ui/AutoCenterDialogBox.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// 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.gerrit.client.ui;
-
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.WindowResizeListener;
-import com.google.gwt.user.client.ui.DialogBox;
-
-/** A DialogBox that automatically re-centers itself if the window changes */
-public class AutoCenterDialogBox extends DialogBox {
-  private WindowResizeListener recenter;
-
-  public AutoCenterDialogBox() {
-  }
-
-  public AutoCenterDialogBox(final boolean autoHide) {
-    super(autoHide);
-  }
-
-  public AutoCenterDialogBox(final boolean autoHide, final boolean modal) {
-    super(autoHide, modal);
-  }
-
-  @Override
-  public void show() {
-    if (recenter == null) {
-      recenter = new WindowResizeListener() {
-        public void onWindowResized(final int width, final int height) {
-          onResize(width, height);
-        }
-      };
-      Window.addWindowResizeListener(recenter);
-    }
-    super.show();
-  }
-
-  @Override
-  protected void onUnload() {
-    if (recenter != null) {
-      Window.removeWindowResizeListener(recenter);
-      recenter = null;
-    }
-    super.onUnload();
-  }
-
-  protected void onResize(final int width, final int height) {
-    if (isAttached()) {
-      center();
-    }
-  }
-}
diff --git a/src/main/java/com/google/gerrit/client/ui/CopyableText.java b/src/main/java/com/google/gerrit/client/ui/CopyableText.java
deleted file mode 100644
index 618a952..0000000
--- a/src/main/java/com/google/gerrit/client/ui/CopyableText.java
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2009 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.gerrit.client.ui;
-
-import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
-import com.google.gwt.user.client.ui.ClickListener;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.FlowPanel;
-import com.google.gwt.user.client.ui.FocusListener;
-import com.google.gwt.user.client.ui.InlineLabel;
-import com.google.gwt.user.client.ui.KeyboardListenerAdapter;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.TextBox;
-import com.google.gwt.user.client.ui.Widget;
-
-public class CopyableText extends Composite implements ClickListener {
-  private static final CopyableTextImpl impl;
-
-  static {
-    if (UserAgent.hasFlash) {
-      impl = new CopyableTextImplFlash();
-    } else {
-      impl = new CopyableTextImpl();
-    }
-  }
-
-  private final FlowPanel content;
-  private final String text;
-  private Label textLabel;
-  private TextBox textBox;
-
-  public CopyableText(final String str) {
-    this(str, true);
-  }
-
-  public CopyableText(final String str, final boolean showLabel) {
-    content = new FlowPanel();
-    content.setStyleName("gerrit-CopyableText");
-    initWidget(content);
-
-    text = str;
-    if (showLabel) {
-      textLabel = new InlineLabel(getText());
-      textLabel.setStyleName("gerrit-CopyableText-Label");
-      textLabel.addClickListener(this);
-      content.add(textLabel);
-    }
-    impl.inject(this);
-  }
-
-  public String getText() {
-    return text;
-  }
-
-  public void onClick(final Widget source) {
-    if (textLabel == source) {
-      showTextBox();
-    }
-  }
-
-  private void showTextBox() {
-    if (textBox == null) {
-      textBox = new TextBox();
-      textBox.setText(getText());
-      textBox.setVisibleLength(getText().length());
-      textBox.addKeyboardListener(new KeyboardListenerAdapter() {
-        @Override
-        public void onKeyPress(final Widget sender, final char kc, final int mod) {
-          if ((mod & MODIFIER_CTRL) == MODIFIER_CTRL
-              || (mod & MODIFIER_META) == MODIFIER_META) {
-            switch (kc) {
-              case 'c':
-              case 'x':
-                DeferredCommand.addCommand(new Command() {
-                  public void execute() {
-                    hideTextBox();
-                  }
-                });
-                break;
-            }
-          }
-        }
-      });
-      textBox.addFocusListener(new FocusListener() {
-        public void onFocus(Widget arg0) {
-        }
-
-        public void onLostFocus(Widget arg0) {
-          hideTextBox();
-        }
-      });
-      content.insert(textBox, 1);
-    }
-
-    textLabel.setVisible(false);
-    textBox.setVisible(true);
-    textBox.selectAll();
-    textBox.setFocus(true);
-  }
-
-  private void hideTextBox() {
-    if (textBox != null) {
-      textBox.removeFromParent();
-      textBox = null;
-    }
-    textLabel.setVisible(true);
-  }
-}
diff --git a/src/main/java/com/google/gerrit/client/ui/CopyableTextImpl.java b/src/main/java/com/google/gerrit/client/ui/CopyableTextImpl.java
deleted file mode 100644
index 647ea95..0000000
--- a/src/main/java/com/google/gerrit/client/ui/CopyableTextImpl.java
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2009 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.gerrit.client.ui;
-
-class CopyableTextImpl {
-  void inject(final CopyableText widget) {
-  }
-}
diff --git a/src/main/java/com/google/gerrit/client/ui/CopyableTextImplFlash.java b/src/main/java/com/google/gerrit/client/ui/CopyableTextImplFlash.java
deleted file mode 100644
index 484e8a2..0000000
--- a/src/main/java/com/google/gerrit/client/ui/CopyableTextImplFlash.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2009 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.gerrit.client.ui;
-
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.http.client.URL;
-import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Element;
-
-class CopyableTextImplFlash extends CopyableTextImpl {
-  private static final int SWF_WIDTH = 110;
-  private static final int SWF_HEIGHT = 14;
-  private static final String swfUrl =
-      GWT.getModuleBaseURL() + "clippy1.cache.swf";
-
-  @Override
-  void inject(final CopyableText widget) {
-    final String flashVars = "text=" + URL.encodeComponent(widget.getText());
-    final StringBuilder html = new StringBuilder();
-
-    final Element span = DOM.createSpan();
-    DOM.setElementProperty(span, "className", "gerrit-CopyableText-SWF");
-    html.append("<object");
-    html.append(" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\"");
-    html.append(" width=\"" + SWF_WIDTH + "\"");
-    html.append(" height=\"" + SWF_HEIGHT + "\"");
-    html.append(">");
-    param(html, "movie", swfUrl);
-    param(html, "FlashVars", flashVars);
-
-    html.append("<embed ");
-    html.append(" type=\"application/x-shockwave-flash\"");
-    html.append(" width=\"" + SWF_WIDTH + "\"");
-    html.append(" height=\"" + SWF_HEIGHT + "\"");
-    attribute(html, "src", swfUrl);
-    attribute(html, "FlashVars", flashVars);
-    html.append("/>");
-
-    html.append("</object>");
-
-    DOM.setInnerHTML(span, html.toString());
-    DOM.appendChild(widget.getElement(), span);
-  }
-
-  private static void param(StringBuilder html, String name, String value) {
-    html.append("<param");
-    attribute(html, "name", name);
-    attribute(html, "value", value);
-    html.append("/>");
-  }
-
-  private static void attribute(StringBuilder html, String name, String value) {
-    html.append(" ");
-    html.append(name);
-    html.append("=\"");
-    html.append(DomUtil.escape(value));
-    html.append("\"");
-  }
-}
diff --git a/src/main/java/com/google/gerrit/client/ui/DomUtil.java b/src/main/java/com/google/gerrit/client/ui/DomUtil.java
index 56e147c..3ae0abf 100644
--- a/src/main/java/com/google/gerrit/client/ui/DomUtil.java
+++ b/src/main/java/com/google/gerrit/client/ui/DomUtil.java
@@ -14,92 +14,29 @@
 
 package com.google.gerrit.client.ui;
 
-import com.google.gwt.core.client.GWT;
+import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
 
 /** Utilities for dealing with the DOM. */
 public abstract class DomUtil {
-  private static final Impl INSTANCE;
-
-  static {
-    if (GWT.isClient())
-      INSTANCE = new ClientImpl();
-    else
-      INSTANCE = new JavaImpl();
-  }
-
   /** Escape XML/HTML special characters in the input string. */
   public static String escape(final String in) {
-    return INSTANCE.escape(in);
+    return new SafeHtmlBuilder().append(in).asString();
   }
 
   /** Convert bare URLs into &lt;a href&gt; tags. */
   public static String linkify(final String in) {
-    return INSTANCE.linkify(in);
+    return in.replaceAll("(https?://[^ \n\r\t]*)", "<a href=\"$1\">$1</a>");
   }
 
   /** Do wiki style formatting to make it pretty */
   public static String wikify(String in) {
-    in = INSTANCE.escape(in);
-    in = INSTANCE.linkify(in);
-    in = INSTANCE.wikify(in);
+    in = escape(in);
+    in = linkify(in);
+    in = in.replaceAll("(^|\n)([ \t][^\n]*)", "$1<span class=\"gerrit-preformat\">$2</span><br />");
+    in = in.replaceAll("\n\n", "<p>\n");
     return in;
   }
 
   private DomUtil() {
   }
-
-  private static abstract class Impl {
-    abstract String escape(String in);
-
-    String wikify(String s) {
-      s = s.replaceAll("(^|\n)([ \t][^\n]*)", "$1<span class=\"gerrit-preformat\">$2</span><br />");
-      s = s.replaceAll("\n\n", "<p>\n");
-      return s;
-    }
-
-    String linkify(String in) {
-      return in.replaceAll("(https?://[^ \n\r\t]*)", "<a href=\"$1\">$1</a>");
-    }
-  }
-
-  private static class ClientImpl extends Impl {
-    @Override
-    native String escape(String src)
-    /*-{ return src.replace(/&/g,'&amp;')
-                   .replace(/>/g,'&gt;')
-                   .replace(/</g,'&lt;')
-                   .replace(/"/g,'&quot;')
-                   .replace(/'/g,'&#39;')
-                   ; }-*/;
-  }
-
-  private static class JavaImpl extends Impl {
-    @Override
-    String escape(final String in) {
-      final StringBuilder r = new StringBuilder(in.length());
-      for (int i = 0; i < in.length(); i++) {
-        final char c = in.charAt(i);
-        switch (c) {
-          case '&':
-            r.append("&amp;");
-            break;
-          case '>':
-            r.append("&gt;");
-            break;
-          case '<':
-            r.append("&lt;");
-            break;
-          case '"':
-            r.append("&quot;");
-            break;
-          case '\'':
-            r.append("&#39;");
-            break;
-          default:
-            r.append(c);
-        }
-      }
-      return r.toString();
-    }
-  }
 }
diff --git a/src/main/java/com/google/gerrit/client/ui/ProgressMeter.java b/src/main/java/com/google/gerrit/client/ui/ProgressMeter.java
deleted file mode 100644
index 8193d59..0000000
--- a/src/main/java/com/google/gerrit/client/ui/ProgressMeter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2009 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.gerrit.client.ui;
-
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.FlowPanel;
-import com.google.gwt.user.client.ui.Label;
-
-public class ProgressMeter extends Composite {
-  private final String callerText;
-  private final Label bar;
-  private final Label msg;
-
-  public ProgressMeter() {
-    this("");
-  }
-
-  public ProgressMeter(final String text) {
-    if (text == null || text.length() == 0) {
-      callerText = "";
-    } else {
-      callerText = text + " ";
-    }
-
-    final FlowPanel body = new FlowPanel();
-    body.setStyleName("gerrit-ProgressMeter");
-
-    msg = new Label(callerText);
-    msg.setStyleName("gerrit-ProgressMeterText");
-    body.add(msg);
-
-    bar = new Label("");
-    bar.setStyleName("gerrit-ProgressMeterBar");
-    body.add(bar);
-
-    initWidget(body);
-  }
-
-  public void setValue(final int v) {
-    bar.setWidth("" + (2 * v) + "px");
-    msg.setText(callerText + v + "%");
-  }
-}
diff --git a/src/main/java/com/google/gerrit/client/ui/UserAgent.java b/src/main/java/com/google/gerrit/client/ui/UserAgent.java
deleted file mode 100644
index 5b6e193..0000000
--- a/src/main/java/com/google/gerrit/client/ui/UserAgent.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2009 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.gerrit.client.ui;
-
-/**
- * User agent feature tests we don't create permutations for.
- * <p>
- * Some features aren't worth creating full permutations in GWT for, as it each
- * new boolean permutation (only two settings) doubles the compile time
- * required. If the setting only affects a couple of lines of JavaScript code,
- * the slightly larger cache files for user agents that lack the functionality
- * requested is trivial compared to the time developers lose building Gerrit.
- */
-public class UserAgent {
-  /** Does the browser have ShockwaveFlash plugin enabled? */
-  public static final boolean hasFlash = hasFlash();
-
-  private static native boolean hasFlash()
-  /*-{
-    if (navigator.plugins && navigator.plugins.length) {
-      if (navigator.plugins['Shockwave Flash'])     return true;
-      if (navigator.plugins['Shockwave Flash 2.0']) return true;
-
-    } else if (navigator.mimeTypes && navigator.mimeTypes.length) {
-      var mimeType = navigator.mimeTypes['application/x-shockwave-flash'];
-      if (mimeType && mimeType.enabledPlugin) return true;
-
-    } else {
-      try { new ActiveXObject('ShockwaveFlash.ShockwaveFlash.7'); return true; } catch (e) {}
-      try { new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6'); return true; } catch (e) {}
-      try { new ActiveXObject('ShockwaveFlash.ShockwaveFlash');   return true; } catch (e) {}
-    }
-    return false;
-  }-*/;
-
-  private UserAgent() {
-  }
-}
diff --git a/src/main/java/com/google/gerrit/public/Gerrit.css b/src/main/java/com/google/gerrit/public/Gerrit.css
index c219cd1..59d1f4f 100644
--- a/src/main/java/com/google/gerrit/public/Gerrit.css
+++ b/src/main/java/com/google/gerrit/public/Gerrit.css
@@ -72,42 +72,6 @@
   font-weight: bold;
 }
 
-.gerrit-ProgressMeter {
-  position: relative;
-  border: 1px solid #6B90DA;
-  height: 20px;
-  width: 200px;
-}
-.gerrit-ProgressMeterText {
-  position: absolute;
-  bottom: 0;
-  left: 0;
-  z-index: 2;
-  width: 200px;
-  padding-bottom: 3px;
-  text-align: center;
-  font-weight: bold;
-  font-style: italic;
-  font-size: smaller;
-}
-.gerrit-ProgressMeterBar {
-  background: #F0F7F9;
-  border-right: 1px solid #D0D7D9;
-  position: absolute;
-  top: 0;
-  left: 0;
-  height: 20px;
-}
-
-.gerrit-CopyableText {
-}
-.gerrit-CopyableText-Label {
-  vertical-align: top;
-}
-.gerrit-CopyableText-SWF {
-  margin-left: 5px;
-}
-
 
 /** Menu **/
 .gwt-MenuItem a,
diff --git a/src/main/java/com/google/gerrit/public/clippy1.cache.swf b/src/main/java/com/google/gerrit/public/clippy1.cache.swf
deleted file mode 100644
index e46886c..0000000
--- a/src/main/java/com/google/gerrit/public/clippy1.cache.swf
+++ /dev/null
Binary files differ
diff --git a/src/main/java/com/google/gerrit/server/CacheControlFilter.java b/src/main/java/com/google/gerrit/server/CacheControlFilter.java
deleted file mode 100644
index 32fba5d..0000000
--- a/src/main/java/com/google/gerrit/server/CacheControlFilter.java
+++ /dev/null
@@ -1,93 +0,0 @@
-// 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.gerrit.server;
-
-import java.io.IOException;
-
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Forces GWT resources to cache for a very long time.
- * <p>
- * GWT compiled JavaScript and ImageBundles can be cached indefinitely by a
- * browser and/or an edge proxy, as they never contain user-specific data and
- * are named by a unique checksum. If their content is ever modified then the
- * URL changes, so user agents would request a different resource. We force
- * these resources to have very long expiration times.
- */
-public class CacheControlFilter implements Filter {
-  public void init(final FilterConfig config) {
-  }
-
-  public void destroy() {
-  }
-
-  public void doFilter(final ServletRequest sreq, final ServletResponse srsp,
-      final FilterChain chain) throws IOException, ServletException {
-    final HttpServletRequest req = (HttpServletRequest) sreq;
-    final HttpServletResponse rsp = (HttpServletResponse) srsp;
-    final String pathInfo = pathInfo(req);
-
-    if (cacheForever(pathInfo)) {
-      rsp.setHeader("Cache-Control", "max-age=31536000,public");
-      rsp.setDateHeader("Expires", System.currentTimeMillis() + 31536000000L);
-    } else if (nocache(pathInfo)) {
-      rsp.setHeader("Expires", "Fri, 01 Jan 1980 00:00:00 GMT");
-      rsp.setHeader("Pragma", "no-cache");
-      rsp.setHeader("Cache-Control", "no-cache, must-revalidate");
-    }
-
-    chain.doFilter(req, rsp);
-  }
-
-  private static boolean cacheForever(final String pathInfo) {
-    if (pathInfo.endsWith(".cache.gif")) {
-      return true;
-    }
-    if (pathInfo.endsWith(".cache.html")) {
-      return true;
-    }
-    if (pathInfo.endsWith(".cache.png")) {
-      return true;
-    }
-    if (pathInfo.endsWith(".cache.jar")) {
-      return true;
-    }
-    if (pathInfo.endsWith(".cache.swf")) {
-      return true;
-    }
-    return false;
-  }
-
-  private static boolean nocache(final String pathInfo) {
-    if (pathInfo.endsWith(".nocache.js")) {
-      return true;
-    }
-    return false;
-  }
-
-  private static String pathInfo(final HttpServletRequest req) {
-    final String uri = req.getRequestURI();
-    final String ctx = req.getContextPath();
-    return uri.startsWith(ctx) ? uri.substring(ctx.length()) : uri;
-  }
-}
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 5d78cbc..eea4a20 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -23,7 +23,7 @@
 
   <filter>
     <filter-name>CacheControl</filter-name>
-    <filter-class>com.google.gerrit.server.CacheControlFilter</filter-class>
+    <filter-class>com.google.gwtexpui.server.CacheControlFilter</filter-class>
   </filter>
   <filter-mapping>
     <filter-name>CacheControl</filter-name>
