diff --git a/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitor.java
index aa8adb1e..479f6b4 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitor.java
@@ -32,7 +32,7 @@
   public boolean visit(JsFunction x) {
     super.visit(x);
     x.getBody().traverse(this);
-    fNeedSemi = true;
+    needSemi = true;
     return false;
   }
 
diff --git a/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java
index bdae55a..1ff7269 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java
@@ -149,9 +149,9 @@
 
     for (Iterator iter = block.getStatements().iterator(); iter.hasNext();) {
       JsStatement stmt = (JsStatement) iter.next();
-      fNeedSemi = true;
+      needSemi = true;
       stmt.traverse(this);
-      if (fNeedSemi) {
+      if (needSemi) {
         /*
          * Special treatment of function decls: function decls always set
          * fNeedSemi back to true. But if they are the only item in a statement
@@ -174,7 +174,7 @@
       //
       _blockClose();
     }
-    fNeedSemi = false;
+    needSemi = false;
     return false;
   }
 
@@ -209,15 +209,15 @@
     indent();
     for (Iterator iter = x.getStmts().iterator(); iter.hasNext();) {
       JsStatement stmt = (JsStatement) iter.next();
-      fNeedSemi = true;
+      needSemi = true;
       stmt.traverse(this);
-      if (fNeedSemi) {
+      if (needSemi) {
         _semi();
       }
       _newlineOpt();
     }
     outdent();
-    fNeedSemi = false;
+    needSemi = false;
     return false;
   }
 
@@ -302,15 +302,15 @@
     indent();
     for (Iterator iter = x.getStmts().iterator(); iter.hasNext();) {
       JsStatement stmt = (JsStatement) iter.next();
-      fNeedSemi = true;
+      needSemi = true;
       stmt.traverse(this);
-      if (fNeedSemi) {
+      if (needSemi) {
         _semi();
       }
       _newlineOpt();
     }
     outdent();
-    fNeedSemi = false;
+    needSemi = false;
     return false;
   }
 
@@ -328,12 +328,12 @@
     _nestedPush(x.getBody(), true);
     x.getBody().traverse(this);
     _nestedPop(x.getBody());
-    if (fNeedSemi) {
+    if (needSemi) {
       _semi();
       _newlineOpt();
     } else {
       _spaceOpt();
-      fNeedSemi = true;
+      needSemi = true;
     }
     _while();
     _spaceOpt();
@@ -458,12 +458,12 @@
     _nestedPop(thenStmt);
     JsStatement elseStmt = x.getElseStmt();
     if (elseStmt != null) {
-      if (fNeedSemi) {
+      if (needSemi) {
         _semi();
         _newlineOpt();
       } else {
         _spaceOpt();
-        fNeedSemi = true;
+        needSemi = true;
       }
       _else();
       boolean elseIf = elseStmt instanceof JsIf;
@@ -1132,5 +1132,5 @@
 
   private final NamingStrategy namer;
   private final TextOutput p;
-  protected boolean fNeedSemi = true;
+  protected boolean needSemi = true;
 }
diff --git a/dev/core/src/com/google/gwt/dev/shell/BrowserDialog.java b/dev/core/src/com/google/gwt/dev/shell/BrowserDialog.java
index d6cfff4..f0f886f 100644
--- a/dev/core/src/com/google/gwt/dev/shell/BrowserDialog.java
+++ b/dev/core/src/com/google/gwt/dev/shell/BrowserDialog.java
@@ -22,9 +22,9 @@
 
   public BrowserDialog(Shell parent, TreeLogger logger, String html) {
     super(parent, 550, 520, true, false);
-    fLogger = logger;
-    fHtml = html;
-    fUrl = null;
+    this.logger = logger;
+    this.html = html;
+    this.url = null;
   }
 
   protected Control createContents(Composite parent) {
@@ -36,10 +36,10 @@
         setText(event.title);
       }});
 
-    if (fHtml != null) {
-      browser.setText(fHtml);
-    } else if (fUrl != null) {
-      browser.setUrl(fUrl.toString());
+    if (html != null) {
+      browser.setText(html);
+    } else if (url != null) {
+      browser.setUrl(url.toString());
     }
     
     browser.addLocationListener(new LocationListener() {
@@ -47,14 +47,14 @@
       }
       public void changing(LocationEvent event) {
         event.doit = false;
-        BrowserWidget.launchExternalBrowser(fLogger, event.location);
+        BrowserWidget.launchExternalBrowser(logger, event.location);
       }
     });
 
     return browser;
   }
 
-  private final String fHtml;
-  private final URL fUrl;
-  private final TreeLogger fLogger;
+  private final String html;
+  private final URL url;
+  private final TreeLogger logger;
 }
diff --git a/dev/core/src/com/google/gwt/dev/shell/BrowserWidget.java b/dev/core/src/com/google/gwt/dev/shell/BrowserWidget.java
index 93ac885..f5d75ce 100644
--- a/dev/core/src/com/google/gwt/dev/shell/BrowserWidget.java
+++ b/dev/core/src/com/google/gwt/dev/shell/BrowserWidget.java
@@ -53,56 +53,55 @@
     public Toolbar(Composite parent) {
       super(parent);
 
-      fBackButton = newItem("back.gif", "   &Back   ", "Go back one state");
-      fBackButton.addSelectionListener(this);
+      backButton = newItem("back.gif", "   &Back   ", "Go back one state");
+      backButton.addSelectionListener(this);
 
-      fForwardButton = newItem("forward.gif", "&Forward",
+      forwardButton = newItem("forward.gif", "&Forward",
         "Go forward one state");
-      fForwardButton.addSelectionListener(this);
+      forwardButton.addSelectionListener(this);
 
-      fRefreshButton = newItem("refresh.gif", " &Refresh ", "Reload the page");
-      fRefreshButton.addSelectionListener(this);
+      refreshButton = newItem("refresh.gif", " &Refresh ", "Reload the page");
+      refreshButton.addSelectionListener(this);
 
-      fStopButton = newItem("stop.gif", "    &Stop    ",
+      stopButton = newItem("stop.gif", "    &Stop    ",
         "Stop loading the page");
-      fStopButton.addSelectionListener(this);
+      stopButton.addSelectionListener(this);
 
       newSeparator();
 
-      fOpenWebModeButton = newItem("new-web-mode-window.gif",
+      openWebModeButton = newItem("new-web-mode-window.gif",
         "&Compile/Browse",
         "Compiles and opens the current URL in the system browser");
-      fOpenWebModeButton.addSelectionListener(this);
-      fOpenWebModeButton.setEnabled(false);
+      openWebModeButton.addSelectionListener(this);
+      openWebModeButton.setEnabled(false);
     }
 
     public void widgetDefaultSelected(SelectionEvent e) {
     }
 
     public void widgetSelected(SelectionEvent evt) {
-      if (evt.widget == fBackButton) {
-        fBrowser.back();
-      } else if (evt.widget == fForwardButton) {
-        fBrowser.forward();
-      } else if (evt.widget == fRefreshButton) {
+      if (evt.widget == backButton) {
+        browser.back();
+      } else if (evt.widget == forwardButton) {
+        browser.forward();
+      } else if (evt.widget == refreshButton) {
         // we have to clean up old module spaces here b/c we don't get a
         // location changed event
 
         // lastHostPageLocation = null;
-        fBrowser.refresh();
-      } else if (evt.widget == fStopButton) {
-        fBrowser.stop();
-      } else if (evt.widget == fOpenWebModeButton) {
+        browser.refresh();
+      } else if (evt.widget == stopButton) {
+        browser.stop();
+      } else if (evt.widget == openWebModeButton) {
         // first, compile
         Set keySet = moduleSpacesByName.keySet();
         String[] moduleNames = Util.toStringArray(keySet);
         if (moduleNames.length == 0) {
           // A latent problem with a module.
           //
-          fOpenWebModeButton.setEnabled(false);
+          openWebModeButton.setEnabled(false);
           return;
         }
-        TreeLogger logger = fLogger;
         try {
           Cursor waitCursor = getDisplay().getSystemCursor(SWT.CURSOR_WAIT);
           getShell().setCursor(waitCursor);
@@ -123,20 +122,20 @@
           getShell().setCursor(normalCursor);
         }
 
-        String location = fLocation.getText();
+        String locationText = location.getText();
 
-        launchExternalBrowser(logger, location);
+        launchExternalBrowser(logger, locationText);
       }
     }
 
-    private final ToolItem fBackButton;
-    private final ToolItem fForwardButton;
+    private final ToolItem backButton;
+    private final ToolItem forwardButton;
 
-    private final ToolItem fOpenWebModeButton;
+    private final ToolItem openWebModeButton;
 
-    private final ToolItem fRefreshButton;
+    private final ToolItem refreshButton;
 
-    private final ToolItem fStopButton;
+    private final ToolItem stopButton;
   }
 
   static void launchExternalBrowser(TreeLogger logger, String location) {
@@ -198,24 +197,24 @@
   public BrowserWidget(Composite parent, BrowserWidgetHost host) {
     super(parent, SWT.NONE);
 
-    fHost = host;
-    fLogger = fHost.getLogger();
+    this.host = host;
+    logger = this.host.getLogger();
 
-    fBgColor = new Color(null, 239, 237, 216);
+    bgColor = new Color(null, 239, 237, 216);
 
-    fToolbar = new Toolbar(this);
+    toolbar = new Toolbar(this);
     Composite secondBar = buildLocationBar(this);
 
-    fBrowser = new Browser(this, SWT.NONE);
+    browser = new Browser(this, SWT.NONE);
 
     {
-      fStatusBar = new Label(this, SWT.BORDER | SWT.SHADOW_IN);
-      fStatusBar.setBackground(fBgColor);
+      statusBar = new Label(this, SWT.BORDER | SWT.SHADOW_IN);
+      statusBar.setBackground(bgColor);
       GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
       gridData.verticalAlignment = GridData.CENTER;
       gridData.verticalIndent = 0;
       gridData.horizontalIndent = 0;
-      fStatusBar.setLayoutData(gridData);
+      statusBar.setLayoutData(gridData);
     }
 
     GridLayout layout = new GridLayout();
@@ -225,13 +224,13 @@
     layout.marginHeight = 0;
     setLayout(layout);
 
-    fToolbar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+    toolbar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
     secondBar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 
     GridData data = new GridData(GridData.FILL_BOTH);
     data.grabExcessVerticalSpace = true;
     data.grabExcessHorizontalSpace = true;
-    fBrowser.setLayoutData(data);
+    browser.setLayoutData(data);
 
     // Hook up all appropriate event listeners.
     //
@@ -242,11 +241,11 @@
    * Gets the browser object wrapped by this window.
    */
   public Browser getBrowser() {
-    return fBrowser;
+    return browser;
   }
 
   public BrowserWidgetHost getHost() {
-    return fHost;
+    return host;
   }
 
   /**
@@ -254,19 +253,19 @@
    * project's public directory.
    */
   public void go(String target) {
-    String url = fHost.normalizeURL(target);
-    fBrowser.setUrl(url);
+    String url = host.normalizeURL(target);
+    browser.setUrl(url);
   }
 
   public void onFirstShown() {
-    String baseUrl = fHost.normalizeURL("/");
+    String baseUrl = host.normalizeURL("/");
     setLocationText(baseUrl);
-    fLocation.setFocus();
-    fLocation.setSelection(baseUrl.length());
-    fLocation.addFocusListener(new FocusListener() {
+    location.setFocus();
+    location.setSelection(baseUrl.length());
+    location.addFocusListener(new FocusListener() {
       public void focusGained(FocusEvent e) {
-        int length = fLocation.getText().length();
-        fLocation.setSelection(length, length);
+        int length = location.getText().length();
+        location.setSelection(length, length);
       }
 
       public void focusLost(FocusEvent e) {
@@ -283,7 +282,7 @@
 
     // Let the space do its thing.
     //
-    space.onLoad(fLogger);
+    space.onLoad(logger);
 
     // Remember this new module space so that we can dispose of it later.
     //
@@ -291,7 +290,7 @@
 
     // Enable the compile button since we successfully loaded.
     //
-    fToolbar.fOpenWebModeButton.setEnabled(true);
+    toolbar.openWebModeButton.setEnabled(true);
   }
 
   /**
@@ -306,15 +305,15 @@
       ModuleSpace space = (ModuleSpace) entry.getValue();
 
       space.dispose();
-      fLogger.log(TreeLogger.SPAM, "Cleaning up resources for module "
+      logger.log(TreeLogger.SPAM, "Cleaning up resources for module "
         + moduleName, null);
     }
     moduleSpacesByName.clear();
 
-    if (!fToolbar.fOpenWebModeButton.isDisposed()) {
+    if (!toolbar.openWebModeButton.isDisposed()) {
       // Disable the compile buton.
       //
-      fToolbar.fOpenWebModeButton.setEnabled(false);
+      toolbar.openWebModeButton.setEnabled(false);
     }
   }
 
@@ -324,12 +323,12 @@
     Composite bar = new Composite(parent, SWT.BORDER);
     bar.setBackground(white);
 
-    fLocation = new Text(bar, SWT.FLAT);
+    location = new Text(bar, SWT.FLAT);
 
-    fGoButton = new Button(bar, SWT.NONE);
-    fGoButton.setBackground(fBgColor);
-    fGoButton.setText("Go");
-    fGoButton.setImage(LowLevel.loadImage("go.gif"));
+    goButton = new Button(bar, SWT.NONE);
+    goButton.setBackground(bgColor);
+    goButton.setText("Go");
+    goButton.setImage(LowLevel.loadImage("go.gif"));
 
     GridLayout layout = new GridLayout();
     layout.numColumns = 2;
@@ -341,7 +340,7 @@
     GridData data = new GridData(GridData.FILL_HORIZONTAL);
     data.grabExcessHorizontalSpace = true;
     data.verticalAlignment = GridData.CENTER;
-    fLocation.setLayoutData(data);
+    location.setLayoutData(data);
 
     return bar;
   }
@@ -353,22 +352,22 @@
 
     this.addDisposeListener(new DisposeListener() {
       public void widgetDisposed(DisposeEvent e) {
-        fBgColor.dispose();
+        bgColor.dispose();
       }
     });
 
-    fGoButton.addSelectionListener(new SelectionAdapter() {
+    goButton.addSelectionListener(new SelectionAdapter() {
       public void widgetSelected(SelectionEvent e) {
-        go(fLocation.getText());
+        go(location.getText());
       }
     });
 
     // Hook up the return key in the location bar.
     //
-    fLocation.addKeyListener(new KeyListener() {
+    location.addKeyListener(new KeyListener() {
       public void keyPressed(KeyEvent e) {
         if (e.character == '\r') {
-          go(fLocation.getText());
+          go(location.getText());
         }
       }
 
@@ -378,22 +377,22 @@
 
     // Tie the status label to the browser's status.
     //
-    fBrowser.addStatusTextListener(new StatusTextListener() {
+    browser.addStatusTextListener(new StatusTextListener() {
       public void changed(StatusTextEvent evt) {
         // Add a little space so it doesn't look so crowded.
-        fStatusBar.setText(" " + evt.text);
+        statusBar.setText(" " + evt.text);
       }
     });
 
-    fBrowser.addTitleListener(new TitleListener() {
+    browser.addTitleListener(new TitleListener() {
       public void changed(TitleEvent evt) {
-        fBrowser.getShell().setText(evt.title);
+        browser.getShell().setText(evt.title);
       }
     });
 
     // Tie the location text box to the browser's location.
     //
-    fBrowser.addLocationListener(new LocationListener() {
+    browser.addLocationListener(new LocationListener() {
 
       public void changed(LocationEvent evt) {
         if (evt.top) {
@@ -472,7 +471,7 @@
               } else {
                 String msg = "Cannot find file '" + file.getAbsolutePath()
                   + "'";
-                TreeLogger branch = fLogger.branch(TreeLogger.ERROR, msg, null);
+                TreeLogger branch = logger.branch(TreeLogger.ERROR, msg, null);
                 if ("gwt-hosted.html".equalsIgnoreCase(file.getName())) {
                   branch.log(
                     TreeLogger.ERROR,
@@ -494,11 +493,11 @@
           TreeLogger header;
           TreeLogger.Type msgType = TreeLogger.ERROR;
           if (!evt.doit) {
-            header = fLogger.branch(msgType, "Unable to visit " + typeStr
+            header = logger.branch(msgType, "Unable to visit " + typeStr
               + " URL: '" + url, null);
           } else {
             msgType = TreeLogger.WARN;
-            header = fLogger.branch(
+            header = logger.branch(
               TreeLogger.WARN,
               "Confirmation was required to visit " + typeStr + " URL: '" + url,
               null);
@@ -509,7 +508,7 @@
             BrowserWidgetHostChecker.notifyBlacklistedHost(blacklistRuleFound,
               url, header, msgType);
           }
-          setLocationText(fBrowser.getUrl());
+          setLocationText(browser.getUrl());
         }
       }
 
@@ -517,31 +516,31 @@
 
     // Handle new window requests.
     //
-    fBrowser.addOpenWindowListener(new OpenWindowListener() {
+    browser.addOpenWindowListener(new OpenWindowListener() {
       public void open(WindowEvent event) {
         try {
-          event.browser = fHost.openNewBrowserWindow().getBrowser();
+          event.browser = host.openNewBrowserWindow().getBrowser();
           event.browser.getShell().open();
         } catch (UnableToCompleteException e) {
-          fLogger.log(TreeLogger.ERROR, "Unable to open new browser window", e);
+          logger.log(TreeLogger.ERROR, "Unable to open new browser window", e);
         }
       }
     });
   }
 
   private void setLocationText(String text) {
-    fLocation.setText(text);
+    location.setText(text);
     int length = text.length();
-    fLocation.setSelection(length, length);
+    location.setSelection(length, length);
   }
 
-  protected Browser fBrowser;
-  private Color fBgColor = new Color(null, 239, 237, 216);
-  private Button fGoButton;
-  private final BrowserWidgetHost fHost;
-  private Text fLocation;
-  private final TreeLogger fLogger;
-  private Label fStatusBar;
-  private Toolbar fToolbar;
+  protected Browser browser;
+  private Color bgColor = new Color(null, 239, 237, 216);
+  private Button goButton;
+  private final BrowserWidgetHost host;
+  private Text location;
+  private final TreeLogger logger;
+  private Label statusBar;
+  private Toolbar toolbar;
   private Map moduleSpacesByName = new HashMap();
 }
diff --git a/dev/core/src/com/google/gwt/dev/shell/CheckForUpdates.java b/dev/core/src/com/google/gwt/dev/shell/CheckForUpdates.java
index 89fcf10..01dab92 100644
--- a/dev/core/src/com/google/gwt/dev/shell/CheckForUpdates.java
+++ b/dev/core/src/com/google/gwt/dev/shell/CheckForUpdates.java
@@ -86,30 +86,36 @@
    */
   protected static boolean isServerVersionNewer(String clientVersion,
       String serverVersion) {
-    if (clientVersion == null || serverVersion == null)
+    if (clientVersion == null || serverVersion == null) {
       return false;
-
+    }
+    
     // must match expected format
     if (!clientVersion.matches(VERSION_REGEXP)
-        || !serverVersion.matches(VERSION_REGEXP))
+        || !serverVersion.matches(VERSION_REGEXP)) {
       return false;
-
+    }
+    
     // extract the relevant parts
     String[] clientParts = clientVersion.split("\\.");
     String[] serverParts = serverVersion.split("\\.");
     if (clientParts.length != VERSION_PARTS
-        || serverParts.length != VERSION_PARTS)
+        || serverParts.length != VERSION_PARTS) {
       return false;
+    }
 
     // examine piece by piece from most significant to least significant
     for (int i = 0; i < VERSION_PARTS; ++i) {
       try {
         int clientPart = Integer.parseInt(clientParts[i]);
         int serverPart = Integer.parseInt(serverParts[i]);
-        if (serverPart < clientPart)
+        if (serverPart < clientPart) {
           return false;
-        if (serverPart > clientPart)
+        }
+        
+        if (serverPart > clientPart) {
           return true;
+        }
       } catch (NumberFormatException e) {
         return false;
       }
@@ -475,15 +481,16 @@
   static {
     // Do this in a static initializer so we can ignore all exceptions.
     //
-    boolean debug_version_check = false;
+    boolean debugVersionCheck = false;
     try {
-      if (System.getProperty("gwt.debugVersionCheck") != null)
-        debug_version_check = true;
+      if (System.getProperty("gwt.debugVersionCheck") != null) {
+        debugVersionCheck = true;
+      }
     } catch (Throwable e) {
       // Always silently ignore any errors.
       //
     } finally {
-      DEBUG_VERSION_CHECK = debug_version_check;
+      DEBUG_VERSION_CHECK = debugVersionCheck;
     }
   }
 }
diff --git a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
index 8d8547f..02f92e1 100644
--- a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
+++ b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
@@ -26,7 +26,7 @@
 
   /**
    * Oracle that can answer questions about
-   * {@link DispatchClassInfo DispatchClassInfos}
+   * {@link DispatchClassInfo DispatchClassInfos}.
    */
   private final class DispatchClassInfoOracle {
 
@@ -217,12 +217,12 @@
     }
 
     /**
-     * Class identifier to DispatchClassInfo mapping
+     * Class identifier to DispatchClassInfo mapping.
      */
     private final ArrayList classIdToClassInfo = new ArrayList();
 
     /**
-     * Binary or source class name to DispatchClassInfo map
+     * Binary or source class name to DispatchClassInfo map.
      */
     private final Map classNameToClassInfo = new HashMap();
 
@@ -350,8 +350,9 @@
     try {
       byte classBytes[] = new byte[is.available()];
       int read = 0;
-      while (read < classBytes.length)
+      while (read < classBytes.length) {
         read += is.read(classBytes, read, classBytes.length - read);
+      }
       return classBytes;
     } finally {
       Utility.close(is);
diff --git a/dev/core/src/com/google/gwt/dev/shell/DialogBase.java b/dev/core/src/com/google/gwt/dev/shell/DialogBase.java
index 7af291f..363f07d 100644
--- a/dev/core/src/com/google/gwt/dev/shell/DialogBase.java
+++ b/dev/core/src/com/google/gwt/dev/shell/DialogBase.java
@@ -23,42 +23,41 @@
 /** 
  * Pops up a confirm/cancel dialog. 
  */
-	public static boolean confirmAction(Shell shell, String msg, String msgTitle) {
-		MessageBox msgBox = new MessageBox(shell, SWT.ICON_WARNING
-				| SWT.YES | SWT.NO);
-		msgBox.setText(msgTitle);
-		msgBox.setMessage(msg);
-		return msgBox.open()==SWT.YES;
-	}
-	
+  public static boolean confirmAction(Shell shell, String msg, String msgTitle) {
+    MessageBox msgBox = new MessageBox(shell, SWT.ICON_WARNING
+        | SWT.YES | SWT.NO);
+    msgBox.setText(msgTitle);
+    msgBox.setMessage(msg);
+    return msgBox.open() == SWT.YES;
+  }
 
 private class Buttons extends GridPanel {
     public Buttons(Composite parent) {
-      super(parent, SWT.NONE, fHasCancel ? 2 : 1, true);
+      super(parent, SWT.NONE, hasCancel ? 2 : 1, true);
 
-      if (fHasOk) {
-        fOKButton = new Button(this, SWT.PUSH);
-        setGridData(fOKButton, 1, 1, FILL, FILL, false, false);
-        fOKButton.setText("    OK    ");
-        fOKButton.addSelectionListener(new SelectionAdapter() {
+      if (hasOk) {
+        okButton = new Button(this, SWT.PUSH);
+        setGridData(okButton, 1, 1, FILL, FILL, false, false);
+        okButton.setText("    OK    ");
+        okButton.addSelectionListener(new SelectionAdapter() {
           public void widgetSelected(SelectionEvent e) {
             clickOkButton();
           }
         });
       }
 
-      if (fHasCancel) {
-        fCancelButton = new Button(this, SWT.PUSH);
-        setGridData(fCancelButton, 1, 1, FILL, FILL, false, false);
-        fCancelButton.setText("Cancel");
-        fCancelButton.addSelectionListener(new SelectionAdapter() {
+      if (hasCancel) {
+        cancelButton = new Button(this, SWT.PUSH);
+        setGridData(cancelButton, 1, 1, FILL, FILL, false, false);
+        cancelButton.setText("Cancel");
+        cancelButton.addSelectionListener(new SelectionAdapter() {
           public void widgetSelected(SelectionEvent e) {
             clickCancelButton();
           }
         });
       }
 
-      fShell.setDefaultButton(fOKButton);
+      shell.setDefaultButton(okButton);
     }
   }
 
@@ -70,7 +69,7 @@
       Control contents = createContents(this);
       setGridData(contents, 1, 1, FILL, FILL, true, true);
 
-      if (fHasOk || fHasCancel) {
+      if (hasOk || hasCancel) {
         Buttons buttons = new Buttons(this);
         setGridData(buttons, 1, 1, RIGHT, BOTTOM, false, false);
       }
@@ -84,14 +83,14 @@
   public DialogBase(Shell parent, int minWidth, int minHeight,
       boolean hasOkButton, boolean hasCancelButton) {
     super(parent, SWT.NONE);
-    fMinWidth = minWidth;
-    fMinHeight = minHeight;
-    fHasOk = hasOkButton;
-    fHasCancel = hasCancelButton;
+    this.minWidth = minWidth;
+    this.minHeight = minHeight;
+    hasOk = hasOkButton;
+    hasCancel = hasCancelButton;
   }
 
   public Shell getShell() {
-    return fShell;
+    return shell;
   }
 
   public boolean open() {
@@ -100,13 +99,13 @@
 
   public boolean open(boolean autoSize) {
     Shell parent = getParent();
-    fShell = new Shell(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL
+    shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL
       | SWT.RESIZE);
-    fShell.setImages(GWTShell.getIcons());
-    fShell.setText(getText());
-    fShell.setLayout(new FillLayout());
+    shell.setImages(GWTShell.getIcons());
+    shell.setText(getText());
+    shell.setLayout(new FillLayout());
 
-    new Contents(fShell);
+    new Contents(shell);
 
     onOpen();
 
@@ -116,15 +115,15 @@
       // Try to make the dialog big enough to hold the packed layout or
       // the requested size, whichever is bigger.
       //
-      fShell.pack();
+      shell.pack();
 
-      Rectangle shellBounds = fShell.getBounds();
+      Rectangle shellBounds = shell.getBounds();
 
-      myWidth = Math.max(shellBounds.width, fMinWidth);
-      myHeight = Math.max(shellBounds.height, fMinHeight);
+      myWidth = Math.max(shellBounds.width, minWidth);
+      myHeight = Math.max(shellBounds.height, minHeight);
     } else {
-      myWidth = fMinWidth;
-      myHeight = fMinHeight;
+      myWidth = minWidth;
+      myHeight = minHeight;
     }
 
     // Try to center within parent shell.
@@ -133,37 +132,38 @@
     int myLeft = parentBounds.x + (parentBounds.width / 2 - myWidth / 2);
     int myTop = parentBounds.y + (parentBounds.height / 4);
 
-    fShell.setBounds(myLeft, myTop, myWidth, myHeight);
+    shell.setBounds(myLeft, myTop, myWidth, myHeight);
 
-    fShell.open();
+    shell.open();
 
     Display display = parent.getDisplay();
-    while (!fShell.isDisposed()) {
-      if (!display.readAndDispatch())
+    while (!shell.isDisposed()) {
+      if (!display.readAndDispatch()) {
         display.sleep();
+      }
     }
 
-    return !fCancelled;
+    return !cancelled;
   }
 
   public void setText(String string) {
     super.setText(string);
-    fShell.setText(string);
+    shell.setText(string);
   }
 
   public void widgetDisposed(DisposeEvent e) {
   }
 
   protected void clickCancelButton() {
-    fCancelled = true;
+    cancelled = true;
     onCancel();
-    fShell.dispose();
+    shell.dispose();
   }
 
   protected void clickOkButton() {
-    fCancelled = false;
+    cancelled = false;
     onOk();
-    fShell.dispose();
+    shell.dispose();
   }
 
   protected abstract Control createContents(Composite parent);
@@ -178,15 +178,15 @@
   }
 
   protected void setOkEnabled(boolean enabled) {
-    fOKButton.setEnabled(enabled);
+    okButton.setEnabled(enabled);
   }
 
-  private Button fCancelButton;
-  private boolean fCancelled = true;
-  private boolean fHasCancel;
-  private boolean fHasOk;
-  private int fMinHeight;
-  private int fMinWidth;
-  private Button fOKButton;
-  private Shell fShell;
+  private Button cancelButton;
+  private boolean cancelled = true;
+  private boolean hasCancel;
+  private boolean hasOk;
+  private int minHeight;
+  private int minWidth;
+  private Button okButton;
+  private Shell shell;
 }
diff --git a/dev/core/src/com/google/gwt/dev/shell/DispatchClassInfo.java b/dev/core/src/com/google/gwt/dev/shell/DispatchClassInfo.java
index 9f0afab..ff91481 100644
--- a/dev/core/src/com/google/gwt/dev/shell/DispatchClassInfo.java
+++ b/dev/core/src/com/google/gwt/dev/shell/DispatchClassInfo.java
@@ -14,37 +14,39 @@
 public class DispatchClassInfo {
 
   public DispatchClassInfo(Class cls, int classId) {
-    fClass = cls;
-    fClassId = classId;
+    this.cls = cls;
+    clsId = classId;
   }
 
   public int getClassId() {
-    return fClassId;
+    return clsId;
   }
 
   public Member getMember(int id) {
     lazyInitTargetMembers();
     id &= 0xffff;
-    return (Member) fMemberById.get(id);
+    return (Member) memberById.get(id);
   }
 
   public int getMemberId(String mangledMemberName) {
     lazyInitTargetMembers();
 
-    Integer id = (Integer) fMemberIdByName.get(mangledMemberName);
-    if (id == null) return -1;
+    Integer id = (Integer) memberIdByName.get(mangledMemberName);
+    if (id == null) {
+      return -1;
+    }
 
     return id.intValue();
   }
 
   public Class getWrappedClass() {
-    return fClass;
+    return cls;
   }
 
   private void addMember(Member member, String sig) {
-    fMemberById.add(member);
-    int index = fMemberById.size() - 1;
-    fMemberIdByName.put(sig, new Integer(index));
+    memberById.add(member);
+    int index = memberById.size() - 1;
+    memberIdByName.put(sig, new Integer(index));
   }
 
   /**
@@ -75,25 +77,26 @@
     }
 
     if (type.isPrimitive()) {
-      if (type.equals(int.class))
+      if (type.equals(int.class)) {
         return "I";
-      else if (type.equals(boolean.class))
+      } else if (type.equals(boolean.class)) {
         return "Z";
-      else if (type.equals(char.class))
+      } else if (type.equals(char.class)) {
         return "C";
-      else if (type.equals(long.class))
+      } else if (type.equals(long.class)) {
         return "J";
-      else if (type.equals(short.class))
+      } else if (type.equals(short.class)) {
         return "S";
-      else if (type.equals(float.class))
+      } else if (type.equals(float.class)) {
         return "F";
-      else if (type.equals(double.class))
+      } else if (type.equals(double.class)) {
         return "D";
-      else if (type.equals(byte.class))
+      } else if (type.equals(byte.class)) {
         return "B";
-      else
+      } else { 
         throw new RuntimeException("Unexpected primitive type: "
             + type.getName());
+      }
     } else {
       StringBuffer sb = new StringBuffer();
       sb.append("L");
@@ -104,11 +107,11 @@
   }
 
   private void lazyInitTargetMembers() {
-    if (fMemberById == null) {
-      fMemberById = new ArrayList();
+    if (memberById == null) {
+      memberById = new ArrayList();
       try {
         // MAGIC: 0 is the default property
-        fMemberById.add(fClass.getMethod("toString", null));
+        memberById.add(cls.getMethod("toString", null));
       } catch (SecurityException e) {
         e.printStackTrace();
       } catch (NoSuchMethodException e) {
@@ -127,9 +130,9 @@
          * 
          *   x.@java.lang.Object::equals(Ljava/lang/Object;)(y)
          */
-        if (fClass.isInterface()) {
+        if (cls.isInterface()) {
           try {
-            fMemberById.add(Object.class.getMethod("toString", null));
+            memberById.add(Object.class.getMethod("toString", null));
           } catch (Exception e1) {
             e1.printStackTrace();
           }
@@ -138,17 +141,18 @@
         }
       }
       
-      fMemberIdByName = new HashMap();
-      lazyInitTargetMembersUsingReflectionHelper(fClass);
+      memberIdByName = new HashMap();
+      lazyInitTargetMembersUsingReflectionHelper(cls);
     }
   }
 
   private void lazyInitTargetMembersUsingReflectionHelper(Class targetClass) {
     // Start by analyzing the superclass recursively.
     Class superclass = targetClass.getSuperclass();
-    if (superclass != null)
+    if (superclass != null) {
       lazyInitTargetMembersUsingReflectionHelper(superclass);
-
+    }
+    
     // Get the methods on this class/interface.
     //
     Method[] methods = targetClass.getDeclaredMethods();
@@ -166,11 +170,11 @@
     }
   }
 
-  private Class fClass;
+  private Class cls;
 
-  private final int fClassId;
+  private final int clsId;
 
-  private ArrayList fMemberById;
+  private ArrayList memberById;
 
-  private HashMap fMemberIdByName;
+  private HashMap memberIdByName;
 }
diff --git a/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java b/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java
index 34ea7b7..d6a6b31 100644
--- a/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java
+++ b/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java
@@ -336,7 +336,6 @@
           logger.log(TreeLogger.WARN, msg, null);
           throw new UnableToCompleteException();
         }
-
       }
     } catch (UnableToCompleteException e) {
       sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND,
@@ -423,8 +422,8 @@
   private synchronized TreeLogger getLogger() {
     if (topLogger == null) {
       ServletContext servletContext = getServletContext();
-      final String ATTR = "com.google.gwt.dev.shell.logger";
-      topLogger = (TreeLogger) servletContext.getAttribute(ATTR);
+      final String attr = "com.google.gwt.dev.shell.logger";
+      topLogger = (TreeLogger) servletContext.getAttribute(attr);
       if (topLogger == null) {
         // No shell available, so wrap the regular servlet context logger.
         //
@@ -470,8 +469,8 @@
   private synchronized File getOutputDir() {
     if (outDir == null) {
       ServletContext servletContext = getServletContext();
-      final String ATTR = "com.google.gwt.dev.shell.outdir";
-      outDir = (File) servletContext.getAttribute(ATTR);
+      final String attr = "com.google.gwt.dev.shell.outdir";
+      outDir = (File) servletContext.getAttribute(attr);
       assert (outDir != null);
     }
     return outDir;
@@ -656,8 +655,9 @@
       // (IE does add this).
       //
       int lastSemi = ifModifiedSince.lastIndexOf(';');
-      if (lastSemi != -1)
+      if (lastSemi != -1) {
         ifModifiedSince = ifModifiedSince.substring(0, lastSemi);
+      }
       ageOfClientCopy = HttpHeaders.fromInternetDateFormat(ifModifiedSince);
     }
 
diff --git a/dev/core/src/com/google/gwt/dev/shell/GridPanel.java b/dev/core/src/com/google/gwt/dev/shell/GridPanel.java
index bbd66fc..7892149 100644
--- a/dev/core/src/com/google/gwt/dev/shell/GridPanel.java
+++ b/dev/core/src/com/google/gwt/dev/shell/GridPanel.java
@@ -46,10 +46,14 @@
         gridData.verticalAlignment = vAlign;
         gridData.grabExcessHorizontalSpace = hGrab;
         gridData.grabExcessVerticalSpace = vGrab;
-        if (heightHint != SWT.DEFAULT)
+        if (heightHint != SWT.DEFAULT) {
             gridData.heightHint = heightHint;
-        if (widthHint != SWT.DEFAULT)
+        }
+        
+        if (widthHint != SWT.DEFAULT) {
             gridData.widthHint = widthHint;
+        }
+        
         control.setLayoutData(gridData);
         return gridData; 
     }
diff --git a/dev/core/src/com/google/gwt/dev/shell/Handle.java b/dev/core/src/com/google/gwt/dev/shell/Handle.java
index d089b5e..1bf5983 100644
--- a/dev/core/src/com/google/gwt/dev/shell/Handle.java
+++ b/dev/core/src/com/google/gwt/dev/shell/Handle.java
@@ -26,8 +26,9 @@
   private static Handle sImpl;
   
   protected Handle() {
-    if (sImpl != null)
+    if (sImpl != null) {
       throw new RuntimeException("More than one Handle class!");
+    }
     sImpl = this;
   }
 
@@ -63,11 +64,13 @@
       checkThread();
 
       Class handleClass = handle.getClass();
-      while (handleClass != null && !handleClass.getName().equals(HANDLE_CLASS))
+      while (handleClass != null && !handleClass.getName().equals(HANDLE_CLASS)) {
         handleClass = handleClass.getSuperclass();
+      }
       
-      if (handleClass == null)
+      if (handleClass == null) {
         throw new RuntimeException("Error reading handle");
+      }
 
       Field opaqueField = handleClass.getDeclaredField("opaque");
       opaqueField.setAccessible(true);
@@ -116,10 +119,10 @@
    * Ensures that the current thread is actually the UI thread.
    */
   private static synchronized void checkThread() {
-    if (theOnlyThreadAllowed == null)
+    if (theOnlyThreadAllowed == null) {
       theOnlyThreadAllowed = Thread.currentThread();
-    else if (theOnlyThreadAllowed != Thread.currentThread())
+    } else if (theOnlyThreadAllowed != Thread.currentThread()) {
       throw new RuntimeException("This object has permanent thread affinity.");
+    }
   }
-  
 }
diff --git a/dev/core/src/com/google/gwt/dev/shell/HeaderBarBase.java b/dev/core/src/com/google/gwt/dev/shell/HeaderBarBase.java
index 960f21c..76cdfa4 100644
--- a/dev/core/src/com/google/gwt/dev/shell/HeaderBarBase.java
+++ b/dev/core/src/com/google/gwt/dev/shell/HeaderBarBase.java
@@ -1,8 +1,6 @@
 // Copyright 2006 Google Inc. All Rights Reserved.
 package com.google.gwt.dev.shell;
 
-
-
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
@@ -16,10 +14,13 @@
 import org.eclipse.swt.widgets.ToolBar;
 import org.eclipse.swt.widgets.ToolItem;
 
+/**
+ * Base class for <code>Composites</code> that contain <code>ToolItem</code> entities.
+ */
 public class HeaderBarBase extends Composite implements DisposeListener {
   
-  private final Color fBgColor;
-  private final ToolBar fToolBar;
+  private final Color bgColor;
+  private final ToolBar toolBar;
   
   public HeaderBarBase(Composite parent) {
     super(parent, SWT.NONE);
@@ -30,7 +31,7 @@
     fillLayout.marginWidth = 1;
     setLayout(fillLayout);
 
-    fBgColor = new Color(null, 239, 237, 216);
+    bgColor = new Color(null, 239, 237, 216);
     addDisposeListener(this);
 
     GridLayout gridLayout = new GridLayout(2, false);
@@ -41,22 +42,22 @@
     gridLayout.marginWidth = 0;
     gridLayout.marginHeight = 0;
     outer.setLayout(gridLayout);
-    outer.setBackground(fBgColor);
+    outer.setBackground(bgColor);
 
-    fToolBar = new ToolBar(outer, SWT.FLAT);
-    fToolBar.setBackground(new Color(null, 255, 0, 0));
+    toolBar = new ToolBar(outer, SWT.FLAT);
+    toolBar.setBackground(new Color(null, 255, 0, 0));
     GridData data = new GridData();
     data.grabExcessHorizontalSpace = true;
     data.verticalAlignment = SWT.CENTER;
     data.horizontalAlignment = SWT.FILL;
-    fToolBar.setLayoutData(data);
-    fToolBar.setBackground(fBgColor);
+    toolBar.setLayoutData(data);
+    toolBar.setBackground(bgColor);
 
     RowLayout rowLayout = new RowLayout();
     rowLayout.fill = true;
     rowLayout.pack = false;
     rowLayout.wrap = false;
-    fToolBar.setLayout(rowLayout);
+    toolBar.setLayout(rowLayout);
 
     Label logoLabel = new Label(outer, SWT.BORDER | SWT.SHADOW_IN);
     logoLabel.setImage(LowLevel.loadImage("logo.gif"));
@@ -64,15 +65,15 @@
   }
 
   public void widgetDisposed(DisposeEvent e) {
-    fBgColor.dispose();
+    bgColor.dispose();
   }
   
   public ToolBar getToolBar() {
-    return fToolBar;
+    return toolBar;
   }
   
   public ToolItem newItem(String imageName, String label, String tooltip) {
-    ToolItem item = new ToolItem(fToolBar, SWT.PUSH);
+    ToolItem item = new ToolItem(toolBar, SWT.PUSH);
     item.setImage(LowLevel.loadImage(imageName));
     item.setText(label);
     item.setSelection(false);
@@ -82,6 +83,6 @@
   }
   
   public void newSeparator() {
-    new ToolItem(fToolBar, SWT.SEPARATOR);
+    new ToolItem(toolBar, SWT.SEPARATOR);
   }
 }
diff --git a/dev/core/src/com/google/gwt/dev/shell/JavaDispatchImpl.java b/dev/core/src/com/google/gwt/dev/shell/JavaDispatchImpl.java
index 87d65e9f..6fc8482 100644
--- a/dev/core/src/com/google/gwt/dev/shell/JavaDispatchImpl.java
+++ b/dev/core/src/com/google/gwt/dev/shell/JavaDispatchImpl.java
@@ -78,7 +78,10 @@
    * @return true if the dispId represents a field
    */
   public boolean isField(int dispId) {
-    if (dispId < 0) return false;
+    if (dispId < 0) {
+      return false;
+    }
+    
     return getMember(dispId) instanceof Field;
   }
 
@@ -87,7 +90,10 @@
    * @return true if the dispId represents a method
    */
   public boolean isMethod(int dispId) {
-    if (dispId < 0) return false;
+    if (dispId < 0) {
+      return false;
+    }
+    
     return getMember(dispId) instanceof Method;
   }
 
diff --git a/dev/core/src/com/google/gwt/dev/shell/JsniInjector.java b/dev/core/src/com/google/gwt/dev/shell/JsniInjector.java
index 900e89f..a02c08e 100644
--- a/dev/core/src/com/google/gwt/dev/shell/JsniInjector.java
+++ b/dev/core/src/com/google/gwt/dev/shell/JsniInjector.java
@@ -290,8 +290,10 @@
     StringBuffer sb = new StringBuffer();
     sb.append("new String[] {");
     for (int i = 0, n = params.length; i < n; ++i) {
-      if (i > 0)
+      if (i > 0) {
         sb.append(", ");
+      }
+      
       JParameter param = params[i];
       sb.append('\"');
       sb.append(param.getName());
diff --git a/dev/core/src/com/google/gwt/dev/shell/LowLevel.java b/dev/core/src/com/google/gwt/dev/shell/LowLevel.java
index 9e8e666..5bc02f8 100644
--- a/dev/core/src/com/google/gwt/dev/shell/LowLevel.java
+++ b/dev/core/src/com/google/gwt/dev/shell/LowLevel.java
@@ -16,7 +16,7 @@
 public class LowLevel {
 
   /**
-   * Not instantiable
+   * This class is not instantiable.
    */
   private LowLevel() {
   }
@@ -100,10 +100,11 @@
    */
   public static void clobberFieldObjectValue(Object victim, String fieldName,
       Object value) {
-    if (victim != null)
+    if (victim != null) {
       clobberFieldObjectValue(victim.getClass(), victim, fieldName, value);
-    else
+    } else {
       throw new NullPointerException("victim must not be null");
+    }
   }
 
   /**
@@ -163,10 +164,11 @@
    * Snatches a field from an object to which we do not have access.
    */
   public static Object snatchFieldObjectValue(Object victim, String fieldName) {
-    if (victim != null)
+    if (victim != null) {
       return snatchFieldObjectValue(victim.getClass(), victim, fieldName);
-    else
+    } else {
       throw new NullPointerException("victim must not be null");
+    }
   }
 
   private static native void _deleteGlobalRefInt(int globalRef);
diff --git a/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java b/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java
index cf91325..8d14423 100644
--- a/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java
+++ b/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java
@@ -158,8 +158,10 @@
     String newScript = "window[\"" + jsniSignature + "\"] = function(";
 
     for (int i = 0; i < paramNames.length; ++i) {
-      if (i > 0)
+      if (i > 0) {
         newScript += ", ";
+      }
+      
       newScript += paramNames[i];
     }
 
diff --git a/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java b/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java
index feaa4e5..591f909 100644
--- a/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java
+++ b/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java
@@ -23,6 +23,9 @@
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.ToolItem;
 
+/**
+ * Implements the GWTShell's main window control.  
+ */
 public class ShellMainWindow extends Composite implements DisposeListener,
     ShellListener {
 
@@ -31,13 +34,13 @@
     public Toolbar(Composite parent) {
       super(parent);
 
-      fNewWindow = newItem("new-window.gif", "&Hosted Browser",
+      newWindow = newItem("new-window.gif", "&Hosted Browser",
         "Opens a new hosted mode browser window for debugging");
-      fNewWindow.addSelectionListener(new SelectionAdapter() {
+      newWindow.addSelectionListener(new SelectionAdapter() {
         public void widgetSelected(SelectionEvent event) {
-          String startupUrl = fServerWindow.normalizeURL("/");
+          String startupUrl = serverWindow.normalizeURL("/");
           try {
-            BrowserWidget bw = fServerWindow.openNewBrowserWindow();
+            BrowserWidget bw = serverWindow.openNewBrowserWindow();
             bw.go(startupUrl);
           } catch (UnableToCompleteException e) {
             getLogger().log(TreeLogger.ERROR,
@@ -48,34 +51,34 @@
 
       newSeparator();
 
-      fCollapseAll = newItem("collapse.gif", "&Collapse All",
+      collapseAll = newItem("collapse.gif", "&Collapse All",
         "Collapses all log entries");
-      fCollapseAll.addSelectionListener(new SelectionAdapter() {
+      collapseAll.addSelectionListener(new SelectionAdapter() {
         public void widgetSelected(SelectionEvent e) {
-          fLogPane.collapseAll();
+          logPane.collapseAll();
         }
       });
 
-      fExpandAll = newItem("expand.gif", "&Expand All",
+      expandAll = newItem("expand.gif", "&Expand All",
         "Expands all log entries");
-      fExpandAll.addSelectionListener(new SelectionAdapter() {
+      expandAll.addSelectionListener(new SelectionAdapter() {
         public void widgetSelected(SelectionEvent e) {
-          fLogPane.expandAll();
+          logPane.expandAll();
         }
       });
 
-      fClearLog = newItem("clear-log.gif", "Clear &Log",
+      clearLog = newItem("clear-log.gif", "Clear &Log",
         "Removes all log entries");
-      fClearLog.addSelectionListener(new SelectionAdapter() {
+      clearLog.addSelectionListener(new SelectionAdapter() {
         public void widgetSelected(SelectionEvent e) {
-          fLogPane.removeAll();
+          logPane.removeAll();
         }
       });
 
       newSeparator();
 
-      fAbout = newItem("about.gif", "    &About    ", "About...");
-      fAbout.addSelectionListener(new SelectionAdapter() {
+      about = newItem("about.gif", "    &About    ", "About...");
+      about.addSelectionListener(new SelectionAdapter() {
         public void widgetSelected(SelectionEvent e) {
           String aboutHtml = Util.getFileFromInstallPath("about.html");
           if (aboutHtml != null) {
@@ -83,8 +86,9 @@
             StringBuffer sb = new StringBuffer();
             sb
               .append("<div style='overflow:hidden;width:100%;white-space:nowrap;font-size:1px'><br/><br/><br/><br/><font style='background-color:gray;color:lightgrey'>");
-            for (int i = 0; i < 100; ++i)
+            for (int i = 0; i < 100; ++i) {
               sb.append(serial);
+            }
             sb.append("</font></div>");
             serial = sb.toString();
             int pos;
@@ -107,20 +111,20 @@
       });
     }
 
-    private ToolItem fAbout;
-    private ToolItem fClearLog;
-    private ToolItem fCollapseAll;
-    private ToolItem fExpandAll;
-    private ToolItem fNewWindow;
+    private ToolItem about;
+    private ToolItem clearLog;
+    private ToolItem collapseAll;
+    private ToolItem expandAll;
+    private ToolItem newWindow;
   }
 
   public ShellMainWindow(GWTShell serverWindow, final Shell parent,
       int serverPort, boolean checkForUpdates) {
     super(parent, SWT.NONE);
 
-    fServerWindow = serverWindow;
+    this.serverWindow = serverWindow;
 
-    fColorWhite = new Color(null, 255, 255, 255);
+    colorWhite = new Color(null, 255, 255, 255);
 
     addDisposeListener(this);
     parent.addShellListener(this);
@@ -142,23 +146,23 @@
     // Create the toolbar.
     //
     {
-      fToolbar = new Toolbar(this);
+      toolbar = new Toolbar(this);
       GridData data = new GridData();
       data.grabExcessHorizontalSpace = true;
       data.horizontalAlignment = GridData.FILL;
-      fToolbar.setLayoutData(data);
+      toolbar.setLayoutData(data);
     }
 
     // Create the log pane.
     //
     {
-      fLogPane = new TreeLoggerWidget(this);
+      logPane = new TreeLoggerWidget(this);
       GridData data = new GridData();
       data.grabExcessHorizontalSpace = true;
       data.grabExcessVerticalSpace = true;
       data.horizontalAlignment = GridData.FILL;
       data.verticalAlignment = GridData.FILL;
-      fLogPane.setLayoutData(data);
+      logPane.setLayoutData(data);
     }
 
     // check for updates
@@ -198,27 +202,28 @@
   }
 
   public AbstractTreeLogger getLogger() {
-    return fLogPane.getLogger();
+    return logPane.getLogger();
   }
 
   public void shellActivated(ShellEvent e) {
   }
 
   public void shellClosed(ShellEvent e) {
-	  if (fServerWindow.hasBrowserWindowsOpen()) {
-		  boolean closeWindows=true;
-		  if(System.getProperty("gwt.shell.endquick")==null) {
-			  closeWindows = DialogBase.confirmAction((Shell) e.widget,
-						  "Closing the development shell will close " +
-						  "all hosted mode browsers.  Continue?", "Confirm close");
-		  } 
-		if (closeWindows) {
-			  fServerWindow.closeAllBrowserWindows();
-			  e.doit = true;
-		  } else {
-			  e.doit = false;
-		  }
-	  }
+    if (serverWindow.hasBrowserWindowsOpen()) {
+      boolean closeWindows = true;
+      if (System.getProperty("gwt.shell.endquick") == null) {
+        closeWindows = DialogBase.confirmAction((Shell) e.widget,
+            "Closing the development shell will close " +
+            "all hosted mode browsers.  Continue?", "Confirm close");
+      } 
+      
+      if (closeWindows) {
+        serverWindow.closeAllBrowserWindows();
+        e.doit = true;
+      } else {
+        e.doit = false;
+      }
+    }
   }
 
   public void shellDeactivated(ShellEvent e) {
@@ -231,28 +236,30 @@
   }
 
   public void widgetDisposed(DisposeEvent e) {
-    fColorWhite.dispose();
+    colorWhite.dispose();
   }
 
   private static String verify(String hash) {
     char[] in = hash.toCharArray();
     char[] ou = new char[in.length];
     for (int i = 0, c = 0; i < in.length; ++i) {
-      if (in[i] < 'a')
+      if (in[i] < 'a') {
         c += in[i] - 'A';
-      else
+      } else {
         c += in[i] - 'a' - 26;
-
-      if (c == 0)
+      }
+      
+      if (c == 0) {
         ou[i] = ' ';
-      else
+      } else {
         ou[i] = (char) ('@' + c);
+      }
     }
     return String.valueOf(ou);
   }
 
-  private Color fColorWhite;
-  private TreeLoggerWidget fLogPane;
-  private GWTShell fServerWindow;
-  private Toolbar fToolbar;
+  private Color colorWhite;
+  private TreeLoggerWidget logPane;
+  private GWTShell serverWindow;
+  private Toolbar toolbar;
 }
diff --git a/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java b/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java
index 30e1e03..22078a3 100644
--- a/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java
+++ b/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java
@@ -123,12 +123,11 @@
     this.propOracle = propOracle;
     this.rules = rules;
     this.genDir = genDir;
-    if(cacheManager!= null) {
+    if (cacheManager != null) {
       this.cacheManager = cacheManager;
     } else {
       this.cacheManager = new CacheManager(typeOracle);
     }
-    
   }
 
   public StandardRebindOracle(TypeOracle typeOracle, StaticPropertyOracle propOracle, Rules rules, File genDir) {
diff --git a/dev/core/src/com/google/gwt/dev/shell/tomcat/CatalinaLoggerAdapter.java b/dev/core/src/com/google/gwt/dev/shell/tomcat/CatalinaLoggerAdapter.java
index ae31d72..a943ba7 100644
--- a/dev/core/src/com/google/gwt/dev/shell/tomcat/CatalinaLoggerAdapter.java
+++ b/dev/core/src/com/google/gwt/dev/shell/tomcat/CatalinaLoggerAdapter.java
@@ -7,32 +7,32 @@
 
 class CatalinaLoggerAdapter extends LoggerBase {
 
-  private final TreeLogger fLogger;
+  private final TreeLogger logger;
 
   public CatalinaLoggerAdapter(TreeLogger logger) {
-    fLogger = logger;
+    this.logger = logger;
   }
 
   public void log(Exception exception, String msg) {
-    fLogger.log(TreeLogger.WARN, msg, exception);
+    logger.log(TreeLogger.WARN, msg, exception);
   }
 
   public void log(String msg) {
-    fLogger.log(TreeLogger.INFO, msg, null);
+    logger.log(TreeLogger.INFO, msg, null);
   }
 
   public void log(String message, int verbosity) {
     TreeLogger.Type type = mapVerbosityToLogType(verbosity);
-    fLogger.log(type, message, null);
+    logger.log(type, message, null);
   }
 
   public void log(String msg, Throwable throwable) {
-    fLogger.log(TreeLogger.WARN, msg, throwable);
+    logger.log(TreeLogger.WARN, msg, throwable);
   }
 
   public void log(String message, Throwable throwable, int verbosity) {
     TreeLogger.Type type = mapVerbosityToLogType(verbosity);
-    fLogger.log(type, message, throwable);
+    logger.log(type, message, throwable);
   }
 
   private TreeLogger.Type mapVerbosityToLogType(int verbosity) {
diff --git a/dev/core/src/com/google/gwt/dev/shell/tomcat/CommonsLoggerAdapter.java b/dev/core/src/com/google/gwt/dev/shell/tomcat/CommonsLoggerAdapter.java
index 170141a..c0b670f 100644
--- a/dev/core/src/com/google/gwt/dev/shell/tomcat/CommonsLoggerAdapter.java
+++ b/dev/core/src/com/google/gwt/dev/shell/tomcat/CommonsLoggerAdapter.java
@@ -9,7 +9,7 @@
     // NOTE: this is ugly, but I don't know of any other way to get a 
     // non-static log to which we can delegate.
     //
-    fLog = EmbeddedTomcatServer.sTomcat.getLogger();
+    log = EmbeddedTomcatServer.sTomcat.getLogger();
   }
 
   public void debug(Object message) {
@@ -47,29 +47,29 @@
   }
 
   public boolean isDebugEnabled() {
-    return fLog.isLoggable(TreeLogger.SPAM);
+    return log.isLoggable(TreeLogger.SPAM);
   }
 
   public boolean isErrorEnabled() {
-    return fLog.isLoggable(TreeLogger.WARN);
+    return log.isLoggable(TreeLogger.WARN);
   }
 
   public boolean isFatalEnabled() {
-    return fLog.isLoggable(TreeLogger.WARN);
+    return log.isLoggable(TreeLogger.WARN);
   }
 
   public boolean isInfoEnabled() {
     // Intentionally low-level to us.
-    return fLog.isLoggable(TreeLogger.TRACE);
+    return log.isLoggable(TreeLogger.TRACE);
   }
 
   public boolean isTraceEnabled() {
     // Intentionally low-level to us.
-    return fLog.isLoggable(TreeLogger.SPAM);
+    return log.isLoggable(TreeLogger.SPAM);
   }
 
   public boolean isWarnEnabled() {
-    return fLog.isLoggable(TreeLogger.WARN);
+    return log.isLoggable(TreeLogger.WARN);
   }
 
   public void trace(Object message) {
@@ -92,8 +92,8 @@
 
   private void doLog(TreeLogger.Type type, Object message, Throwable t) {
     String msg = message.toString();
-    fLog.log(type, msg, t);
+    log.log(type, msg, t);
   }
 
-  private TreeLogger fLog;
+  private TreeLogger log;
 }
\ No newline at end of file
diff --git a/dev/core/src/com/google/gwt/dev/shell/tomcat/EmbeddedTomcatServer.java b/dev/core/src/com/google/gwt/dev/shell/tomcat/EmbeddedTomcatServer.java
index fb1411d..efbacf5 100644
--- a/dev/core/src/com/google/gwt/dev/shell/tomcat/EmbeddedTomcatServer.java
+++ b/dev/core/src/com/google/gwt/dev/shell/tomcat/EmbeddedTomcatServer.java
@@ -24,11 +24,14 @@
 import java.net.InetAddress;
 import java.net.URL;
 
+/**
+ * Wraps an instance of the Tomcat web server used in hosted mode.
+ */
 public class EmbeddedTomcatServer {
 
   static EmbeddedTomcatServer sTomcat;
 
-  public synchronized static String start(TreeLogger topLogger, int port,
+  public static synchronized String start(TreeLogger topLogger, int port,
       File outDir) {
     if (sTomcat != null) {
       throw new IllegalStateException("Embedded Tomcat is already running");
@@ -36,7 +39,7 @@
 
     try {
       new EmbeddedTomcatServer(topLogger, port, outDir);
-      sTomcat.fCatEmbedded.start();
+      sTomcat.catEmbedded.start();
       return null;
     } catch (LifecycleException e) {
       String msg = e.getMessage();
@@ -53,10 +56,10 @@
 
   // Stop the embedded Tomcat server.
   //
-  public synchronized static void stop() {
+  public static synchronized void stop() {
     if (sTomcat != null) {
       try {
-        sTomcat.fCatEmbedded.stop();
+        sTomcat.catEmbedded.stop();
       } catch (LifecycleException e) {
         // There's nothing we can really do about this and the logger is
         // gone in many scenarios, so we just ignore it.
@@ -76,7 +79,7 @@
     final TreeLogger logger = topLogger.branch(TreeLogger.INFO,
       "Starting HTTP on port " + listeningPort, null);
 
-    fStartupBranchLogger = logger;
+    startupBranchLogger = logger;
 
     // Make myself the one static instance.
     // NOTE: there is only one small implementation reason that this has
@@ -91,7 +94,7 @@
 
     // Set the port, which is used in the creation of catalina.home.
     //
-    fPort = listeningPort;
+    port = listeningPort;
 
     // Assume the working directory is simply the user's current directory.
     //
@@ -120,31 +123,31 @@
 
     // Create an embedded server.
     //
-    fCatEmbedded = new Embedded();
-    fCatEmbedded.setDebug(0);
-    fCatEmbedded.setLogger(catalinaLogger);
+    catEmbedded = new Embedded();
+    catEmbedded.setDebug(0);
+    catEmbedded.setLogger(catalinaLogger);
 
     // The embedded engine is called "gwt".
     //
-    fCatEngine = fCatEmbedded.createEngine();
-    fCatEngine.setName("gwt");
-    fCatEngine.setDefaultHost("localhost");
+    catEngine = catEmbedded.createEngine();
+    catEngine.setName("gwt");
+    catEngine.setDefaultHost("localhost");
 
     // It answers localhost requests.
     //
     // String appBase = fCatalinaBaseDir.getAbsolutePath();
     String appBase = catBase + "/webapps";
-    fCatHost = (StandardHost) fCatEmbedded.createHost("localhost", appBase);
+    catHost = (StandardHost) catEmbedded.createHost("localhost", appBase);
 
     // Hook up a host config to search for and pull in webapps.
     //
     HostConfig hostConfig = new HostConfig();
-    fCatHost.addLifecycleListener(hostConfig);
+    catHost.addLifecycleListener(hostConfig);
 
     // Hook pre-install events so that we can add attributes to allow loaded
     // instances to find their development instance host.
     //
-    fCatHost.addContainerListener(new ContainerListener() {
+    catHost.addContainerListener(new ContainerListener() {
       public void containerEvent(ContainerEvent event) {
         if (StandardHost.PRE_INSTALL_EVENT.equals(event.getType())) {
           StandardContext webapp = (StandardContext) event.getData();
@@ -156,15 +159,15 @@
 
     // Tell the engine about the host.
     //
-    fCatEngine.addChild(fCatHost);
-    fCatEngine.setDefaultHost(fCatHost.getName());
+    catEngine.addChild(catHost);
+    catEngine.setDefaultHost(catHost.getName());
 
     // Tell the embedded manager about the engine.
     //
-    fCatEmbedded.addEngine(fCatEngine);
+    catEmbedded.addEngine(catEngine);
     InetAddress nullAddr = null;
-    Connector connector = fCatEmbedded.createConnector(nullAddr, fPort, false);
-    fCatEmbedded.addConnector(connector);
+    Connector connector = catEmbedded.createConnector(nullAddr, port, false);
+    catEmbedded.addConnector(connector);
   }
 
   /**
@@ -278,8 +281,8 @@
    */
   private void publishShellLoggerAttribute(TreeLogger logger,
       TreeLogger loggerToPublish, StandardContext webapp) {
-    final String ATTR = "com.google.gwt.dev.shell.logger";
-    publishAttributeToWebApp(logger, webapp, ATTR, loggerToPublish);
+    final String attr = "com.google.gwt.dev.shell.logger";
+    publishAttributeToWebApp(logger, webapp, attr, loggerToPublish);
   }
 
   /**
@@ -288,17 +291,17 @@
    */
   private void publishShellOutDirAttribute(TreeLogger logger,
       File outDirToPublish, StandardContext webapp) {
-    final String ATTR = "com.google.gwt.dev.shell.outdir";
-    publishAttributeToWebApp(logger, webapp, ATTR, outDirToPublish);
+    final String attr = "com.google.gwt.dev.shell.outdir";
+    publishAttributeToWebApp(logger, webapp, attr, outDirToPublish);
   }
 
   public TreeLogger getLogger() {
-    return fStartupBranchLogger;
+    return startupBranchLogger;
   }
 
-  private Embedded fCatEmbedded;
-  private Engine fCatEngine;
-  private StandardHost fCatHost = null;
-  private final int fPort;
-  private final TreeLogger fStartupBranchLogger;
+  private Embedded catEmbedded;
+  private Engine catEngine;
+  private StandardHost catHost = null;
+  private final int port;
+  private final TreeLogger startupBranchLogger;
 }
diff --git a/dev/core/src/com/google/gwt/util/tools/Utility.java b/dev/core/src/com/google/gwt/util/tools/Utility.java
index b7a02f5..090cd49 100644
--- a/dev/core/src/com/google/gwt/util/tools/Utility.java
+++ b/dev/core/src/com/google/gwt/util/tools/Utility.java
@@ -33,7 +33,7 @@
 import java.util.Set;
 
 /**
- * A smattering of useful file functions
+ * A smattering of useful file functions.
  */
 public final class Utility {
 
@@ -46,8 +46,9 @@
    */
   public static void close(InputStream is) {
     try {
-      if (is != null)
+      if (is != null) {
         is.close();
+      }
     } catch (IOException e) {
     }
   }
@@ -58,8 +59,10 @@
    */
   public static void close(OutputStream os) {
     try {
-      if (os != null)
+      if (os != null) {
         os.close();
+      }
+      
     } catch (IOException e) {
     }
   }
@@ -83,8 +86,9 @@
    */
   public static void close(Reader reader) {
     try {
-      if (reader != null)
+      if (reader != null) {
         reader.close();
+      }
     } catch (IOException e) {
     }
   }
@@ -95,8 +99,9 @@
    */
   public static void close(Writer writer) {
     try {
-      if (writer != null)
+      if (writer != null) {
         writer.close();
+      }
     } catch (IOException e) {
     }
   }
@@ -117,19 +122,21 @@
       return file;
     }
 
-    if (!file.exists() || file.isDirectory())
+    if (!file.exists() || file.isDirectory()) {
       throw new IOException(file.getPath() + " : could not create normal file.");
-
+    }
+    
     if (ignore) {
       System.out.println(file + " already exists; skipping");
       return null;
     }
 
-    if (!overwrite)
+    if (!overwrite) {
       throw new IOException(
         file.getPath()
           + " : already exists; please remove it or use the -overwrite or -ignore option.");
-
+    }
+    
     System.out.println("Overwriting existing file " + file);
     return file;
   }
@@ -158,15 +165,17 @@
     }
 
     if (!dir.exists() || !dir.isDirectory()) {
-      if (create)
+      if (create) {
         throw new IOException(dir.getPath() + " : could not create directory.");
-      else
+      } else {
         throw new IOException(dir.getPath() + " : could not find directory.");
+      }
     }
 
-    if (create && !alreadyExisted)
+    if (create && !alreadyExisted) {
       System.out.println("Created directory " + dir);
-
+    }
+    
     return dir;
   }
 
@@ -276,18 +285,21 @@
           String jarPath = path.substring(path.indexOf("file:"),
             path.lastIndexOf('!'));
           File devJarFile = new File(URI.create(jarPath));
-          if (!devJarFile.isFile())
+          if (!devJarFile.isFile()) {
             throw new IOException("Could not find jar file; "
               + devJarFile.getCanonicalPath()
               + " does not appear to be a valid file");
+          }
           sDevJarName = devJarFile.getName();
 
           String dirPath = jarPath.substring(0, jarPath.lastIndexOf('/') + 1);
           File installDirFile = new File(URI.create(dirPath));
-          if (!installDirFile.isDirectory())
+          if (!installDirFile.isDirectory()) {
             throw new IOException("Could not find installation directory; "
               + installDirFile.getCanonicalPath()
               + " does not appear to be a valid directory");
+          }
+          
           sInstallPath = installDirFile.getCanonicalPath().replace(
             File.separatorChar, '/');
         } else {
@@ -304,7 +316,6 @@
           sInstallPath = override.substring(0, pos);
           sDevJarName = override.substring(pos + 1);
         }
-
       }
     } catch (IOException e) {
       throw new RuntimeException(
diff --git a/dev/linux/src/com/google/gwt/dev/shell/moz/BrowserWidgetMoz.java b/dev/linux/src/com/google/gwt/dev/shell/moz/BrowserWidgetMoz.java
index 4fd945d..491899c 100644
--- a/dev/linux/src/com/google/gwt/dev/shell/moz/BrowserWidgetMoz.java
+++ b/dev/linux/src/com/google/gwt/dev/shell/moz/BrowserWidgetMoz.java
@@ -72,7 +72,7 @@
 
       public boolean matchesDOMWindow(int domWindow) {
         nsIWebBrowser webBrowser = (nsIWebBrowser) LowLevel
-          .snatchFieldObjectValue(fBrowser.getClass(), fBrowser, "webBrowser");
+          .snatchFieldObjectValue(browser.getClass(), browser, "webBrowser");
         int[] aContentDOMWindow = new int[1];
         webBrowser.GetContentDOMWindow(aContentDOMWindow);
         if (aContentDOMWindow[0] == domWindow) {
