diff --git a/dev/core/src/com/google/gwt/dev/DevModeBase.java b/dev/core/src/com/google/gwt/dev/DevModeBase.java
index 511d545..25cb7b3 100644
--- a/dev/core/src/com/google/gwt/dev/DevModeBase.java
+++ b/dev/core/src/com/google/gwt/dev/DevModeBase.java
@@ -150,6 +150,57 @@
   }
 
   /**
+   * Handles the -portHosted command line flag.
+   */
+  protected static class ArgHandlerCodeServerPort extends ArgHandlerString {
+
+    private static final String CODE_SERVER_PORT_TAG = "-codeServerPort";
+    private static final String DEFAULT_PORT = "9997";
+    
+    private final OptionCodeServerPort options;
+
+    public ArgHandlerCodeServerPort(OptionCodeServerPort options) {
+      this.options = options;
+    }
+
+    @Override
+    public String[] getDefaultArgs() {
+      return new String[] {CODE_SERVER_PORT_TAG, DEFAULT_PORT};
+    }
+
+    @Override
+    public String getPurpose() {
+      return "Specifies the TCP port for the code server (defaults to " + 
+        DEFAULT_PORT + ")";
+    }
+
+    @Override
+    public String getTag() {
+      return CODE_SERVER_PORT_TAG;
+    }
+
+    @Override
+    public String[] getTagArgs() {
+      return new String[] {"port-number | \"auto\""};
+    }
+
+    @Override
+    public boolean setString(String value) {
+      if (value.equals("auto")) {
+        options.setCodeServerPort(getFreeSocketPort());
+      } else {
+        try {
+          options.setCodeServerPort(Integer.parseInt(value));
+        } catch (NumberFormatException e) {
+          System.err.println("A port must be an integer or \"auto\"");
+          return false;
+        }
+      }
+      return true;
+    }
+  }
+
+  /**
    * Handles the -logdir command line option.
    */
   protected static class ArgHandlerLogDir extends ArgHandlerString {
@@ -255,57 +306,6 @@
     }
   }
 
-  /**
-   * Handles the -portHosted command line flag.
-   */
-  protected static class ArgHandlerCodeServerPort extends ArgHandlerString {
-
-    private static final String CODE_SERVER_PORT_TAG = "-codeServerPort";
-    private static final String DEFAULT_PORT = "9997";
-    
-    private final OptionCodeServerPort options;
-
-    public ArgHandlerCodeServerPort(OptionCodeServerPort options) {
-      this.options = options;
-    }
-
-    @Override
-    public String[] getDefaultArgs() {
-      return new String[] {CODE_SERVER_PORT_TAG, DEFAULT_PORT};
-    }
-
-    @Override
-    public String getPurpose() {
-      return "Specifies the TCP port for the code server (defaults to " + 
-        DEFAULT_PORT + ")";
-    }
-
-    @Override
-    public String getTag() {
-      return CODE_SERVER_PORT_TAG;
-    }
-
-    @Override
-    public String[] getTagArgs() {
-      return new String[] {"port-number | \"auto\""};
-    }
-
-    @Override
-    public boolean setString(String value) {
-      if (value.equals("auto")) {
-        options.setCodeServerPort(getFreeSocketPort());
-      } else {
-        try {
-          options.setCodeServerPort(Integer.parseInt(value));
-        } catch (NumberFormatException e) {
-          System.err.println("A port must be an integer or \"auto\"");
-          return false;
-        }
-      }
-      return true;
-    }
-  }
-
   protected static class ArgHandlerRemoteUI extends ArgHandlerString {
 
     private final HostedModeBaseOptions options;
@@ -361,8 +361,6 @@
     }
   }
 
-  protected static final Map<String, ModuleDef> startupModules = new HashMap<String, ModuleDef>();
-  
   /**
    * Handles the -whitelist command line flag.
    */
@@ -387,7 +385,7 @@
       return BrowserWidgetHostChecker.whitelistRegexes(whitelistStr);
     }
   }
-
+  
   protected interface HostedModeBaseOptions extends JJSOptions, OptionLogDir,
       OptionLogLevel, OptionGenDir, OptionNoServer, OptionPort,
       OptionCodeServerPort, OptionStartupURLs, OptionRemoteUI {
@@ -429,6 +427,10 @@
       return remoteUIClientId;
     }
 
+    public int getCodeServerPort() {
+      return portHosted;
+    }
+
     public File getLogDir() {
       return logDir;
     }
@@ -444,10 +446,6 @@
       return port;
     }
 
-    public int getCodeServerPort() {
-      return portHosted;
-    }
-
     public String getRemoteUIHost() {
       return remoteUIHost;
     }
@@ -472,6 +470,10 @@
       this.remoteUIClientId = clientId;
     }
 
+    public void setCodeServerPort(int port) {
+      portHosted = port;
+    }
+
     public void setLogFile(String filename) {
       logDir = new File(filename);
     }
@@ -484,10 +486,6 @@
       this.port = port;
     }
 
-    public void setCodeServerPort(int port) {
-      portHosted = port;
-    }
-
     public void setRemoteUIHost(String remoteUIHost) {
       this.remoteUIHost = remoteUIHost;
     }
@@ -501,6 +499,12 @@
     }
   }
 
+  protected interface OptionCodeServerPort {
+    int getCodeServerPort();
+
+    void setCodeServerPort(int codeServerPort);
+  }
+
   /**
    * Controls whether and where to log data to file.
    * 
@@ -535,12 +539,6 @@
     void setPort(int port);
   }
 
-  protected interface OptionCodeServerPort {
-    int getCodeServerPort();
-
-    void setCodeServerPort(int codeServerPort);
-  }
-
   /**
    * Controls the UI that should be used to display the dev mode server's data.
    */
@@ -585,6 +583,8 @@
     }
   }
 
+  protected static final Map<String, ModuleDef> startupModules = new HashMap<String, ModuleDef>();
+
   private static final Random RNG = new Random();
 
   private static final AtomicLong uniqueId = new AtomicLong();
