makes GWT boolean flags togglable

Change-Id: I5eee53b0b50fde31f3e750ad85c3e089a52fcbab
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/CompilerOptionsImpl.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/CompilerOptionsImpl.java
index e8f65e7..2b4f76e 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/CompilerOptionsImpl.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/CompilerOptionsImpl.java
@@ -182,11 +182,6 @@
   }
 
   @Override
-  public boolean isUseGuiLogger() {
-    return false;
-  }
-
-  @Override
   public boolean isValidateOnly() {
     return false;
   }
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
index 08380bd..ab3a83b 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
@@ -98,6 +98,13 @@
   }
 
   /**
+   * Whether the codeServer should allow missing source directories.
+   */
+  boolean shouldAllowMissingSourceDir() {
+    return allowMissingSourceDir;
+  }
+
+  /**
    * Whether the codeServer should start without precompiling modules.
    */
   boolean getNoPrecompile() {
@@ -159,39 +166,49 @@
   private class NoPrecompileFlag extends ArgHandlerFlag {
 
     @Override
-    public String getTag() {
-      return "-noprecompile";
+    public String getLabel() {
+      return "precompile";
     }
 
     @Override
-    public String getPurpose() {
-      return "Disables pre-compilation of modules.";
+    public String getPurposeSnippet() {
+      return "Precompile modules.";
     }
 
     @Override
-    public boolean setFlag() {
-      noPrecompile = true;
+    public boolean setFlag(boolean value) {
+      noPrecompile = !value;
       return true;
     }
+
+    @Override
+    public boolean getDefaultValue() {
+      return !noPrecompile;
+    }
   }
 
   private class CompileTestFlag extends ArgHandlerFlag {
 
     @Override
-    public String getTag() {
-      return "-compileTest";
+    public String getLabel() {
+      return "compileTest";
     }
 
     @Override
-    public String getPurpose() {
-      return "Just compile the modules and exit.";
+    public String getPurposeSnippet() {
+      return "Exits after compiling the modules. The exit code will be 0 if the compile succeeded.";
     }
 
     @Override
-    public boolean setFlag() {
-      isCompileTest = true;
+    public boolean setFlag(boolean value) {
+      isCompileTest = value;
       return true;
     }
+
+    @Override
+    public boolean getDefaultValue() {
+      return isCompileTest;
+    }
   }
 
   private class BindAddressFlag extends ArgHandlerString {
@@ -278,20 +295,25 @@
   private class AllowMissingSourceDirFlag extends ArgHandlerFlag {
 
     @Override
-    public String getTag() {
-      return "-allowMissingSrc";
+    public String getLabel() {
+      return "allowMissingSrc";
     }
 
     @Override
-    public String getPurpose() {
-      return "Disables the directory existence check for -src flags.";
+    public String getPurposeSnippet() {
+      return "Allows -src flags to reference missing directories.";
     }
 
     @Override
-    public boolean setFlag() {
-      allowMissingSourceDir = true;
+    public boolean setFlag(boolean value) {
+      allowMissingSourceDir = value;
       return true;
     }
+
+    @Override
+    public boolean getDefaultValue() {
+      return allowMissingSourceDir;
+    }
   }
 
   private class SourceFlag extends ArgHandler {
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/UnmodifiableCompilerOptions.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/UnmodifiableCompilerOptions.java
index b6b63e7..865f095 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/UnmodifiableCompilerOptions.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/UnmodifiableCompilerOptions.java
@@ -193,11 +193,6 @@
   }
 
   @Override
-  public final void setUseGuiLogger(boolean useGuiLogger) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
   public final void setValidateOnly(boolean validateOnly) {
     throw new UnsupportedOperationException();
   }
diff --git a/dev/core/src/com/google/gwt/dev/CompileArgProcessor.java b/dev/core/src/com/google/gwt/dev/CompileArgProcessor.java
index d0964de..50b4bec 100644
--- a/dev/core/src/com/google/gwt/dev/CompileArgProcessor.java
+++ b/dev/core/src/com/google/gwt/dev/CompileArgProcessor.java
@@ -17,13 +17,11 @@
 
 import com.google.gwt.dev.util.arg.ArgHandlerLogLevel;
 import com.google.gwt.dev.util.arg.ArgHandlerModuleName;
-import com.google.gwt.dev.util.arg.ArgHandlerTreeLoggerFlag;
 import com.google.gwt.dev.util.arg.ArgHandlerWorkDirRequired;
 
 abstract class CompileArgProcessor extends ArgProcessorBase {
   public CompileArgProcessor(CompileTaskOptions options) {
     registerHandler(new ArgHandlerLogLevel(options));
-    registerHandler(new ArgHandlerTreeLoggerFlag(options));
     registerHandler(new ArgHandlerWorkDirRequired(options));
     registerHandler(new ArgHandlerModuleName(options) {
       @Override
diff --git a/dev/core/src/com/google/gwt/dev/CompileTaskOptions.java b/dev/core/src/com/google/gwt/dev/CompileTaskOptions.java
index 82965c9..8b04846 100644
--- a/dev/core/src/com/google/gwt/dev/CompileTaskOptions.java
+++ b/dev/core/src/com/google/gwt/dev/CompileTaskOptions.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.dev;
 
-import com.google.gwt.dev.util.arg.OptionGuiLogger;
 import com.google.gwt.dev.util.arg.OptionLogLevel;
 import com.google.gwt.dev.util.arg.OptionModuleName;
 import com.google.gwt.dev.util.arg.OptionWorkDir;
@@ -23,6 +22,5 @@
 /**
  * A common set of options for all compile tasks.
  */
-public interface CompileTaskOptions extends OptionGuiLogger, OptionModuleName,
-    OptionLogLevel, OptionWorkDir {
+public interface CompileTaskOptions extends OptionModuleName, OptionLogLevel, OptionWorkDir {
 }
diff --git a/dev/core/src/com/google/gwt/dev/CompileTaskOptionsImpl.java b/dev/core/src/com/google/gwt/dev/CompileTaskOptionsImpl.java
index cabbc4f..3855eb8 100644
--- a/dev/core/src/com/google/gwt/dev/CompileTaskOptionsImpl.java
+++ b/dev/core/src/com/google/gwt/dev/CompileTaskOptionsImpl.java
@@ -28,7 +28,6 @@
 
   private Type logLevel;
   private final List<String> moduleNames = new ArrayList<String>();
-  private boolean useGuiLogger;
   private File workDir;
 
   public CompileTaskOptionsImpl() {
@@ -45,7 +44,6 @@
   public void copyFrom(CompileTaskOptions other) {
     setLogLevel(other.getLogLevel());
     setModuleNames(other.getModuleNames());
-    setUseGuiLogger(other.isUseGuiLogger());
     setWorkDir(other.getWorkDir());
   }
 
@@ -65,10 +63,6 @@
     return workDir;
   }
 
-  public boolean isUseGuiLogger() {
-    return useGuiLogger;
-  }
-
   public void setLogLevel(Type logLevel) {
     this.logLevel = logLevel;
   }
@@ -78,10 +72,6 @@
     this.moduleNames.addAll(moduleNames);
   }
 
-  public void setUseGuiLogger(boolean useGuiLogger) {
-    this.useGuiLogger = useGuiLogger;
-  }
-
   public void setWorkDir(File workDir) {
     this.workDir = workDir;
   }
diff --git a/dev/core/src/com/google/gwt/dev/CompileTaskRunner.java b/dev/core/src/com/google/gwt/dev/CompileTaskRunner.java
index 914713d..42d4276 100644
--- a/dev/core/src/com/google/gwt/dev/CompileTaskRunner.java
+++ b/dev/core/src/com/google/gwt/dev/CompileTaskRunner.java
@@ -18,7 +18,6 @@
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.dev.javac.CompilationProblemReporter;
-import com.google.gwt.dev.shell.log.SwingLoggerPanel;
 import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
 
 /**
@@ -38,49 +37,17 @@
    * is used, this method will not return until its window is closed by the
    * user.
    */
-  public static boolean runWithAppropriateLogger(CompileTaskOptions options,
-      final CompileTask task) {
+  public static boolean runWithAppropriateLogger(
+      CompileTaskOptions options, final CompileTask task) {
     // Set any platform specific system properties.
     BootStrapPlatform.applyPlatformHacks();
 
-    // TODO(jat): add support for GUI logger back
-    if (false && options.isUseGuiLogger()) {
-      // Initialize a tree logger window.
-      SwingLoggerPanel loggerWindow = new SwingLoggerPanel(
-          options.getLogLevel(), null);
-
-      // Eager AWT initialization for OS X to ensure safe coexistence with SWT.
-      BootStrapPlatform.initGui();
-
-      final TreeLogger logger = loggerWindow.getLogger();
-      final boolean[] success = new boolean[1];
-
-      // Compiler will be spawned onto a second thread, UI thread for tree
-      // logger will remain on the main.
-      Thread compilerThread = new Thread(new Runnable() {
-        public void run() {
-          success[0] = doRun(logger, task);
-        }
-      });
-
-      compilerThread.setName("GWT Compiler Thread");
-      compilerThread.start();
-      // TODO(jat): create an app frame for loggerWindow
-      
-      // Even if the tree logger window is closed, we wait for the compiler
-      // to finish.
-      waitForThreadToTerminate(compilerThread);
-
-      return success[0];
-    } else {
-      // Compile tasks without -treeLogger should run headless.
-      if (System.getProperty("java.awt.headless") == null) {
-        System.setProperty("java.awt.headless", "true");
-      }
-      PrintWriterTreeLogger logger = new PrintWriterTreeLogger();
-      logger.setMaxDetail(options.getLogLevel());
-      return doRun(logger, task);
+    if (System.getProperty("java.awt.headless") == null) {
+      System.setProperty("java.awt.headless", "true");
     }
+    PrintWriterTreeLogger logger = new PrintWriterTreeLogger();
+    logger.setMaxDetail(options.getLogLevel());
+    return doRun(logger, task);
   }
 
   private static boolean doRun(TreeLogger logger, CompileTask task) {
diff --git a/dev/core/src/com/google/gwt/dev/DevModeBase.java b/dev/core/src/com/google/gwt/dev/DevModeBase.java
index d4374c8..1440210 100644
--- a/dev/core/src/com/google/gwt/dev/DevModeBase.java
+++ b/dev/core/src/com/google/gwt/dev/DevModeBase.java
@@ -287,30 +287,38 @@
   }
 
   /**
-   * Handles the -noserver command line flag.
+   * Runs a convenient embedded web server.
    */
   protected static class ArgHandlerNoServerFlag extends ArgHandlerFlag {
+
     private final OptionNoServer options;
 
     public ArgHandlerNoServerFlag(OptionNoServer options) {
       this.options = options;
+
+      addTagValue("-noserver", false);
     }
 
     @Override
-    public String getPurpose() {
-      return "Prevents the embedded web server from running";
+    public String getPurposeSnippet() {
+      return "Starts a servlet container serving the directory specified by the -war flag.";
     }
 
     @Override
-    public String getTag() {
-      return "-noserver";
+    public String getLabel() {
+      return "startServer";
     }
 
     @Override
-    public boolean setFlag() {
-      options.setNoServer(true);
+    public boolean setFlag(boolean value) {
+      options.setNoServer(!value);
       return true;
     }
+
+    @Override
+    public boolean getDefaultValue() {
+      return !options.isNoServer();
+    }
   }
 
   /**
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java b/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
index 7a5bbf9..d853cf6 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
@@ -34,7 +34,7 @@
   private int fragmentCount = -1;
   private int fragmentsMerge = -1;
   private boolean inlineLiteralParameters = true;
-  private int optimizationLevel = OptionOptimize.OPTIMIZE_LEVEL_MAX;
+  private int optimizationLevel = OptionOptimize.OPTIMIZE_LEVEL_DEFAULT;
   private boolean optimizeDataflow = true;
   private boolean optimizePrecompile = false;
   private boolean ordinalizeEnums = true;
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerCompileReport.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerCompileReport.java
index 1e90f0d..5186ed6 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerCompileReport.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerCompileReport.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * An ArgHandler that enables Story Of Your Compile data-collection.
+ * Enables Story Of Your Compile data-collection.
  */
 public class ArgHandlerCompileReport extends ArgHandlerFlag {
 
@@ -29,18 +29,23 @@
   }
 
   @Override
-  public String getPurpose() {
-    return "Create a compile report that tells the Story of Your Compile";
+  public String getPurposeSnippet() {
+    return "Compile a report that tells the \"Story of Your Compile\".";
   }
 
   @Override
-  public String getTag() {
-    return "-compileReport";
+  public String getLabel() {
+    return "compileReport";
   }
 
   @Override
-  public boolean setFlag() {
-    options.setSoycEnabled(true);
+  public boolean setFlag(boolean value) {
+    options.setSoycEnabled(value);
     return true;
   }
+
+  @Override
+  public boolean getDefaultValue() {
+    return options.isSoycEnabled();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerCompilerMetrics.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerCompilerMetrics.java
index 05e74db..e775839 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerCompilerMetrics.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerCompilerMetrics.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * An ArgHandler that enables Compiler Metrics.
+ * Enables Compiler Metrics.
  */
 public class ArgHandlerCompilerMetrics extends ArgHandlerFlag {
 
@@ -29,13 +29,13 @@
   }
 
   @Override
-  public String getPurpose() {
-    return "Enable CompilerMetrics";
+  public String getPurposeSnippet() {
+    return "Gather compiler metrics.";
   }
 
   @Override
-  public String getTag() {
-    return "-XcompilerMetrics";
+  public String getLabel() {
+    return "compilerMetrics";
   }
 
   @Override
@@ -44,8 +44,18 @@
   }
 
   @Override
-  public boolean setFlag() {
-    options.setCompilerMetricsEnabled(true);
+  public boolean setFlag(boolean value) {
+    options.setCompilerMetricsEnabled(value);
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return options.isCompilerMetricsEnabled();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableAggressiveOptimization.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableAggressiveOptimization.java
index e6d42e7..3c8602c 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableAggressiveOptimization.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableAggressiveOptimization.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * Handles the -XdisableAggressiveOptimization command line flag.<br />
+ * Enables several aggressive optimization options.<br />
  *
  * Has been deprecated but preserved for backwards compatibility. The impact it has now is via its
  * cascaded modification of five more specific options (each of which is also modifiable via flag).
@@ -44,17 +44,19 @@
     this.optimizeDataflowOption = option;
     this.ordinalizeEnumsOption = option;
     this.removeDuplicateFunctionsOption = option;
+
+    addTagValue("-XdisableAggressiveOptimization", false);
   }
 
   @Override
-  public String getPurpose() {
-    return "Troubleshooting: Prevent the Production Mode compiler from "
-        + "performing aggressive optimizations.";
+  public String getPurposeSnippet() {
+    return "DEPRECATED: Tells the Production Mode compiler to perform "
+        + "aggressive optimizations.";
   }
 
   @Override
-  public String getTag() {
-    return "-XdisableAggressiveOptimization";
+  public String getLabel() {
+    return "aggressiveOptimizations";
   }
 
   @Override
@@ -63,13 +65,24 @@
   }
 
   @Override
-  public boolean setFlag() {
-    aggressivelyOptimizeOption.setAggressivelyOptimize(false);
-    clusterSimilarFunctionsOption.setClusterSimilarFunctions(false);
-    inlineLiteralParametersOption.setInlineLiteralParameters(false);
-    optimizeDataflowOption.setOptimizeDataflow(false);
-    ordinalizeEnumsOption.setOrdinalizeEnums(false);
-    removeDuplicateFunctionsOption.setRemoveDuplicateFunctions(false);
+  public boolean setFlag(boolean value) {
+    aggressivelyOptimizeOption.setAggressivelyOptimize(value);
+    clusterSimilarFunctionsOption.setClusterSimilarFunctions(value);
+    inlineLiteralParametersOption.setInlineLiteralParameters(value);
+    optimizeDataflowOption.setOptimizeDataflow(value);
+    ordinalizeEnumsOption.setOrdinalizeEnums(value);
+    removeDuplicateFunctionsOption.setRemoveDuplicateFunctions(value);
+
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return aggressivelyOptimizeOption.isAggressivelyOptimize();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableCastChecking.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableCastChecking.java
index 29c8a1c..bf97d6c 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableCastChecking.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableCastChecking.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * An ArgHandler to provide the -disableCastChecking flag.
+ * Enables run-time cast checking.
  */
 public class ArgHandlerDisableCastChecking extends ArgHandlerFlag {
 
@@ -26,21 +26,33 @@
 
   public ArgHandlerDisableCastChecking(OptionDisableCastChecking option) {
     this.option = option;
+
+    addTagValue("-XdisableCastChecking", false);
   }
 
   @Override
-  public String getPurpose() {
-    return "EXPERIMENTAL: Disables run-time checking of cast operations";
+  public String getPurposeSnippet() {
+    return "Insert run-time checking of cast operations.";
   }
 
   @Override
-  public String getTag() {
-    return "-XdisableCastChecking";
+  public String getLabel() {
+    return "checkCasts";
   }
 
   @Override
-  public boolean setFlag() {
-    option.setCastCheckingDisabled(true);
+  public boolean setFlag(boolean value) {
+    option.setCastCheckingDisabled(!value);
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return !option.isCastCheckingDisabled();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableClassMetadata.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableClassMetadata.java
index 13590a6..552cdc7 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableClassMetadata.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableClassMetadata.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * An ArgHandler to provide the -disableClassMetadata flag.
+ * Includes metadata for class name methods.
  */
 public class ArgHandlerDisableClassMetadata extends ArgHandlerFlag {
 
@@ -26,21 +26,33 @@
 
   public ArgHandlerDisableClassMetadata(OptionDisableClassMetadata option) {
     this.option = option;
+
+    addTagValue("-XdisableClassMetadata", false);
   }
 
   @Override
-  public String getPurpose() {
-    return "EXPERIMENTAL: Disables some java.lang.Class methods (e.g. getName())";
+  public String getPurposeSnippet() {
+    return "Include metadata for some java.lang.Class methods (e.g. getName()).";
   }
 
   @Override
-  public String getTag() {
-    return "-XdisableClassMetadata";
+  public String getLabel() {
+    return "classMetadata";
   }
 
   @Override
-  public boolean setFlag() {
-    option.setClassMetadataDisabled(true);
+  public boolean setFlag(boolean value) {
+    option.setClassMetadataDisabled(!value);
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return !option.isClassMetadataDisabled();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableClusterSimilarFunctions.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableClusterSimilarFunctions.java
index 37df471..d329e1d 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableClusterSimilarFunctions.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableClusterSimilarFunctions.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * Handles the -XdisableClusterSimilarFunctions command line flag.
+ * Clusters similar functions in the output to improve compression.
  */
 public final class ArgHandlerDisableClusterSimilarFunctions extends ArgHandlerFlag {
 
@@ -26,17 +26,18 @@
 
   public ArgHandlerDisableClusterSimilarFunctions(OptionClusterSimilarFunctions option) {
     this.option = option;
+
+    addTagValue("-XdisableClusterSimilarFunctions", false);
   }
 
   @Override
-  public String getPurpose() {
-    return "Troubleshooting: Prevent the compiler from clustering similar "
-        + "functions in the output.";
+  public String getPurposeSnippet() {
+    return "Cluster similar functions in the output to improve compression.";
   }
 
   @Override
-  public String getTag() {
-    return "-XdisableClusterSimilarFunctions";
+  public String getLabel() {
+    return "clusterFunctions";
   }
 
   @Override
@@ -45,8 +46,18 @@
   }
 
   @Override
-  public boolean setFlag() {
-    option.setClusterSimilarFunctions(false);
+  public boolean setFlag(boolean value) {
+    option.setClusterSimilarFunctions(value);
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return option.shouldClusterSimilarFunctions();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableGeneratingOnShards.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableGeneratingOnShards.java
index c01cb2a..6555557 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableGeneratingOnShards.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableGeneratingOnShards.java
@@ -32,16 +32,18 @@
   public ArgHandlerDisableGeneratingOnShards(
       OptionEnableGeneratingOnShards options) {
     this.options = options;
+
+    addTagValue("-XdisableGeneratingOnShards", false);
   }
 
   @Override
-  public String getPurpose() {
-    return "Disables running generators on CompilePerms shards, even when it would be a likely speedup";
+  public String getPurposeSnippet() {
+    return "Run generators on CompilePerms shards for a likely speedup.";
   }
 
   @Override
-  public String getTag() {
-    return "-XdisableGeneratingOnShards";
+  public String getLabel() {
+    return "generateOnShards";
   }
 
   @Override
@@ -50,8 +52,18 @@
   }
 
   @Override
-  public boolean setFlag() {
-    options.setEnabledGeneratingOnShards(false);
+  public boolean setFlag(boolean value) {
+    options.setEnabledGeneratingOnShards(value);
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return options.isEnabledGeneratingOnShards();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableInlineLiteralParameters.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableInlineLiteralParameters.java
index 9f4087c..c0515f9 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableInlineLiteralParameters.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableInlineLiteralParameters.java
@@ -18,7 +18,8 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * Handles the -XdisableInlineLiteralParameters command line flag.
+ * Inlines literal parameters to shrink function declarations and provide more deadcode elimination
+ * possibilities.
  */
 public final class ArgHandlerDisableInlineLiteralParameters extends ArgHandlerFlag {
 
@@ -26,16 +27,19 @@
 
   public ArgHandlerDisableInlineLiteralParameters(OptionInlineLiteralParameters option) {
     this.option = option;
+
+    addTagValue("-XdisableInlineLiteralParameters", false);
   }
 
   @Override
-  public String getPurpose() {
-    return "Troubleshooting: Prevent the compiler from inlining literal parameters.";
+  public String getPurposeSnippet() {
+    return "Inline literal parameters to shrink function declarations and "
+        + "provide more deadcode elimination possibilities.";
   }
 
   @Override
-  public String getTag() {
-    return "-XdisableInlineLiteralParameters";
+  public String getLabel() {
+    return "inlineLiteralParameters";
   }
 
   @Override
@@ -44,8 +48,18 @@
   }
 
   @Override
-  public boolean setFlag() {
-    option.setInlineLiteralParameters(false);
+  public boolean setFlag(boolean value) {
+    option.setInlineLiteralParameters(value);
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return option.shouldInlineLiteralParameters();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableOptimizeDataflow.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableOptimizeDataflow.java
index aa5e1bd..eda7d2f 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableOptimizeDataflow.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableOptimizeDataflow.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * Handles the -XdisableOptimizeDataflow command line flag.
+ * Analyzes and optimizes dataflow.
  */
 public final class ArgHandlerDisableOptimizeDataflow extends ArgHandlerFlag {
 
@@ -26,16 +26,18 @@
 
   public ArgHandlerDisableOptimizeDataflow(OptionOptimizeDataflow option) {
     this.option = option;
+
+    addTagValue("-XdisableOptimizeDataflow", false);
   }
 
   @Override
-  public String getPurpose() {
-    return "Troubleshooting: Prevent the compiler from optimizing dataflow.";
+  public String getPurposeSnippet() {
+    return "Analyze and optimize dataflow.";
   }
 
   @Override
-  public String getTag() {
-    return "-XdisableOptimizeDataflow";
+  public String getLabel() {
+    return "optimizeDataflow";
   }
 
   @Override
@@ -44,8 +46,18 @@
   }
 
   @Override
-  public boolean setFlag() {
-    option.setOptimizeDataflow(false);
+  public boolean setFlag(boolean value) {
+    option.setOptimizeDataflow(value);
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return option.shouldOptimizeDataflow();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableOrdinalizeEnums.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableOrdinalizeEnums.java
index 4141f39..8579840 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableOrdinalizeEnums.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableOrdinalizeEnums.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * Handles the -XdisableOrdinalizeEnums command line flag.
+ * Ordinalizes enums to reduce some large strings.
  */
 public final class ArgHandlerDisableOrdinalizeEnums extends ArgHandlerFlag {
 
@@ -26,16 +26,18 @@
 
   public ArgHandlerDisableOrdinalizeEnums(OptionOrdinalizeEnums option) {
     this.option = option;
+    
+    addTagValue("-XdisableOrdinalizeEnums", false);
   }
 
   @Override
-  public String getPurpose() {
-    return "Troubleshooting: Prevent the compiler from ordinalizing enums.";
+  public String getPurposeSnippet() {
+    return "Ordinalize enums to reduce some large strings.";
   }
 
   @Override
-  public String getTag() {
-    return "-XdisableOrdinalizeEnums";
+  public String getLabel() {
+    return "ordinalizeEnums";
   }
 
   @Override
@@ -44,8 +46,18 @@
   }
 
   @Override
-  public boolean setFlag() {
-    option.setOrdinalizeEnums(false);
+  public boolean setFlag(boolean value) {
+    option.setOrdinalizeEnums(value);
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return option.shouldOrdinalizeEnums();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableRemoveDuplicateFunctions.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableRemoveDuplicateFunctions.java
index 67d72d1..db8ff6f 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableRemoveDuplicateFunctions.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableRemoveDuplicateFunctions.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * Handles the -XdisableRemoveDuplicateFunctions command line flag.
+ * Removes duplicate functions to shrink output.
  */
 public final class ArgHandlerDisableRemoveDuplicateFunctions extends ArgHandlerFlag {
 
@@ -26,16 +26,19 @@
 
   public ArgHandlerDisableRemoveDuplicateFunctions(OptionRemoveDuplicateFunctions option) {
     this.option = option;
+
+    addTagValue("-XdisableRemoveDuplicateFunctions", false);
   }
 
   @Override
-  public String getPurpose() {
-    return "Troubleshooting: Prevent the compiler from removing duplicate functions.";
+  public String getPurposeSnippet() {
+    return "Removing duplicate functions. Will interfere with stacktrace "
+        + "deobfuscation and so is only honored when compiler.stackMode is set to strip.";
   }
 
   @Override
-  public String getTag() {
-    return "-XdisableRemoveDuplicateFunctions";
+  public String getLabel() {
+    return "removeDuplicateFunctions";
   }
 
   @Override
@@ -44,8 +47,18 @@
   }
 
   @Override
-  public boolean setFlag() {
-    option.setRemoveDuplicateFunctions(false);
+  public boolean setFlag(boolean value) {
+    option.setRemoveDuplicateFunctions(value);
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return option.shouldRemoveDuplicateFunctions();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableRunAsync.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableRunAsync.java
index 581ba32..07f0d78 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableRunAsync.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableRunAsync.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * An ArgHandler than can be used to disable runAsync code-splitting.
+ * Splits code on runAsync boundaries.
  */
 public class ArgHandlerDisableRunAsync extends ArgHandlerFlag {
 
@@ -26,16 +26,18 @@
 
   public ArgHandlerDisableRunAsync(OptionRunAsyncEnabled option) {
     this.option = option;
+
+    addTagValue("-XdisableRunAsync", false);
   }
 
   @Override
-  public String getPurpose() {
-    return "Disable runAsync code-splitting";
+  public String getPurposeSnippet() {
+    return "Split code on runAsync boundaries.";
   }
 
   @Override
-  public String getTag() {
-    return "-XdisableRunAsync";
+  public String getLabel() {
+    return "codeSplitting";
   }
 
   @Override
@@ -44,8 +46,18 @@
   }
 
   @Override
-  public boolean setFlag() {
-    option.setRunAsyncEnabled(false);
+  public boolean setFlag(boolean value) {
+    option.setRunAsyncEnabled(value);
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return option.isRunAsyncEnabled();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableSoycHtml.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableSoycHtml.java
index e6b9608..42f8e95 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableSoycHtml.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableSoycHtml.java
@@ -18,25 +18,29 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * An ArgHandler that enables detailed Story Of Your Compile data collection,
- * but disables HTML report generation, leaving only XML output.
+ * Collects SOYC metrics and output in xml but not html format.
  */
 public class ArgHandlerDisableSoycHtml extends ArgHandlerFlag {
 
-  private final OptionSoycHtmlDisabled options;
+  private final OptionSoycHtmlDisabled optionSoycHtmlDisabled;
+  private final OptionSoycEnabled optionSoycEnabled;
 
-  public ArgHandlerDisableSoycHtml(OptionSoycHtmlDisabled options) {
-    this.options = options;
+  public <T extends OptionSoycHtmlDisabled & OptionSoycEnabled> ArgHandlerDisableSoycHtml(
+      T options) {
+    optionSoycHtmlDisabled = options;
+    optionSoycEnabled = options;
+
+    addTagValue("-XdisableSoycHtml", false);
   }
 
   @Override
-  public String getPurpose() {
-    return "Enable SOYC reporting without HTML report generation.";
+  public String getPurposeSnippet() {
+    return "Collect SOYC metrics and output in xml but not html format.";
   }
 
   @Override
-  public String getTag() {
-    return "-XdisableSoycHtml";
+  public String getLabel() {
+    return "soycHtmlOnly";
   }
 
   @Override
@@ -45,9 +49,19 @@
   }
 
   @Override
-  public boolean setFlag() {
-    options.setSoycHtmlDisabled(true);
-    options.setSoycEnabled(true);
+  public boolean setFlag(boolean value) {
+    optionSoycHtmlDisabled.setSoycHtmlDisabled(!value);
+    optionSoycEnabled.setSoycEnabled(!value);
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return !optionSoycHtmlDisabled.isSoycHtmlDisabled() && !optionSoycEnabled.isSoycEnabled();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableUpdateCheck.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableUpdateCheck.java
index 142f69c..3123879 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableUpdateCheck.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableUpdateCheck.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * Handles the -XdisableUpdateCheck command line flag.
+ * Checks to see if an updated version of GWT is available.
  */
 public final class ArgHandlerDisableUpdateCheck extends ArgHandlerFlag {
 
@@ -26,16 +26,18 @@
 
   public ArgHandlerDisableUpdateCheck(OptionDisableUpdateCheck option) {
     this.option = option;
+    
+    addTagValue("-XdisableUpdateCheck", false);
   }
 
   @Override
-  public String getPurpose() {
-    return "Disable the check to see if an update version of GWT is available";
+  public String getPurposeSnippet() {
+    return "Check to see if an updated version of GWT is available.";
   }
 
   @Override
-  public String getTag() {
-    return "-XdisableUpdateCheck";
+  public String getLabel() {
+    return "checkForUpdates";
   }
 
   @Override
@@ -44,8 +46,18 @@
   }
   
   @Override
-  public boolean setFlag() {
-    option.setDisableUpdateCheck(true);
+  public boolean setFlag(boolean value) {
+    option.setDisableUpdateCheck(!value);
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return !option.isUpdateCheckDisabled();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDraftCompile.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDraftCompile.java
index f60d53a..7e29eb0 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDraftCompile.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDraftCompile.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * An ArgHandler to enable draft compiles.
+ * Compiles quickly with minimal optimizations.
  */
 public class ArgHandlerDraftCompile extends ArgHandlerFlag {
 
@@ -46,24 +46,34 @@
   }
 
   @Override
-  public String getPurpose() {
-    return "Enable faster, but less-optimized, compilations";
+  public String getPurposeSnippet() {
+    return "Compile quickly with minimal optimizations.";
   }
 
   @Override
-  public String getTag() {
-    return "-draftCompile";
+  public String getLabel() {
+    return "draftCompile";
   }
 
   @Override
-  public boolean setFlag() {
-    optimizeOption.setOptimizationLevel(OptionOptimize.OPTIMIZE_LEVEL_DRAFT);
-    aggressivelyOptimizeOption.setAggressivelyOptimize(false);
-    clusterSimilarFunctionsOption.setClusterSimilarFunctions(false);
-    inlineLiteralParametersOption.setInlineLiteralParameters(false);
-    optimizeDataflowOption.setOptimizeDataflow(false);
-    ordinalizeEnumsOption.setOrdinalizeEnums(false);
-    removeDuplicateFunctionsOption.setRemoveDuplicateFunctions(false);
+  public boolean setFlag(boolean value) {
+    int optimizeLevel =
+        value ? OptionOptimize.OPTIMIZE_LEVEL_DRAFT : OptionOptimize.OPTIMIZE_LEVEL_DEFAULT;
+    optimizeOption.setOptimizationLevel(optimizeLevel);
+
+    aggressivelyOptimizeOption.setAggressivelyOptimize(!value);
+    clusterSimilarFunctionsOption.setClusterSimilarFunctions(!value);
+    inlineLiteralParametersOption.setInlineLiteralParameters(!value);
+    optimizeDataflowOption.setOptimizeDataflow(!value);
+    ordinalizeEnumsOption.setOrdinalizeEnums(!value);
+    removeDuplicateFunctionsOption.setRemoveDuplicateFunctions(!value);
+
     return true;
   }
+
+  @Override
+  public boolean getDefaultValue() {
+    return optimizeOption.getOptimizationLevel() == OptionOptimize.OPTIMIZE_LEVEL_DRAFT
+        && !aggressivelyOptimizeOption.isAggressivelyOptimize();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableAssertions.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableAssertions.java
index f62bcd8..ce4e1cf 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableAssertions.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableAssertions.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * Handles the -ea command line flag.
+ * Includes assert statements in compiled output.
  */
 public final class ArgHandlerEnableAssertions extends ArgHandlerFlag {
 
@@ -26,21 +26,28 @@
 
   public ArgHandlerEnableAssertions(OptionEnableAssertions option) {
     this.option = option;
+
+    addTagValue("-ea", true);
   }
 
   @Override
-  public String getPurpose() {
-    return "Debugging: causes the compiled output to check assert statements";
+  public String getPurposeSnippet() {
+    return "Include assert statements in compiled output.";
   }
 
   @Override
-  public String getTag() {
-    return "-ea";
+  public String getLabel() {
+    return "checkAssertions";
   }
 
   @Override
-  public boolean setFlag() {
-    option.setEnableAssertions(true);
+  public boolean setFlag(boolean value) {
+    option.setEnableAssertions(value);
     return true;
   }
+
+  @Override
+  public boolean getDefaultValue() {
+    return option.isEnableAssertions();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableClosureCompiler.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableClosureCompiler.java
index 206cccd..3c8ab42 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableClosureCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableClosureCompiler.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * An ArgHandler to provide the -enableClosureCompiler flag.
+ * Compiles output Javascript with the Closure compiler for even further optimizations.
  */
 public class ArgHandlerEnableClosureCompiler extends ArgHandlerFlag {
 
@@ -26,21 +26,33 @@
 
   public ArgHandlerEnableClosureCompiler(OptionEnableClosureCompiler option) {
     this.option = option;
+
+    addTagValue("-XenableClosureCompiler", true);
   }
 
   @Override
-  public String getPurpose() {
-    return "EXPERIMENTAL: Enables Closure Compiler optimizations";
+  public String getPurposeSnippet() {
+    return "Compile output Javascript with the Closure compiler for even further optimizations.";
   }
 
   @Override
-  public String getTag() {
-    return "-XenableClosureCompiler";
+  public String getLabel() {
+    return "closureCompiler";
   }
 
   @Override
-  public boolean setFlag() {
-    option.setClosureCompilerEnabled(true);
+  public boolean setFlag(boolean value) {
+    option.setClosureCompilerEnabled(value);
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return option.isClosureCompilerEnabled();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableGeneratorResultCaching.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableGeneratorResultCaching.java
index 9825457..625893e 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableGeneratorResultCaching.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableGeneratorResultCaching.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * An ArgHandler to provide the -XenableGeneratorResultCaching flag.
+ * Caches results of generators with stable output.
  * 
  * Note: This is no longer needed since generator result caching is now enabled by default.
  * It's left here for an interim period, so that uses of the flag can be removed.
@@ -27,25 +27,36 @@
 public class ArgHandlerEnableGeneratorResultCaching extends ArgHandlerFlag {
 
   public ArgHandlerEnableGeneratorResultCaching() {
+    addTagValue("-XenableGeneratorResultCaching", true);
   }
 
   @Override
-  public String getPurpose() {
-    return "Enables generator result caching, for those generators that implement it";
+  public String getPurposeSnippet() {
+    return "Cache results of generators with stable output.";
   }
 
   @Override
-  public String getTag() {
-    return "-XenableGeneratorResultCaching";
+  public String getLabel() {
+    return "cacheGeneratorResults";
   }
-  
+
   @Override
   public boolean isUndocumented() {
     return true;
   }
- 
+
   @Override
-  public boolean setFlag() {
+  public boolean setFlag(boolean value) {
+    return true;
+  }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
     return true;
   }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerOptimize.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerOptimize.java
index 48cc787..1ac3b5f 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerOptimize.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerOptimize.java
@@ -19,20 +19,20 @@
 
 /**
  * Set the optimization level from the command line.  For now, level 1 is the same
- * as draft compile, and level 9 is the same as the default (maximium optimization).
+ * as draft compile, and level 9 is the same as the default (maximum optimization).
  * 
  * TODO(zundel): In theory, a level 0 should be possible, where all optimizers 
  * are eliminated for the fastest possible compile.  In practice, code generation 
  * depends on some optimizers being run.
  */
 public class ArgHandlerOptimize extends ArgHandlerInt {
-  
+
   private final OptionOptimize options;
 
   public ArgHandlerOptimize(OptionOptimize options) {
     this.options = options;
   }
-  
+
   @Override
   public String getPurpose() {
     return "Sets the optimization level used by the compiler.  0=none 9=maximum.";
@@ -50,10 +50,9 @@
 
   @Override
   public void setInt(int level) {
-    if (level <= OptionOptimize.OPTIMIZE_LEVEL_MAX) {
-      options.setOptimizationLevel(Math.max(level, OptionOptimize.OPTIMIZE_LEVEL_DRAFT));  
-    } else {
-      options.setOptimizationLevel(OptionOptimize.OPTIMIZE_LEVEL_MAX);
-    }
+    level = Math.max(level, OptionOptimize.OPTIMIZE_LEVEL_DRAFT);
+    level = Math.min(level, OptionOptimize.OPTIMIZE_LEVEL_MAX);
+
+    options.setOptimizationLevel(level);
   }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerSoyc.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerSoyc.java
index bf6b17c..0f3c6c1 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerSoyc.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerSoyc.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * An ArgHandler that enables Story Of Your Compile data-collection.
+ * Generates the "Story Of Your Compile".
  */
 public class ArgHandlerSoyc extends ArgHandlerFlag {
 
@@ -26,16 +26,18 @@
 
   public ArgHandlerSoyc(OptionSoycEnabled options) {
     this.options = options;
+
+    addTagValue("-soyc", true);
   }
 
   @Override
-  public String getPurpose() {
-    return "Enable Story Of Your Compile";
+  public String getPurposeSnippet() {
+    return "Generate the \"Story Of Your Compile\".";
   }
 
   @Override
-  public String getTag() {
-    return "-soyc";
+  public String getLabel() {
+    return "soycReport";
   }
 
   @Override
@@ -44,8 +46,13 @@
   }
 
   @Override
-  public boolean setFlag() {
-    options.setSoycEnabled(true);
+  public boolean setFlag(boolean value) {
+    options.setSoycEnabled(value);
     return true;
   }
+
+  @Override
+  public boolean getDefaultValue() {
+    return options.isSoycEnabled();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerSoycDetailed.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerSoycDetailed.java
index 3fb028c..1c71845 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerSoycDetailed.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerSoycDetailed.java
@@ -18,23 +18,30 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * An ArgHandler that enables detailed Story Of Your Compile data collection.
+ * Emits extra, detailed compile-report information in the "Story Of Your Compile".
  */
 public class ArgHandlerSoycDetailed extends ArgHandlerFlag {
-  private final OptionSoycDetailed options;
 
-  public ArgHandlerSoycDetailed(OptionSoycDetailed options) {
-    this.options = options;
+  private final OptionSoycDetailed optionSoycDetailed;
+  private final OptionSoycEnabled optionSoycEnabled;
+
+  public <T extends OptionSoycDetailed & OptionSoycEnabled> ArgHandlerSoycDetailed(
+      T options) {
+    optionSoycDetailed = options;
+    optionSoycEnabled = options;
+
+    addTagValue("-XsoycDetailed", true);
   }
 
   @Override
-  public String getPurpose() {
-    return "Emit extra, detailed compile-report information at the expense of compile time";
+  public String getPurposeSnippet() {
+    return "Emit extra, detailed compile-report information in the \"Story Of Your Compile\" "
+        + "at the expense of compile time.";
   }
 
   @Override
-  public String getTag() {
-    return "-XsoycDetailed";
+  public String getLabel() {
+    return "detailedSoyc";
   }
 
   @Override
@@ -43,9 +50,19 @@
   }
 
   @Override
-  public boolean setFlag() {
-    options.setSoycExtra(true);
-    options.setSoycEnabled(true);
+  public boolean setFlag(boolean value) {
+    optionSoycDetailed.setSoycExtra(value);
+    optionSoycEnabled.setSoycEnabled(value);
     return true;
   }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean getDefaultValue() {
+    return optionSoycDetailed.isSoycExtra() && optionSoycEnabled.isSoycEnabled();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerStrict.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerStrict.java
index 2cb116e..fe6fb1e 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerStrict.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerStrict.java
@@ -19,28 +19,36 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * Argument handler for {@link OptionStrict}.
+ * Fails compilation if any input file contains an error.
  */
 public class ArgHandlerStrict extends ArgHandlerFlag {
+
   private final OptionStrict options;
 
   public ArgHandlerStrict(OptionStrict options) {
     this.options = options;
+
+    addTagValue("-strict", true);
   }
 
   @Override
-  public String getPurpose() {
-    return "Only succeed if no input files have errors";
+  public String getPurposeSnippet() {
+    return "Fail compilation if any input file contains an error.";
   }
 
   @Override
-  public String getTag() {
-    return "-strict";
+  public String getLabel() {
+    return "failOnError";
   }
 
   @Override
-  public boolean setFlag() {
-    options.setStrict(true);
+  public boolean setFlag(boolean value) {
+    options.setStrict(value);
     return true;
   }
+
+  @Override
+  public boolean getDefaultValue() {
+    return options.isStrict();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerTreeLoggerFlag.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerTreeLoggerFlag.java
deleted file mode 100644
index a0bd680..0000000
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerTreeLoggerFlag.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2006 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.dev.util.arg;
-
-import com.google.gwt.util.tools.ArgHandlerFlag;
-
-/**
- * Argument handler for processing the GUI tree logger boolean flag.
- */
-public final class ArgHandlerTreeLoggerFlag extends ArgHandlerFlag {
-
-  private final OptionGuiLogger option;
-
-  public ArgHandlerTreeLoggerFlag(OptionGuiLogger option) {
-    this.option = option;
-  }
-
-  @Override
-  public String getPurpose() {
-    return "Logs output in a graphical tree view";
-  }
-  @Override
-
-  public String getTag() {
-    return "-treeLogger";
-  }
-
-  @Override
-  public boolean isUndocumented() {
-    return true;
-  }
-
-  @Override
-  public boolean setFlag() {
-    option.setUseGuiLogger(true);
-    return true;
-  }
-}
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerValidateOnlyFlag.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerValidateOnlyFlag.java
index b3ea8ac..ae4601d 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerValidateOnlyFlag.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerValidateOnlyFlag.java
@@ -18,7 +18,7 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * Handles the -validateOnly command line flag.
+ * Validates all source code, but does not compile it.
  */
 public final class ArgHandlerValidateOnlyFlag extends ArgHandlerFlag {
 
@@ -29,18 +29,23 @@
   }
 
   @Override
-  public String getPurpose() {
-    return "Validate all source code, but do not compile";
+  public String getPurposeSnippet() {
+    return "Validate all source code, but do not compile.";
   }
 
   @Override
-  public String getTag() {
-    return "-validateOnly";
+  public String getLabel() {
+    return "validateOnly";
   }
 
   @Override
-  public boolean setFlag() {
-    option.setValidateOnly(true);
+  public boolean setFlag(boolean value) {
+    option.setValidateOnly(value);
     return true;
   }
+
+  @Override
+  public boolean getDefaultValue() {
+    return option.isValidateOnly();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/OptionGuiLogger.java b/dev/core/src/com/google/gwt/dev/util/arg/OptionGuiLogger.java
deleted file mode 100644
index 56205ba..0000000
--- a/dev/core/src/com/google/gwt/dev/util/arg/OptionGuiLogger.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2008 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.dev.util.arg;
-
-/**
- * Option to set whether to use a GUI logger instead of stdout.
- */
-public interface OptionGuiLogger {
-
-  /**
-   * Returns true if a GUI logger should be used.
-   */
-  boolean isUseGuiLogger();
-
-  /**
-   * Sets whether or not to use a GUI logger.
-   */
-  void setUseGuiLogger(boolean useGuiLogger);
-}
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/OptionOptimize.java b/dev/core/src/com/google/gwt/dev/util/arg/OptionOptimize.java
index 696da47..39980bf 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/OptionOptimize.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/OptionOptimize.java
@@ -22,6 +22,8 @@
 public interface OptionOptimize {
 
   int OPTIMIZE_LEVEL_DRAFT = 0;
+  // TODO(stalcup): change the default to 8 to balance time and shrinkage.
+  int OPTIMIZE_LEVEL_DEFAULT = 9;
   int OPTIMIZE_LEVEL_MAX = 9;
 
   /**
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/OptionSoycDetailed.java b/dev/core/src/com/google/gwt/dev/util/arg/OptionSoycDetailed.java
index baf05f1..eba98f8 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/OptionSoycDetailed.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/OptionSoycDetailed.java
@@ -26,12 +26,6 @@
   boolean isSoycExtra();
 
   /**
-   * Sets whether or not the compiler should record and emit Compile Report information
-   * and build the dashboard.
-   */
-  void setSoycEnabled(boolean enabled);
-
-  /**
    * Sets whether or not the compiler should record and emit extra Compile Report
    * information.
    */
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/OptionSoycHtmlDisabled.java b/dev/core/src/com/google/gwt/dev/util/arg/OptionSoycHtmlDisabled.java
index a105fd3..753d505 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/OptionSoycHtmlDisabled.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/OptionSoycHtmlDisabled.java
@@ -27,12 +27,6 @@
   boolean isSoycHtmlDisabled();
 
   /**
-   * Sets whether or not the compiler should record and emit Compile Report
-   * information and build the dashboard.
-   */
-  void setSoycEnabled(boolean enabled);
-
-  /**
    * Sets whether or not the compiler should produce HTML compile reports in
    * addition to SOYC XML output.
    */
diff --git a/dev/core/src/com/google/gwt/util/tools/ArgHandler.java b/dev/core/src/com/google/gwt/util/tools/ArgHandler.java
index d0124bd..10ea662 100644
--- a/dev/core/src/com/google/gwt/util/tools/ArgHandler.java
+++ b/dev/core/src/com/google/gwt/util/tools/ArgHandler.java
@@ -29,6 +29,21 @@
   public abstract String getTag();
 
   /**
+   * The set of tags matched by this argument handler. By default includes just the one primary tag
+   * mentioned in getTag() but can be overridden to provide broader matching.
+   */
+  public String[] getTags() {
+    return new String[] {getTag()};
+  }
+
+  /**
+   * The tag to display in help messages.
+   */
+  public String getHelpTag() {
+    return getTag();
+  }
+
+  /**
    * A list of words representing the arguments in help text.
    */
   public abstract String[] getTagArgs();
@@ -54,4 +69,7 @@
     return false;
   }
 
+  public boolean isExperimental() {
+    return false;
+  }
 }
diff --git a/dev/core/src/com/google/gwt/util/tools/ArgHandlerFlag.java b/dev/core/src/com/google/gwt/util/tools/ArgHandlerFlag.java
index 887652a..c96cb0b 100644
--- a/dev/core/src/com/google/gwt/util/tools/ArgHandlerFlag.java
+++ b/dev/core/src/com/google/gwt/util/tools/ArgHandlerFlag.java
@@ -17,23 +17,105 @@
 
 import com.google.gwt.dev.util.Empty;
 
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
 /**
- * Argument handler for flags that have no parameters.
+ * Argument handler for boolean flags that have no parameters.
+ * 
+ * Supports toggling the boolean value on and off using -label and -nolabel tag variants and
+ * calculating a meaningful purpose including default value.
  */
 public abstract class ArgHandlerFlag extends ArgHandler {
 
+  private Map<String, Boolean> valuesByTag;
+
+  protected void addTagValue(String tag, boolean value) {
+    initValuesByTag();
+    valuesByTag.put(tag, value);
+  }
+
+  /**
+   * Returns the default value that will appear in help messages.
+   */
+  public abstract boolean getDefaultValue();
+
+  @Override
+  public String getHelpTag() {
+    return "-" + (isExperimental() ? "X" : "") + "[no]" + getLabel();
+  }
+
+  /**
+   * The root String that will be munged into -label and -nolabel variants for flag value toggling.
+   * Should follow the verb[Adjective]Noun naming pattern. For example:
+   * 
+   * @Override
+   * public String getLabel() {
+   *   return "allowMissingSrc";
+   * }
+   */
+  public String getLabel() {
+    return "";
+  }
+
+  @Override
+  public final String getPurpose() {
+    return (isExperimental() ? "EXPERIMENTAL: " : "") + getPurposeSnippet() + " " + "(defaults to "
+        + (getDefaultValue() ? "ON" : "OFF") + ")";
+  }
+
+  /**
+   * Returns a description that will be mixed together with default value to come up with the
+   * overall flag purpose.
+   */
+  public abstract String getPurposeSnippet();
+
+  /**
+   * The primary tag matched by this argument handler.
+   */
+  @Override
+  public final String getTag() {
+    String label = getLabel();
+    if (label == "") {
+      return "";
+    }
+    return "-" + (isExperimental() ? "X" : "") + label;
+  }
+
   @Override
   public String[] getTagArgs() {
     return Empty.STRINGS;
   }
 
   @Override
+  public final String[] getTags() {
+    initValuesByTag();
+    Set<String> tags = valuesByTag.keySet();
+    return tags.toArray(new String[tags.size()]);
+  }
+
+  // @VisibleForTesting
+  boolean getValueByTag(String tag) {
+    initValuesByTag();
+    return valuesByTag.get(tag);
+  }
+
+  @Override
   public int handle(String[] args, int startIndex) {
-    if (setFlag()) {
-      return 0;
-    } else {
-      return -1;
+    String tag = args[startIndex];
+    Boolean value = getValueByTag(tag);
+    return setFlag(value) ? 0 : 1;
+  }
+
+  private void initValuesByTag() {
+    if (valuesByTag != null) {
+      return;
     }
+
+    valuesByTag = new LinkedHashMap<String, Boolean>();
+    valuesByTag.put("-" + (isExperimental() ? "X" : "") + getLabel(), true);
+    valuesByTag.put("-" + (isExperimental() ? "X" : "") + "no" + getLabel(), false);
   }
 
   @Override
@@ -41,5 +123,12 @@
     return false;
   }
 
-  public abstract boolean setFlag();
+  /**
+   * Takes the explicitly provided value and propagates it into whatever option settings this flag
+   * controls.
+   * 
+   * @param value the new value for the flag.
+   * @return whether the assignment was valid.
+   */
+  public abstract boolean setFlag(boolean value);
 }
diff --git a/dev/core/src/com/google/gwt/util/tools/ToolBase.java b/dev/core/src/com/google/gwt/util/tools/ToolBase.java
index c6931a0..ce201ec 100644
--- a/dev/core/src/com/google/gwt/util/tools/ToolBase.java
+++ b/dev/core/src/com/google/gwt/util/tools/ToolBase.java
@@ -19,6 +19,7 @@
 
 import java.util.HashSet;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 
@@ -85,16 +86,18 @@
   protected void printHelp() {
     System.err.println(About.getGwtVersion());
 
+    Set<ArgHandler> uniqueArgHandlers = new LinkedHashSet<ArgHandler>(argHandlers.values());
+
     ArgHandler nullHandler = null;
     int widest = 0;
-    for (ArgHandler handler : argHandlers.values()) {
+    for (ArgHandler handler : uniqueArgHandlers) {
       if (handler.isUndocumented()) {
         continue;
       }
-      String tag = handler.getTag();
-      if (tag != null) {
-        if (tag.length() > widest) {
-          widest = tag.length();
+      String helpTag = handler.getHelpTag();
+      if (helpTag != null) {
+        if (helpTag.length() > widest) {
+          widest = helpTag.length();
         }
       } else {
         nullHandler = handler;
@@ -116,14 +119,14 @@
 
     // Print the command-line template.
     //
-    for (ArgHandler handler : argHandlers.values()) {
+    for (ArgHandler handler : uniqueArgHandlers) {
       if (handler.isUndocumented()) {
         continue;
       }
-      String tag = handler.getTag();
-      if (tag != null) {
+      String helpTag = handler.getHelpTag();
+      if (helpTag != null) {
         System.err.print(handler.isRequired() ? " " : " [");
-        System.err.print(tag);
+        System.err.print(helpTag);
         String[] tagArgs = handler.getTagArgs();
         for (String tagArg : tagArgs) {
           System.err.print(" " + tagArg);
@@ -155,15 +158,15 @@
 
     // Print the details.
     //
-    for (ArgHandler handler : argHandlers.values()) {
+    for (ArgHandler handler : uniqueArgHandlers) {
       if (handler.isUndocumented()) {
         continue;
       }
-      String tag = handler.getTag();
-      if (tag != null) {
-        int len = tag.length();
+      String helpTag = handler.getHelpTag();
+      if (helpTag != null) {
+        int len = helpTag.length();
         System.err.print("  ");
-        System.err.print(tag);
+        System.err.print(helpTag);
         for (i = len; i < widest; ++i) {
           System.err.print(' ');
         }
@@ -296,7 +299,9 @@
   }
 
   protected void registerHandler(ArgHandler handler) {
-    String tag = handler.getTag();
-    argHandlers.put(tag != null ? tag : "", handler);
+    for (String tag : handler.getTags()) {
+      tag = tag != null ? tag : "";
+      argHandlers.put(tag, handler);
+    }
   }
 }
diff --git a/dev/core/test/com/google/gwt/dev/PrecompileTaskArgProcessorTest.java b/dev/core/test/com/google/gwt/dev/PrecompileTaskArgProcessorTest.java
new file mode 100644
index 0000000..079abb1
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/PrecompileTaskArgProcessorTest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2013 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.dev;
+
+import junit.framework.TestCase;
+
+/**
+ * Test for PrecompileTaskArgProcessor.
+ */
+public class PrecompileTaskArgProcessorTest extends TestCase {
+
+  private PrecompileTaskOptions defaultOptions = new PrecompileTaskOptionsImpl();
+  private PrecompileTaskOptions handledOptions = new PrecompileTaskOptionsImpl();
+  private PrecompileTaskArgProcessor precompileTaskArgProcessor;
+
+  private static void assertNotEquals(boolean expected, boolean actual) {
+    assertTrue(expected != actual);
+  }
+
+  @Override
+  protected void setUp() throws Exception {
+    precompileTaskArgProcessor = new PrecompileTaskArgProcessor(handledOptions);
+  }
+
+  public void testFlagBackwardCompatibility() {
+    // Set a bunch of boolean flags using old-style tags.
+    precompileTaskArgProcessor.processArgs("-workDir", "/tmp", "-XcompilerMetrics",
+        "-XdisableCastChecking", "-XdisableClassMetadata", "-XdisableClusterSimilarFunctions",
+        "-XdisableInlineLiteralParameters", "-XdisableOptimizeDataflow", "-XdisableOrdinalizeEnums",
+        "-XdisableRemoveDuplicateFunctions", "-XdisableRunAsync", "-XdisableSoycHtml",
+        "-XdisableUpdateCheck", "-ea", "-XenableClosureCompiler", "-soyc", "-XsoycDetailed",
+        "-strict", "com.google.gwt.dev.DevModule");
+
+    // Show that the flags were recognized and ended up modifying options.
+    assertNotEquals(
+        defaultOptions.isCompilerMetricsEnabled(), handledOptions.isCompilerMetricsEnabled());
+    assertNotEquals(
+        defaultOptions.isCastCheckingDisabled(), handledOptions.isCastCheckingDisabled());
+    assertNotEquals(
+        defaultOptions.isClassMetadataDisabled(), handledOptions.isClassMetadataDisabled());
+    assertNotEquals(defaultOptions.shouldClusterSimilarFunctions(),
+        handledOptions.shouldClusterSimilarFunctions());
+    assertNotEquals(defaultOptions.shouldInlineLiteralParameters(),
+        handledOptions.shouldInlineLiteralParameters());
+    assertNotEquals(
+        defaultOptions.shouldOptimizeDataflow(), handledOptions.shouldOptimizeDataflow());
+    assertNotEquals(defaultOptions.shouldOrdinalizeEnums(), handledOptions.shouldOrdinalizeEnums());
+    assertNotEquals(defaultOptions.shouldRemoveDuplicateFunctions(),
+        handledOptions.shouldRemoveDuplicateFunctions());
+    assertNotEquals(defaultOptions.isRunAsyncEnabled(), handledOptions.isRunAsyncEnabled());
+    assertNotEquals(defaultOptions.isSoycHtmlDisabled(), handledOptions.isSoycHtmlDisabled());
+    assertNotEquals(defaultOptions.isUpdateCheckDisabled(), handledOptions.isUpdateCheckDisabled());
+    assertNotEquals(defaultOptions.isEnableAssertions(), handledOptions.isEnableAssertions());
+    assertNotEquals(
+        defaultOptions.isClosureCompilerEnabled(), handledOptions.isClosureCompilerEnabled());
+    assertNotEquals(defaultOptions.isSoycEnabled(), handledOptions.isSoycEnabled());
+    assertNotEquals(defaultOptions.isSoycExtra(), handledOptions.isSoycExtra());
+    assertNotEquals(defaultOptions.isStrict(), handledOptions.isStrict());
+  }
+
+  @SuppressWarnings("deprecation")
+  public void testFlagBackwardCompatibility_aggressiveOptimizations() {
+    // Set aggressiveOptimizations using the old-style tag.
+    precompileTaskArgProcessor.processArgs(
+        "-workDir", "/tmp", "-XdisableAggressiveOptimization", "com.google.gwt.dev.DevModule");
+
+    // Show that the flags were recognized and ended up modifying options.
+    assertNotEquals(
+        defaultOptions.isAggressivelyOptimize(), handledOptions.isAggressivelyOptimize());
+  }
+
+  @SuppressWarnings("deprecation")
+  public void testFlagBackwardCompatibility_draftCompile() {
+    // Set draftCompile using the old-style tag.
+    precompileTaskArgProcessor.processArgs(
+        "-workDir", "/tmp", "-draftCompile", "com.google.gwt.dev.DevModule");
+
+    // Show that the flags were recognized and ended up modifying options.
+    assertTrue(defaultOptions.getOptimizationLevel() != handledOptions.getOptimizationLevel());
+    assertNotEquals(
+        defaultOptions.isAggressivelyOptimize(), handledOptions.isAggressivelyOptimize());
+  }
+}
diff --git a/dev/core/test/com/google/gwt/util/tools/ArgHandlerFlagTest.java b/dev/core/test/com/google/gwt/util/tools/ArgHandlerFlagTest.java
new file mode 100644
index 0000000..47f939d
--- /dev/null
+++ b/dev/core/test/com/google/gwt/util/tools/ArgHandlerFlagTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2013 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.util.tools;
+
+import junit.framework.TestCase;
+
+/**
+ * Test for ArgHandlerFlag.
+ */
+public class ArgHandlerFlagTest extends TestCase {
+
+  private class MockArgHandlerFlag extends ArgHandlerFlag {
+
+    private boolean value;
+
+    public MockArgHandlerFlag() {
+      addTagValue("-XdisableSand", false);
+    }
+
+    @Override
+    public String getLabel() {
+      return "floorSanding";
+    }
+
+    @Override
+    public String getPurposeSnippet() {
+      return null;
+    }
+
+    @Override
+    public boolean isExperimental() {
+      return true;
+    }
+
+    @Override
+    public boolean setFlag(boolean value) {
+      this.value = value;
+      return true;
+    }
+
+    @Override
+    public boolean getDefaultValue() {
+      return value;
+    }
+  }
+
+  private MockArgHandlerFlag argHandlerFlag;
+
+  @Override
+  protected void setUp() throws Exception {
+    argHandlerFlag = new MockArgHandlerFlag();
+  }
+
+  public void testGetTag() {
+    assertEquals("-XfloorSanding", argHandlerFlag.getTag());
+  }
+
+  public void testGetTags() {
+    assertEquals("-XfloorSanding", argHandlerFlag.getTags()[0]);
+    assertEquals("-XnofloorSanding", argHandlerFlag.getTags()[1]);
+    assertEquals("-XdisableSand", argHandlerFlag.getTags()[2]);
+  }
+
+  public void testGetValueByTag() {
+    assertEquals(true, argHandlerFlag.getValueByTag("-XfloorSanding"));
+    assertEquals(false, argHandlerFlag.getValueByTag("-XnofloorSanding"));
+    assertEquals(false, argHandlerFlag.getValueByTag("-XdisableSand"));
+  }
+
+  public void testHandle() {
+    argHandlerFlag.handle(new String[] {"-XfloorSanding"}, 0);
+    assertEquals(true, argHandlerFlag.value);
+
+    argHandlerFlag.handle(new String[] {"-XnofloorSanding"}, 0);
+    assertEquals(false, argHandlerFlag.value);
+
+    argHandlerFlag.handle(new String[] {"-XdisableSand"}, 0);
+    assertEquals(false, argHandlerFlag.value);
+  }
+}
diff --git a/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiCompatibilityChecker.java b/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiCompatibilityChecker.java
index b6b5785..9eb92dc 100644
--- a/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiCompatibilityChecker.java
+++ b/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiCompatibilityChecker.java
@@ -762,21 +762,25 @@
     registerHandler(new ArgHandlerFlag() {
 
       @Override
-      public String getPurpose() {
-        return "Prints all api";
+      public String getPurposeSnippet() {
+        return "Prints all api.";
       }
 
       @Override
-      public String getTag() {
-        return "-printAllApi";
+      public String getLabel() {
+        return "printAllApi";
       }
 
       @Override
-      public boolean setFlag() {
-        printAllApi = true;
+      public boolean setFlag(boolean enabled) {
+        printAllApi = enabled;
         return true;
       }
 
+      @Override
+      public boolean getDefaultValue() {
+        return printAllApi;
+      }
     });
 
     // handler for configFile
diff --git a/user/src/com/google/gwt/i18n/tools/ArgHandlerValueChooser.java b/user/src/com/google/gwt/i18n/tools/ArgHandlerValueChooser.java
index 0dd2b1c..01dda07 100644
--- a/user/src/com/google/gwt/i18n/tools/ArgHandlerValueChooser.java
+++ b/user/src/com/google/gwt/i18n/tools/ArgHandlerValueChooser.java
@@ -48,42 +48,47 @@
   }
 
   /**
-   * Retrieve the argument handler for -createConstantsWithLookup.
-   *
+   * Creates scripts for a ConstantsWithLookup interface rather than a Constants one.
+   * 
    * @return a flag argument handler
    */
-   ArgHandler getConstantsWithLookupArgHandler() {
+  ArgHandler getConstantsWithLookupArgHandler() {
     if (cwlArgHandler == null) {
       cwlArgHandler = new ArgHandlerFlag() {
 
         @Override
-        public String getPurpose() {
+        public String getPurposeSnippet() {
           return "Create scripts for a ConstantsWithLookup interface "
-              + "rather than a Constants one";
+              + "rather than a Constants one.";
         }
 
         @Override
-        public String getTag() {
-          return "-createConstantsWithLookup";
+        public String getLabel() {
+          return "createConstantsWithLookup";
         }
 
         @Override
-        public boolean setFlag() {
-          if (argValue == Messages.class) {
+        public boolean setFlag(boolean value) {
+          if (value && argValue == Messages.class) {
             System.err.println("-createMessages cannot be used with -createConstantsWithLookup");
             return false;
           }
-          argValue = ConstantsWithLookup.class;
+          argValue = value ? ConstantsWithLookup.class : Constants.class;
           return true;
         }
+
+        @Override
+        public boolean getDefaultValue() {
+          return argValue == ConstantsWithLookup.class;
+        }
       };
     }
     return cwlArgHandler;
   }
 
   /**
-   * Retrieves the -createMessages argument handler.
-   *
+   * Creates scripts for a Messages interface rather than a Constants one.
+   * 
    * @return a flag argument handler
    */
   ArgHandler getMessagesArgHandler() {
@@ -91,25 +96,29 @@
       messagesArgHandler = new ArgHandlerFlag() {
 
         @Override
-        public String getPurpose() {
-          return "Create scripts for a Messages interface "
-              + "rather than a Constants one";
+        public String getPurposeSnippet() {
+          return "Create scripts for a Messages interface rather than a Constants one.";
         }
 
         @Override
-        public String getTag() {
-          return "-createMessages";
+        public String getLabel() {
+          return "createMessages";
         }
 
         @Override
-        public boolean setFlag() {
-          if (argValue == ConstantsWithLookup.class) {
+        public boolean setFlag(boolean value) {
+          if (value && argValue == ConstantsWithLookup.class) {
             System.err.println("-createMessages cannot be used with -createConstantsWithLookup");
             return false;
           }
-          argValue = Messages.class;
+          argValue = value ? Messages.class : Constants.class;
           return true;
         }
+
+        @Override
+        public boolean getDefaultValue() {
+          return argValue == Messages.class;
+        }
       };
     }
     return messagesArgHandler;
diff --git a/user/src/com/google/gwt/i18n/tools/I18NCreator.java b/user/src/com/google/gwt/i18n/tools/I18NCreator.java
index 5d5c582..d7e178a 100755
--- a/user/src/com/google/gwt/i18n/tools/I18NCreator.java
+++ b/user/src/com/google/gwt/i18n/tools/I18NCreator.java
@@ -252,10 +252,6 @@
   protected I18NCreator() {
 
     registerHandler(new ArgHandlerEclipse() {
-      @Override
-      public String getPurpose() {
-        return "Creates a i18n update launch config for the named eclipse project";
-      }
 
       @Override
       public boolean setString(String str) {
@@ -275,14 +271,19 @@
     registerHandler(new ArgHandlerOverwrite() {
 
       @Override
-      public boolean setFlag() {
-        if (ignore) {
+      public boolean setFlag(boolean value) {
+        if (value && ignore) {
           System.err.println("-overwrite cannot be used with -ignore.");
           return false;
         }
-        overwrite = true;
+        overwrite = value;
         return true;
       }
+
+      @Override
+      public boolean getDefaultValue() {
+        return overwrite;
+      }
     });
     chooser = new ArgHandlerValueChooser();
     registerHandler(chooser.getConstantsWithLookupArgHandler());
@@ -291,14 +292,19 @@
     registerHandler(new ArgHandlerIgnore() {
 
       @Override
-      public boolean setFlag() {
-        if (overwrite) {
+      public boolean setFlag(boolean value) {
+        if (value && overwrite) {
           System.err.println("-ignore cannot be used with -overwrite.");
           return false;
         }
-        ignore = true;
+        ignore = value;
         return true;
       }
+
+      @Override
+      public boolean getDefaultValue() {
+        return ignore;
+      }
     });
 
     registerHandler(new ArgHandlerClassName());
diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index 4838338..b442959 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -130,6 +130,104 @@
     void processModule(ModuleDef module);
   }
 
+  private static class ArgHandlerRunCompiledJavascript extends ArgHandlerFlag {
+
+    private JUnitShell shell;
+
+    public ArgHandlerRunCompiledJavascript(JUnitShell shell) {
+      this.shell = shell;
+
+      addTagValue("-web", false);
+      addTagValue("-prod", false);
+    }
+
+    @Override
+    public String getPurposeSnippet() {
+      return "Runs tests in Development Mode, using the Java virtual machine.";
+    }
+
+    @Override
+    public String getLabel() {
+      return "devMode";
+    }
+
+    @Override
+    public boolean setFlag(boolean enabled) {
+      shell.developmentMode = enabled;
+      return true;
+    }
+
+    @Override
+    public boolean getDefaultValue() {
+      return shell.developmentMode;
+    }
+  }
+
+  private static class ArgHandlerShowWindows extends ArgHandlerFlag {
+
+    private JUnitShell shell;
+
+    public ArgHandlerShowWindows(JUnitShell shell) {
+      this.shell = shell;
+
+      addTagValue("-notHeadless", true);
+    }
+    
+    @Override
+    public String getPurposeSnippet() {
+      return "Causes the log window and browser windows to be displayed; useful for debugging.";
+    }
+
+    @Override
+    public String getLabel() {
+      return "showUi";
+    }
+
+    @Override
+    public boolean setFlag(boolean enabled) {
+      shell.setHeadless(!enabled);
+      return true;
+    }
+
+    @Override
+    public boolean getDefaultValue() {
+      return !shell.isHeadless();
+    }
+  }
+
+  private static class ArgHandlerRunInStandardsMode extends ArgHandlerFlag {
+
+    private JUnitShell shell;
+
+    public ArgHandlerRunInStandardsMode(JUnitShell shell) {
+      this.shell = shell;
+
+      addTagValue("-standardsMode", true);
+      addTagValue("-quirksMode", false);
+    }
+
+    @Override
+    public String getPurposeSnippet() {
+      return "Run each test using an HTML document in standards mode (rather than quirks mode).";
+    }
+
+    @Override
+    public String getLabel() {
+      return "runStandardsMode";
+    }
+
+    @Override
+    public boolean setFlag(boolean enabled) {
+      shell.setStandardsMode(enabled);
+      return true;
+    }
+
+    @Override
+    public boolean getDefaultValue() {
+      return shell.standardsMode;
+    }
+  }
+
   static class ArgProcessor extends ArgProcessorBase {
 
     @SuppressWarnings("deprecation")
@@ -215,48 +313,10 @@
         }
       });
 
-      registerHandler(new ArgHandlerFlag() {
-        @Override
-        public String getPurpose() {
-          return "Synonym for -prod (deprecated)";
-        }
-
-        @Override
-        public String getTag() {
-          return "-web";
-        }
-
-        @Override
-        public boolean isUndocumented() {
-          return true;
-        }
-
-        @Override
-        public boolean setFlag() {
-          shell.developmentMode = false;
-          return true;
-        }
-      });
-
-      registerHandler(new ArgHandlerFlag() {
-        @Override
-        public String getPurpose() {
-          return "Causes your test to run in production (compiled) mode (defaults to development mode)";
-        }
-
-        @Override
-        public String getTag() {
-          return "-prod";
-        }
-
-        @Override
-        public boolean setFlag() {
-          shell.developmentMode = false;
-          return true;
-        }
-      });
+      registerHandler(new ArgHandlerRunCompiledJavascript(shell));
 
       registerHandler(new ArgHandlerInt() {
+
         @Override
         public String[] getDefaultArgs() {
           return new String[]{getTag(), "5"};
@@ -389,25 +449,10 @@
         }
       });
 
-      registerHandler(new ArgHandlerFlag() {
-        @Override
-        public String getPurpose() {
-          return "Causes the log window and browser windows to be displayed; useful for debugging";
-        }
-
-        @Override
-        public String getTag() {
-          return "-notHeadless";
-        }
-
-        @Override
-        public boolean setFlag() {
-          shell.setHeadless(false);
-          return true;
-        }
-      });
+      registerHandler(new ArgHandlerShowWindows(shell));
 
       registerHandler(new ArgHandlerString() {
+
         @Override
         public String getPurpose() {
           return "Precompile modules as tests are running (speeds up remote tests but requires more memory)";
@@ -443,43 +488,10 @@
         }
       });
 
-      registerHandler(new ArgHandlerFlag() {
-        @Override
-        public String getPurpose() {
-          return "Run each test using an HTML document in standards mode (rather than quirks mode)";
-        }
-
-        @Override
-        public String getTag() {
-          return "-standardsMode";
-        }
-
-        @Override
-        public boolean setFlag() {
-          shell.setStandardsMode(true);
-          return true;
-        }
-      });
-
-      registerHandler(new ArgHandlerFlag() {
-        @Override
-        public String getPurpose() {
-          return "Run each test using an HTML document in quirks mode (rather than standards mode)";
-        }
-
-        @Override
-        public String getTag() {
-          return "-quirksMode";
-        }
-
-        @Override
-        public boolean setFlag() {
-          shell.setStandardsMode(false);
-          return true;
-        }
-      });
+      registerHandler(new ArgHandlerRunInStandardsMode(shell));
 
       registerHandler(new ArgHandlerInt() {
+
         @Override
         public String getPurpose() {
           return "EXPERIMENTAL: Sets the maximum number of attempts for running each test method";
@@ -509,9 +521,15 @@
         public void setInt(int value) {
           shell.tries = value;
         }
+
+        @Override
+        public boolean isExperimental() {
+          return true;
+        }
       });
 
       registerHandler(new ArgHandlerString() {
+
         @Override
         public String getPurpose() {
           return "Specify the user agents to reduce the number of permutations for remote browser tests;"
diff --git a/user/src/com/google/gwt/junit/remote/BrowserManagerServerLauncher.java b/user/src/com/google/gwt/junit/remote/BrowserManagerServerLauncher.java
index 0c35290..b4c08a5 100644
--- a/user/src/com/google/gwt/junit/remote/BrowserManagerServerLauncher.java
+++ b/user/src/com/google/gwt/junit/remote/BrowserManagerServerLauncher.java
@@ -73,14 +73,47 @@
   }
 
   /**
+   * Queues up requests to a single server so that only a single test runs at a time.
+   */
+  private class ArgHandlerSerializeRequests extends ArgHandlerFlag {
+
+    public ArgHandlerSerializeRequests() {
+      addTagValue("-serialize", true);
+    }
+
+    @Override
+    public String getPurposeSnippet() {
+      return "Queue up requests to a single server so that only a single "
+          + "test runs at a time. Useful for a simple Firefox setup.";
+    }
+
+    @Override
+    public String getLabel() {
+      return "serializeRequests";
+    }
+
+    @Override
+    public boolean setFlag(boolean value) {
+      serializeArg = value;
+      return true;
+    }
+
+    @Override
+    public boolean getDefaultValue() {
+      return serializeArg;
+    }
+  }
+
+  /**
    * Handles the list of registration ids / machine names passed on the command
    * line.
    */
   private class ArgHandlerRegistration extends ArgHandler {
+
     @Override
     public String getPurpose() {
       return "Specify two arguments: a registration id used for the "
-          + "RMI call and the browser launch command";
+          + "RMI call and the browser launch command.";
     }
 
     @Override
@@ -142,26 +175,7 @@
   BrowserManagerServerLauncher() {
     registerHandler(new ArgHandlerPort());
     registerHandler(new ArgHandlerRegistration());
-    registerHandler(new ArgHandlerFlag() {
-
-      @Override
-      public String getPurpose() {
-        return "Queue up requests to a single server so that only a single "
-            + "test runs at a time (Usefule for a simple Firefox setup.)\n";
-      }
-
-      @Override
-      public String getTag() {
-        return "-serialize";
-      }
-
-      @Override
-      public boolean setFlag() {
-        serializeArg = true;
-        return true;
-      }
-
-    });
+    registerHandler(new ArgHandlerSerializeRequests());
   }
 
   public boolean doProcessArgs(String[] args) {
diff --git a/user/src/com/google/gwt/resources/css/InterfaceGenerator.java b/user/src/com/google/gwt/resources/css/InterfaceGenerator.java
index 5f08dab..430e591 100644
--- a/user/src/com/google/gwt/resources/css/InterfaceGenerator.java
+++ b/user/src/com/google/gwt/resources/css/InterfaceGenerator.java
@@ -60,29 +60,38 @@
   private TreeLogger logger;
   private boolean standaloneFile;
 
+  private class ArgHandlerAddPackageHeader extends ArgHandlerFlag {
+
+    public ArgHandlerAddPackageHeader() {
+      addTagValue("-standalone", true);
+    }
+
+    @Override
+    public String getPurposeSnippet() {
+      return "Add package and import statements to generated interface so that "
+          + "they are still functional when they stand alone.";
+    }
+
+    @Override
+    public String getLabel() {
+      return "addPackageHeader";
+    }
+
+    @Override
+    public boolean setFlag(boolean value) {
+      standaloneFile = value;
+      logger.log(TreeLogger.DEBUG, value ? "Not creating" : "Creating" + " a standalone file");
+      return true;
+    }
+
+    @Override
+    public boolean getDefaultValue() {
+      return standaloneFile;
+    }
+  }
+
   private InterfaceGenerator() {
-    // -standalone
-    registerHandler(new ArgHandlerFlag() {
-
-      @Override
-      public String getPurpose() {
-        return "Add package and import statements to generated interface";
-      }
-
-      @Override
-      public String getTag() {
-        return "-standalone";
-      }
-
-      @Override
-      public boolean setFlag() {
-        standaloneFile = true;
-        logger.log(TreeLogger.DEBUG, "Creating standalone file");
-        return true;
-      }
-    });
-
-    // -typeName some.package.MyCssResource
+    registerHandler(new ArgHandlerAddPackageHeader());
     registerHandler(new ArgHandlerString() {
 
       @Override
diff --git a/user/src/com/google/gwt/resources/css/Minify.java b/user/src/com/google/gwt/resources/css/Minify.java
index b7fc260..812c91e 100644
--- a/user/src/com/google/gwt/resources/css/Minify.java
+++ b/user/src/com/google/gwt/resources/css/Minify.java
@@ -35,6 +35,29 @@
  */
 public class Minify extends ToolBase {
 
+  private class ArgHandlerOutputReadable extends ArgHandlerFlag {
+
+    @Override
+    public String getPurposeSnippet() {
+      return "Output human readable CSS.";
+    }
+
+    @Override
+    public String getLabel() {
+      return "pretty";
+    }
+
+    @Override
+    public boolean setFlag(boolean enabled) {
+      return pretty = enabled;
+    }
+
+    @Override
+    public boolean getDefaultValue() {
+      return pretty;
+    }
+  }
+
   /**
    * See {@link #printHelp()} for usage.
    */
@@ -90,22 +113,7 @@
       }
     });
 
-    registerHandler(new ArgHandlerFlag() {
-      @Override
-      public String getPurpose() {
-        return "Enable human-parsable output";
-      }
-
-      @Override
-      public String getTag() {
-        return "-pretty";
-      }
-
-      @Override
-      public boolean setFlag() {
-        return pretty = true;
-      }
-    });
+    registerHandler(new ArgHandlerOutputReadable());
 
     if (!processArgs(args)) {
       return false;
diff --git a/user/src/com/google/gwt/user/tools/WebAppCreator.java b/user/src/com/google/gwt/user/tools/WebAppCreator.java
index 962b382..9a28133 100644
--- a/user/src/com/google/gwt/user/tools/WebAppCreator.java
+++ b/user/src/com/google/gwt/user/tools/WebAppCreator.java
@@ -68,11 +68,11 @@
       registerHandler(new ArgHandlerTemplates());
       registerHandler(new ArgHandlerModuleName());
       registerHandler(new ArgHandlerOutDirExtension());
-      registerHandler(new ArgHandlerNoEclipse());
-      registerHandler(new ArgHandlerOnlyEclipse());
+      registerHandler(new ArgHandlerCreateEclipseProject());
+      registerHandler(new ArgHandlerCreateEclipseProjectOnly());
       registerHandler(new ArgHandlerJUnitPath());
-      registerHandler(new ArgHandlerMaven());
-      registerHandler(new ArgHandlerNoAnt());
+      registerHandler(new ArgHandlerCreateMavenProject());
+      registerHandler(new ArgHandlerCreateAntFile());
     }
 
     @Override
@@ -82,15 +82,21 @@
   }
 
   private final class ArgHandlerIgnoreExtension extends ArgHandlerIgnore {
+
     @Override
-    public boolean setFlag() {
-      if (overwrite) {
+    public boolean setFlag(boolean value) {
+      if (value && overwrite) {
         System.err.println("-ignore cannot be used with -overwrite");
         return false;
       }
-      ignore = true;
+      ignore = value;
       return true;
     }
+
+    @Override
+    public boolean getDefaultValue() {
+      return ignore;
+    }
   }
 
   private final class ArgHandlerJUnitPath extends ArgHandlerString {
@@ -132,29 +138,37 @@
     }
   }
 
-  private final class ArgHandlerMaven extends ArgHandlerFlag {
+  private final class ArgHandlerCreateMavenProject extends ArgHandlerFlag {
+
     @Override
-    public String getPurpose() {
-      return "Deprecated. Create a maven2 project structure and pom file (default disabled). "
+    public String getPurposeSnippet() {
+      return "DEPRECATED: Create a maven2 project structure and pom file (default disabled). "
           + "Equivalent to specifying 'maven' in the list of templates.";
     }
 
     @Override
-    public String getTag() {
-      return "-maven";
+    public String getLabel() {
+      return "maven";
     }
 
     @Override
-    public boolean setFlag() {
-      if (onlyEclipse) {
+    public boolean setFlag(boolean value) {
+      if (value && onlyEclipse) {
         System.err.println("-maven and -XonlyEclipse cannot be used at the same time.");
         return false;
       }
-      if (!templates.contains("maven")) {
+      if (value) {
         templates.add("maven");
+      } else {
+        templates.remove("maven");
       }
       return true;
     }
+
+    @Override
+    public boolean getDefaultValue() {
+      return templates.contains("maven");
+    }
   }
 
   private final class ArgHandlerModuleName extends ArgHandlerExtra {
@@ -192,46 +206,64 @@
     }
   }
 
-  private final class ArgHandlerNoAnt extends ArgHandlerFlag {
+  private final class ArgHandlerCreateAntFile extends ArgHandlerFlag {
+
     @Override
-    public String getPurpose() {
-      return "Deprecated. Do not create an ant configuration file. "
-          + "Equivalent to not specifying 'ant' in the list of templates.";
+    public String getPurposeSnippet() {
+      return "DEPRECATED: Create an ant configuration file. "
+          + "Equivalent to specifying 'ant' in the list of templates.";
     }
 
     @Override
-    public String getTag() {
-      return "-noant";
+    public String getLabel() {
+      return "ant";
     }
 
     @Override
-    public boolean setFlag() {
+    public boolean setFlag(final boolean value) {
       argProcessingToDos.add(new Procrastinator() {
         @Override
         public void stopProcratinating() {
-          if (templates.contains("maven")) {
-            System.err.println("-maven and -noant are redundant. Continuing.");
-          }
-          if (templates.contains("ant")) {
-            System.err.println("Removing ant template from generated output.");
-            templates.remove("ant");
+          if (!value) {
+            if (templates.contains("maven")) {
+              System.err.println("-maven and -noant are redundant. Continuing.");
+            }
+            if (templates.contains("ant")) {
+              System.err.println("Removing ant template from generated output.");
+              templates.remove("ant");
+            }
+          } else {
+            if (!templates.contains("ant")) {
+              System.err.println("Adding ant template to generated output.");
+              templates.add("ant");
+            }
           }
         }
       });
       return true;
     }
+
+    @Override
+    public boolean getDefaultValue() {
+      return templates.contains("ant");
+    }
   }
 
-  private final class ArgHandlerNoEclipse extends ArgHandlerFlag {
-    @Override
-    public String getPurpose() {
-      return "Deprecated. Do not generate eclipse files. "
-          + "Equivalent to not specifying 'eclipse' in the list of templates";
+  private final class ArgHandlerCreateEclipseProject extends ArgHandlerFlag {
+
+    public ArgHandlerCreateEclipseProject() {
+      addTagValue("-XnoEclipse", false);
     }
 
     @Override
-    public String getTag() {
-      return "-XnoEclipse";
+    public String getPurposeSnippet() {
+      return "DEPRECATED: Generate eclipse files. Equivalent to specifying "
+          + "'eclipse' in the list of templates.";
+    }
+
+    @Override
+    public String getLabel() {
+      return "createEclipseProject";
     }
 
     @Override
@@ -240,38 +272,57 @@
     }
 
     @Override
-    public boolean setFlag() {
-      if (onlyEclipse) {
-        System.err.println("-XonlyEclipse and -XnoEclipse cannot be used at the same time.");
-        return false;
-      }
-      if (!templates.contains("maven")) {
-        System.err.println("-maven and -XnoEclipse are redundant. Continuing.");
-      }
-      noEclipse = true;
-      argProcessingToDos.add(new Procrastinator() {
-        @Override
-        public void stopProcratinating() {
-          if (templates.contains("eclipse")) {
-            System.err.println("Removing eclipse template from generated output.");
-            templates.remove("eclipse");
-          }
+    public boolean setFlag(boolean value) {
+      if (!value) {
+        if (onlyEclipse) {
+          System.err.println("-XonlyEclipse and -XnoEclipse cannot be used at the same time.");
+          return false;
         }
-      });
+        if (!templates.contains("maven")) {
+          System.err.println("-maven and -XnoEclipse are redundant. Continuing.");
+        }
+        noEclipse = true;
+        argProcessingToDos.add(new Procrastinator() {
+          @Override
+          public void stopProcratinating() {
+            if (noEclipse && templates.contains("eclipse")) {
+              System.err.println("Removing eclipse template from generated output.");
+              templates.remove("eclipse");
+            }
+          }
+        });
+      } else {
+        noEclipse = false;
+      }
       return true;
     }
+
+    @Override
+    public boolean isExperimental() {
+      return true;
+    }
+
+    @Override
+    public boolean getDefaultValue() {
+      return !noEclipse;
+    }
   }
 
-  private final class ArgHandlerOnlyEclipse extends ArgHandlerFlag {
+  private final class ArgHandlerCreateEclipseProjectOnly extends ArgHandlerFlag {
+
+    public ArgHandlerCreateEclipseProjectOnly() {
+      addTagValue("-XonlyEclipse", true);
+    }
+
     @Override
-    public String getPurpose() {
-      return "Deprecated. Generate only eclipse files. "
+    public String getPurposeSnippet() {
+      return "DEPRECATED: Generate only eclipse files. "
           + "Equivalent to only specifying 'eclipse' in the list of templates.";
     }
 
     @Override
-    public String getTag() {
-      return "-XonlyEclipse";
+    public String getLabel() {
+      return "createEclipseProjectOnly";
     }
 
     @Override
@@ -280,38 +331,60 @@
     }
 
     @Override
-    public boolean setFlag() {
-      if (noEclipse) {
-        System.err.println("-XonlyEclipse and -XnoEclipse cannot be used at the same time.");
-        return false;
-      }
-      if (templates.contains("maven")) {
-        System.err.println("-maven and -XonlyEclipse cannot be used at the same time.");
-        return false;
-      }
-      onlyEclipse = true;
-      argProcessingToDos.add(new Procrastinator() {
-        @Override
-        public void stopProcratinating() {
-          System.err.println("Removing all templates but 'eclipse' from generated output.");
-          templates.clear();
-          templates.add("eclipse");
+    public boolean setFlag(boolean value) {
+      if (value) {
+        if (noEclipse) {
+          System.err.println("-XonlyEclipse and -XnoEclipse cannot be used at the same time.");
+          return false;
         }
-      });
+        if (templates.contains("maven")) {
+          System.err.println("-maven and -XonlyEclipse cannot be used at the same time.");
+          return false;
+        }
+        onlyEclipse = true;
+        argProcessingToDos.add(new Procrastinator() {
+          @Override
+          public void stopProcratinating() {
+            if (onlyEclipse) {
+              System.err.println("Removing all templates but 'eclipse' from generated output.");
+              templates.clear();
+              templates.add("eclipse");
+            }
+          }
+        });
+      } else {
+        onlyEclipse = false;
+      }
       return true;
     }
+    
+    @Override
+    public boolean isExperimental() {
+      return true;
+    }
+
+    @Override
+    public boolean getDefaultValue() {
+      return onlyEclipse;
+    }
   }
 
   private final class ArgHandlerOverwriteExtension extends ArgHandlerOverwrite {
+
     @Override
-    public boolean setFlag() {
-      if (ignore) {
+    public boolean setFlag(boolean value) {
+      if (value && ignore) {
         System.err.println("-overwrite cannot be used with -ignore");
         return false;
       }
-      overwrite = true;
+      overwrite = value;
       return true;
     }
+
+    @Override
+    public boolean getDefaultValue() {
+      return overwrite;
+    }
   }
 
   private final class ArgHandlerTemplates extends ArgHandlerString {
diff --git a/user/src/com/google/gwt/user/tools/util/ArgHandlerEclipse.java b/user/src/com/google/gwt/user/tools/util/ArgHandlerEclipse.java
index 5ab1a64..6757fc5 100644
--- a/user/src/com/google/gwt/user/tools/util/ArgHandlerEclipse.java
+++ b/user/src/com/google/gwt/user/tools/util/ArgHandlerEclipse.java
@@ -21,6 +21,12 @@
  * Creates an arg handler for eclipse launch config options.
  */
 public abstract class ArgHandlerEclipse extends ArgHandlerString {
+
+  @Override
+  public String getPurpose() {
+    return "Creates a i18n update launch config for the named eclipse project.";
+  }
+
   @Override
   public String getTag() {
     return "-eclipse";
diff --git a/user/src/com/google/gwt/user/tools/util/ArgHandlerIgnore.java b/user/src/com/google/gwt/user/tools/util/ArgHandlerIgnore.java
index febff12..bb62557 100644
--- a/user/src/com/google/gwt/user/tools/util/ArgHandlerIgnore.java
+++ b/user/src/com/google/gwt/user/tools/util/ArgHandlerIgnore.java
@@ -18,17 +18,21 @@
 import com.google.gwt.util.tools.ArgHandlerFlag;
 
 /**
- * Arg handler for "ignore" option.
+ * Ignores any existing files and does not overwrite them.
  */
 public abstract class ArgHandlerIgnore extends ArgHandlerFlag {
 
+  public ArgHandlerIgnore() {
+    addTagValue("-ignore", true);
+  }
+  
   @Override
-  public String getPurpose() {
-    return "Ignore any existing files; do not overwrite";
+  public String getPurposeSnippet() {
+    return "Ignore any existing files; do not overwrite.";
   }
 
   @Override
-  public String getTag() {
-    return "-ignore";
+  public String getLabel() {
+    return "ignoreExistingFiles";
   }
 }
diff --git a/user/src/com/google/gwt/user/tools/util/ArgHandlerOverwrite.java b/user/src/com/google/gwt/user/tools/util/ArgHandlerOverwrite.java
index 0c003b6..02d552b 100644
--- a/user/src/com/google/gwt/user/tools/util/ArgHandlerOverwrite.java
+++ b/user/src/com/google/gwt/user/tools/util/ArgHandlerOverwrite.java
@@ -16,18 +16,23 @@
 package com.google.gwt.user.tools.util;
 
 import com.google.gwt.util.tools.ArgHandlerFlag;
+
 /**
- *  Arg handler for "overwrite" option.
+ * Overwrites any existing files.
  */
 public abstract class ArgHandlerOverwrite extends ArgHandlerFlag {
 
+  public ArgHandlerOverwrite() {
+    addTagValue("-overwrite", true);
+  }
+  
   @Override
-  public String getPurpose() {
-    return "Overwrite any existing files";
+  public String getPurposeSnippet() {
+    return "Overwrite any existing files.";
   }
 
   @Override
-  public String getTag() {
-    return "-overwrite";
+  public String getLabel() {
+    return "overwriteFiles";
   }
 }