diff --git a/dev/core/src/com/google/gwt/core/ext/soyc/impl/SizeMapRecorder.java b/dev/core/src/com/google/gwt/core/ext/soyc/impl/SizeMapRecorder.java
index 0c23027..4433ef6 100644
--- a/dev/core/src/com/google/gwt/core/ext/soyc/impl/SizeMapRecorder.java
+++ b/dev/core/src/com/google/gwt/core/ext/soyc/impl/SizeMapRecorder.java
@@ -56,7 +56,7 @@
   }
 
   /**
-   * Returns the hexadecimal representation of a character
+   * Returns the hexadecimal representation of a character.
    */
   public static StringBuilder charToHex(char c) {
     char hexDigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
@@ -105,19 +105,15 @@
       if ((c[i] < '\u0020')) {
         builder.append(c, lastIndex, i - lastIndex);
         if (c[i] == '\u0000') {
-         builder.append("\\0");
-        }
-        else if (c[i] == '\u0009') {
-         builder.append("\\t");
-        }
-        else if (c[i] == '\n') {
-         builder.append("\\n");
-        }
-        else if (c[i] == '\r') {
-         builder.append("\\r");
-        }
-        else {
-            builder.append("(invalid xml character: \\u" + charToHex(c[i]) + ")");
+          builder.append("\\0");
+        } else if (c[i] == '\u0009') {
+          builder.append("\\t");
+        } else if (c[i] == '\n') {
+          builder.append("\\n");
+        } else if (c[i] == '\r') {
+          builder.append("\\r");
+        } else {
+          builder.append("(invalid xml character: \\u" + charToHex(c[i]) + ")");
         }
         lastIndex = i + 1;
       } else if (((c[i] >= '\u007F') && (c[i] <= '\u0084')) ||
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JVisitor.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JVisitor.java
index fba2c7f..ba2e24c 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JVisitor.java
@@ -220,7 +220,7 @@
   }
 
   /**
-   * NOTE: not called from JsniFieldRef
+   * NOTE: not called from JsniFieldRef.
    */
   public void endVisit(JFieldRef x, Context ctx) {
     endVisit((JVariableRef) x, ctx);
@@ -287,7 +287,7 @@
   }
 
   /**
-   * NOTE: not called from JsniMethodRef
+   * NOTE: not called from JsniMethodRef.
    */
   public void endVisit(JMethodCall x, Context ctx) {
     endVisit((JExpression) x, ctx);
@@ -528,7 +528,7 @@
   }
 
   /**
-   * NOTE: not called from JsniFieldRef
+   * NOTE: not called from JsniFieldRef.
    */
   public boolean visit(JFieldRef x, Context ctx) {
     return visit((JVariableRef) x, ctx);
@@ -595,7 +595,7 @@
   }
 
   /**
-   * NOTE: not called from JsniMethodRef
+   * NOTE: not called from JsniMethodRef.
    */
   public boolean visit(JMethodCall x, Context ctx) {
     return visit((JExpression) x, ctx);
diff --git a/dev/core/src/com/google/gwt/dev/shell/BrowserChannel.java b/dev/core/src/com/google/gwt/dev/shell/BrowserChannel.java
index 9d1ff60..98569c6 100644
--- a/dev/core/src/com/google/gwt/dev/shell/BrowserChannel.java
+++ b/dev/core/src/com/google/gwt/dev/shell/BrowserChannel.java
@@ -1473,7 +1473,7 @@
   }
 
   /**
-   * The current version of the protocol
+   * The current version of the protocol.
    */
   public static final int PROTOCOL_VERSION_CURRENT = 3;
 
diff --git a/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java b/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java
index fd3cac1..e8e0fe2 100644
--- a/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java
+++ b/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java
@@ -246,7 +246,6 @@
    * The mask to use for Ctrl -- mapped to Command on Mac.
    */
   private static int ctrlKeyDown;
-  
 
   private static final Color DISCONNECTED_COLOR = Color.decode("0xFFDDDD");
 
diff --git a/dev/core/src/com/google/gwt/dev/shell/remoteui/ViewerServiceClient.java b/dev/core/src/com/google/gwt/dev/shell/remoteui/ViewerServiceClient.java
index 92a5f92..62c8b00 100644
--- a/dev/core/src/com/google/gwt/dev/shell/remoteui/ViewerServiceClient.java
+++ b/dev/core/src/com/google/gwt/dev/shell/remoteui/ViewerServiceClient.java
@@ -92,14 +92,14 @@
   /**
    * Add a log entry.
    * 
+   * @param indexOfLogEntryWithinParentLogger The index of this entry within the
+   *          parent logger
    * @param type The severity of the log message.
    * @param msg The message.
    * @param caught An exception associated with the message
    * @param helpInfo A URL or message which directs the user to helpful
    *          information related to the log message
    * @param logHandle The log handle of the parent of this log entry/branch
-   * @param indexOfLogentryWithinParentLogger The index of this entry within the
-   *          parent logger
    */
   public void addLogEntry(int indexOfLogEntryWithinParentLogger, Type type,
       String msg, Throwable caught, HelpInfo helpInfo, int logHandle) {
diff --git a/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java b/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
index 6b322f9..46115b5 100644
--- a/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
+++ b/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
@@ -132,7 +132,7 @@
         + "-index.html\">Permutation " + permutationId);
       if (permutationInfoList.size() > 0) {
         for (String desc : permutationInfoList) {
-          outFile.println("  (" + desc + ")" );
+          outFile.println("  (" + desc + ")");
         }
         outFile.println("</a></li>");
       } else {
diff --git a/eclipse/user/.checkstyle b/eclipse/user/.checkstyle
index 820029f..a7ec366 100644
--- a/eclipse/user/.checkstyle
+++ b/eclipse/user/.checkstyle
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<fileset-config file-format-version="1.2.0" simple-config="false">
-    <fileset name="Java source for production code" enabled="true" check-config-name="GWT Checks" local="false">
-        <file-match-pattern match-pattern=".*src.*\.java" include-pattern="true"/>
-    </fileset>
-    <fileset name="Java source for test cases" enabled="true" check-config-name="GWT Checks for Tests" local="false">
-        <file-match-pattern match-pattern=".*test.*com[/\\]google[/\\].*\.java$" include-pattern="true"/>
-        <file-match-pattern match-pattern=".*test.*test[/\\].*\.java$" include-pattern="true"/>
-    </fileset>
-    <filter name="NonSrcDirs" enabled="true"/>
-</fileset-config>
+<?xml version="1.0" encoding="UTF-8"?>
+<fileset-config file-format-version="1.2.0" simple-config="false">
+    <fileset name="Java source for production code" enabled="true" check-config-name="GWT Checks" local="false">
+        <file-match-pattern match-pattern=".*src.*\.java" include-pattern="true"/>
+    </fileset>
+    <fileset name="Java source for test cases" enabled="true" check-config-name="GWT Checks for Tests" local="false">
+        <file-match-pattern match-pattern="core[/\\]test[/\\]com[/\\]google[/\\].*\.java$" include-pattern="true"/>
+        <file-match-pattern match-pattern="core[/\\]test[/\\]test[/\\].*\.java$" include-pattern="true"/>
+    </fileset>
+    <filter name="NonSrcDirs" enabled="true"/>
+</fileset-config>
diff --git a/user/src/com/google/gwt/layout/client/LayoutImplIE6.java b/user/src/com/google/gwt/layout/client/LayoutImplIE6.java
index 7ebdf53..ece2c9a 100644
--- a/user/src/com/google/gwt/layout/client/LayoutImplIE6.java
+++ b/user/src/com/google/gwt/layout/client/LayoutImplIE6.java
@@ -285,7 +285,6 @@
     ruler.onresize = null;
   }-*/;
 
-
   @SuppressWarnings("unused") // called from JSNI
   private void resizeHandler(Element parent) {
     resizeHandler(parent, false);
diff --git a/user/src/com/google/gwt/uibinder/attributeparsers/AttributeParsers.java b/user/src/com/google/gwt/uibinder/attributeparsers/AttributeParsers.java
index 36fdf79..70af3f9 100644
--- a/user/src/com/google/gwt/uibinder/attributeparsers/AttributeParsers.java
+++ b/user/src/com/google/gwt/uibinder/attributeparsers/AttributeParsers.java
@@ -26,7 +26,7 @@
 import java.util.Map;
 
 /**
- * Managers access to all implementations of {@link AttributeParser}
+ * Managers access to all implementations of {@link AttributeParser}.
  */
 public class AttributeParsers {
   private static final String VERT_CONSTANT = "com.google.gwt.user.client.ui.HasVerticalAlignment."
diff --git a/user/src/com/google/gwt/uibinder/attributeparsers/FieldReferenceConverter.java b/user/src/com/google/gwt/uibinder/attributeparsers/FieldReferenceConverter.java
index 0de177a..6c0c4a2 100644
--- a/user/src/com/google/gwt/uibinder/attributeparsers/FieldReferenceConverter.java
+++ b/user/src/com/google/gwt/uibinder/attributeparsers/FieldReferenceConverter.java
@@ -109,7 +109,6 @@
 
   private static final Pattern BRACES = Pattern.compile("[{]([^}]*)[}]");
   private static final Pattern LEGAL_FIRST_CHAR = Pattern.compile("^[$_a-zA-Z].*");
-
   
   /**
    * @return true if the given string holds one or more field references
diff --git a/user/src/com/google/gwt/uibinder/attributeparsers/IntPairParser.java b/user/src/com/google/gwt/uibinder/attributeparsers/IntPairParser.java
index e1ced7a..921942b 100644
--- a/user/src/com/google/gwt/uibinder/attributeparsers/IntPairParser.java
+++ b/user/src/com/google/gwt/uibinder/attributeparsers/IntPairParser.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.uibinder.attributeparsers;
 
-
 /**
  * Parses a pair of integer values.
  */
diff --git a/user/src/com/google/gwt/uibinder/attributeparsers/StrictAttributeParser.java b/user/src/com/google/gwt/uibinder/attributeparsers/StrictAttributeParser.java
index a89075e..2d2cd97 100644
--- a/user/src/com/google/gwt/uibinder/attributeparsers/StrictAttributeParser.java
+++ b/user/src/com/google/gwt/uibinder/attributeparsers/StrictAttributeParser.java
@@ -27,7 +27,7 @@
 class StrictAttributeParser implements AttributeParser {
 
   /**
-   * Package protected for testing
+   * Package protected for testing.
    */
   static class FieldReferenceDelegate implements Delegate {
     private boolean sawReference = false;
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/DialogBoxParser.java b/user/src/com/google/gwt/uibinder/elementparsers/DialogBoxParser.java
index 10ed6d6..00dfd26 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/DialogBoxParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/DialogBoxParser.java
@@ -22,7 +22,7 @@
 import com.google.gwt.user.client.ui.DialogBox;
 
 /**
- * Parses {@link DialogBox} widgets
+ * Parses {@link DialogBox} widgets.
  */
 public class DialogBoxParser implements ElementParser {
   public void parse(XMLElement elem, String fieldName, JClassType type,
diff --git a/user/src/com/google/gwt/uibinder/rebind/XMLElement.java b/user/src/com/google/gwt/uibinder/rebind/XMLElement.java
index e67db25..9996f9f 100644
--- a/user/src/com/google/gwt/uibinder/rebind/XMLElement.java
+++ b/user/src/com/google/gwt/uibinder/rebind/XMLElement.java
@@ -148,7 +148,7 @@
   }
 
   /**
-   * Ensure that the receiver has no attributes left
+   * Ensure that the receiver has no attributes left.
    * 
    * @throws UnableToCompleteException if it does
    */
@@ -169,7 +169,7 @@
   }
 
   /**
-   * Require that the receiver's body is empty of text and has no child nodes
+   * Require that the receiver's body is empty of text and has no child nodes.
    * 
    * @throws UnableToCompleteException if it isn't
    */
@@ -185,7 +185,7 @@
   }
 
   /**
-   * Require that the receiver's body is empty of text
+   * Require that the receiver's body is empty of text.
    * 
    * @throws UnableToCompleteException if it isn't
    */
@@ -203,7 +203,7 @@
    * parameter is required to determine how the value is parsed and validated.
    * 
    * @param name the attribute's full name (including prefix)
-   * @param types the type(s) this attribute is expected to provide
+   * @param type the type this attribute is expected to provide
    * @return the attribute's value as a Java expression, or null if it is not set
    * @throws UnableToCompleteException on parse failure
    */
@@ -218,7 +218,7 @@
    * 
    * @param name the attribute's full name (including prefix)
    * @param defaultValue the value to @return if the attribute was unset
-   * @param types the type(s) this attribute is expected to provide
+   * @param type the type this attribute is expected to provide
    * @return the attribute's value as a Java expression, or the given default if
    *         it was unset
    * @throws UnableToCompleteException on parse failure
@@ -301,7 +301,7 @@
   }
 
   /**
-   * Consumes and returns all child elements
+   * Consumes and returns all child elements.
    * 
    * @throws UnableToCompleteException if extra text nodes are found
    */
@@ -475,7 +475,6 @@
    * (or a mix of both).
    * 
    * @return array of String, empty if the attribute was not set.
-   * @throws UnableToCompleteException on unparseable value
    */
   public String[] consumeRawArrayAttribute(String name) {
     String raw = consumeRawAttribute(name, null);
diff --git a/user/test/com/google/gwt/emultest/java/util/ListTestBase.java b/user/test/com/google/gwt/emultest/java/util/ListTestBase.java
index 06d7d3c..681756a 100644
--- a/user/test/com/google/gwt/emultest/java/util/ListTestBase.java
+++ b/user/test/com/google/gwt/emultest/java/util/ListTestBase.java
@@ -23,7 +23,6 @@
 import java.util.List;
 import java.util.ListIterator;
 
-
 /**
  * Tests List, and, by extension AbstractList. Uses inheritance to inherit all
  * of Apache's TestList and TestCollection.
diff --git a/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java b/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java
index 62e7d51..d049ad5 100644
--- a/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java
+++ b/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java
@@ -41,7 +41,7 @@
 import junit.framework.TestSuite;
 
 /**
- * Suite of UiBinder tests that require the JRE
+ * Suite of UiBinder tests that require the JRE.
  */
 public class UiBinderJreSuite {
   public static Test suite() {
diff --git a/user/test/com/google/gwt/uibinder/attributeparsers/FieldReferenceConverterTest.java b/user/test/com/google/gwt/uibinder/attributeparsers/FieldReferenceConverterTest.java
index ed6e161..c26bf0d 100644
--- a/user/test/com/google/gwt/uibinder/attributeparsers/FieldReferenceConverterTest.java
+++ b/user/test/com/google/gwt/uibinder/attributeparsers/FieldReferenceConverterTest.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.uibinder.attributeparsers;
 
-
 import com.google.gwt.core.ext.typeinfo.JType;
 
 import junit.framework.TestCase;
diff --git a/user/test/com/google/gwt/uibinder/test/client/ParameterizedWidgets.java b/user/test/com/google/gwt/uibinder/test/client/ParameterizedWidgets.java
index d4a1da5..edf1934 100644
--- a/user/test/com/google/gwt/uibinder/test/client/ParameterizedWidgets.java
+++ b/user/test/com/google/gwt/uibinder/test/client/ParameterizedWidgets.java
@@ -22,7 +22,7 @@
 import com.google.gwt.user.client.ui.Widget;
 
 /**
- * Used by {@link TestParameterizedWidgets}
+ * Used by {@link TestParameterizedWidgets}.
  */
 class ParameterizedWidgets {
   interface Binder extends UiBinder<Widget, ParameterizedWidgets> {
diff --git a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingService.java b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingService.java
index d31416f..f1fe049 100644
--- a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingService.java
+++ b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingService.java
@@ -75,13 +75,14 @@
    * Verifies that the string contains the specified characters.
    * 
    * Used to verify client->server escaping.
-   *
+   * 
    * @param start start code point value included
    * @param end first code point not included
    * @param str string to verify
-   * @throws InvalidCharacterException if the string does not contain the specified characters
+   * @throws UnicodeEscapingService.InvalidCharacterException if the string does
+   *           not contain the specified characters
    * @return true if the verification succeeded
    */
   boolean verifyStringContainingCharacterRange(int start, int end, String str)
-      throws InvalidCharacterException;
+      throws UnicodeEscapingService.InvalidCharacterException;
 }
