diff --git a/user/src/com/google/gwt/dom/client/DOMImplIE8.java b/user/src/com/google/gwt/dom/client/DOMImplIE8.java
index 2b65cd8..0c29ccc 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplIE8.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplIE8.java
@@ -17,6 +17,41 @@
 
 class DOMImplIE8 extends DOMImplTrident {
 
+  private static boolean isIE8;
+  private static boolean isIE8Detected;
+
+  /**
+   * Check if the browser is IE8 or IE9.
+   * 
+   * @return <code>true</code> if the browser is IE8, <code>false</code> if IE9
+   *         or any other browser
+   */
+  static boolean isIE8() {
+    if (!isIE8Detected) {
+      isIE8 = isIE8Impl();
+      isIE8Detected = true;
+    }
+    return isIE8;
+  }
+
+  // Stolen and modified from UserAgent.gwt.xml.
+  private static native boolean isIE8Impl() /*-{
+    var ua = navigator.userAgent.toLowerCase();
+    if (ua.indexOf("msie") != -1 && $doc.documentMode == 8) {
+      return true;
+    }
+    return false;
+  }-*/;
+
+  @Override
+  public void cssSetOpacity(Style style, double value) {
+    if (isIE8()) {
+      cssSetOpacityImpl(style, value);
+    } else {
+      super.cssSetOpacity(style, value);
+    }
+  }
+
   @Override
   public int getAbsoluteLeft(Element elem) {
     Document doc = elem.getOwnerDocument();
@@ -46,4 +81,8 @@
     }
     super.setScrollLeft(elem, left);
   }
+
+  private native void cssSetOpacityImpl(Style style, double value) /*-{
+    style.filter = 'alpha(opacity=' + (value * 100) + ')';
+  }-*/;
 }
diff --git a/user/src/com/google/gwt/i18n/client/constants/DateTimeConstantsImpl_pt_PT.properties b/user/src/com/google/gwt/i18n/client/constants/DateTimeConstantsImpl_pt_PT.properties
index 8da543a..611875c 100644
--- a/user/src/com/google/gwt/i18n/client/constants/DateTimeConstantsImpl_pt_PT.properties
+++ b/user/src/com/google/gwt/i18n/client/constants/DateTimeConstantsImpl_pt_PT.properties
@@ -8,7 +8,7 @@
 # CLDR version 1.7.1 is used in this generation.
 
 eras = a.C., d.C.
-eraNames = Antes de Cristo, Ano do Senhor
+eraNames = Antes de Cristo, Depois de Cristo
 narrowMonths = J, F, M, A, M, J, J, A, S, O, N, D
 months = Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro
 shortMonths = Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pt_PT.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pt_PT.java
index f4d4c62..7c30159 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pt_PT.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pt_PT.java
@@ -36,14 +36,6 @@
   }
 
   @Override
-  public String[] erasFull() {
-    return new String[] {
-        "Antes de Cristo",
-        "Ano do Senhor"
-    };
-  }
-
-  @Override
   public int firstDayOfTheWeek() {
     return 1;
   }
diff --git a/user/src/com/google/gwt/user/cellview/client/CellList.java b/user/src/com/google/gwt/user/cellview/client/CellList.java
index 2c557d5..c7100d1 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellList.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellList.java
@@ -340,7 +340,7 @@
   protected Element getKeyboardSelectedElement() {
     // Do not use getRowElement() because that will flush the presenter.
     int rowIndex = getKeyboardSelectedRow();
-    if (childContainer.getChildCount() > rowIndex) {
+    if (rowIndex >= 0 && childContainer.getChildCount() > rowIndex) {
       return childContainer.getChild(rowIndex).cast();
     }
     return null;
diff --git a/user/src/com/google/gwt/user/cellview/client/CellTable.java b/user/src/com/google/gwt/user/cellview/client/CellTable.java
index 0c5e6a6..7511d58 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellTable.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellTable.java
@@ -869,7 +869,7 @@
     // Do not use getRowElement() because that will flush the presenter.
     int rowIndex = getKeyboardSelectedRow();
     NodeList<TableRowElement> rows = tbody.getRows();
-    if (rowIndex < rows.getLength() && columns.size() > 0) {
+    if (rowIndex >= 0 && rowIndex < rows.getLength() && columns.size() > 0) {
       TableRowElement tr = rows.getItem(rowIndex);
       TableCellElement td = tr.getCells().getItem(keyboardSelectedColumn);
       return getCellParent(td);
diff --git a/user/test/com/google/gwt/user/cellview/client/AbstractHasDataTestBase.java b/user/test/com/google/gwt/user/cellview/client/AbstractHasDataTestBase.java
index d56a3f5..5f4bc4f 100644
--- a/user/test/com/google/gwt/user/cellview/client/AbstractHasDataTestBase.java
+++ b/user/test/com/google/gwt/user/cellview/client/AbstractHasDataTestBase.java
@@ -25,6 +25,7 @@
 import com.google.gwt.regexp.shared.MatchResult;
 import com.google.gwt.regexp.shared.RegExp;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
+import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.view.client.ListDataProvider;
 import com.google.gwt.view.client.Range;
@@ -145,6 +146,21 @@
     assertEquals("test 12", items.get(2));
   }
 
+  /**
+   * Test that we don't get any errors when keyboard selection is disabled.
+   */
+  public void testKeyboardSelectionPolicyDisabled() {
+    AbstractHasData<String> display = createAbstractHasData(new TextCell());
+    display.setRowData(createData(0, 10));
+    display.getPresenter().flush();
+    display.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.DISABLED);
+
+    assertNull(display.getKeyboardSelectedElement());
+    display.resetFocusOnCell();
+    display.setAccessKey('a');
+    display.setTabIndex(1);
+  }
+
   public void testResetFocus() {
     IndexCell<String> cell = new IndexCell<String>();
     AbstractHasData<String> display = createAbstractHasData(cell);
