diff --git a/reference/code-museum/src/com/google/gwt/museum/DefaultMuseum.gwt.xml b/reference/code-museum/src/com/google/gwt/museum/DefaultMuseum.gwt.xml
deleted file mode 100644
index 0a10e5c..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/DefaultMuseum.gwt.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<module rename-to="defaultmuseum">
-    
-    <!-- Inherit the core Web Toolkit stuff.                  -->
-    <inherits name='com.google.gwt.museum.Museum'/>
-    <source path="client/defaultmuseum"/>
-      <!-- Specify the app entry point class.                   -->
-    <entry-point class='com.google.gwt.museum.client.defaultmuseum.DefaultMuseum'/>
- </module>
diff --git a/reference/code-museum/src/com/google/gwt/museum/Issue3892Module1.gwt.xml b/reference/code-museum/src/com/google/gwt/museum/Issue3892Module1.gwt.xml
deleted file mode 100644
index d83fadc..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/Issue3892Module1.gwt.xml
+++ /dev/null
@@ -1,28 +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   -->
-<!-- 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. License for the specific language governing permissions and   -->
-<!-- limitations under the License.                                         -->
-<module rename-to="issue3892Module1">
-
-  <!-- Inherit the core Web Toolkit stuff.                  -->
-  <inherits name='com.google.gwt.user.User' />
-  <inherits name='com.google.gwt.museum.Museum' />
-  <inherits name="com.google.gwt.user.theme.standard.StandardResources" />
-  <inherits name="com.google.gwt.user.theme.chrome.ChromeResources" />
-  <inherits name="com.google.gwt.user.theme.dark.DarkResources" />
-
-  <!-- Specify the app entry point class.                   -->
-  <entry-point class='com.google.gwt.museum.client.defaultmuseum.Issue3892EntryPoint1' />
-  <source path="client/common" />
-  <source path="client/defaultmuseum" />
-  <source path="client/viewer" />
-</module>
diff --git a/reference/code-museum/src/com/google/gwt/museum/Issue3892Module2.gwt.xml b/reference/code-museum/src/com/google/gwt/museum/Issue3892Module2.gwt.xml
deleted file mode 100644
index 47fb0eb..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/Issue3892Module2.gwt.xml
+++ /dev/null
@@ -1,28 +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   -->
-<!-- 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. License for the specific language governing permissions and   -->
-<!-- limitations under the License.                                         -->
-<module rename-to="issue3892Module2">
-
-  <!-- Inherit the core Web Toolkit stuff.                  -->
-  <inherits name='com.google.gwt.user.User' />
-  <inherits name='com.google.gwt.museum.Museum' />
-  <inherits name="com.google.gwt.user.theme.standard.StandardResources" />
-  <inherits name="com.google.gwt.user.theme.chrome.ChromeResources" />
-  <inherits name="com.google.gwt.user.theme.dark.DarkResources" />
-
-  <!-- Specify the app entry point class.                   -->
-  <entry-point class="com.google.gwt.museum.client.defaultmuseum.Issue3892EntryPoint2" />
-  <source path="client/common" />
-  <source path="client/defaultmuseum" />
-  <source path="client/viewer" />
-</module>
diff --git a/reference/code-museum/src/com/google/gwt/museum/Issue3892Module3.gwt.xml b/reference/code-museum/src/com/google/gwt/museum/Issue3892Module3.gwt.xml
deleted file mode 100644
index 0b42303..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/Issue3892Module3.gwt.xml
+++ /dev/null
@@ -1,28 +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   -->
-<!-- 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. License for the specific language governing permissions and   -->
-<!-- limitations under the License.                                         -->
-<module rename-to="issue3892Module3">
-
-  <!-- Inherit the core Web Toolkit stuff.                  -->
-  <inherits name='com.google.gwt.user.User' />
-  <inherits name='com.google.gwt.museum.Museum' />
-  <inherits name="com.google.gwt.user.theme.standard.StandardResources" />
-  <inherits name="com.google.gwt.user.theme.chrome.ChromeResources" />
-  <inherits name="com.google.gwt.user.theme.dark.DarkResources" />
-
-  <!-- Specify the app entry point class.                   -->
-  <entry-point class="com.google.gwt.museum.client.defaultmuseum.Issue3892EntryPoint3" />
-  <source path="client/common" />
-  <source path="client/defaultmuseum" />
-  <source path="client/viewer" />
-</module>
diff --git a/reference/code-museum/src/com/google/gwt/museum/Museum.gwt.xml b/reference/code-museum/src/com/google/gwt/museum/Museum.gwt.xml
deleted file mode 100644
index cf72db5..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/Museum.gwt.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<module rename-to="museum">
-    
-    <!-- Inherit the core Web Toolkit stuff.                  -->
-    <inherits name='com.google.gwt.user.User'/>
-    <inherits name="com.google.gwt.user.theme.standard.StandardResources"/>
-   
-    <source path="client/common"/>
-    <source path="client/viewer"/>
-    <stylesheet src="Museum.css"/>
-</module>
diff --git a/reference/code-museum/src/com/google/gwt/museum/SingleIssue.gwt.xml b/reference/code-museum/src/com/google/gwt/museum/SingleIssue.gwt.xml
deleted file mode 100644
index 84ab025..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/SingleIssue.gwt.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<module rename-to="singleissue">
-    
-    <!-- Inherit the core Web Toolkit stuff.                  -->
-    <inherits name='com.google.gwt.user.User'/>
-    <inherits name='com.google.gwt.museum.Museum'/>
-    <inherits name="com.google.gwt.user.theme.standard.StandardResources"/>
-    <inherits name="com.google.gwt.user.theme.chrome.ChromeResources"/>
-    <inherits name="com.google.gwt.user.theme.dark.DarkResources"/>
-    
-    <!-- Specify the app entry point class.                   -->
-    <entry-point class='com.google.gwt.museum.client.defaultmuseum.VisualsForDateBox'/>
-    <source path="client/common"/>
-    <source path="client/defaultmuseum"/>
-    <source path="client/viewer"/>
-    
-    <extend-property name="locale" values="ar"/>
-</module>
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/common/AbstractIssue.java b/reference/code-museum/src/com/google/gwt/museum/client/common/AbstractIssue.java
deleted file mode 100644
index 580ca31..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/common/AbstractIssue.java
+++ /dev/null
@@ -1,129 +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.gwt.museum.client.common;
-
-import com.google.gwt.core.client.EntryPoint;
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.dom.client.Document;
-import com.google.gwt.dom.client.LinkElement;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.RootPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * An abstract issue that can be used in the code museum. Each
- * {@link AbstractIssue} should address a single issue. If at all possible, that
- * issue should be obvious from the initial ui state.
- */
-public abstract class AbstractIssue implements EntryPoint {
-  /**
-   * Headline for this issue.
-   */
-  private String headline;
-
-  /**
-   * Creates the css associated with this issue.
-   * 
-   * @return link with css
-   */
-  public LinkElement createCSS() {
-    String cssName;
-    if (hasCSS()) {
-      // Fetch the associated style sheet using an HTTP request
-      cssName = getClass().getName();
-      cssName = cssName.substring(cssName.lastIndexOf(".") + 1);
-    } else {
-      cssName = "Default";
-    }
-
-    String baseUrl = GWT.getModuleBaseURL();
-    LinkElement issueLinkElement = Document.get().createLinkElement();
-    issueLinkElement.setRel("stylesheet");
-    issueLinkElement.setType("text/css");
-    issueLinkElement.setHref(baseUrl + "issues/" + cssName + ".css");
-    return issueLinkElement;
-  }
-
-  /**
-   * <p>
-   * Create a widget that illustrates the issue. Each issue should include a
-   * detailed description of the expected results and the observed results
-   * before the issue was fixed.
-   * </p>
-   * <p>
-   * Note that createIssue will may be called multiple times if the user
-   * refreshes the issue. If you save state within the instance, you must clear
-   * it out and reset the issue when createIssue is called again.
-   * </p>
-   * 
-   * @return a widget that can reproduce the issue
-   */
-  public abstract Widget createIssue();
-
-  /**
-   * Returns the "<i>classname</i>: summary".
-   * 
-   * @return a short summary of the issue, including the class name
-   */
-  public final String getHeadline() {
-    if (headline == null) {
-      String className = getClass().getName();
-      headline = className.substring(className.lastIndexOf(".") + 1) + ": "
-          + getSummary();
-    }
-    return headline;
-  }
-
-  /**
-   * Return a detailed description of what the user should expect to see. The
-   * description will be added above the example. You can also include
-   * instructions to reproduce the issue.
-   * 
-   * @return instructions explaining what the user should see
-   */
-  public abstract String getInstructions();
-
-  /**
-   * Gets the summary for this test. All tests should include a summary so users
-   * can scan through them quickly.
-   */
-  public abstract String getSummary();
-
-  /**
-   * Does the test have css?
-   * 
-   * @return true to load a CSS file of the same name, placed in the issues
-   *         directory
-   */
-  public abstract boolean hasCSS();
-
-  /**
-   * Called immediately after the widget is attached.
-   */
-  public void onAttached() {
-    // By default do nothing.
-  }
-
-  public void onModuleLoad() {
-    Utility.getHeadElement().appendChild(createCSS());
-    Window.setTitle(getHeadline());
-    RootPanel.get().add(new HTML(getInstructions()));
-    RootPanel.get().add(createIssue());
-    onAttached();
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/common/ControlInputPanel.java b/reference/code-museum/src/com/google/gwt/museum/client/common/ControlInputPanel.java
deleted file mode 100644
index 371da89..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/common/ControlInputPanel.java
+++ /dev/null
@@ -1,107 +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.gwt.museum.client.common;
-
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.FlexTable;
-import com.google.gwt.user.client.ui.HasText;
-import com.google.gwt.user.client.ui.TextBox;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Helper class to get/set default values for visual tests.
- */
-public class ControlInputPanel extends Composite {
-  /**
-   * Input
-   * 
-   * @param <V>
-   * @param <W>
-   */
-  public abstract static class Input<V, W extends Widget> {
-    protected String name;
-    protected V value;
-    protected W widget;
-
-    protected Input(String name) {
-      this.name = name;
-      this.widget = createInputWidget();
-    }
-
-    /**
-     * Gets the name of the input
-     * 
-     * @return the name of the input
-     */
-    public String getName() {
-      return name;
-    }
-
-    /**
-     * Gets the value of this input.
-     */
-    public abstract V getValue();
-
-    @SuppressWarnings("unchecked")
-    protected W createInputWidget() {
-      return (W) new TextBox();
-    }
-
-    protected void setValue(V value) {
-      ((HasText) widget).setText(value.toString());
-    }
-  }
-
-  /**
-   * Set/get integer value.
-   */
-
-  public static class IntegerInput extends Input<Integer, TextBox> {
-    public IntegerInput(String name, int defaultValue, ControlInputPanel p) {
-      this(name, defaultValue, defaultValue, p);
-    }
-
-    public IntegerInput(String name, int defaultHostedValue,
-        int defaultWebValue, ControlInputPanel p) {
-      super(name);
-
-      this.value = GWT.isScript() ? defaultWebValue : defaultHostedValue;
-      p.add(this);
-      widget.setText(value.toString());
-    }
-
-    @Override
-    public Integer getValue() {
-      return Integer.valueOf(widget.getText());
-    }
-  }
-
-  final FlexTable layout = new FlexTable();
-
-  private int numInputs;
-
-  public ControlInputPanel() {
-    layout.setWidth("100%");
-    initWidget(layout);
-  }
-
-  private void add(Input<?, ?> input) {
-    layout.setText(0, numInputs, input.getName());
-    layout.setWidget(1, numInputs, input.widget);
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/common/EventReporter.java b/reference/code-museum/src/com/google/gwt/museum/client/common/EventReporter.java
deleted file mode 100644
index df9121f..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/common/EventReporter.java
+++ /dev/null
@@ -1,267 +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.gwt.museum.client.common;
-
-import com.google.gwt.event.dom.client.BlurEvent;
-import com.google.gwt.event.dom.client.BlurHandler;
-import com.google.gwt.event.dom.client.ChangeEvent;
-import com.google.gwt.event.dom.client.ChangeHandler;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.FocusEvent;
-import com.google.gwt.event.dom.client.FocusHandler;
-import com.google.gwt.event.dom.client.HasClickHandlers;
-import com.google.gwt.event.dom.client.KeyDownEvent;
-import com.google.gwt.event.dom.client.KeyDownHandler;
-import com.google.gwt.event.dom.client.KeyPressEvent;
-import com.google.gwt.event.dom.client.KeyPressHandler;
-import com.google.gwt.event.dom.client.KeyUpEvent;
-import com.google.gwt.event.dom.client.KeyUpHandler;
-import com.google.gwt.event.logical.shared.CloseEvent;
-import com.google.gwt.event.logical.shared.CloseHandler;
-import com.google.gwt.event.logical.shared.SelectionEvent;
-import com.google.gwt.event.logical.shared.SelectionHandler;
-import com.google.gwt.event.logical.shared.ValueChangeEvent;
-import com.google.gwt.event.logical.shared.ValueChangeHandler;
-import com.google.gwt.event.shared.HandlerRegistration;
-import com.google.gwt.user.client.ui.ChangeListener;
-import com.google.gwt.user.client.ui.CheckBox;
-import com.google.gwt.user.client.ui.ClickListener;
-import com.google.gwt.user.client.ui.FocusListener;
-import com.google.gwt.user.client.ui.HasHTML;
-import com.google.gwt.user.client.ui.HasText;
-import com.google.gwt.user.client.ui.HasWidgets;
-import com.google.gwt.user.client.ui.KeyboardListener;
-import com.google.gwt.user.client.ui.MouseListener;
-import com.google.gwt.user.client.ui.SuggestionEvent;
-import com.google.gwt.user.client.ui.SuggestionHandler;
-import com.google.gwt.user.client.ui.UIObject;
-import com.google.gwt.user.client.ui.Widget;
-import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
-
-/**
- * Helper class to create visual tests.
- * 
- * @param <V> value type
- * @param <T> target type
- */
-@SuppressWarnings("deprecation")
-public class EventReporter<V, T> extends SimpleLogger implements
-    ChangeListener, FocusListener, ValueChangeHandler<V>,
-    SelectionHandler<Suggestion>, SuggestionHandler, KeyboardListener,
-    ChangeHandler, BlurHandler, FocusHandler, ClickHandler, ClickListener,
-    CloseHandler<T>, MouseListener, KeyDownHandler, KeyUpHandler,
-    KeyPressHandler {
-
-  /**
-   * Add/remove handlers via check box.
-   * 
-   */
-  public abstract class CheckBoxEvent extends CheckBox implements
-      ValueChangeHandler<Boolean> {
-    String name;
-
-    private HandlerRegistration registration;
-
-    public CheckBoxEvent(String name, HasWidgets p) {
-      this.name = name;
-      this.setText(name);
-      p.add(this);
-      this.addValueChangeHandler(this);
-      this.setValue(true, true);
-    }
-
-    public abstract HandlerRegistration addHandler();
-
-    public void onValueChange(ValueChangeEvent<Boolean> event) {
-      if (event.getValue().booleanValue()) {
-        report("add " + name);
-        registration = addHandler();
-      } else {
-        report("remove " + name);
-        removeHandler();
-      }
-    }
-
-    public void removeHandler() {
-      registration.removeHandler();
-      registration = null;
-    }
-  }
-
-  /**
-   * Add/remove handlers via check box.
-   * 
-   */
-  public abstract class CheckBoxListener extends CheckBox implements
-      ValueChangeHandler<Boolean> {
-    String name;
-
-    public CheckBoxListener(String name, HasWidgets p) {
-      this.name = name;
-      this.setText(name);
-      p.add(this);
-      this.addValueChangeHandler(this);
-      this.setValue(true, true);
-    }
-
-    public abstract void addListener();
-
-    public void onValueChange(ValueChangeEvent<Boolean> event) {
-      if (event.getValue().booleanValue()) {
-        report("add " + name);
-        addListener();
-      } else {
-        report("remove " + name);
-        removeListener();
-      }
-    }
-
-    public abstract void removeListener();
-  }
-
-  public EventReporter() {
-  }
-
-  public EventReporter(HasWidgets parent) {
-    parent.add(this);
-  }
-
-  public void addClickHandler(final HasClickHandlers h, HasWidgets p) {
-    addClickHandler(h, p, getInfo(h) + " click handler");
-  }
-
-  public void addClickHandler(final HasClickHandlers h, HasWidgets p,
-      String title) {
-
-    new CheckBoxEvent(title, p) {
-      @Override
-      public HandlerRegistration addHandler() {
-        return h.addClickHandler(EventReporter.this);
-      }
-    };
-  }
-
-  @Override
-  public String getInfo(Object sender) {
-    if (sender instanceof HasText) {
-      return ((HasText) sender).getText();
-    } else if (sender instanceof UIObject
-        && ((UIObject) sender).getTitle() != null) {
-      return ((UIObject) sender).getTitle();
-    } else if (sender instanceof HasHTML) {
-      return ((HasHTML) sender).getHTML();
-    } else {
-      return sender.toString();
-    }
-  }
-
-  public void onBlur(BlurEvent event) {
-    report(event);
-  }
-
-  public void onChange(ChangeEvent event) {
-    report(event);
-  }
-
-  public void onChange(Widget sender) {
-    report("change on " + getInfo(sender));
-  }
-
-  public void onClick(ClickEvent event) {
-    report(event);
-  }
-
-  public void onClick(Widget sender) {
-    report("click: " + getInfo(sender));
-  }
-
-  public void onClose(CloseEvent<T> event) {
-    report("close " + getInfo(event.getTarget()));
-  }
-
-  public void onFocus(FocusEvent event) {
-    report(event);
-  }
-
-  public void onFocus(Widget sender) {
-    report("focus: " + getInfo(sender));
-  }
-
-  public void onKeyDown(KeyDownEvent event) {
-    report(event);
-  }
-
-  public void onKeyDown(Widget sender, char keyCode, int modifiers) {
-    report(getInfo(sender) + "key down code: " + keyCode + " modifiers: "
-        + modifiers);
-  }
-
-  public void onKeyPress(KeyPressEvent event) {
-    report(event);
-  }
-
-  public void onKeyPress(Widget sender, char keyCode, int modifiers) {
-    report(getInfo(sender) + "key press code: " + keyCode + " modifiers: "
-        + modifiers);
-  }
-
-  public void onKeyUp(KeyUpEvent event) {
-    report(event);
-  }
-
-  public void onKeyUp(Widget sender, char keyCode, int modifiers) {
-    report(getInfo(sender) + "key  up code: " + keyCode + " modifiers: "
-        + modifiers);
-  }
-
-  public void onLostFocus(Widget sender) {
-    report("blur: " + sender.getClass());
-  }
-
-  public void onMouseDown(Widget sender, int x, int y) {
-    report(getInfo(sender) + "mouse down");
-  }
-
-  public void onMouseEnter(Widget sender) {
-    report(getInfo(sender) + "mouse enter");
-  }
-
-  public void onMouseLeave(Widget sender) {
-    report(getInfo(sender) + "mouse leave");
-  }
-
-  public void onMouseMove(Widget sender, int x, int y) {
-    report(getInfo(sender) + "mouse move");
-  }
-
-  public void onMouseUp(Widget sender, int x, int y) {
-    report(getInfo(sender) + "mouse up");
-  }
-
-  public void onSelection(SelectionEvent<Suggestion> event) {
-    report(event);
-  }
-
-  public void onSuggestionSelected(SuggestionEvent event) {
-    report("suggestion: " + event.getSelectedSuggestion());
-  }
-
-  public void onValueChange(ValueChangeEvent<V> event) {
-    report(event);
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLayout.java b/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLayout.java
deleted file mode 100644
index 1e713e7..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLayout.java
+++ /dev/null
@@ -1,108 +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.gwt.museum.client.common;
-
-import com.google.gwt.user.client.ui.CaptionPanel;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.HasWidgets;
-import com.google.gwt.user.client.ui.HorizontalPanel;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-import java.util.Iterator;
-
-/**
- * Helper class to avoid manually assembling vertical and horizontal panels for
- * these tests. It acts like a "typewriter" layout.
- * 
- * So, for instance
- * <pre>
- *   // assume the existence of widgets a-z
- *   SimpleLayout layout = new SimpleLayout();
- *   layout.add(a);
- *   layout.add(b);
- *   layout.nextRow();
- *   layout.add(c);
- *   layout.nextRow();
- *   layout.add(d);
- *   layout.add(e);
- *</pre>
- * 
- * would be rendered as:
- * <pre>
- *  a b 
- *  c 
- *  d e
- *  </pre>
- * */
-public class SimpleLayout extends Composite implements HasWidgets {
-
-  private final VerticalPanel master = new VerticalPanel();
-  private VerticalPanel allRows = new VerticalPanel();
-  private HorizontalPanel currentRow;
-
-  public SimpleLayout() {
-    initWidget(master);
-    master.add(allRows);
-    nextRow();
-  }
-
-  /**
-   * Adds a widget to the current row with the given caption.
-   */
-  public void add(String caption, Widget w) {
-    CaptionPanel c = new CaptionPanel(caption);
-    c.add(w);
-    add(c);
-  }
-
-  /**
-   * Adds a widget to the current row.
-   */
-  public void add(Widget w) {
-    currentRow.add(w);
-  }
-
-  /**
-   * Adds a footer to this layout table, the footer is guaranteed to be beneath
-   * all the rows.
-   */
-  public void addFooter(Widget w) {
-    master.add(w);
-  }
-
-  public void clear() {
-    master.clear();
-  }
-
-  public Iterator<Widget> iterator() {
-    return master.iterator();
-  }
-
-  /**
-   * Creates another row. After creating this row, all widgets added using
-   * {@link #add(Widget)} and {@link #add(String, Widget)} will be added to the
-   * new row.
-   */
-  public void nextRow() {
-    currentRow = new HorizontalPanel();
-    allRows.add(currentRow);
-  }
-
-  public boolean remove(Widget w) {
-    return master.remove(w);
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLogger.java b/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLogger.java
deleted file mode 100644
index 4642cdd..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLogger.java
+++ /dev/null
@@ -1,63 +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.gwt.museum.client.common;
-
-import com.google.gwt.event.shared.GwtEvent;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.HasHTML;
-import com.google.gwt.user.client.ui.HasText;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.UIObject;
-import com.google.gwt.user.client.ui.VerticalPanel;
-
-/**
- * Simple logging class.
- */
-@SuppressWarnings("deprecation")
-public class SimpleLogger extends Composite {
-
-  private VerticalPanel panel = new VerticalPanel();
-
-  public SimpleLogger() {
-    initWidget(panel);
-  }
-
-  public String getInfo(Object sender) {
-    if (sender instanceof HasText) {
-      return ((HasText) sender).getText();
-    } else if (sender instanceof UIObject
-        && ((UIObject) sender).getTitle() != null) {
-      return ((UIObject) sender).getTitle();
-    } else if (sender instanceof HasHTML) {
-      return ((HasHTML) sender).getHTML();
-    } else {
-      return sender.toString();
-    }
-  }
-
-  public void report(String s) {
-    panel.insert(new Label(s), 0);
-    if (panel.getWidgetCount() == 10) {
-      panel.remove(9);
-    }
-  }
-
-  public void report(GwtEvent<?> event) {
-    report(getInfo(event.getSource()) + " fired " + event.toDebugString());
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/common/Utility.java b/reference/code-museum/src/com/google/gwt/museum/client/common/Utility.java
deleted file mode 100644
index 66a2860..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/common/Utility.java
+++ /dev/null
@@ -1,33 +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.gwt.museum.client.common;
-
-import com.google.gwt.dom.client.HeadElement;
-
-/**
- * Utility helper methods.
- */
-public class Utility {
-  /**
-   * Convenience method for getting the document's head element.
-   * 
-   * @return the document's head element
-   */
-  public static native HeadElement getHeadElement() /*-{
-    return $doc.getElementsByTagName("head")[0];
-  }-*/;
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/DefaultMuseum.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/DefaultMuseum.java
deleted file mode 100644
index 7527e09..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/DefaultMuseum.java
+++ /dev/null
@@ -1,72 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.core.client.EntryPoint;
-import com.google.gwt.museum.client.viewer.Museum;
-
-/**
- * Default bug museum. By default, shows all visual tests defined in GWT ui to
- * date. Modify the code to add all bugs in as well.
- */
-public class DefaultMuseum extends Museum implements EntryPoint {
-
-  public DefaultMuseum() {
-    addVisuals();
-    addBugs();
-  }
-
-  public void addBugs() {
-    addIssue(new Issue1245());
-    addIssue(new Issue1772());
-    addIssue(new Issue1897());
-    addIssue(new Issue1932());
-    addIssue(new Issue2261());
-    addIssue(new Issue2290());
-    addIssue(new Issue2307());
-    addIssue(new Issue2318());
-    addIssue(new Issue2321());
-    addIssue(new Issue2331());
-    addIssue(new Issue2338());
-    addIssue(new Issue2339());
-    addIssue(new Issue2390());
-    addIssue(new Issue1169());
-    addIssue(new Issue2392());
-    addIssue(new Issue2443());
-    addIssue(new Issue2553());
-    addIssue(new Issue2855());
-    addIssue(new Issue3172());
-    addIssue(new Issue3962());
-    addIssue(new Issue3973());
-  }
-
-  public void addVisuals() {
-    addIssue(new VisualsForDateBox());
-    addIssue(new VisualsForDatePicker());
-    addIssue(new VisualsForDisclosurePanelEvents());
-    addIssue(new VisualsForEventsFiring());
-    addIssue(new VisualsForPopupEvents());
-    addIssue(new VisualsForTextEvents());
-    addIssue(new VisualsForSuggestBoxEvents());
-    addIssue(new VisualsForTableEvents());
-    addIssue(new VisualsForTree());
-    addIssue(new VisualsForTreeEvents());
-    addIssue(new VisualsForWindowEvents());
-    addIssue(new VisualsForDialogBox());
-    addIssue(new VisualsForSuggestBox());
-    addIssue(new VisualsForCheckBoxAndRadioButtonEvents());
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1169.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1169.java
deleted file mode 100644
index 45bcf4b..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1169.java
+++ /dev/null
@@ -1,75 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.ui.MenuBar;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * The {@link com.google.gwt.user.client.ui.PopupPanel} used to display sub
- * menus in a {@link MenuBar} is not accessible, nor is it under the
- * {@link MenuBar MenuBar's} DOM structure, so it cannot be uniquely styled.
- */
-public class Issue1169 extends AbstractIssue {
-  /**
-   * A command that does not do anything.
-   */
-  private static Command emptyCommand = new Command() {
-    public void execute() {
-    }
-  };
-
-  @Override
-  public Widget createIssue() {
-    // Create the main menu bar
-    MenuBar menuBar = new MenuBar();
-    menuBar.setAutoOpen(true);
-
-    // Change the primary style name
-    menuBar.setStylePrimaryName("myMenuBar");
-
-    // Add the original style names so the default styles apply
-    menuBar.addStyleName("gwt-MenuBar gwt-MenuBar-horizontal");
-
-    // Add some sub menus, each with a unique style name
-    for (int i = 0; i < 3; i++) {
-      MenuBar subMenu = new MenuBar(true);
-      subMenu.addItem("Item 1", emptyCommand);
-      subMenu.addItem("Item 2", emptyCommand);
-      subMenu.addItem("Item 3", emptyCommand);
-      menuBar.addItem("Option " + i, subMenu);
-    }
-
-    return menuBar;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Verify that each submenu has a red border, but no shadow.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Cannot apply unique styles to MenuBar popups";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return true;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1245.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1245.java
deleted file mode 100644
index 86837a9..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1245.java
+++ /dev/null
@@ -1,57 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.Tree;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Ugly focus ring on Tree.
- */
-public class Issue1245 extends AbstractIssue {
-  Tree t = null;
-
-  @Override
-  public Widget createIssue() {
-    t = new Tree();
-    t.addItem("a").addItem("a.a");
-    t.addItem("b");
-    t.addItem("c").addItem("c.a");
-    return t;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "No focus triangle should be visible";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Ugly focus ring on Tree";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-  public void onAttatched() {
-    t.setFocus(true);
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1488.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1488.java
deleted file mode 100644
index e8150f4..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1488.java
+++ /dev/null
@@ -1,51 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.RichTextArea;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * RichTextArea - setEnabled does not work.
- * 
- */
-public class Issue1488 extends AbstractIssue {
-  RichTextArea t = new RichTextArea();
-
-  @Override
-  public Widget createIssue() {
-    t.setFocus(true);
-    return t;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Should not be able to type in the text area";
-  }
-
-  @Override
-  public String getSummary() {
-    return "RichTextArea - setEnabled does not work";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1772.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1772.java
deleted file mode 100644
index ae1cc1c..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1772.java
+++ /dev/null
@@ -1,73 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.Frame;
-import com.google.gwt.user.client.ui.Grid;
-import com.google.gwt.user.client.ui.VerticalSplitPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * If a {@link VerticalSplitPanel} contains a {@link Frame}, then the splitter
- * will stop responding when the user drags it over the {@link Frame}. If the
- * user releases the mouse over the frame, the splitter will continue to move
- * when it emerges froo the {@link Frame}.
- */
-public class Issue1772 extends AbstractIssue {
-  @Override
-  public Widget createIssue() {
-    // Create a heavy grid for top of the split panel
-    Grid topWidget = new Grid(10, 10);
-    for (int i = 0; i < 10; i++) {
-      for (int j = 0; j < 10; j++) {
-        topWidget.setHTML(i, j, i + ":" + j);
-      }
-    }
-
-    // Create a frame for the bottom of the split panel
-    Frame bottomWidget = new Frame("http://www.google.com");
-    bottomWidget.setSize("100%", "100%");
-
-    // Create the split panel
-    VerticalSplitPanel splitPanel = new VerticalSplitPanel();
-    splitPanel.getElement().getStyle().setProperty("marginTop", "100px");
-    splitPanel.getElement().getStyle().setProperty("marginLeft", "200px");
-    splitPanel.getElement().getStyle().setProperty("border", "3px solid black");
-    splitPanel.setPixelSize(500, 500);
-    splitPanel.setTopWidget(topWidget);
-    splitPanel.setBottomWidget(bottomWidget);
-    return splitPanel;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Drag the splitter into the bottom half of the split panel very "
-        + "quickly and release the mouse when it is no longer over the "
-        + "splitter.  The splitter should not continue to move after the mouse "
-        + "button is released.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "SplitPanel continues to drag after mouse is released";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1897.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1897.java
deleted file mode 100644
index 8f21036..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1897.java
+++ /dev/null
@@ -1,149 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.HorizontalPanel;
-import com.google.gwt.user.client.ui.RichTextArea;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * <h1>Attaching and detaching a RichTextArea too fast crashes GWT</h1>
- * 
- * <p>
- * The RichTextArea uses a Timer or iframe.onload event (depending on the
- * browser) to trigger the event system initialization. Basically, that
- * introduces a small delay between the time the RichTextArea is attached to the
- * page and the time that the event handlers are added.
- * </p>
- * <p>
- * However, if you programmatically (or just very quickly) remove the
- * RichTextArea from the page, you will immediately trigger the teardown methods
- * that remove the event listeners. In some browsers, removing the event
- * listeners before they are added throws a JavaScript exception do to an
- * undefined variable, which messes up the rest of the onDetach mechanism, which
- * gets your attach state out of sync, which means your app stops working
- * properly.
- * </p>
- * <p>
- * I am able to reliably reproduce these errors by attaching and removing a
- * RichTextArea very quickly, even in user time. The errors affect all browsers,
- * but Firefox is by far the most affected because it catches the iframe.onload
- * event, whereas the others just use a 1ms timer. Also, Safari and IE seem to
- * handle the javascript exceptions a little cleaner.
- * </p>
- */
-public class Issue1897 extends AbstractIssue {
-  /**
-   * A set of options used to set the caption and content in the caption panel.
-   */
-  private class ControlPanel extends Composite {
-    private final HorizontalPanel hPanel = new HorizontalPanel();
-
-    public ControlPanel() {
-      initWidget(hPanel);
-      hPanel.setSpacing(10);
-
-      // Add option to attach RichTextArea
-      Button attachButton = new Button("Attach RichText", new ClickHandler() {
-        public void onClick(ClickEvent event) {
-          if (rta.isAttached()) {
-            Window.alert("RichTextArea is already attached.");
-          }
-          wrapper.add(rta);
-        }
-      });
-      hPanel.add(attachButton);
-
-      // Add option to detach RichTextArea
-      Button detachButton = new Button("Detach RichText", new ClickHandler() {
-        public void onClick(ClickEvent event) {
-          if (!rta.isAttached()) {
-            Window.alert("RichTextArea is already detached.");
-            return;
-          }
-          wrapper.remove(rta);
-        }
-      });
-      hPanel.add(detachButton);
-
-      // Add option to attach and detach RichTextArea
-      Button quickDetachButton = new Button("Attach/Detach RichText",
-          new ClickHandler() {
-            public void onClick(ClickEvent event) {
-              if (rta.isAttached()) {
-                Window.alert("RichTextArea is already attached.");
-                return;
-              }
-              wrapper.add(rta);
-              wrapper.remove(rta);
-            }
-          });
-      hPanel.add(quickDetachButton);
-    }
-  }
-
-  private RichTextArea rta;
-
-  private VerticalPanel wrapper;
-
-  @Override
-  public Widget createIssue() {
-    rta = new RichTextArea();
-    rta.setPixelSize(200, 100);
-
-    // Combine the control panel and RichTextArea in a wrapper
-    wrapper = new VerticalPanel();
-    wrapper.setSpacing(10);
-    wrapper.add(new ControlPanel());
-    wrapper.add(rta);
-
-    // Remove the RichTextArea after the wrapper is attached to the DOM
-    DeferredCommand.addCommand(new Command() {
-      public void execute() {
-        wrapper.remove(rta);
-      }
-    });
-
-    return wrapper;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "You should <b>not</b> see a RichTextArea, and no errors should "
-        + "occur.  If you click the Attach/Detach button, the RichTextArea will"
-        + " be programmatically attached and detached from the DOM structure, "
-        + "and you should not see any errors.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Attaching and detaching a RichTextArea too fast crashes GWT";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return true;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1932.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1932.java
deleted file mode 100644
index 394bbc4..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1932.java
+++ /dev/null
@@ -1,174 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.dom.client.Element;
-import com.google.gwt.dom.client.NativeEvent;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.Event.NativePreviewEvent;
-import com.google.gwt.user.client.Event.NativePreviewHandler;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.Grid;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.RootPanel;
-import com.google.gwt.user.client.ui.SimplePanel;
-import com.google.gwt.user.client.ui.TextBox;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * DOM.eventGetClientX/Y incorrect with HTML margin/borders Firefox 2/Safari 3.
- */
-public class Issue1932 extends AbstractIssue {
-  /**
-   * A set of options used to set the page margins and borders.
-   */
-  private class ControlPanel extends Composite {
-    private final Grid grid = new Grid(2, 3);
-
-    private final TextBox borderBox = new TextBox();
-
-    private final TextBox marginBox = new TextBox();
-
-    public ControlPanel() {
-      initWidget(grid);
-
-      // Add an option to set the margin
-      marginBox.setText("10px");
-      grid.setHTML(0, 0, "<b>Margin:</b>");
-      grid.setWidget(0, 1, marginBox);
-      grid.setWidget(0, 2, new Button("Set", new ClickHandler() {
-        public void onClick(ClickEvent event) {
-          updateMargin();
-        }
-      }));
-
-      // Add an option to set the border
-      borderBox.setText("5px solid #DDDDDD");
-      grid.setHTML(1, 0, "<b>Border:</b>");
-      grid.setWidget(1, 1, borderBox);
-      grid.setWidget(1, 2, new Button("Set", new ClickHandler() {
-        public void onClick(ClickEvent event) {
-          updateBorder();
-        }
-      }));
-    }
-
-    /**
-     * Update the border on the HTML element.
-     */
-    public void updateBorder() {
-      htmlElement.getStyle().setProperty("border", borderBox.getText());
-    }
-
-    /**
-     * Update the margin on the HTML element.
-     */
-    public void updateMargin() {
-      htmlElement.getStyle().setProperty("margin", marginBox.getText());
-    }
-  }
-
-  /**
-   * The HTML element of the page.
-   */
-  private Element htmlElement = null;
-
-  @Override
-  public Widget createIssue() {
-    // Setup the page size and cursor
-    htmlElement = DOM.getParent(RootPanel.getBodyElement());
-
-    // Create a crosshair to show the current position
-    final SimplePanel positioner = new SimplePanel();
-    positioner.setPixelSize(30, 30);
-    positioner.getElement().getStyle().setProperty("borderLeft",
-        "1px solid red");
-    positioner.getElement().getStyle().setProperty("borderTop", "1px solid red");
-    positioner.getElement().getStyle().setProperty("cursor", "crosshair");
-
-    // Create an area to echo position information.
-    final HTML echo = new HTML();
-
-    // Create a target box to test inside
-    final Label sandbox = new Label();
-    sandbox.sinkEvents(Event.ONMOUSEMOVE);
-    sandbox.setPixelSize(300, 300);
-    sandbox.getElement().getStyle().setProperty("border", "3px solid blue");
-    sandbox.getElement().getStyle().setProperty("cursor", "crosshair");
-
-    // Keep the crosshair under the cursor
-    Event.addNativePreviewHandler(new NativePreviewHandler() {
-      public void onPreviewNativeEvent(NativePreviewEvent event) {
-        // Ignore events outside of the sandbox
-        NativeEvent nativeEvent = event.getNativeEvent();
-        Element target = Element.as(nativeEvent.getEventTarget());
-        if (!sandbox.getElement().isOrHasChild(target)
-            && !positioner.getElement().isOrHasChild(target)) {
-          positioner.removeFromParent();
-          return;
-        }
-                
-        switch (Event.as(nativeEvent).getTypeInt()) {
-          case Event.ONMOUSEMOVE:
-            int absX = nativeEvent.getClientX() + Window.getScrollLeft();
-            int absY = nativeEvent.getClientY() + Window.getScrollTop();
-            RootPanel.get().add(positioner, absX, absY);
-
-            echo.setHTML("event.clientX: " + nativeEvent.getClientX() + "<br>"
-                + "event.clientY: " + nativeEvent.getClientY() + "<br>"
-                + "absolute left: " + positioner.getAbsoluteLeft() + "<br>"
-                + "absolute top: " + positioner.getAbsoluteTop());
-            break;
-        }
-      }
-    });
-
-    // Combine the control panel and return
-    VerticalPanel vPanel = new VerticalPanel();
-    vPanel.add(new ControlPanel());
-    vPanel.add(echo);
-    vPanel.add(sandbox);
-    return vPanel;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Move the cursor inside the blue box below and verify that the "
-        + "point of the red positioner lines up directly beneath the center of "
-        + "the cursor (crosshair). Also confirm that event.clientX/Y == absolute "
-        + "left/top. The buttons may not work on Safari 2 because Safari 2 has "
-        + "issues when you attempt to modify the HTML element programatically.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "DOM.eventGetClientX/Y incorrect with HTML margin/border in Firefox "
-        + "2 and Safari 2";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return true;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2261.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2261.java
deleted file mode 100644
index 7c1904e..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2261.java
+++ /dev/null
@@ -1,55 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.DisclosurePanel;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Open disclosure panel causes flicker.
- */
-public class Issue2261 extends AbstractIssue {
-
-  @Override
-  public Widget createIssue() {
-    DisclosurePanel disclosurePanel = new DisclosurePanel("Disclosure Panel 1");
-    disclosurePanel.setAnimationEnabled(true);
-    Label content = new Label("Some content<br/><br/><br/>");
-    content.setHeight("200px");
-    content.getElement().getStyle().setProperty("background", "blue");
-    disclosurePanel.setContent(content);
-    return disclosurePanel;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Open disclosure panel and you should not see a flicker";
-  }
-
-  @Override
-  public String getSummary() {
-    return "DisclosurePanel flicker";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2290.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2290.java
deleted file mode 100644
index 8543e9e..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2290.java
+++ /dev/null
@@ -1,65 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.Tree;
-import com.google.gwt.user.client.ui.TreeItem;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * <h1>gwt-TreeItem refers to the wrong element in TreeItem</h1>
- * 
- * <p>
- * gwt-TreeItem used to refer to the span that directly wrapped the text in a
- * TreeItem. Now it refers to the table element that holds the expand/collapse
- * image and the text. gwt-TreeItem-selected is still added to the span, so
- * there is an inconsistency here.
- * </p>
- */
-public class Issue2290 extends AbstractIssue {
-
-  @Override
-  public Widget createIssue() {
-    Tree tree = new Tree();
-    TreeItem root = tree.addItem("Root Item");
-    root.addItem("Item1");
-    root.addItem("Item2");
-    root.addItem("Item3");
-    root.addItem("Item4");
-
-    root.setState(true);
-    tree.setSelectedItem(root);
-
-    return tree;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "The background of the Root Item, when selected, should be "
-        + "completely red, with no visible green.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Tree background test";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return true;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2307.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2307.java
deleted file mode 100644
index ca9ed69..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2307.java
+++ /dev/null
@@ -1,106 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.CaptionPanel;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.Grid;
-import com.google.gwt.user.client.ui.TextBox;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * <h1>Normalize design of CaptionPanel</h1>
- * 
- * <p>
- * Methods should be set/getCaptionHTML, set/getCaptionText,
- * set/getContentWidget. Write lots of unit tests.
- * </p>
- */
-public class Issue2307 extends AbstractIssue {
-
-  private CaptionPanel captionPanel;
-
-  /**
-   * A set of options used to set the caption and content in the caption panel.
-   */
-  private class ControlPanel extends Composite {
-    private final Grid grid = new Grid(3, 2);
-
-    public ControlPanel() {
-      initWidget(grid);
-
-      // Add option to set the text
-      final TextBox textBox = new TextBox();
-      textBox.setText("<b>CaptionPanel</b>");
-      grid.setWidget(0, 1, textBox);
-      grid.setWidget(0, 0, new Button("setCaptionText", new ClickHandler() {
-        public void onClick(ClickEvent event) {
-          captionPanel.setCaptionText(textBox.getText());
-        }
-      }));
-
-      // Add option to set the html
-      final TextBox htmlBox = new TextBox();
-      htmlBox.setText("<b>CaptionPanel</b>");
-      grid.setWidget(1, 1, htmlBox);
-      grid.setWidget(1, 0, new Button("setCaptionHTML", new ClickHandler() {
-        public void onClick(ClickEvent event) {
-          captionPanel.setCaptionHTML(htmlBox.getText());
-        }
-      }));
-
-      // Add option to set the content
-      final TextBox contentBox = new TextBox();
-      contentBox.setText("<b><i>I am a Button</i></b>");
-      grid.setWidget(2, 1, contentBox);
-      grid.setWidget(2, 0, new Button("setContentWidget", new ClickHandler() {
-        public void onClick(ClickEvent event) {
-          captionPanel.setContentWidget(new Button(contentBox.getText()));
-        }
-      }));
-    }
-  }
-
-  @Override
-  public Widget createIssue() {
-    captionPanel = new CaptionPanel("CaptionPanel");
-    VerticalPanel p = new VerticalPanel();
-    p.setSpacing(6);
-    p.add(captionPanel);
-    p.add(new ControlPanel());
-    return p;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Verify the usage of various CaptionPanel methods.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "CaptionPanel tests";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2318.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2318.java
deleted file mode 100644
index 9b6a3ff..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2318.java
+++ /dev/null
@@ -1,47 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.NamedFrame;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Warning message in IE6 when using NamedFrame on SSL-secured web-site.
- */
-public class Issue2318 extends AbstractIssue {
-  @Override
-  public Widget createIssue() {
-    return new NamedFrame("myFrame");
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Open this page in IE6 on an SSL-secured server (https).  Verify "
-        + "that you do not see a mixed-content warning.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Warning message in IE6 when using NamedFrame on SSL-secured site";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2321.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2321.java
deleted file mode 100644
index 44ba2d8..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2321.java
+++ /dev/null
@@ -1,144 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.DeckPanel;
-import com.google.gwt.user.client.ui.Grid;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * <h1>DeckPanel children getOffsetWidth/Height() return 0 after r2060</h1>
- * 
- * <p>
- * Child widgets of DeckPanel used to be able to call getOffsetWidth/Height() in
- * onLoad() to obtain the widget's offset dimensions. These methods now return 0
- * (zero) in onLoad(), and are only correct later, e.g. in a deferred command.
- * </p>
- */
-public class Issue2321 extends AbstractIssue {
-  /**
-   * A set of options used to set the caption and content in the caption panel.
-   */
-  private class ControlPanel extends Composite {
-    private final Grid grid = new Grid(3, 2);
-
-    public ControlPanel() {
-      initWidget(grid);
-
-      // Add option to detach the deck panel
-      Button addWidgetButton = new Button("Add widget", new ClickHandler() {
-        public void onClick(ClickEvent event) {
-          addWidgetToDeckPanel();
-        }
-      });
-      grid.setWidget(0, 0, addWidgetButton);
-
-      // Add option to retrieve the dimensions of the content
-      Button updateDimButton = new Button("Get Current Dimensions",
-          new ClickHandler() {
-            public void onClick(ClickEvent event) {
-              updateContentDimensions();
-            }
-          });
-      grid.setWidget(0, 1, updateDimButton);
-
-      // Add labels for the content height and width
-      grid.setHTML(1, 0, "Content Height:");
-      grid.setHTML(2, 0, "Content Width:");
-    }
-
-    /**
-     * Add another widget to the deck panel.
-     */
-    public void addWidgetToDeckPanel() {
-      int numWidgets = deck.getWidgetCount();
-      HTML content = new HTML("Content " + numWidgets) {
-        @Override
-        protected void onLoad() {
-          updateContentDimensions();
-        }
-      };
-
-      content.setStylePrimaryName("deckPanel-content");
-      deck.add(content);
-      deck.showWidget(numWidgets);
-    }
-
-    /**
-     * Retrieve the size of the content widgets.
-     */
-    public void updateContentDimensions() {
-      Widget content = deck.getWidget(deck.getWidgetCount() - 1);
-      grid.setHTML(1, 1, content.getOffsetHeight() + "");
-      grid.setHTML(2, 1, content.getOffsetWidth() + "");
-    }
-  }
-
-  /**
-   * The options panel to control this test.
-   */
-  private ControlPanel controlPanel = new ControlPanel();
-
-  /**
-   * The {@link DeckPanel} to be tested.
-   */
-  private DeckPanel deck;
-
-  /**
-   * The main container that holds the control panel and deck panel.
-   */
-  private VerticalPanel vPanel;
-
-  @Override
-  public Widget createIssue() {
-    // Create the deck panel and grab the size of the contents on load
-    deck = new DeckPanel() {
-      @Override
-      protected void onLoad() {
-        controlPanel.addWidgetToDeckPanel();
-      }
-    };
-    deck.setStylePrimaryName("deckPanel");
-
-    // Combine the control panel and DeckPanel
-    vPanel = new VerticalPanel();
-    vPanel.add(controlPanel);
-    vPanel.add(deck);
-    return vPanel;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "The height and width of the content should be greater than 0.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "DeckPanel should return content dimensions onLoad";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2331.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2331.java
deleted file mode 100644
index 26ae0d0..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2331.java
+++ /dev/null
@@ -1,53 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.StackPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Clicking on StackPanel fails to open stack.
- */
-public class Issue2331 extends AbstractIssue {
-
-  @Override
-  public Widget createIssue() {
-    StackPanel p = new StackPanel();
-    p.add(new Label("Content A"), "Header A");
-    p.add(new Label("Content B"), "Header B");
-    p.add(new Label("Content C"), "Header C");
-    return p;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Click on B";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Stack Panel does not response to switching stacks";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2338.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2338.java
deleted file mode 100644
index 1f619c0..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2338.java
+++ /dev/null
@@ -1,55 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.Tree;
-import com.google.gwt.user.client.ui.TreeItem;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Opening a tree item flickers in IE7 because all of the children are shown for
- * an instant, and then the animation continues normally.
- */
-public class Issue2338 extends AbstractIssue {
-
-  @Override
-  public Widget createIssue() {
-    Tree tree = new Tree();
-    tree.setAnimationEnabled(true);
-    TreeItem root = tree.addItem("Root");
-    for (int i = 0; i < 5; i++) {
-      root.addItem("Item " + i);
-    }
-    return tree;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Open the root node and you should not see a flicker";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Tree animation flickers when expanding a TreeItem";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2339.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2339.java
deleted file mode 100644
index 3cdcd09..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2339.java
+++ /dev/null
@@ -1,64 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.TabPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * When you change to a different widget in the DeckPanel, there is a flicker in
- * IE7 where the new widget is completely visible for an instant, and then the
- * animation continues normally.
- */
-public class Issue2339 extends AbstractIssue {
-  private static final String[] TAB_BACKGROUNDS = {
-      "#f88", "#88f", "#8f8", "#8ff", "#f8f"};
-
-  @Override
-  public Widget createIssue() {
-    final TabPanel tabPanel = new TabPanel();
-    String contentText = "";
-    for (int i = 0; i < TAB_BACKGROUNDS.length; i++) {
-      contentText += "Each tab has more text.<br>";
-      HTML content = new HTML(contentText);
-      content.getElement().getStyle().setProperty("background",
-          TAB_BACKGROUNDS[i]);
-      tabPanel.add(content, "Tab " + i);
-    }
-
-    tabPanel.selectTab(0);
-    tabPanel.getDeckPanel().setAnimationEnabled(true);
-    return tabPanel;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Switch to a different tab and you should not see a flicker";
-  }
-
-  @Override
-  public String getSummary() {
-    return "DeckPanel flickers when switching between widgets";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2390.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2390.java
deleted file mode 100644
index b478ec9..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2390.java
+++ /dev/null
@@ -1,102 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.CheckBox;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.ListBox;
-import com.google.gwt.user.client.ui.PopupPanel;
-import com.google.gwt.user.client.ui.RadioButton;
-import com.google.gwt.user.client.ui.TextBox;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Focusing on the document body while a modal {@link PopupPanel} is visible
- * causes Internet Explorer to disappear to the back of the UI stack. Also,
- * modal PopupPanels do not prevent the user from focusing on input elements.
- */
-public class Issue2390 extends AbstractIssue {
-  @Override
-  public Widget createIssue() {
-    // A label indicating where to click to focus the body
-    Label label = new Label("Click to the right of this box while the popup "
-        + "is visible >>>");
-    label.getElement().getStyle().setProperty("border", "1px solid red");
-
-    // Create a modal PopupPanel
-    final PopupPanel popup = new PopupPanel(false, true);
-    popup.setWidget(new Button("Hide Popup", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        popup.hide();
-      }
-    }));
-
-    // Create a button to show the PopupPanel
-    Button showPopupButton = new Button("Show Popup", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        popup.center();
-      }
-    });
-
-    // Create a bunch of input elements to test
-    // TODO(jlabanca): divide this out into a separate issue 2707
-    CheckBox checkBox = new CheckBox("CheckBox");
-    RadioButton radio1 = new RadioButton("grouping", "RadioButton1");
-    RadioButton radio2 = new RadioButton("grouping", "RadioButton2");
-    ListBox list = new ListBox();
-    list.addItem("test1");
-    list.addItem("test2");
-    list.addItem("test3");
-    list.addItem("test4");
-    TextBox textBox = new TextBox();
-
-    // Combine all of the elements into a panel
-    VerticalPanel layout = new VerticalPanel();
-    layout.add(label);
-    layout.add(showPopupButton);
-    layout.add(textBox);
-    layout.add(checkBox);
-    layout.add(radio1);
-    layout.add(radio2);
-    layout.add(list);
-    return layout;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "First, make sure you have another program (such as another "
-        + "instance of the IE) running on the system.  Click the button below "
-        + "to show the PopupPanel, then click to right of the red box.  The "
-        + "browser should not be sent to the back of the OS UI stack because the "
-        + "document body is blurred.  Also, make sure that the user cannot "
-        + "interact with the input elements while the popup is visible.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "IE dissappears when clicking outside a modal PopupPanel";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2392.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2392.java
deleted file mode 100644
index 644dc33..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2392.java
+++ /dev/null
@@ -1,80 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
-import com.google.gwt.user.client.ui.SuggestBox;
-import com.google.gwt.user.client.ui.SuggestOracle;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * SuggestBox does not shrink to fit its contents when the number of suggestions
- * is reduced. This issue was reported against IE in standards mode.
- */
-public class Issue2392 extends AbstractIssue {
-  private MultiWordSuggestOracle oracle = null;
-
-  @Override
-  public Widget createIssue() {
-    SuggestBox box = new SuggestBox(getSuggestOracle());
-
-    // Enable animations to ensure that the suggestions are only animated when
-    // they are opened the first time.
-    box.setAnimationEnabled(true);
-
-    return box;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Type in the word 'add' one letter at a time.  As the number of "
-        + "suggestions is reduced, the red box around the SuggestPopup should "
-        + "shrink to just fit the contents.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "SuggestBox does not shrink when the number of suggestions is "
-        + "reduced";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return true;
-  }
-
-  /**
-   * Create a {@link SuggestOracle} that returns random words. Only one suggest
-   * oracle is created.
-   * 
-   * @return a {@link SuggestOracle}
-   */
-  private SuggestOracle getSuggestOracle() {
-    if (oracle == null) {
-      oracle = new MultiWordSuggestOracle();
-      for (char a = 'a'; a <= 'z'; a++) {
-        for (char b = 'a'; b <= 'm'; b++) {
-          for (char c = 'a'; c <= 'd'; c++) {
-            oracle.add("" + a + b + c);
-          }
-        }
-      }
-    }
-    return oracle;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2443.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2443.java
deleted file mode 100644
index 9c8db32..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2443.java
+++ /dev/null
@@ -1,80 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.DialogBox;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Dragging a {@link DialogBox} to the right edge of the screen creates a
- * horizontal scroll bar. The {@link DialogBox} should wrap the text in
- * order to avoid creating the scroll bar.
- */
-public class Issue2443 extends AbstractIssue {
-  /**
-   * The DialogBox to test.
-   */
-  private DialogBox dialogBox = null;
-
-  @Override
-  public Widget createIssue() {
-    // Create the DialogBox
-    dialogBox = new DialogBox(false, false);
-    dialogBox.setText("Dialog Box");
-
-    String message = "This text should wrap when the "
-        + "DialogBox is dragged to the right edge of the screen.  ";
-    VerticalPanel vPanel = new VerticalPanel();
-    vPanel.add(new Label(message));
-    vPanel.add(new Button("Close", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        dialogBox.hide();
-      }
-    }));
-    dialogBox.setWidget(vPanel);
-
-    // Create a button to display the dialog box
-    Button showButton = new Button("Show DialogBox", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        dialogBox.center();
-      }
-    });
-    return showButton;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Move the DialogBox to the right edge of the screen.  The DialogBox "
-        + "should wrap its text as best it can to avoid creating a horizontal "
-        + "scroll bar.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "DialogBox does not resize naturally";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return true;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2553.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2553.java
deleted file mode 100644
index cd70ae6..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2553.java
+++ /dev/null
@@ -1,52 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.Tree;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Test for http://code.google.com/p/google-web-toolkit/issues/detail?id=2553
- */
-public class Issue2553 extends AbstractIssue {
-
-  @Override
-  public Widget createIssue() {
-    Tree tree = new Tree();
-    tree.addItem("This is a long text displayed in a tree item");
-    tree.addItem("This is a long text displayed in a tree item and it's longer than the others");
-    tree.addItem("This is a long text displayed in a tree item");
-    return tree;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "resize the browser to a smaller width than the tree's width";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Word wrap of treeitem's text when browser width is too small";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2855.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2855.java
deleted file mode 100644
index 6d77f74..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue2855.java
+++ /dev/null
@@ -1,115 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.PopupPanel;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * <h1>PopupPanel.setAutoHideEnabled() and setModel()</h1>
- * 
- * <p>
- * Verify that all states of the {@link PopupPanel} (combinations of modal and
- * autoHide) work and can be change seemlessly.
- * </p>
- */
-public class Issue2855 extends AbstractIssue {
-
-  @Override
-  public Widget createIssue() {
-    // Create the popup panel
-    final PopupPanel popup = new PopupPanel();
-
-    // Add buttons to call getters and setters
-    Button toggleAutoHide = new Button("4. Toggle AutoHide",
-        new ClickHandler() {
-          public void onClick(ClickEvent event) {
-            popup.setAutoHideEnabled(!popup.isAutoHideEnabled());
-          }
-        });
-    Button toggleModal = new Button("3. Toggle Modal", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        popup.setModal(!popup.isModal());
-      }
-    });
-    Button isAutoHide = new Button("isAutoHide?", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        Window.alert("AutoHide: " + popup.isAutoHideEnabled());
-      }
-    });
-    Button isModal = new Button("isModal?", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        Window.alert("Modal: " + popup.isModal());
-      }
-    });
-    Button closeButton = new Button("Close", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        popup.hide();
-      }
-    });
-    VerticalPanel vPanel = new VerticalPanel();
-    vPanel.add(toggleModal);
-    vPanel.add(toggleAutoHide);
-    vPanel.add(isModal);
-    vPanel.add(isAutoHide);
-    vPanel.add(closeButton);
-    popup.setWidget(vPanel);
-
-    // Add control buttons
-    Button showPopup = new Button("1. Show Popup", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        popup.center();
-      }
-    });
-    Button clickable = new Button("2/4. Click Me", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        Window.alert("You got me!");
-      }
-    });
-    VerticalPanel layout = new VerticalPanel();
-    layout.add(showPopup);
-    layout.add(clickable);
-    return layout;
-  }
-
-  @Override
-  public String getInstructions() {
-    String text = "Perform the following steps:<br>"
-        + "1. Show the popup<br>"
-        + "2. Click the 'Click Me' button and verify an alert box appears<br>"
-        + "3. Click the 'Toggle Modal' button<br>"
-        + "4. Click the 'Click Me' button and verify an alert box doesn't appear<br>"
-        + "5. Click the 'Toggle AutoHide' button<br>"
-        + "6. Click on the screen and verify that the popup closes";
-    return text;
-  }
-
-  @Override
-  public String getSummary() {
-    return "PopupPanel.setAutoHideEnabled() and setModel() tests";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3172.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3172.java
deleted file mode 100644
index 7d9a974..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3172.java
+++ /dev/null
@@ -1,89 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.ui.MenuBar;
-import com.google.gwt.user.client.ui.MenuItem;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Verify that IE returns the correct value for getAbsoluteLeft() when zoomed
- * in. The absolute left coordinate should NOT depend on the zoom. That is, an
- * elements absoluteLeft position should be the same regardless of zoom (IE
- * automatically multiplies it by the zoom).
- */
-public class Issue3172 extends AbstractIssue {
-
-  @Override
-  public Widget createIssue() {
-    // Create a command that will execute on menu item selection
-    Command emptyCommand = new Command() {
-      public void execute() {
-      }
-    };
-
-    // Create a menu bar
-    MenuBar menu = new MenuBar();
-    menu.setWidth("500px");
-    menu.setAutoOpen(true);
-
-    // Create a sub menu of recent documents
-    MenuBar recentDocsMenu = new MenuBar(true);
-    recentDocsMenu.addItem("Document 0", emptyCommand);
-    recentDocsMenu.addItem("Document 1", emptyCommand);
-    recentDocsMenu.addItem("Document 2", emptyCommand);
-
-    // Create the file menu
-    MenuBar fileMenu = new MenuBar(true);
-    menu.addItem(new MenuItem("File", fileMenu));
-    fileMenu.addItem("New", emptyCommand);
-    fileMenu.addItem("Print", emptyCommand);
-    fileMenu.addItem("Recent Docs", recentDocsMenu);
-
-    // Create the edit menu
-    MenuBar editMenu = new MenuBar(true);
-    menu.addItem(new MenuItem("Edit", editMenu));
-    editMenu.addItem("Cut", emptyCommand);
-    editMenu.addItem("Copy", emptyCommand);
-    editMenu.addItem("Paste", emptyCommand);
-
-    // Create the help menu
-    MenuBar helpMenu = new MenuBar(true);
-    menu.addItem(new MenuItem("Help", helpMenu));
-    helpMenu.addItem("Settings", emptyCommand);
-    helpMenu.addItem("About", emptyCommand);
-
-    return menu;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "In IE, press Ctrl++ to zoom in, then verify that the sub menus open"
-        + " in the correct locations.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "getAbsoluteLeft() with zoom in IE";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3186.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3186.java
deleted file mode 100644
index 666450b..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3186.java
+++ /dev/null
@@ -1,211 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.dom.client.Element;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.ui.AbsolutePanel;
-import com.google.gwt.user.client.ui.FlexTable;
-import com.google.gwt.user.client.ui.FocusPanel;
-import com.google.gwt.user.client.ui.MouseListener;
-import com.google.gwt.user.client.ui.MouseListenerCollection;
-import com.google.gwt.user.client.ui.Widget;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Ensure the ListenerWrapper for mouse still works like the old listeners did.
- */
-@SuppressWarnings("deprecation")
-public class Issue3186 extends AbstractIssue {
-
-  enum VisibleEvents {
-    mouseDown, mouseEnter, mouseLeave, mouseMove, mouseUp
-  }
-
-  private final class TestWidget extends FocusPanel {
-    private class Control implements MouseListener {
-      int controlX;
-      int controlY;
-      int controlMouseEnter;
-      int controlMouseLeave;
-
-      public void onMouseDown(Widget sender, int x, int y) {
-        this.controlX = x;
-        this.controlY = y;
-      }
-
-      public void onMouseEnter(Widget sender) {
-        ++controlMouseEnter;
-      }
-
-      public void onMouseLeave(Widget sender) {
-        ++controlMouseLeave;
-      }
-
-      public void onMouseMove(Widget sender, int x, int y) {
-        this.controlX = x;
-        this.controlY = y;
-      }
-
-      public void onMouseUp(Widget sender, int x, int y) {
-        this.controlX = x;
-        this.controlY = y;
-      }
-    }
-
-    private class Current implements MouseListener {
-      private int mouseEnterCount;
-      private int mouseLeaveCount;
-
-      public void onMouseDown(Widget sender, int x, int y) {
-        check(x, y, VisibleEvents.mouseDown);
-      }
-
-      public void onMouseEnter(Widget sender) {
-        ++mouseEnterCount;
-        if (mouseEnterCount != control.controlMouseEnter) {
-          fail("recieved:" + mouseEnterCount + " events, expected:"
-              + control.controlMouseEnter, VisibleEvents.mouseEnter);
-        } else {
-          pass(VisibleEvents.mouseEnter);
-        }
-        sender.getElement().getStyle().setProperty("background", "yellow");
-      }
-
-      public void onMouseLeave(Widget sender) {
-        ++mouseLeaveCount;
-        if (mouseLeaveCount != control.controlMouseLeave) {
-          fail("recieved:" + mouseLeaveCount + " events, expected:"
-              + control.controlMouseLeave, VisibleEvents.mouseLeave);
-        } else {
-          pass(VisibleEvents.mouseLeave);
-        }
-
-        sender.getElement().getStyle().setProperty("background", "");
-      }
-
-      public void onMouseMove(Widget sender, int x, int y) {
-        check(x, y, VisibleEvents.mouseMove);
-      }
-
-      public void onMouseUp(Widget sender, int x, int y) {
-        check(x, y, VisibleEvents.mouseUp);
-      }
-
-      private void check(int x, int y, VisibleEvents event) {
-        String errorReport = getErrorReport(x, y);
-        if (errorReport == null) {
-          eventToElement.get(event).setInnerHTML(
-              "<span style='color:green'>pass</span>");
-        } else {
-          fail(errorReport, event);
-        }
-      }
-
-      private String getErrorReport(int x, int y) {
-        String errorReport = null;
-        if (x != control.controlX) {
-          errorReport = "wanted x: " + control.controlX + " actual x" + x;
-        } else if (y != control.controlY) {
-          errorReport += "wanted y: " + control.controlY + " actual y" + y;
-        }
-        return errorReport;
-      }
-    }
-
-    private FlexTable layout = null;
-    private MouseListenerCollection collection = new MouseListenerCollection();
-
-    private Control control = new Control();
-    private Current current = new Current();
-    private final Map<VisibleEvents, Element> eventToElement = new HashMap<VisibleEvents, Element>();
-
-    public TestWidget() {
-      layout = new FlexTable();
-      layout.setCellPadding(3);
-      layout.setBorderWidth(2);
-
-      layout.setHTML(0, 0, "<b>MouseEvents</b>");
-      layout.setHTML(0, 1, "<b>Status</b>");
-
-      for (VisibleEvents e : VisibleEvents.values()) {
-        eventToElement.put(e, addResultRow(e.name()));
-      }
-      add(layout);
-      this.addMouseListener(current);
-      collection.add(control);
-    }
-
-    public void fail(String errorReport, VisibleEvents event) {
-      eventToElement.get(event).setInnerHTML(
-          "<span style='color:red'>" + errorReport + "</span>");
-    }
-
-    @Override
-    public void onBrowserEvent(Event event) {
-      collection.fireMouseEvent(this, event);
-      super.onBrowserEvent(event);
-    }
-
-    public void pass(VisibleEvents event) {
-      eventToElement.get(event).setInnerHTML(
-          "<span style='color:green'>pass</span>");
-    }
-
-    private Element addResultRow(String eventName) {
-      int row = layout.getRowCount();
-      layout.setHTML(row, 0, eventName);
-      layout.setHTML(row, 1, "<span style='color:red'>?</span>");
-      Element cell = layout.getCellFormatter().getElement(row, 1);
-      return cell;
-    }
-  }
-
-  @Override
-  public Widget createIssue() {
-    AbsolutePanel p = new AbsolutePanel();
-    p.setHeight("500px");
-    p.setWidth("500px");
-    final TestWidget dialog = showTestWidget();
-    p.add(dialog, 100, 100);
-    return p;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "move your mouse around ";
-  }
-
-  @Override
-  public String getSummary() {
-    return "mouse listeners work the same";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-  private TestWidget showTestWidget() {
-    final TestWidget dialog = new TestWidget();
-    return dialog;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3187.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3187.java
deleted file mode 100644
index 162a816..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3187.java
+++ /dev/null
@@ -1,56 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.dom.client.ChangeEvent;
-import com.google.gwt.event.dom.client.ChangeHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.FileUpload;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * {@link FileUpload} onChange event fires correctly in all browsers.
- */
-public class Issue3187 extends AbstractIssue {
-  @Override
-  public Widget createIssue() {
-    FileUpload fileUpload = new FileUpload();
-    fileUpload.addChangeHandler(new ChangeHandler() {
-      public void onChange(ChangeEvent event) {
-        Window.alert("Value Changed");
-      }
-    });
-    return fileUpload;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Change the file path and verify an alert dialog appears.  In "
-        + "Opera, the onChange event should only be fired when the box is "
-        + "blurred.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "FileUpload supports change events";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3892EntryPoint1.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3892EntryPoint1.java
deleted file mode 100644
index dd3b799..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3892EntryPoint1.java
+++ /dev/null
@@ -1,125 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.dom.client.Element;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.Event.NativePreviewEvent;
-import com.google.gwt.user.client.Event.NativePreviewHandler;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.Grid;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Only a single GWT application can preview native events.
- */
-public class Issue3892EntryPoint1 extends AbstractIssue {
-
-  public static final String BUTTON_1_ID = "Issue3892Button1";
-  public static final String BUTTON_2_ID = "Issue3892Button2";
-  public static final String BUTTON_3_ID = "Issue3892Button3";
-
-  /**
-   * The main grid used for layout.
-   */
-  private Grid grid = new Grid(1, 3);
-
-  @Override
-  public Widget createIssue() {
-    Window.alert("Module 1 loaded");
-
-    // Setup the grid.
-    grid.setHTML(0, 0, "<b>Test<b>");
-    grid.setHTML(0, 1, "<b>Description<b>");
-    grid.setHTML(0, 2, "<b>Expected Results<b>");
-    addTest(BUTTON_1_ID, "Event is not cancelled by any module.",
-        "The event will fire in the button.", false);
-    addTest(BUTTON_2_ID, "Module 1 cancels event.",
-        "The event will not fire in the button.", true);
-    addTest(BUTTON_3_ID, "Module 2 cancels event.",
-        "The event will not fire in the button.", true);
-
-    // Add the event preview.
-    Event.addNativePreviewHandler(new NativePreviewHandler() {
-      public void onPreviewNativeEvent(NativePreviewEvent event) {
-        if (event.getTypeInt() == Event.ONCLICK) {
-          Element target = event.getNativeEvent().getEventTarget().cast();
-          if (BUTTON_2_ID.equals(target.getId())) {
-            event.cancel();
-            Window.alert("Click handled by module 1 and cancelled");
-          } else {
-            Window.alert("Click handled by module 1");
-          }
-        }
-      }
-    });
-
-    return grid;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "After all three modules have loaded (indicated by alert boxes), "
-        + "click the buttons and verify that you see the expected results. "
-        + "For each test, all three modules should preview the event (even if "
-        + "one of the modules cancels the event).";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Only a single GWT application can preview native events";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-  /**
-   * Add a test button to the grid.
-   * 
-   * @param buttonId the ID of the button
-   * @param description the test description
-   * @param results the expected result of the test
-   * @param isCancelled true if one of the modules will cancel the event
-   */
-  private void addTest(String buttonId, String description, String results,
-      final boolean isCancelled) {
-    int row = grid.getRowCount();
-    grid.resizeRows(row + 1);
-
-    // Add the test button.
-    Button button = new Button("Run Test", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        if (isCancelled) {
-          Window.alert("[Error] Event should have been cancelled");
-        } else {
-          Window.alert("[Success] Event successfully fired");
-        }
-      }
-    });
-    button.getElement().setId(buttonId);
-    grid.setWidget(row, 0, button);
-
-    // Add the description and expected results.
-    grid.setText(row, 1, description);
-    grid.setText(row, 2, results);
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3892EntryPoint2.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3892EntryPoint2.java
deleted file mode 100644
index 1231698..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3892EntryPoint2.java
+++ /dev/null
@@ -1,45 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.core.client.EntryPoint;
-import com.google.gwt.dom.client.Element;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.Event.NativePreviewEvent;
-import com.google.gwt.user.client.Event.NativePreviewHandler;
-
-/**
- * Only a single GWT application can preview native events.
- */
-public class Issue3892EntryPoint2 implements EntryPoint {
-  public void onModuleLoad() {
-    Window.alert("Module 2 loaded");
-    Event.addNativePreviewHandler(new NativePreviewHandler() {
-      public void onPreviewNativeEvent(NativePreviewEvent event) {
-        if (event.getTypeInt() == Event.ONCLICK) {
-          Element target = event.getNativeEvent().getEventTarget().cast();
-          if (Issue3892EntryPoint1.BUTTON_3_ID.equals(target.getId())) {
-            event.cancel();
-            Window.alert("Click handled by module 2 and cancelled");
-          } else {
-            Window.alert("Click handled by module 2");
-          }
-        }
-      }
-    });
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3892EntryPoint3.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3892EntryPoint3.java
deleted file mode 100644
index 4f52d40..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3892EntryPoint3.java
+++ /dev/null
@@ -1,38 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.core.client.EntryPoint;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.Event.NativePreviewEvent;
-import com.google.gwt.user.client.Event.NativePreviewHandler;
-
-/**
- * Only a single GWT application can preview native events.
- */
-public class Issue3892EntryPoint3 implements EntryPoint {
-  public void onModuleLoad() {
-    Window.alert("Module 3 loaded");
-    Event.addNativePreviewHandler(new NativePreviewHandler() {
-      public void onPreviewNativeEvent(NativePreviewEvent event) {
-        if (event.getTypeInt() == Event.ONCLICK) {
-          Window.alert("Click handled by module 3");
-        }
-      }
-    });
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3962.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3962.java
deleted file mode 100644
index b0e6587..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3962.java
+++ /dev/null
@@ -1,61 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.FormPanel;
-import com.google.gwt.user.client.ui.Widget;
-import com.google.gwt.user.client.ui.FormPanel.SubmitEvent;
-import com.google.gwt.user.client.ui.FormPanel.SubmitHandler;
-
-/**
- * Buttons default to type=submit in WebKit (Safari and Chrome) and IE8 (in IE8
- * mode).
- */
-public class Issue3962 extends AbstractIssue {
-  private FormPanel form;
-
-  @Override
-  public Widget createIssue() {
-    form = new FormPanel();
-    form.addSubmitHandler(new SubmitHandler() {
-      public void onSubmit(SubmitEvent event) {
-        Window.alert("Form is being submitted.");
-        event.cancel();
-      }
-    });
-    form.setWidget(new Button("Submit"));
-    return form;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Click the button, it should have no effect.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "In IE8 (in IE8 mode) and WebKit (Safari and Chrome), buttons default"
-        + " to type submit.";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3973.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3973.java
deleted file mode 100644
index a5eef5e..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3973.java
+++ /dev/null
@@ -1,64 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.FormPanel;
-import com.google.gwt.user.client.ui.TextBox;
-import com.google.gwt.user.client.ui.Widget;
-import com.google.gwt.user.client.ui.FormPanel.SubmitEvent;
-import com.google.gwt.user.client.ui.FormPanel.SubmitHandler;
-
-/**
- * When a {@link FormPanel} does not use a synthesized hidden iframe and is
- * being submit by means other than {@link FormPanel#submit()}, it doesn't fire
- * submit events.
- */
-public class Issue3973 extends AbstractIssue {
-  private FormPanel form;
-
-  @Override
-  public Widget createIssue() {
-    form = new FormPanel("_blank");
-    form.setAction("http://www.google.com/search");
-    form.addSubmitHandler(new SubmitHandler() {
-      public void onSubmit(SubmitEvent event) {
-        Window.alert("Did you see me?");
-        event.cancel();
-      }
-    });
-    TextBox box = new TextBox();
-    box.setName("q");
-    form.setWidget(box);
-    return form;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Enter some text and press the ENTER key, it should show an alert. It shouldn't open Google within a new window/tab!";
-  }
-
-  @Override
-  public String getSummary() {
-    return "FormPanel doesn't hook events when not using a synthesized hidden iframe.";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/SpeedForClear.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/SpeedForClear.java
deleted file mode 100644
index 5e1f4cf..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/SpeedForClear.java
+++ /dev/null
@@ -1,129 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.core.client.Duration;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.museum.client.common.ControlInputPanel;
-import com.google.gwt.museum.client.common.SimpleLogger;
-import com.google.gwt.museum.client.common.ControlInputPanel.IntegerInput;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.FlowPanel;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.Panel;
-import com.google.gwt.user.client.ui.RootPanel;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/*
- * Originally, on IE, about three seconds to distroy
- */
-/**
- * Tests bad behavior for clear.
- * 
- * <pre>
- * ff -- 1000 flow panels, aprox 500  millis
- * ie -- 1000 flow panels, aprox 3000 millis
- * 
- * in new version
- * ie -- 1000 flow panels, aprox 30-80 millis
- * ff -- 1000 flow panels, aprox 13-50 millis
- * </pre>
- * <p>
- * <img class='gallery' src='FlowPanel.png'/>
- * </p>
- */
-public class SpeedForClear extends AbstractIssue {
-  private Panel target;
-  private List<Widget> children = new ArrayList<Widget>();
-  private SimpleLogger log = new SimpleLogger();
-
-  @Override
-  public Widget createIssue() {
-    VerticalPanel v = new VerticalPanel();
-    ControlInputPanel p = new ControlInputPanel();
-    v.add(p);
-    v.add(log);
-    final IntegerInput size = new IntegerInput("flowpanel", 10, p);
-    Button create = new Button("create widget", new ClickHandler() {
-
-      public void onClick(ClickEvent event) {
-        createLargeFlowPanel(size.getValue());
-      }
-    });
-
-    Button distroy = new Button("time the removal", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        Duration d = new Duration();
-        target.clear();
-
-        log.report("Took " + d.elapsedMillis() + " milliseconds to clear "
-            + size.getValue() + " widgets from a flow panel");
-        for (Widget child : children) {
-          if (child.getElement().getPropertyString("__listener") != null) {
-            throw new IllegalStateException(
-                "each child should no longer have a listener");
-          }
-        }
-      }
-    });
-    v.add(create);
-    v.add(distroy);
-    return v;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "check the speed of clear methods";
-  }
-
-  @Override
-  public String getSummary() {
-    return "clear() speed check";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-  private void createLargeFlowPanel(int size) {
-
-    if (target != null) {
-      target.removeFromParent();
-    }
-    target = new FlowPanel();
-
-    for (int i = 0; i < size; i++) {
-      Widget w = new Label("widget-" + i);
-      target.add(w);
-      children.add(w);
-    }
-
-    RootPanel.get().add(target);
-    for (Widget child : target) {
-      if (child.getElement().getPropertyString("__listener") == null) {
-        throw new IllegalStateException("each child should now have a listener");
-      }
-    }
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/SpeedForClippedImageLoading.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/SpeedForClippedImageLoading.java
deleted file mode 100644
index 04d216e..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/SpeedForClippedImageLoading.java
+++ /dev/null
@@ -1,104 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.core.client.Duration;
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.LoadEvent;
-import com.google.gwt.event.dom.client.LoadHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.museum.client.common.ControlInputPanel;
-import com.google.gwt.museum.client.common.SimpleLogger;
-import com.google.gwt.museum.client.common.ControlInputPanel.IntegerInput;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.Image;
-import com.google.gwt.user.client.ui.RootPanel;
-import com.google.gwt.user.client.ui.TreeImages;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Tests the speed of clipped images.
- * 
- */
-public class SpeedForClippedImageLoading extends AbstractIssue {
-  private SimpleLogger log = new SimpleLogger();
-  List<Image> images = new ArrayList<Image>();
-
-  @Override
-  public Widget createIssue() {
-    VerticalPanel v = new VerticalPanel();
-    ControlInputPanel p = new ControlInputPanel();
-    v.add(p);
-    v.add(log);
-    final IntegerInput size = new IntegerInput("how many clipped images", 10,
-        30, p);
-
-    Button createClippedImages = new Button("time the creation",
-        new ClickHandler() {
-          boolean firstTime = true;
-
-          public void onClick(ClickEvent event) {
-            final Duration d = new Duration();
-
-            final int numImages = size.getValue();
-            final TreeImages test = GWT.<TreeImages> create(TreeImages.class);
-
-            for (int i = 0; i < numImages; i++) {
-              Image current = test.treeClosed().createImage();
-
-              if (i == numImages - 1) {
-                current.addLoadHandler(new LoadHandler() {
-                  public void onLoad(LoadEvent event) {
-                    if (firstTime) {
-                      log.report("Took " + d.elapsedMillis()
-                          + " milliseconds to create the images");
-                    }
-                    firstTime = false;
-                  }
-                });
-              }
-              images.add(current);
-              RootPanel.get().add(current);
-            }
-          }
-        });
-
-    v.add(createClippedImages);
-    return v;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "IE has traditionally been very slow compared to the other browsers,  this speed test in intended to allow us to capture and document improvements in the speed of clipped images";
-  }
-
-  @Override
-  public String getSummary() {
-    return "clear() speed check";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForCheckBoxAndRadioButtonEvents.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForCheckBoxAndRadioButtonEvents.java
deleted file mode 100644
index 1afbee1..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForCheckBoxAndRadioButtonEvents.java
+++ /dev/null
@@ -1,99 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.HandlesAllKeyEvents;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.museum.client.common.EventReporter;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.CheckBox;
-import com.google.gwt.user.client.ui.RadioButton;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Visual testing of rich text box events.
- */
-public class VisualsForCheckBoxAndRadioButtonEvents extends AbstractIssue {
-  private VerticalPanel p = new VerticalPanel();
-
-  @SuppressWarnings("deprecation")
-  @Override
-  public Widget createIssue() {
-    p.setWidth("500px");
-    p.setBorderWidth(1);
-    // TextBox
-    final CheckBox b = new CheckBox("My Checkbox");
-    b.setTitle("text box");
-    p.add(b);
-    EventReporter<Boolean, Object> handler = new EventReporter<Boolean, Object>(
-        p);
-    p.add(new Button("change value with event", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        b.setValue(false, true);
-      }
-    }));
-    b.addKeyboardListener(handler);
-    HandlesAllKeyEvents.addHandlers(b, handler);
-    b.addFocusHandler(handler);
-    b.addBlurHandler(handler);
-    b.addFocusListener(handler);
-    b.addValueChangeHandler(handler);
-
-    // Rich text box:
-    final RadioButton radio = new RadioButton("A", "With events");
-    p.add(radio);
-    final RadioButton radioPrime = new RadioButton("A", "No events");
-    p.add(radioPrime);
-    b.setTitle("Radio Button");
-    p.add(radio);
-    handler = new EventReporter<Boolean, Object>(p);
-    radio.addKeyboardListener(handler);
-
-    HandlesAllKeyEvents.addHandlers(radio, handler);
-    radio.addBlurHandler(handler);
-    radio.addFocusHandler(handler);
-    radio.addClickHandler(handler);
-    radio.addClickListener(handler);
-    radio.addValueChangeHandler(handler);
-    p.add(new Button("change value with event", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        radio.setValue(true, true);
-      }
-    }));
-
-    return p;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Click on CheckBox and Radio Button, use change value events,see that correct events are firing";
-  }
-
-  @Override
-  public String getSummary() {
-    return "CheckBox and RadioButton test";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForCustomButtons.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForCustomButtons.java
deleted file mode 100644
index 26d58c3..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForCustomButtons.java
+++ /dev/null
@@ -1,73 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.museum.client.common.EventReporter;
-import com.google.gwt.museum.client.common.SimpleLayout;
-import com.google.gwt.user.client.ui.PushButton;
-import com.google.gwt.user.client.ui.ToggleButton;
-import com.google.gwt.user.client.ui.Tree;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Visual test for custom buttons.
- */
-public class VisualsForCustomButtons extends AbstractIssue {
-
-  @Override
-  public Widget createIssue() {
-    SimpleLayout l = new SimpleLayout();
-    Tree t = new Tree();
-    PushButton a = new PushButton("Simple-dum");
-    t.add(a);
-    PushButton a2 = new PushButton("Simple-dee");
-    t.add(a2);
-    PushButton aUp = new PushButton("A-up");
-    aUp.getDownFace().setHTML("A-down");
-    t.add(aUp);
-
-    ToggleButton b = new ToggleButton("B");
-    t.add(b);
-    l.add(t);
-    l.nextRow();
-    EventReporter<Object, Object> handler = new EventReporter<Object, Object>();
-    l.addFooter(handler);
-    handler.addClickHandler(a, l);
-    handler.addClickHandler(a2, l);
-    handler.addClickHandler(aUp, l);
-    handler.addClickHandler(b, l);
-
-    return l;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Check for custom buttons";
-  }
-
-  @Override
-  public String getSummary() {
-    return "CustomButton visual test";
-  }
-
-  @Override
-  public boolean hasCSS() {
-
-    return false;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDateBox.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDateBox.java
deleted file mode 100644
index 273c8e8..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDateBox.java
+++ /dev/null
@@ -1,194 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.KeyDownEvent;
-import com.google.gwt.event.dom.client.KeyDownHandler;
-import com.google.gwt.event.logical.shared.ValueChangeEvent;
-import com.google.gwt.event.logical.shared.ValueChangeHandler;
-import com.google.gwt.i18n.client.DateTimeFormat;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.museum.client.common.EventReporter;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.HorizontalPanel;
-import com.google.gwt.user.client.ui.Label;
-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.gwt.user.datepicker.client.DateBox;
-import com.google.gwt.user.datepicker.client.DatePicker;
-import com.google.gwt.user.datepicker.client.DateBox.DefaultFormat;
-
-import java.util.Date;
-
-/**
- * Visuals for date box.
- */
-public class VisualsForDateBox extends AbstractIssue {
-  class FormatWithNewYearsEve extends DefaultFormat {
-    public FormatWithNewYearsEve() {
-    }
-
-    public FormatWithNewYearsEve(DateTimeFormat format) {
-      super(format);
-    }
-
-    @Override
-    public String format(DateBox box, Date d) {
-      if (d == null) {
-        return "Please Change me";
-      } else {
-        return super.format(box, d);
-      }
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public Date parse(DateBox box, String input, boolean reportError) {
-      if (input.equalsIgnoreCase("new year's eve")) {
-        Date d = new Date();
-        d.setDate(31);
-        d.setMonth(12);
-        return d;
-      } else {
-        return super.parse(box, input, reportError);
-      }
-    }
-  }
-
-  @Override
-  public Widget createIssue() {
-    VerticalPanel v = new VerticalPanel();
-    v.add(new HTML("<div style='height:25px'></div>"));
-    v.add(dateRange());
-    v.add(new HTML("<div style='height:25px'></div>"));
-    return v;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Instructions <ul><li>Click on first date box, see that date picker is displayed</li> "
-        + "<li>use arrow keys to navigate to second date box, select a date.</li> "
-        + "<li>type in a bad date then click back to the first date box. Your bad date should now be in red</li>"
-        + "<li>get back to the second box, now type in a valid date and tab away, its text should now be black again. </li>"
-        + "<li>Try typing 'New Year's Eve' in on the start datebox)</li>"
-        + "<li> Hit 'Show values' and confirm that you see the correct values</li></ul>";
-  }
-
-  @Override
-  public String getSummary() {
-    return "date box visual test";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-  private Widget dateRange() {
-    VerticalPanel v = new VerticalPanel();
-    HorizontalPanel p = new HorizontalPanel();
-    v.add(p);
-    final DateBox start = new DateBox(new DatePicker(), null,
-        new FormatWithNewYearsEve());
-
-    start.setWidth("13em");
-    final DateBox end = new DateBox();
-    end.setWidth("13em");
-
-    end.getDatePicker().addValueChangeHandler(new ValueChangeHandler<Date>() {
-      public void onValueChange(ValueChangeEvent<Date> event) {
-        start.removeStyleName("user-modified");
-      }
-    });
-
-    final TextBox startText = start.getTextBox();
-    startText.addKeyDownHandler(new KeyDownHandler() {
-      public void onKeyDown(KeyDownEvent e) {
-        if (e.isRightArrow()
-            && start.getCursorPos() == startText.getText().length()) {
-          start.hideDatePicker();
-          end.setFocus(true);
-        }
-      }
-    });
-
-    end.getTextBox().addKeyDownHandler(new KeyDownHandler() {
-      public void onKeyDown(KeyDownEvent e) {
-        if ((e.isLeftArrow()) && end.getCursorPos() == 0) {
-          end.hideDatePicker();
-          start.setFocus(true);
-        }
-      }
-    });
-
-    end.setValue(new Date());
-    p.add(start);
-    Label l = new Label(" - ");
-    l.setStyleName("filler");
-    p.add(l);
-    p.add(end);
-    final Label value = new Label();
-    p.add(value);
-    HorizontalPanel h2 = new HorizontalPanel();
-    v.add(h2);
-    h2.add(new Button("Short format", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        updateFormat(start, end, DateTimeFormat.getShortDateFormat());
-      }
-    }));
-    h2.add(new Button("Long format", new ClickHandler() {
-
-      public void onClick(ClickEvent event) {
-        updateFormat(start, end, DateTimeFormat.getMediumDateFormat());
-      }
-    }));
-
-    h2.add(new Button("Clear", new ClickHandler() {
-      public void onClick(ClickEvent sender) {
-        start.setValue(null);
-        end.setValue(null);
-      }
-    }));
-
-    h2.add(new Button("Show Values", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        DateTimeFormat f = DateTimeFormat.getShortDateFormat();
-        Date d1 = start.getValue();
-        Date d2 = end.getValue();
-        value.setText("Start: \"" + (d1 == null ? "null" : f.format(d1))
-            + "\" End: \"" + (d2 == null ? "null" : f.format(d2)) + "\"");
-      }
-    }));
-
-    EventReporter<Date, DateBox> reporter = new EventReporter<Date, DateBox>();
-    start.addValueChangeHandler(reporter);
-    end.addValueChangeHandler(reporter);
-    reporter.report("Events are logged here");
-    v.add(reporter);
-    return v;
-  }
-
-  private void updateFormat(DateBox start, DateBox end, DateTimeFormat format) {
-    // You can replace the format itself.
-    start.setFormat(new FormatWithNewYearsEve(format));
-    end.setFormat(new DefaultFormat(format));
-  }
-}
\ No newline at end of file
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDatePicker.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDatePicker.java
deleted file mode 100644
index 14386b3..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDatePicker.java
+++ /dev/null
@@ -1,99 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.logical.shared.HighlightEvent;
-import com.google.gwt.event.logical.shared.HighlightHandler;
-import com.google.gwt.event.logical.shared.ShowRangeEvent;
-import com.google.gwt.event.logical.shared.ShowRangeHandler;
-import com.google.gwt.event.logical.shared.ValueChangeEvent;
-import com.google.gwt.event.logical.shared.ValueChangeHandler;
-import com.google.gwt.i18n.client.DateTimeFormat;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-import com.google.gwt.user.datepicker.client.DatePicker;
-
-import java.util.Date;
-
-/**
- * Date picker demo.
- */
-public class VisualsForDatePicker extends AbstractIssue {
-
-  @Override
-  public Widget createIssue() {
-    VerticalPanel p = new VerticalPanel();
-    final DatePicker picker = new DatePicker();
-    p.add(picker);
-    final Label value = new Label("value: ");
-    p.add(value);
-    final Label highlight = new Label("highlight: ");
-    p.add(highlight);
-    final Label range = new Label("range: ");
-    p.add(range);
-    picker.addValueChangeHandler(new ValueChangeHandler<Date>() {
-      public void onValueChange(ValueChangeEvent<Date> event) {
-        value.setText("value: "
-            + DateTimeFormat.getShortDateFormat().format(event.getValue()));
-      }
-    });
-    picker.addHighlightHandler(new HighlightHandler<Date>() {
-
-      @SuppressWarnings("deprecation")
-      // Should never be seen, as highlight should be cloned.
-      public void onHighlight(HighlightEvent<Date> event) {
-        event.getHighlighted().setYear(1);
-        picker.getHighlightedDate().setYear(1);
-      }
-
-    });
-    picker.addHighlightHandler(new HighlightHandler<Date>() {
-      public void onHighlight(HighlightEvent<Date> event) {
-        highlight.setText("highlight: "
-            + DateTimeFormat.getShortDateFormat().format(event.getHighlighted()));
-      }
-    });
-    picker.addShowRangeHandler(new ShowRangeHandler<Date>() {
-      public void onShowRange(ShowRangeEvent<Date> event) {
-        Date start = event.getStart();
-        Date end = event.getEnd();
-        DateTimeFormat format = DateTimeFormat.getShortDateFormat();
-        range.setText("range: " + format.format(start) + " - "
-            + format.format(end));
-      }
-    });
-    return p;
-  };
-
-  @Override
-  public String getInstructions() {
-    return "Go back one month, go forward one month, check that highlighting is working, and try selecting a date.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Visual test for date picker";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDialogBox.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDialogBox.java
deleted file mode 100644
index 40df95a..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDialogBox.java
+++ /dev/null
@@ -1,254 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.dom.client.Document;
-import com.google.gwt.dom.client.Element;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.MouseDownEvent;
-import com.google.gwt.event.dom.client.MouseDownHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.DialogBox;
-import com.google.gwt.user.client.ui.FlexTable;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.SimplePanel;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Verify that events fire in all browsers.
- */
-public class VisualsForDialogBox extends AbstractIssue {
-
-  enum VisibleEvents {
-    mouseDown, mouseEnter, mouseLeave, mouseMove, mouseUp, captionMouseDown
-  }
-
-  private final class VisibleDialogBox extends DialogBox {
-    private FlexTable layout = null;
-
-    private final Map<VisibleEvents, Element> eventToElement = new HashMap<VisibleEvents, Element>();
-
-    private boolean maybeClose;
-
-    public VisibleDialogBox() {
-      this(false);
-    }
-
-    public VisibleDialogBox(boolean autoHide) {
-      this(autoHide, true);
-    }
-
-    public VisibleDialogBox(boolean autoHide, boolean modal) {
-      super(autoHide, modal);
-      layout = new FlexTable();
-      layout.setCellPadding(3);
-      layout.setBorderWidth(2);
-      layout.setHTML(0, 0, "<b>VisibleEvents</b>");
-      layout.setHTML(0, 1, "<b>Status</b>");
-
-      final String style = "float:right; border: 1px solid blue; color:blue;"
-          + "font-weight:bold; font-size:85%";
-      setHTML("I Gots a Close Box<div id='vis-closebox' style='" + style
-          + "'>&nbsp;X&nbsp;</div>");
-
-      for (VisibleEvents e : VisibleEvents.values()) {
-        eventToElement.put(e, addResultRow(e.name()));
-      }
-      add(layout);
-    }
-
-    @Override
-    public void onBrowserEvent(Event event) {
-      switch (event.getTypeInt()) {
-        case Event.ONMOUSEDOWN:
-          if (isCloseBoxEvent(event)) {
-            maybeClose = true;
-            return;
-          }
-          break;
-        case Event.ONMOUSEUP:
-          if (maybeClose && isCloseBoxEvent(event)) {
-            maybeClose = false;
-            hide();
-            return;
-          }
-          break;
-      }
-      maybeClose = false;
-      super.onBrowserEvent(event);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public void onMouseDown(Widget sender, int x, int y) {
-      pass(VisibleEvents.mouseDown);
-      super.onMouseDown(sender, x, y);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public void onMouseEnter(Widget sender) {
-      pass(VisibleEvents.mouseEnter);
-      sender.getElement().getStyle().setProperty("background", "yellow");
-      super.onMouseEnter(sender);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public void onMouseLeave(Widget sender) {
-      pass(VisibleEvents.mouseLeave);
-      sender.getElement().getStyle().setProperty("background", "");
-      super.onMouseLeave(sender);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public void onMouseMove(Widget sender, int x, int y) {
-      pass(VisibleEvents.mouseMove);
-      super.onMouseMove(sender, x, y);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public void onMouseUp(Widget sender, int x, int y) {
-      pass(VisibleEvents.mouseUp);
-      super.onMouseUp(sender, x, y);
-    }
-
-    public void pass(VisibleEvents event) {
-      eventToElement.get(event).setInnerHTML(
-          "<span style='color:green'>pass</span>");
-    }
-
-    private Element addResultRow(String eventName) {
-      int row = layout.getRowCount();
-      layout.setHTML(row, 0, eventName);
-      layout.setHTML(row, 1, "<span style='color:red'>?</span>");
-      Element cell = layout.getCellFormatter().getElement(row, 1);
-      return cell;
-    }
-
-    private boolean isCloseBoxEvent(Event event) {
-      return Document.get().getElementById("vis-closebox").isOrHasChild(
-          event.getTarget());
-    }
-  }
-
-  @Override
-  public Widget createIssue() {
-    // Create a few extra dialog boxes
-    final DialogBox dialog0 = showCustomDialog(true, true, false, "Dialog 0",
-        "I cannot be dragged or closed until Dialog 2 is closed", 0, 100);
-    final DialogBox dialog1 = showCustomDialog(true, false, false, "Dialog 1",
-        "I cannot be dragged or closed until Dialog 2 is closed", 0, 200);
-    final DialogBox dialog2 = showCustomDialog(false, false, true, "Dialog 2",
-        "I can be dragged", 0, 300);
-    final DialogBox dialog3 = showCustomDialog(
-        true,
-        false,
-        false,
-        "Dialog 3",
-        "I should auto close as soon as you click outside of me and Dialog 4 or greater",
-        0, 400);
-    final DialogBox dialog4 = showCustomDialog(false, false, false, "Dialog 4",
-        "I can be dragged", 0, 500);
-
-    final VisibleDialogBox dialog = showVisibleDialog();
-
-    SimplePanel panel = new SimplePanel() {
-      @Override
-      protected void onUnload() {
-        if (dialog.isAttached()) {
-          dialog.hide();
-          dialog0.hide();
-          dialog1.hide();
-          dialog2.hide();
-          dialog3.hide();
-          dialog4.hide();
-        }
-      }
-    };
-    return panel;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Confirm color change on mouse over caption, that the "
-        + "custom close box works, and that each mouse event fires.  "
-        + "Verify that the text in each DialogBox is true.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Legacy mouse event callbacks fire";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-  private DialogBox showCustomDialog(boolean autoHide,
-      boolean previewAllEvents, boolean modal, String caption, String message,
-      int left, int top) {
-    final DialogBox dialog = new DialogBox(autoHide, modal);
-    dialog.setPreviewingAllNativeEvents(previewAllEvents);
-
-    // Set the caption
-    caption += " (autoHide=" + dialog.isAutoHideEnabled();
-    caption += ", previewAllEvents=" + dialog.isPreviewingAllNativeEvents();
-    caption += ", modal=" + dialog.isModal() + ")";
-    dialog.setText(caption);
-
-    // Set the content
-    Label content = new Label(message);
-    if (autoHide || previewAllEvents) {
-      dialog.setWidget(content);
-    } else {
-      VerticalPanel vPanel = new VerticalPanel();
-      vPanel.add(content);
-      vPanel.add(new Button("Close", new ClickHandler() {
-        public void onClick(ClickEvent event) {
-          dialog.hide();
-        }
-      }));
-      dialog.setWidget(vPanel);
-    }
-    dialog.setPopupPosition(left, top);
-    dialog.show();
-    return dialog;
-  }
-
-  private VisibleDialogBox showVisibleDialog() {
-    final VisibleDialogBox dialog = new VisibleDialogBox();
-    dialog.setModal(false);
-    dialog.center();
-    dialog.getCaption().addMouseDownHandler(new MouseDownHandler() {
-      public void onMouseDown(MouseDownEvent event) {
-        dialog.pass(VisibleEvents.captionMouseDown);
-      }
-    });
-
-    return dialog;
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDisclosurePanelEvents.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDisclosurePanelEvents.java
deleted file mode 100644
index 772e923..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDisclosurePanelEvents.java
+++ /dev/null
@@ -1,112 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.logical.shared.CloseEvent;
-import com.google.gwt.event.logical.shared.CloseHandler;
-import com.google.gwt.event.logical.shared.OpenEvent;
-import com.google.gwt.event.logical.shared.OpenHandler;
-import com.google.gwt.event.shared.GwtEvent;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.CheckBox;
-import com.google.gwt.user.client.ui.DisclosureEvent;
-import com.google.gwt.user.client.ui.DisclosureHandler;
-import com.google.gwt.user.client.ui.DisclosurePanel;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.UIObject;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Testing disclosure events.
- */
-@SuppressWarnings("deprecation")
-public class VisualsForDisclosurePanelEvents extends AbstractIssue {
-
-  VerticalPanel report = new VerticalPanel();
-
-  @Override
-  public Widget createIssue() {
-    VerticalPanel p = new VerticalPanel();
-
-    p.add(createDisclosurePanel("disclose 1"));
-    p.add(createDisclosurePanel("disclose 2"));
-    p.add(report);
-    report("reporting");
-    return p;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Click on disclosure panel, see the expected Open and Close events firing";
-  }
-
-  @Override
-  public String getSummary() {
-    return "DisclosurePanel event tests";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-  DisclosurePanel createDisclosurePanel(final String name) {
-    DisclosurePanel widget = new DisclosurePanel();
-    widget.setContent(new HTML("content for " + name));
-    widget.setTitle(name);
-    widget.setHeader(new CheckBox(name));
-    class MyHandler implements DisclosureHandler, OpenHandler<DisclosurePanel>,
-        CloseHandler<DisclosurePanel> {
-
-      public void onClose(CloseEvent<DisclosurePanel> event) {
-        report(event);
-      }
-
-      public void onClose(DisclosureEvent event) {
-        report(name + "close");
-      }
-
-      public void onOpen(DisclosureEvent event) {
-        report(name + "open");
-      }
-
-      public void onOpen(OpenEvent<DisclosurePanel> event) {
-        report(event);
-      }
-    }
-    MyHandler handler = new MyHandler();
-    widget.addCloseHandler(handler);
-    widget.addOpenHandler(handler);
-    widget.addEventHandler(handler);
-    return widget;
-  }
-
-  private void report(GwtEvent<?> event) {
-    String title = ((UIObject) event.getSource()).getTitle();
-    report(title + " fired " + event.toDebugString());
-  }
-
-  // will be replaced by logging
-  private void report(String s) {
-    report.insert(new Label(s), 0);
-    if (report.getWidgetCount() == 10) {
-      report.remove(9);
-    }
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForEventsFiring.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForEventsFiring.java
deleted file mode 100644
index 41f60fd..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForEventsFiring.java
+++ /dev/null
@@ -1,475 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.dom.client.NativeEvent;
-import com.google.gwt.event.dom.client.BlurEvent;
-import com.google.gwt.event.dom.client.BlurHandler;
-import com.google.gwt.event.dom.client.ChangeEvent;
-import com.google.gwt.event.dom.client.ChangeHandler;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.ContextMenuEvent;
-import com.google.gwt.event.dom.client.ContextMenuHandler;
-import com.google.gwt.event.dom.client.DoubleClickEvent;
-import com.google.gwt.event.dom.client.DoubleClickHandler;
-import com.google.gwt.event.dom.client.ErrorEvent;
-import com.google.gwt.event.dom.client.ErrorHandler;
-import com.google.gwt.event.dom.client.FocusEvent;
-import com.google.gwt.event.dom.client.FocusHandler;
-import com.google.gwt.event.dom.client.HasChangeHandlers;
-import com.google.gwt.event.dom.client.HasContextMenuHandlers;
-import com.google.gwt.event.dom.client.HasDoubleClickHandlers;
-import com.google.gwt.event.dom.client.HasMouseWheelHandlers;
-import com.google.gwt.event.dom.client.KeyDownEvent;
-import com.google.gwt.event.dom.client.KeyDownHandler;
-import com.google.gwt.event.dom.client.KeyPressEvent;
-import com.google.gwt.event.dom.client.KeyPressHandler;
-import com.google.gwt.event.dom.client.KeyUpEvent;
-import com.google.gwt.event.dom.client.KeyUpHandler;
-import com.google.gwt.event.dom.client.LoadEvent;
-import com.google.gwt.event.dom.client.LoadHandler;
-import com.google.gwt.event.dom.client.MouseDownEvent;
-import com.google.gwt.event.dom.client.MouseDownHandler;
-import com.google.gwt.event.dom.client.MouseMoveEvent;
-import com.google.gwt.event.dom.client.MouseMoveHandler;
-import com.google.gwt.event.dom.client.MouseOutEvent;
-import com.google.gwt.event.dom.client.MouseOutHandler;
-import com.google.gwt.event.dom.client.MouseOverEvent;
-import com.google.gwt.event.dom.client.MouseOverHandler;
-import com.google.gwt.event.dom.client.MouseUpEvent;
-import com.google.gwt.event.dom.client.MouseUpHandler;
-import com.google.gwt.event.dom.client.MouseWheelEvent;
-import com.google.gwt.event.dom.client.MouseWheelHandler;
-import com.google.gwt.event.dom.client.ScrollEvent;
-import com.google.gwt.event.dom.client.ScrollHandler;
-import com.google.gwt.event.logical.shared.ResizeEvent;
-import com.google.gwt.event.logical.shared.ResizeHandler;
-import com.google.gwt.event.shared.HandlerRegistration;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.FlexTable;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.HasHorizontalAlignment;
-import com.google.gwt.user.client.ui.HasVerticalAlignment;
-import com.google.gwt.user.client.ui.Image;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.ScrollPanel;
-import com.google.gwt.user.client.ui.TextBox;
-import com.google.gwt.user.client.ui.Widget;
-import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Verify that events fire in all browsers.
- */
-public class VisualsForEventsFiring extends AbstractIssue {
-  private static class CustomImage extends Image implements
-      HasDoubleClickHandlers, HasContextMenuHandlers {
-    public HandlerRegistration addContextMenuHandler(ContextMenuHandler handler) {
-      return addDomHandler(handler, ContextMenuEvent.getType());
-    }
-
-    public HandlerRegistration addDoubleClickHandler(DoubleClickHandler handler) {
-      return addDomHandler(handler, DoubleClickEvent.getType());
-    }
-  }
-
-  private static class CustomScrollPanel extends ScrollPanel implements
-      HasMouseWheelHandlers {
-    public CustomScrollPanel(Widget content) {
-      super(content);
-    }
-
-    public HandlerRegistration addMouseWheelHandler(MouseWheelHandler handler) {
-      return addDomHandler(handler, MouseWheelEvent.getType());
-    }
-  }
-
-  private static class CustomTextBox extends TextBox implements
-      HasChangeHandlers {
-    public HandlerRegistration addChangeHandler(ChangeHandler handler) {
-      return addDomHandler(handler, ChangeEvent.getType());
-    }
-  }
-
-  private static final int WINDOW_EVENT_SCROLL = -1;
-  private static final int WINDOW_EVENT_RESIZE = -2;
-  private static final int WINDOW_EVENT_CLOSING = -3;
-  private static final int VELOCITY_EVENT = -4;
-
-  /**
-   * The main grid used for layout.
-   */
-  private FlexTable layout = null;
-
-  private Map<Integer, Integer> eventMap = new HashMap<Integer, Integer>();
-
-  @Override
-  public Widget createIssue() {
-    // Create a grid to hold all of the tests
-    eventMap.clear();
-    layout = new FlexTable();
-    layout.setCellPadding(3);
-    layout.setBorderWidth(2);
-    layout.setHTML(0, 0, "<b>Action to Perform</b>");
-    layout.setHTML(0, 1, "<b>Event</b>");
-    layout.setHTML(0, 2, "<b>Status</b>");
-
-    prepMouseEvents();
-    prepKeyboardEvents();
-    prepScrollAndMouseWheelEvents();
-    prepLoadEvents();
-    prepWindowEvents();
-
-    // The following are not testable or not supported in all browsers
-    // onlosecapture
-
-    return layout;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Use the Widgets below to verify that all events fire in all "
-        + "browsers.  To test an event, perform the action require to trigger "
-        + "the event using the provided widget.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Events fire in current browsers";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-  /**
-   * Add a test that is dependent on a previous test.
-   * 
-   * @param eventType the type of event defined in {@link Event}
-   * @param eventName the name of the event
-   * @return the index of the test
-   */
-  private int addDependentTest(int eventType, String eventName) {
-    // Find the last test
-    int numRows = layout.getRowCount();
-    eventMap.put(new Integer(eventType), new Integer(numRows));
-    for (int i = numRows - 1; i > 0; i--) {
-      if (layout.getCellCount(i) == 3) {
-        FlexCellFormatter formatter = layout.getFlexCellFormatter();
-        int rowSpan = formatter.getRowSpan(i, 0);
-        formatter.setRowSpan(i, 0, rowSpan + 1);
-        break;
-      }
-    }
-    layout.setText(numRows, 0, eventName);
-    layout.setText(numRows, 1, "?");
-    return numRows;
-  }
-
-  /**
-   * Add a new test that tests one or more events.
-   * 
-   * @param eventType the type of event defined in {@link Event}
-   * @param eventName the name of the event
-   * @param trigger the widget that triggers the events
-   * @return the index of the test
-   */
-  private int addTest(int eventType, String eventName, Widget trigger) {
-    int numRows = layout.getRowCount();
-    eventMap.put(new Integer(eventType), new Integer(numRows));
-    layout.setWidget(numRows, 0, trigger);
-    layout.setText(numRows, 1, eventName);
-    layout.setText(numRows, 2, "?");
-
-    FlexCellFormatter formatter = layout.getFlexCellFormatter();
-    formatter.setVerticalAlignment(numRows, 0,
-        HasVerticalAlignment.ALIGN_MIDDLE);
-    formatter.setHorizontalAlignment(numRows, 0,
-        HasHorizontalAlignment.ALIGN_CENTER);
-    return numRows;
-  }
-
-  /**
-   * Mark the event as passed.
-   * 
-   * @param event the event that was triggered
-   */
-  private void passTest(NativeEvent event) {
-    passTest(Event.as(event).getTypeInt());
-  }
-
-  /**
-   * Mark the event as passed.
-   * 
-   * @param eventType the event type that was triggered
-   */
-  private void passTest(int eventType) {
-    int rowIndex = eventMap.get(new Integer(eventType));
-    if (layout.getCellCount(rowIndex) == 3) {
-      layout.setHTML(rowIndex, 2, "pass");
-    } else {
-      layout.setHTML(rowIndex, 1, "pass");
-    }
-  }
-
-  private void prepKeyboardEvents() {
-    // Setup a text box to trigger the events
-    CustomTextBox textBox = new CustomTextBox();
-
-    // Setup the tests
-    textBox.setText("Type a letter");
-    addTest(Event.ONKEYDOWN, "keydown", textBox);
-    addDependentTest(Event.ONKEYPRESS, "keypress");
-    addDependentTest(Event.ONKEYUP, "keyup");
-    addDependentTest(Event.ONFOCUS, "focus");
-    addDependentTest(Event.ONBLUR, "blur");
-    addDependentTest(Event.ONCHANGE, "change");
-
-    // Add event handlers
-    textBox.addKeyDownHandler(new KeyDownHandler() {
-      public void onKeyDown(KeyDownEvent event) {
-
-        event.isAltKeyDown();
-        event.isControlKeyDown();
-        event.isShiftKeyDown();
-        event.isMetaKeyDown();
-        assert event.getNativeKeyCode() > 0;
-        passTest(event.getNativeEvent());
-      }
-    });
-    textBox.addKeyUpHandler(new KeyUpHandler() {
-      public void onKeyUp(KeyUpEvent event) {
-        event.isAltKeyDown();
-        event.isControlKeyDown();
-        event.isShiftKeyDown();
-        event.isMetaKeyDown();
-        assert event.getNativeKeyCode() > 0;
-        passTest(event.getNativeEvent());
-      }
-    });
-    textBox.addKeyPressHandler(new KeyPressHandler() {
-      public void onKeyPress(KeyPressEvent event) {
-        event.isAltKeyDown();
-        event.isControlKeyDown();
-        event.isShiftKeyDown();
-        event.isMetaKeyDown();
-        assert event.getCharCode() > 0;
-        passTest(event.getNativeEvent());
-      }
-    });
-    textBox.addFocusHandler(new FocusHandler() {
-      public void onFocus(FocusEvent event) {
-        passTest(event.getNativeEvent());
-      }
-    });
-    textBox.addBlurHandler(new BlurHandler() {
-      public void onBlur(BlurEvent event) {
-        passTest(event.getNativeEvent());
-      }
-    });
-    textBox.addChangeHandler(new ChangeHandler() {
-      public void onChange(ChangeEvent event) {
-        passTest(event.getNativeEvent());
-      }
-    });
-  }
-
-  private void prepLoadEvents() {
-    // Create an image to trigger events
-    final CustomImage loadable = new CustomImage();
-
-    // Setup the tests
-    addTest(Event.ONERROR, "error", loadable);
-    addDependentTest(Event.ONLOAD, "load");
-    addDependentTest(Event.ONCONTEXTMENU, "contextMenu");
-    addDependentTest(Event.ONDBLCLICK, "dblclick");
-
-    // Add the handlers
-    loadable.addErrorHandler(new ErrorHandler() {
-      public void onError(ErrorEvent event) {
-        loadable.setUrl("issues/images/gwtLogo.png");
-        passTest(event.getNativeEvent());
-      }
-    });
-    loadable.addLoadHandler(new LoadHandler() {
-      public void onLoad(LoadEvent event) {
-        passTest(event.getNativeEvent());
-      }
-    });
-    loadable.addDoubleClickHandler(new DoubleClickHandler() {
-      public void onDoubleClick(DoubleClickEvent event) {
-        passTest(event.getNativeEvent());
-      }
-    });
-    loadable.addContextMenuHandler(new ContextMenuHandler() {
-      public void onContextMenu(ContextMenuEvent event) {
-        passTest(event.getNativeEvent());
-      }
-    });
-
-    // Trigger the events
-    loadable.setUrl("imageDoesNotExist.abc");
-  }
-
-  private void prepMouseEvents() {
-    // Create a button to trigger events
-    final Button button = new Button("Click me, move over me") {
-      @Override
-      public void onBrowserEvent(Event event) {
-        super.onBrowserEvent(event);
-
-        // Verify that values associated with events are defined. For some
-        // values, we just want to make sure we can get them without any
-        // errors.
-        assert event.getClientX() > 0;
-        assert event.getClientY() > 0;
-        assert event.getScreenX() > 0;
-        assert event.getScreenY() > 0;
-        event.getAltKey();
-        event.getCtrlKey();
-        event.getShiftKey();
-        event.getMetaKey();
-      }
-    };
-
-    // Setup the tests
-    addTest(Event.ONCLICK, "click", button);
-    addDependentTest(Event.ONMOUSEDOWN, "mousedown");
-    addDependentTest(Event.ONMOUSEUP, "mouseup");
-    addDependentTest(Event.ONMOUSEOVER, "mouseover");
-    addDependentTest(Event.ONMOUSEOUT, "mouseout");
-    addDependentTest(Event.ONMOUSEMOVE, "mousemove");
-
-    // Add event handlers
-    button.addClickHandler(new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        passTest(event.getNativeEvent());
-      }
-    });
-    button.addMouseDownHandler(new MouseDownHandler() {
-      public void onMouseDown(MouseDownEvent event) {
-        event.getNativeButton();
-        passTest(event.getNativeEvent());
-      }
-    });
-    button.addMouseUpHandler(new MouseUpHandler() {
-      public void onMouseUp(MouseUpEvent event) {
-        event.getNativeButton();
-        passTest(event.getNativeEvent());
-      }
-    });
-    button.addMouseMoveHandler(new MouseMoveHandler() {
-      public void onMouseMove(MouseMoveEvent event) {
-        passTest(event.getNativeEvent());
-      }
-    });
-    button.addMouseOutHandler(new MouseOutHandler() {
-      public void onMouseOut(MouseOutEvent event) {
-        NativeEvent nativeEvent = event.getNativeEvent();
-        assert nativeEvent.getRelatedEventTarget() != null;
-        assert nativeEvent.getEventTarget() != null;
-        if (button.getElement().equals(nativeEvent.getEventTarget())
-            && button.getElement().getParentElement().equals(
-                nativeEvent.getRelatedEventTarget())) {
-          passTest(nativeEvent);
-        }
-      }
-    });
-    button.addMouseOverHandler(new MouseOverHandler() {
-      public void onMouseOver(MouseOverEvent event) {
-        NativeEvent nativeEvent = event.getNativeEvent();
-        assert nativeEvent.getRelatedEventTarget() != null;
-        assert nativeEvent.getEventTarget() != null;
-        if (button.getElement().equals(nativeEvent.getEventTarget())
-            && button.getElement().getParentElement().equals(
-                nativeEvent.getRelatedEventTarget())) {
-          passTest(nativeEvent);
-        }
-      }
-    });
-  }
-
-  private void prepScrollAndMouseWheelEvents() {
-    // Create a widget to trigger events
-    String scrollableMessage = "Scroll to the bottom<br>(using mouse wheel<br>"
-        + "if supported)";
-    HTML scrollableContents = new HTML(scrollableMessage);
-    scrollableContents.setPixelSize(400, 400);
-    scrollableContents.getElement().getStyle().setProperty("textAlign", "left");
-    CustomScrollPanel scrollable = new CustomScrollPanel(scrollableContents);
-
-    // Setup the tests
-    scrollable.setAlwaysShowScrollBars(true);
-    scrollable.setPixelSize(200, 100);
-    addTest(Event.ONSCROLL, "scroll", scrollable);
-    addDependentTest(Event.ONMOUSEWHEEL, "mousewheel");
-
-    // Display the mouse wheel velocity
-    final int velocityIndex = addDependentTest(VELOCITY_EVENT, "velocityY");
-
-    // Add event handlers
-    scrollable.addScrollHandler(new ScrollHandler() {
-      public void onScroll(ScrollEvent event) {
-        passTest(event.getNativeEvent());
-      }
-    });
-    scrollable.addMouseWheelHandler(new MouseWheelHandler() {
-      public void onMouseWheel(MouseWheelEvent event) {
-        event.getClientX();
-        event.getClientY();
-        event.getScreenX();
-        event.getScreenY();
-        int velocityY = event.getDeltaY();
-        layout.setText(velocityIndex, 1, velocityY + "");
-        passTest(event.getNativeEvent());
-      }
-    });
-  }
-
-  private void prepWindowEvents() {
-    Label windowLabel = new Label("Window level events");
-
-    // Setup the tests
-    addTest(WINDOW_EVENT_SCROLL, "window.onscroll", windowLabel);
-    addDependentTest(WINDOW_EVENT_RESIZE, "window.onresize");
-    addDependentTest(WINDOW_EVENT_CLOSING, "window.onbeforeunload");
-
-    // Add event handlers
-    Window.addWindowScrollHandler(new Window.ScrollHandler() {
-      public void onWindowScroll(Window.ScrollEvent event) {
-        passTest(WINDOW_EVENT_SCROLL);
-      }
-    });
-    Window.addResizeHandler(new ResizeHandler() {
-      public void onResize(ResizeEvent event) {
-        passTest(WINDOW_EVENT_RESIZE);
-      }
-    });
-    Window.addWindowClosingHandler(new Window.ClosingHandler() {
-      public void onWindowClosing(Window.ClosingEvent event) {
-        event.setMessage("Stay and verify that window.onbeforeunload() has passed");
-        passTest(WINDOW_EVENT_CLOSING);
-      }
-    });
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForMenuEvents.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForMenuEvents.java
deleted file mode 100644
index d11371a..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForMenuEvents.java
+++ /dev/null
@@ -1,141 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.logical.shared.CloseEvent;
-import com.google.gwt.event.logical.shared.CloseHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.museum.client.common.EventReporter;
-import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.ui.HorizontalPanel;
-import com.google.gwt.user.client.ui.MenuBar;
-import com.google.gwt.user.client.ui.Panel;
-import com.google.gwt.user.client.ui.PopupPanel;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * A simple test for suggest box events.
- */
-@SuppressWarnings("deprecation")
-public class VisualsForMenuEvents extends AbstractIssue {
-
-  HorizontalPanel report = new HorizontalPanel();
-
-  @Override
-  public Widget createIssue() {
-    VerticalPanel p = new VerticalPanel();
-
-    createMenu(p);
-    report.setBorderWidth(3);
-
-    report.setCellWidth(report.getWidget(0), "300px");
-
-    p.add(report);
-    return p;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Open and close menu items and see that you get close events";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Menu event tests";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-  void createMenu(Panel p) {
-    final EventReporter<Object, PopupPanel> reporter = new EventReporter<Object, PopupPanel>(
-        report);
-    Command command = new Command() {
-
-      public void execute() {
-        reporter.report("menu item selected");
-      }
-
-    };
-
-    MenuBar main = new MenuBar();
-    main.setTitle("Main");
-    p.add(main);
-    MenuBar barA = new MenuBar();
-    barA.setTitle("A");
-    CloseHandler<PopupPanel> handler = new CloseHandler<PopupPanel>() {
-
-      public void onClose(CloseEvent<PopupPanel> event) {
-        reporter.report("closed popup belonging to Main");
-      }
-
-    };
-    main.addCloseHandler(handler);
-    barA.addItem("a1", command);
-    barA.addItem("a2", command);
-
-    handler = new CloseHandler<PopupPanel>() {
-
-      public void onClose(CloseEvent<PopupPanel> event) {
-        reporter.report("closed popup belonging to A");
-      }
-
-    };
-    barA.addCloseHandler(handler);
-    MenuBar barB = new MenuBar();
-    barB.setTitle("B");
-    barB.addItem("b1", command);
-    barB.addItem("b2", command);
-
-    handler = new CloseHandler<PopupPanel>() {
-
-      public void onClose(CloseEvent<PopupPanel> event) {
-        reporter.report("closed popup belonging to B");
-      }
-
-    };
-    barB.addCloseHandler(handler);
-    MenuBar barC = new MenuBar();
-    barC.addItem("c1", command);
-    barC.addItem("c2", command);
-
-    handler = new CloseHandler<PopupPanel>() {
-
-      public void onClose(CloseEvent<PopupPanel> event) {
-        reporter.report("closed popup belonging to c");
-      }
-
-    };
-    barC.addCloseHandler(handler);
-    barC.setTitle("C");
-
-    handler = new CloseHandler<PopupPanel>() {
-
-      public void onClose(CloseEvent<PopupPanel> event) {
-        reporter.report("closed popup belonging to B");
-      }
-
-    };
-
-    main.addItem("A", barA);
-    barA.addItem("b", barB);
-    barB.addItem("c", barC);
-  }
-}
\ No newline at end of file
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForPopupEvents.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForPopupEvents.java
deleted file mode 100644
index 81fa475..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForPopupEvents.java
+++ /dev/null
@@ -1,110 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.logical.shared.CloseEvent;
-import com.google.gwt.event.logical.shared.CloseHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.HorizontalPanel;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.PopupPanel;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Visual tests for {@link PopupPanel}.
- */
-public class VisualsForPopupEvents extends AbstractIssue {
-  static int xPos = 0;
-
-  @Override
-  public Widget createIssue() {
-    VerticalPanel panel = new VerticalPanel();
-    panel.setSpacing(3);
-    {
-      PopupPanel popup = createButton(true, false, panel);
-      Label partner0 = new Label("AutoHide Partner 0");
-      Label partner1 = new Label("AutoHide Partner 1");
-      popup.addAutoHidePartner(partner0.getElement());
-      popup.addAutoHidePartner(partner1.getElement());
-
-      HorizontalPanel hPanel = new HorizontalPanel();
-      hPanel.setBorderWidth(1);
-      hPanel.setSpacing(3);
-      hPanel.add(partner0);
-      hPanel.add(partner1);
-      panel.add(new Label(
-          "Clicking on partners should not autoHide this popup:"));
-      panel.add(hPanel);
-    }
-    createButton(true, true, panel);
-    createButton(false, false, panel);
-    createButton(false, true, panel);
-    return panel;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Open and close each popup, check for the closing text in the window title";
-  }
-
-  @Override
-  public String getSummary() {
-    return "popup event visual test";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-  private PopupPanel createButton(boolean autoHide, boolean modal,
-      VerticalPanel panel) {
-    final String text = " popup " + (modal ? " modal " : " non-modal ")
-        + (autoHide ? "auto hide" : " persistent");
-    panel.add(new HTML("<h2>" + text + "</h2>"));
-    final PopupPanel p = new PopupPanel(autoHide, modal);
-    p.setTitle(text);
-    Button b = new Button("show", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        p.setPopupPosition(200,
-            ((Button) event.getSource()).getAbsoluteTop() - 10);
-        p.show();
-      }
-    });
-    panel.add(b);
-    p.setWidget(new Button("hide me", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        p.hide();
-      }
-    }));
-
-    p.addCloseHandler(new CloseHandler<PopupPanel>() {
-      public void onClose(CloseEvent<PopupPanel> event) {
-        Window.setTitle("closing popup '" + p.getTitle() + "'. autohide:"
-            + event.isAutoClosed());
-      }
-    });
-
-    return p;
-  }
-}
\ No newline at end of file
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForSuggestBox.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForSuggestBox.java
deleted file mode 100644
index a495c3a..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForSuggestBox.java
+++ /dev/null
@@ -1,141 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.dom.client.Document;
-import com.google.gwt.dom.client.Element;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.MouseDownEvent;
-import com.google.gwt.event.dom.client.MouseDownHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.Timer;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.FlexTable;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
-import com.google.gwt.user.client.ui.SuggestBox;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Visual test for suggest box.
- */
-public class VisualsForSuggestBox extends AbstractIssue {
-  MultiWordSuggestOracle girlsNames = new MultiWordSuggestOracle();
-  MultiWordSuggestOracle girlsNamesWithDefault = new MultiWordSuggestOracle();
-
-  Element textBoxToWrap;
-
-  VisualsForSuggestBox() {
-    List<String> femaleNames = Arrays.asList("Jamie", "Jill", "Jackie",
-        "Susan", "Helen", "Emily", "Karen", "Emily", "Isabella", "Emma", "Ava",
-        "Madison", "Sophia", "Olivia", "Abigail", "Hannah", "Elizabeth",
-        "Addison", "Samantha", "Ashley", "Alyssa", "Mia", "Chloe", "Natalie",
-        "Sarah", "Alexis", "Grace", "Ella", "Brianna", "Hailey", "Taylor",
-        "Anna", "Kayla", "Lily", "Lauren", "Victoria", "Savannah", "Nevaeh",
-        "Jasmine", "Lillian", "Julia", "Sofia", "Kaylee", "Sydney",
-        "Gabriella", "Katherine", "Alexa", "Destiny", "Jessica", "Morgan",
-        "Kaitlyn", "Brooke", "Allison", "Makayla", "Avery", "Alexandra",
-        "Jocelyn");
-    girlsNames.addAll(femaleNames);
-    girlsNamesWithDefault.addAll(femaleNames);
-    girlsNamesWithDefault.setDefaultSuggestionsFromText(femaleNames);
-  }
-
-  /**
-   * This is the entry point method.
-   */
-  @Override
-  public Widget createIssue() {
-    VerticalPanel panel = new VerticalPanel();
-    HTML wrapperText = new HTML(
-        "Make sure this wrapped suggest box works as normal.");
-    panel.add(wrapperText);
-    textBoxToWrap = Document.get().createTextInputElement();
-    wrapperText.getElement().appendChild(textBoxToWrap);
-
-    panel.add(new HTML(
-        "Select the show button, nothing should open <br/> Type 'e' and select the button again, now a suggestion list should open and close."));
-    panel.add(manuallyShowAndHide());
-    panel.add(new Label(
-        "Click on suggest box, it should open automatically. Check that First item is not selected"));
-    panel.add(suggestBoxWithDefault());
-    return panel;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Follow the directions above each suggest box";
-  }
-
-  @Override
-  public String getSummary() {
-    return "suggest box visuals";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-  private Widget manuallyShowAndHide() {
-    FlexTable t = new FlexTable();
-    t.getFlexCellFormatter().setColSpan(0, 0, 20);
-    final SuggestBox box = simpleSuggestBox();
-    box.setAnimationEnabled(true);
-    t.setWidget(0, 0, box);
-
-    Button showSuggestions = new Button(
-        "show suggestions, then hide after 2  seconds", new ClickHandler() {
-          public void onClick(ClickEvent event) {
-            box.showSuggestionList();
-            new Timer() {
-
-              @Override
-              public void run() {
-                box.hideSuggestionList();
-              }
-
-            }.schedule(2000);
-          }
-        });
-    t.setWidget(1, 0, showSuggestions);
-    return t;
-  }
-
-  private SuggestBox simpleSuggestBox() {
-    SuggestBox b = new SuggestBox(girlsNames);
-    return b;
-  }
-
-  private SuggestBox suggestBoxWithDefault() {
-    final SuggestBox b = new SuggestBox(girlsNamesWithDefault);
-    b.setAutoSelectEnabled(false);
-    b.getTextBox().addMouseDownHandler(new MouseDownHandler() {
-
-      public void onMouseDown(MouseDownEvent event) {
-        b.showSuggestionList();
-      }
-
-    });
-    return b;
-  }
-}
\ No newline at end of file
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForSuggestBoxEvents.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForSuggestBoxEvents.java
deleted file mode 100644
index d96eac9..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForSuggestBoxEvents.java
+++ /dev/null
@@ -1,136 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.logical.shared.ValueChangeEvent;
-import com.google.gwt.event.logical.shared.ValueChangeHandler;
-import com.google.gwt.event.shared.HandlerRegistration;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.museum.client.common.EventReporter;
-import com.google.gwt.user.client.ui.CheckBox;
-import com.google.gwt.user.client.ui.HorizontalPanel;
-import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
-import com.google.gwt.user.client.ui.Panel;
-import com.google.gwt.user.client.ui.SuggestBox;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * A simple test for suggest box events.
- */
-@SuppressWarnings("deprecation")
-public class VisualsForSuggestBoxEvents extends AbstractIssue {
-
-  HorizontalPanel report = new HorizontalPanel();
-
-  @Override
-  public Widget createIssue() {
-    VerticalPanel p = new VerticalPanel();
-
-    p.add(createSuggestBox("suggest 1", p));
-    p.add(createSuggestBox("suggest 2", p));
-    report.setBorderWidth(3);
-
-    report.setCellWidth(report.getWidget(0), "300px");
-    report.setCellWidth(report.getWidget(1), "300px");
-
-    p.add(report);
-    return p;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Select suggestions from suggest box, check report for events being fired";
-  }
-
-  @Override
-  public String getSummary() {
-    return "suggest box event visual test";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-  SuggestBox createSuggestBox(final String suggestBoxName, Panel p) {
-
-    List<String> femaleNames = Arrays.asList(new String[] {
-        "Jamie", "Jill", "Jackie", "Susan", "Helen", "Emily", "Karen",
-        "Abigail", "Kaitlyn", "Laura", "Joanna", "Tasha"});
-    MultiWordSuggestOracle oracle = new MultiWordSuggestOracle();
-    oracle.addAll(femaleNames);
-
-    final SuggestBox b = new SuggestBox(oracle);
-    b.setTitle(suggestBoxName);
-    p.add(b);
-    final CheckBox selectsFirst = new CheckBox("Selects first suggestion");
-    selectsFirst.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
-      public void onValueChange(ValueChangeEvent<Boolean> event) {
-        b.setAutoSelectEnabled(event.getValue());
-      }
-    });
-    selectsFirst.setChecked(b.isAutoSelectEnabled());
-    p.add(selectsFirst);
-    final EventReporter<String, SuggestBox> handler = new EventReporter<String, SuggestBox>(
-        report);
-
-    handler.new CheckBoxEvent("KeyDown", p) {
-
-      @Override
-      public HandlerRegistration addHandler() {
-        return b.addKeyDownHandler(handler);
-      }
-
-    };
-
-    handler.new CheckBoxListener("ChangeListener", p) {
-
-      @Override
-      public void addListener() {
-        b.addChangeListener(handler);
-      }
-
-      @Override
-      public void removeListener() {
-        b.removeChangeListener(handler);
-      }
-    };
-    handler.new CheckBoxListener("Suggestion listener", p) {
-
-      @Override
-      public void addListener() {
-        b.addEventHandler(handler);
-      }
-
-      @Override
-      public void removeListener() {
-        b.removeEventHandler(handler);
-      }
-    };
-
-    b.addKeyUpHandler(handler);
-    b.addKeyPressHandler(handler);
-    b.addFocusListener(handler);
-    b.addSelectionHandler(handler);
-    b.addValueChangeHandler(handler);
-    return b;
-  }
-}
\ No newline at end of file
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTableEvents.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTableEvents.java
deleted file mode 100644
index d6a2d15..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTableEvents.java
+++ /dev/null
@@ -1,108 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.FocusEvent;
-import com.google.gwt.event.dom.client.FocusHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.CheckBox;
-import com.google.gwt.user.client.ui.Grid;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-import com.google.gwt.user.client.ui.HTMLTable.Cell;
-
-/**
- * Visual test for table events.
- */
-public class VisualsForTableEvents extends AbstractIssue {
-  final Grid g = new Grid(5, 5);
-
-  public void fillInGrid() {
-    int row = 0;
-
-    for (int i = 0; i < 5; i++) {
-      g.setText(row, i, "click on cell in row to change");
-    }
-    ++row;
-    for (int i = 0; i < 5; i++) {
-      g.setText(row, i, "cell(0," + i + ")");
-    }
-    ++row;
-    for (int i = 0; i < 5; i++) {
-      g.setHTML(row, i, "<b>cell(1," + i + "</b>)");
-    }
-
-    ++row;
-    for (int i = 0; i < 5; i++) {
-      g.setWidget(row, i, new CheckBox("cell(1," + i + "</b>)"));
-    }
-
-    ++row;
-    for (int i = 0; i < 5; i++) {
-      final CheckBox box = new CheckBox("eventful cell(1," + i + "</b>)");
-      box.addFocusHandler(new FocusHandler() {
-        public void onFocus(FocusEvent event) {
-          Window.setTitle(box.getText() + " has focus");
-        }
-      });
-      final int index = i;
-      box.addClickHandler(new ClickHandler() {
-
-        public void onClick(ClickEvent event) {
-          g.setText(0, index, "checkbox click");
-        }
-      });
-
-      g.setWidget(row, i, box);
-    }
-  }
-
-  @Override
-  public Widget createIssue() {
-    VerticalPanel p = new VerticalPanel();
-    fillInGrid();
-    p.add(g);
-    g.addClickHandler(new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        Cell cell = g.getCellForEvent(event);
-        g.setText(0, cell.getCellIndex(), "clicked on " + cell.getCellIndex()
-            + "," + cell.getRowIndex());
-      }
-
-    });
-    return p;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Click on the cells";
-  }
-
-  @Override
-  public String getSummary() {
-    return "table events";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTextEvents.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTextEvents.java
deleted file mode 100644
index 76cfe4a..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTextEvents.java
+++ /dev/null
@@ -1,90 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.HandlesAllKeyEvents;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.museum.client.common.EventReporter;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.RichTextArea;
-import com.google.gwt.user.client.ui.TextBox;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Visual testing of rich text box events.
- */
-public class VisualsForTextEvents extends AbstractIssue {
-  private VerticalPanel p = new VerticalPanel();
-
-  @SuppressWarnings("deprecation")
-  @Override
-  public Widget createIssue() {
-    p.setWidth("500px");
-    p.setBorderWidth(1);
-    // TextBox
-    final TextBox b = new TextBox();
-    b.setTitle("text box");
-    p.add(b);
-    EventReporter<String, Object> handler = new EventReporter<String, Object>(p);
-    p.add(new Button("change value with event", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        b.setValue("emily", true);
-      }
-    }));
-    b.addKeyboardListener(handler);
-    HandlesAllKeyEvents.addHandlers(b, handler);
-    b.addChangeListener(handler);
-    b.addFocusHandler(handler);
-    b.addBlurHandler(handler);
-    b.addFocusListener(handler);
-    b.addValueChangeHandler(handler);
-    b.addMouseListener(handler);
-    // Rich text box:
-    RichTextArea rich = new RichTextArea();
-    rich.setTitle("rich text box");
-    p.add(rich);
-    handler = new EventReporter<String, Object>(p);
-    rich.addKeyboardListener(handler);
-    HandlesAllKeyEvents.addHandlers(rich,handler);
-
-    rich.addBlurHandler(handler);
-    rich.addFocusHandler(handler);
-    rich.addClickHandler(handler);
-    rich.addClickListener(handler);
-
-    return p;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "type and click into text boxes, see that correct events show up";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Text widget event tests";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java
deleted file mode 100644
index c317aa2..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java
+++ /dev/null
@@ -1,142 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.user.client.ui.CheckBox;
-import com.google.gwt.user.client.ui.Focusable;
-import com.google.gwt.user.client.ui.HorizontalPanel;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.RadioButton;
-import com.google.gwt.user.client.ui.SimpleCheckBox;
-import com.google.gwt.user.client.ui.SimplePanel;
-import com.google.gwt.user.client.ui.Tree;
-import com.google.gwt.user.client.ui.TreeItem;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * A simple tree used to quickly exercise tree behavior.
- */
-public class VisualsForTree extends AbstractIssue {
-
-  static class DelegatingFocusPanel extends HorizontalPanel implements
-      Focusable {
-
-    public int getTabIndex() {
-      return getFocusable().getTabIndex();
-    }
-
-    public void setAccessKey(char key) {
-      getFocusable().setAccessKey(key);
-    }
-
-    public void setFocus(boolean focused) {
-      getFocusable().setFocus(focused);
-    }
-
-    public void setTabIndex(int index) {
-      getFocusable().setTabIndex(index);
-    }
-
-    private Focusable getFocusable() {
-      for (Widget widget : this.getChildren()) {
-        if (widget instanceof Focusable) {
-          return (Focusable) widget;
-        }
-      }
-      throw new IllegalArgumentException("No focusable children to focus on");
-    }
-  }
-
-  public static Tree createTree() {
-    Tree tree = new Tree();
-    TreeItem a = new TreeItem("a");
-    TreeItem b = new TreeItem(
-        "b, though this is a very, very long text field in order to trigger text wrapping bugs, if there are any such bugs currently in the tree.");
-    TreeItem ba = new TreeItem("b.a");
-    TreeItem bb = new TreeItem("b.b");
-    TreeItem bba = new TreeItem("b.b.a");
-    TreeItem bc = new TreeItem("b.c");
-    TreeItem c = new TreeItem("c");
-    TreeItem d = new TreeItem(new RadioButton("myradio",
-        "I should line up nicely"));
-    TreeItem e = new TreeItem(new CheckBox("I should line up nicely"));
-    TreeItem f = new TreeItem(new CheckBox("I should also line up nicely"));
-    f.addItem(new CheckBox("me to"));
-    SimplePanel panel = new SimplePanel();
-    panel.setWidget(new Label("There should not be any space above me"));
-    TreeItem g = new TreeItem(panel);
-
-    tree.setSelectedItem(b);
-    tree.addItem(a);
-    tree.addItem(b);
-    tree.addItem(c);
-    tree.addItem(d);
-    tree.addItem(e);
-    tree.addItem(f);
-    tree.addItem(g);
-    b.addItem(ba);
-    b.addItem(bb);
-    bb.addItem(bba);
-    b.addItem(bc);
-
-    // Focus checks
-    DelegatingFocusPanel focus = new DelegatingFocusPanel();
-    focus.add(new Label("first check box should have focus "));
-    focus.add(new SimpleCheckBox());
-    focus.add(new SimpleCheckBox());
-
-    final DelegatingFocusPanel focus2 = new DelegatingFocusPanel();
-    focus2.add(new Label("second check box should have focus "));
-    focus2.add(new SimpleCheckBox());
-    focus2.add(new SimpleCheckBox());
-
-    TreeItem customFocus = new TreeItem(focus2) {
-      @Override
-      public Focusable getFocusable() {
-        return (Focusable) focus2.getWidget(2);
-      }
-    };
-    tree.addItem(focus);
-    tree.addItem(customFocus);
-    return tree;
-  }
-
-  @Override
-  public Widget createIssue() {
-    VerticalPanel p = new VerticalPanel();
-    p.add(createTree());
-    return p;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Open each node, make sure everything looks right";
-  }
-
-  @Override
-  public String getSummary() {
-    return "simple tree, used for generic tree tests";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTreeEvents.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTreeEvents.java
deleted file mode 100644
index 601eb05..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTreeEvents.java
+++ /dev/null
@@ -1,92 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.logical.shared.CloseEvent;
-import com.google.gwt.event.logical.shared.CloseHandler;
-import com.google.gwt.event.logical.shared.OpenEvent;
-import com.google.gwt.event.logical.shared.OpenHandler;
-import com.google.gwt.event.logical.shared.SelectionEvent;
-import com.google.gwt.event.logical.shared.SelectionHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.museum.client.common.EventReporter;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.Tree;
-import com.google.gwt.user.client.ui.TreeItem;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * A simple tree used to quickly exercise tree behavior.
- */
-public class VisualsForTreeEvents extends AbstractIssue {
-
-  @Override
-  public Widget createIssue() {
-    VerticalPanel p = new VerticalPanel();
-    Tree t = VisualsForTree.createTree();
-    p.add(t);
-    EventReporter<Object, TreeItem> handler = new EventReporter<Object, TreeItem>(
-        p);
-    t.addKeyboardListener(handler);
-    t.addMouseListener(handler);
-
-    t.addSelectionHandler(new SelectionHandler<TreeItem>() {
-      public void onSelection(SelectionEvent<TreeItem> event) {
-        Window.setTitle("select " + prettyPrint(event.getSelectedItem()));
-      }
-    });
-
-    t.addCloseHandler(new CloseHandler<TreeItem>() {
-
-      public void onClose(CloseEvent<TreeItem> event) {
-        Window.setTitle("close " + prettyPrint(event.getTarget()));
-      }
-
-    });
-
-    t.addOpenHandler(new OpenHandler<TreeItem>() {
-
-      public void onOpen(OpenEvent<TreeItem> event) {
-        Window.setTitle("open " + prettyPrint(event.getTarget()));
-      }
-
-    });
-
-    return p;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Open each node, ensure you see the right events in the window title";
-  }
-
-  @Override
-  public String getSummary() {
-    return "Event Tree tests";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-  private String prettyPrint(TreeItem item) {
-    return item.getText();
-  }
-
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForWindowEvents.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForWindowEvents.java
deleted file mode 100644
index dcb7019..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForWindowEvents.java
+++ /dev/null
@@ -1,148 +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.gwt.museum.client.defaultmuseum;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.logical.shared.CloseEvent;
-import com.google.gwt.event.logical.shared.CloseHandler;
-import com.google.gwt.event.logical.shared.ResizeEvent;
-import com.google.gwt.event.logical.shared.ResizeHandler;
-import com.google.gwt.event.shared.HandlerRegistration;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.museum.client.common.SimpleLogger;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.Window.ClosingEvent;
-import com.google.gwt.user.client.Window.ScrollEvent;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.FlowPanel;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.ScrollPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-import java.util.ArrayList;
-
-/**
- * Simple visual test for checking up on window events with Handlers.
- */
-public class VisualsForWindowEvents extends AbstractIssue implements
-    CloseHandler<Window>, Window.ClosingHandler, Window.ScrollHandler,
-    ResizeHandler {
-  static int numResizes = 0;
-  private SimpleLogger messages = new SimpleLogger();
-  private ArrayList<HandlerRegistration> registrations = new ArrayList<HandlerRegistration>();
-
-  @Override
-  public Widget createIssue() {
-    FlowPanel out = new FlowPanel();
-
-    FlowPanel body = new FlowPanel();
-
-    body.setHeight(Window.getClientHeight() * 2 + "px");
-    FlowPanel buttons = new FlowPanel();
-
-    Button addHandlersButton = new Button("Add window handlers.");
-    addHandlersButton.addClickHandler(new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        setupWindowHandlers();
-      }
-    });
-
-    Button removeHandlersButton = new Button("Remove window handlers.");
-    removeHandlersButton.addClickHandler(new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        removeWindowHandlers();
-      }
-    });
-
-    buttons.add(addHandlersButton);
-    buttons.add(removeHandlersButton);
-
-    body.add(buttons);
-    body.add(messages);
-    ScrollPanel p = new ScrollPanel();
-    p.setHeight("100%");
-    p.setWidth("100%");
-    HTML tester = new HTML("scroller");
-    tester.setHeight("500px");
-    tester.getElement().getStyle().setProperty("border", "10px solid green");
-    p.add(tester);
-    body.add(p);
-
-    out.add(body);
-
-    return out;
-  }
-
-  @Override
-  public String getInstructions() {
-    return "Click on the button to add all the window handlers. "
-        + "Then click the other button to remove them all. "
-        + "With handlers enabled, you should get messages for scrolling or "
-        + "resizing the window, a \"do you want to navigate away?\" message"
-        + "if you're about to navigate away, and an alert when you do navigate"
-        + "away or close the window.";
-  }
-
-  @Override
-  public String getSummary() {
-    return "window events";
-  }
-
-  @Override
-  public boolean hasCSS() {
-    return false;
-  }
-
-  public void onClose(CloseEvent<Window> event) {
-    Window.alert("Closing the window.");
-  }
-
-  public void onResize(ResizeEvent event) {
-    messages.report("Got resize " + numResizes++ + " with values "
-        + event.getWidth() + ", " + event.getHeight());
-  }
-
-  public void onWindowClosing(ClosingEvent event) {
-    event.setMessage("Are you sure you want to navigate away?");
-  }
-
-  public void onWindowScroll(ScrollEvent event) {
-    addMessage("Got a window scroll with " + event.getScrollLeft() + ", "
-        + event.getScrollTop());
-  }
-
-  private void addMessage(String msg) {
-    messages.report(msg);
-  }
-
-  private void removeWindowHandlers() {
-    for (HandlerRegistration reg : registrations) {
-      reg.removeHandler();
-    }
-    registrations.clear();
-  }
-
-  private void setupWindowHandlers() {
-    if (registrations.size() == 0) {
-      registrations.add(Window.addCloseHandler(this));
-      registrations.add(Window.addResizeHandler(this));
-      registrations.add(Window.addWindowClosingHandler(this));
-      registrations.add(Window.addWindowScrollHandler(this));
-    }
-  }
-}
\ No newline at end of file
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/viewer/Museum.java b/reference/code-museum/src/com/google/gwt/museum/client/viewer/Museum.java
deleted file mode 100644
index c934a9c..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/viewer/Museum.java
+++ /dev/null
@@ -1,301 +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.gwt.museum.client.viewer;
-
-import com.google.gwt.core.client.EntryPoint;
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.dom.client.LinkElement;
-import com.google.gwt.event.dom.client.ChangeEvent;
-import com.google.gwt.event.dom.client.ChangeHandler;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.logical.shared.SelectionEvent;
-import com.google.gwt.event.logical.shared.SelectionHandler;
-import com.google.gwt.museum.client.common.AbstractIssue;
-import com.google.gwt.museum.client.common.Utility;
-import com.google.gwt.user.client.DeferredCommand;
-import com.google.gwt.user.client.IncrementalCommand;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.AbstractImagePrototype;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.HasVerticalAlignment;
-import com.google.gwt.user.client.ui.HorizontalPanel;
-import com.google.gwt.user.client.ui.Image;
-import com.google.gwt.user.client.ui.ImageBundle;
-import com.google.gwt.user.client.ui.ListBox;
-import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
-import com.google.gwt.user.client.ui.RootPanel;
-import com.google.gwt.user.client.ui.SimplePanel;
-import com.google.gwt.user.client.ui.SuggestBox;
-import com.google.gwt.user.client.ui.SuggestOracle;
-import com.google.gwt.user.client.ui.Widget;
-import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-
-/**
- * A repository for demonstrating bugs we once faced.
- */
-public class Museum implements EntryPoint {
-  /**
-   * Images used in the museum.
-   */
-  public static interface MuseumImages extends ImageBundle {
-    AbstractImagePrototype nextButton();
-
-    AbstractImagePrototype prevButton();
-  }
-
-  /**
-   * Class used to implement a callback when a css file is loaded. We add a
-   * width style of 10px to isLoaded classes, then test to see if the style is
-   * active.
-   */
-  class Poller implements IncrementalCommand {
-    private HTML test;
-    private AbstractIssue issue;
-    private SimplePanel monitor = new SimplePanel();
-
-    public Poller() {
-      RootPanel.get().add(monitor);
-    }
-
-    public boolean execute() {
-      if (test.getOffsetWidth() == 10) {
-        issueContainer.setWidget(issue.createIssue());
-        issue.onAttached();
-        return false;
-      } else {
-        return true;
-      }
-    }
-
-    public void startPolling(AbstractIssue issue) {
-      test = new HTML();
-      test.setStyleName("isLoaded");
-      monitor.setWidget(test);
-      this.issue = issue;
-      DeferredCommand.addCommand(this);
-    }
-  }
-
-  /**
-   * The images used in this application.
-   */
-  public static final MuseumImages IMAGES = GWT.create(MuseumImages.class);
-
-  /**
-   * A reference for all issues.
-   */
-  private final ArrayList<AbstractIssue> issues = new ArrayList<AbstractIssue>();
-
-  /**
-   * Add an issue to the list of issues.
-   */
-  private final Poller poller = new Poller();
-
-  /**
-   * The panel that contains the current example.
-   */
-  private final SimplePanel issueContainer = new SimplePanel();
-
-  /**
-   * A container to hold the CSS that will be applied to the issue.
-   */
-  private LinkElement issueLinkElement = null;
-
-  /**
-   * A description of the current issue.
-   */
-  private final HTML issueDescription = new HTML();
-
-  /**
-   * The list of all issues.
-   */
-  private final ListBox issueList = new ListBox();
-
-  /**
-   * Add an issue to the museum. Should be called in the inherited constructor.
-   * 
-   * @param issue the issue to be added
-   */
-  public void addIssue(AbstractIssue issue) {
-    issues.add(issue);
-  }
-
-  public void onModuleLoad() {
-    // Add the options and issue containers to the page
-    RootPanel.get().add(createOptionsPanel());
-    RootPanel.get().add(issueDescription);
-    issueDescription.setStylePrimaryName("museum-issueDescription");
-    RootPanel.get().add(issueContainer);
-    issueContainer.setStylePrimaryName("museum-issueContainer");
-
-    // Default to the first issue
-    refreshIssue();
-  }
-
-  /**
-   * Create a suggest box with all current suggestions in it.
-   */
-  private SuggestBox createIssueFinder() {
-    class IssueSuggestion extends MultiWordSuggestOracle.MultiWordSuggestion {
-      private AbstractIssue issue;
-
-      public IssueSuggestion(AbstractIssue issue) {
-        super("", issue.getHeadline());
-        this.issue = issue;
-      }
-
-      public AbstractIssue getIssue() {
-        return issue;
-      }
-    }
-
-    SuggestOracle oracle = new SuggestOracle() {
-
-      @Override
-      public void requestSuggestions(Request request, Callback callback) {
-        String ofInterest = (".*" + request.getQuery() + ".*").toLowerCase();
-        ArrayList<Suggestion> suggestions = new ArrayList<Suggestion>();
-        HashSet<AbstractIssue> s = new HashSet<AbstractIssue>();
-        for (AbstractIssue issue : issues) {
-          if (issue.getHeadline().toLowerCase().matches(ofInterest)) {
-            s.add(issue);
-            suggestions.add(new IssueSuggestion(issue));
-          }
-        }
-
-        for (AbstractIssue issue : issues) {
-          if (!s.contains(issue) && issue.getInstructions().matches(ofInterest)) {
-            suggestions.add(new IssueSuggestion(issue));
-          }
-        }
-        callback.onSuggestionsReady(request, new Response(suggestions));
-      }
-
-    };
-
-    SuggestBox box = new SuggestBox(oracle);
-    box.addSelectionHandler(new SelectionHandler<Suggestion>() {
-      public void onSelection(SelectionEvent<Suggestion> event) {
-        AbstractIssue issue = ((IssueSuggestion) event.getSelectedItem()).getIssue();
-        int index = issues.indexOf(issue);
-        issueList.setSelectedIndex(index);
-        refreshIssue();
-      }
-    });
-    box.setAnimationEnabled(false);
-    return box;
-  }
-
-  /**
-   * Create the options panel.
-   * 
-   * @return the options panel
-   */
-  private Widget createOptionsPanel() {
-    // Populate a list box containing all issues
-    for (AbstractIssue issue : issues) {
-      issueList.addItem(issue.getHeadline());
-    }
-    issueList.addChangeHandler(new ChangeHandler() {
-      public void onChange(ChangeEvent event) {
-        refreshIssue();
-      }
-    });
-
-    // Create a button to refresh the current issue
-    Button refreshIssueButton = new Button("Refresh", new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        refreshIssue();
-      }
-    });
-
-    // Create a suggest box to search for issues
-    SuggestBox suggestBox = createIssueFinder();
-
-    // Create a button to move to the previous issue
-    Image prevButton = IMAGES.prevButton().createImage();
-    prevButton.setStyleName("prevButton");
-    prevButton.addClickHandler(new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        int selectedIndex = issueList.getSelectedIndex();
-        if (selectedIndex > 0) {
-          issueList.setSelectedIndex(selectedIndex - 1);
-          refreshIssue();
-        } else {
-          Window.alert("You are already on the first issue");
-        }
-      }
-    });
-
-    // Create a button to move to the next issue
-    Image nextButton = IMAGES.nextButton().createImage();
-    nextButton.setStyleName("nextButton");
-    nextButton.addClickHandler(new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        int selectedIndex = issueList.getSelectedIndex();
-        if (selectedIndex < issueList.getItemCount() - 1) {
-          issueList.setSelectedIndex(selectedIndex + 1);
-          refreshIssue();
-        } else {
-          Window.alert("You are already on the last issue");
-        }
-      }
-    });
-
-    // Combine the list box and text into a panel
-    HorizontalPanel hPanel = new HorizontalPanel();
-    hPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
-    hPanel.add(new HTML("Select an issue: "));
-    hPanel.add(issueList);
-    hPanel.add(prevButton);
-    hPanel.add(nextButton);
-    hPanel.add(refreshIssueButton);
-    hPanel.add(suggestBox);
-    SimplePanel wrapper = new SimplePanel();
-    wrapper.setStyleName("museum-optionsPanel");
-    wrapper.setWidget(hPanel);
-    return wrapper;
-  }
-
-  /**
-   * Refresh the current issue in the issue list.
-   */
-  private void refreshIssue() {
-    setIssue(issues.get(issueList.getSelectedIndex()));
-  }
-
-  /**
-   * Set the current issue in the issue container.
-   * 
-   * @param issue the issue to set
-   */
-  private void setIssue(AbstractIssue issue) {
-    if (issueLinkElement != null) {
-      Utility.getHeadElement().removeChild(issueLinkElement);
-      issueLinkElement = null;
-    }
-    // Fetch the associated style sheet using an HTTP request
-    issueLinkElement = issue.createCSS();
-    Utility.getHeadElement().appendChild(issueLinkElement);
-    issueDescription.setHTML(issue.getInstructions());
-    poller.startPolling(issue);
-  }
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/viewer/nextButton.png b/reference/code-museum/src/com/google/gwt/museum/client/viewer/nextButton.png
deleted file mode 100644
index 5a9cdf0..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/viewer/nextButton.png
+++ /dev/null
Binary files differ
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/viewer/prevButton.png b/reference/code-museum/src/com/google/gwt/museum/client/viewer/prevButton.png
deleted file mode 100644
index 289b0d4..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/client/viewer/prevButton.png
+++ /dev/null
Binary files differ
diff --git a/reference/code-museum/src/com/google/gwt/museum/public/Museum.css b/reference/code-museum/src/com/google/gwt/museum/public/Museum.css
deleted file mode 100644
index 2b01c4e..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/public/Museum.css
+++ /dev/null
@@ -1,77 +0,0 @@
-body {
-    padding: 0px;
-    margin: 0px;
-}
-
-.isLoaded {
-    width: 40px;
-    height: 1px;
-    visibility: hidden;
-    position: absolute;
-}
-
-.museum-optionsPanel {
-    background: #D6E9F8;
-    border-bottom: 1px solid #aaf;
-}
-
-.museum-optionsPanel td {
-    padding: 2px 0px;
-    font-size: 10pt;
-    font-weight: bold;
-}
-
-.museum-optionsPanel .gwt-ListBox {
-    font-size: 9pt;
-    color: blue;
-    margin: 0px 6px;
-}
-
-.museum-optionsPanel .gwt-Button {
-    font-size: 8pt;
-    margin: 0px 6px;
-}
-
-.museum-optionsPanel .nextButton, .museum-optionsPanel .prevButton {
-    font-weight: normal;
-    color: blue;
-    margin: 0px 2px;
-    cursor: pointer;
-}
-
-.museum-issueDescription {
-    margin: 5px;
-    border: 1px solid #bbb;
-    padding: 8px 3px;
-    background: #fafafa;
-    font-size: 10pt;
-}
-
-.museum-issueContainer {
-    padding: 15px 20px;
-}
-/**
- * Applied to the suggest box.
- */
-.gwt-SuggestBox .topLeft,
-.gwt-SuggestBox .topRight,
-.gwt-SuggestBox .bottomLeft,
-.gwt-SuggestBox .bottomRight {
-	display: none;
-}
-
-
-.gwt-SuggestBoxPopup .item {
-    padding: 2px 6px;
-    color: #424242;
-    cursor: default;
-}
-
-.gwt-SuggestBoxPopup .item-selected {
-    background: #b7d6f6;
-}
-
-.gwt-SuggestBoxPopup .middleCenter {
-    border: 1px solid black;
-    background: white;
-}
\ No newline at end of file
diff --git a/reference/code-museum/src/com/google/gwt/museum/public/issues/Default.css b/reference/code-museum/src/com/google/gwt/museum/public/issues/Default.css
deleted file mode 100644
index 15f6d03..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/public/issues/Default.css
+++ /dev/null
@@ -1,3 +0,0 @@
-@import url("../gwt/standard/standard.css");
-@import url("MasterIssue.css");
- 
\ No newline at end of file
diff --git a/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue1169.css b/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue1169.css
deleted file mode 100644
index 4b446c0..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue1169.css
+++ /dev/null
@@ -1,14 +0,0 @@
-@import url("Default.css");
-
-.myMenuBar {
-  width: 300px;
-}
-.myMenuBarPopup {
-  border: 1px solid red;
-}
-.myMenuBarPopup .menuPopupTopLeft,
-.myMenuBarPopup .menuPopupTopRight,
-.myMenuBarPopup .menuPopupBottomLeft,
-.myMenuBarPopup .menuPopupBottomRight {
-  display: none;
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue1897.css b/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue1897.css
deleted file mode 100644
index d31765f..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue1897.css
+++ /dev/null
@@ -1,5 +0,0 @@
-@import url("MasterIssue.css");
-
-.gwt-RichTextArea {
-  border: 1px solid black;
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue1932.css b/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue1932.css
deleted file mode 100644
index 8766cd9..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue1932.css
+++ /dev/null
@@ -1,6 +0,0 @@
-@import url("MasterIssue.css");
-
-HTML {
-  margin: 10px;
-  border: 5px solid #DDDDDD;
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue2290.css b/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue2290.css
deleted file mode 100644
index 3df1ea4..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue2290.css
+++ /dev/null
@@ -1,9 +0,0 @@
-@import url("MasterIssue.css");
-
-.gwt-TreeItem {
-    background-color: green;
-}
-
-.gwt-TreeItem-selected {
-    background-color: red;
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue2392.css b/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue2392.css
deleted file mode 100644
index 9cd2582..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue2392.css
+++ /dev/null
@@ -1,16 +0,0 @@
-@import url("MasterIssue.css");
-
-/* Outside of the popup */
-.gwt-SuggestBoxPopup {
-  border: 1px solid red;
-}
-
-/* The cell containing the suggestions */
-.gwt-SuggestBoxPopup .suggestPopupMiddleCenter {
-  border: 1px solid blue;
-}
-
-/* The div containing the suggests */
-.gwt-SuggestBoxPopup .suggestPopupContent {
-  border: 1px solid green;
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue2443.css b/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue2443.css
deleted file mode 100644
index fd19a37..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/public/issues/Issue2443.css
+++ /dev/null
@@ -1,5 +0,0 @@
-@import url("Default.css");
-
-iframe {
-  border: 2px solid black;
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/public/issues/MasterIssue.css b/reference/code-museum/src/com/google/gwt/museum/public/issues/MasterIssue.css
deleted file mode 100644
index 5b91db1..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/public/issues/MasterIssue.css
+++ /dev/null
@@ -1,4 +0,0 @@
-
-.isLoaded {
-    width: 10px;
-}
diff --git a/reference/code-museum/src/com/google/gwt/museum/public/issues/images/gwtLogo.png b/reference/code-museum/src/com/google/gwt/museum/public/issues/images/gwtLogo.png
deleted file mode 100644
index e0fb4f1..0000000
--- a/reference/code-museum/src/com/google/gwt/museum/public/issues/images/gwtLogo.png
+++ /dev/null
Binary files differ
