diff --git a/user/src/com/google/gwt/core/Core.gwt.xml b/user/src/com/google/gwt/core/Core.gwt.xml
index 8eea25e..3d4ffbf 100644
--- a/user/src/com/google/gwt/core/Core.gwt.xml
+++ b/user/src/com/google/gwt/core/Core.gwt.xml
@@ -67,22 +67,20 @@
   <add-linker name="soycReport" />
   <add-linker name="symbolMaps" />
 
-  <!-- Set up and handle the gwt.logging property
-   Setting this value to FALSE will compile out all logging.  Setting it to SEVERE
-   or WARNING means that the logging framework will not compile out, but the basic
-   logging calls like logger.info() and logger.fine() will compile out if it is below
-   the level that is set.  Note that something like logger.log(Level.INFO, "foo", e)
-   *will not* compile out at this point.  If you have something that is important to
-   have compiled out, you should put it behind a
-   LogConfiguration.isLoggingEnabled(Level.INFO) guard.
+  <!--
+   Setting this value to OFF will compile out all logging.  Setting it to SEVERE, WARNING
+   or INFO means that the logging framework will not compile out, but the basic logging
+   calls like logger.fine() will compile out if it is below the level that is set.
+   Note that something like logger.log(Level.INFO, "foo") *will not* compile out.
    -->
-  <define-property name="gwt.logging.enabled" values="TRUE, FALSE, SEVERE, WARNING" />
-  <set-property name="gwt.logging.enabled" value="FALSE"/>
+  <define-property name="jre.logging.logLevel" values="OFF, SEVERE, WARNING, INFO, ALL" />
+  <set-property name="jre.logging.logLevel" value="OFF"/>
 
-  <define-property name="gwt.logging.simpleConsoleHandler" values="ENABLED, DISABLED" />
-  <set-property name="gwt.logging.simpleConsoleHandler" value="ENABLED"/>
-
-  <set-property name="gwt.logging.enabled" value="TRUE">
+  <set-property name="jre.logging.logLevel" value="ALL">
     <when-property-is name="jre.debugMode" value="ENABLED"/>
   </set-property>
+
+  <define-property name="jre.logging.simpleConsoleHandler" values="ENABLED, DISABLED" />
+  <set-property name="jre.logging.simpleConsoleHandler" value="ENABLED"/>
+
 </module>
diff --git a/user/src/com/google/gwt/logging/LogImpl.gwt.xml b/user/src/com/google/gwt/logging/LogImpl.gwt.xml
index b28f903..60ca775 100644
--- a/user/src/com/google/gwt/logging/LogImpl.gwt.xml
+++ b/user/src/com/google/gwt/logging/LogImpl.gwt.xml
@@ -1,4 +1,34 @@
 <module>
   <inherits name="com.google.gwt.core.Core"/>
   <source path="impl" />
+
+  <define-property name="gwt.logging.enabled" values="TRUE, FALSE, SEVERE, WARNING" />
+  <set-property name="gwt.logging.enabled" value="FALSE"/>
+  <set-property name="gwt.logging.enabled" value="TRUE">
+    <when-property-is name="jre.debugMode" value="ENABLED"/>
+  </set-property>
+
+  <!-- Forward gwt.logging.enabled to jre.logging.logLevel -->
+  <set-property name="jre.logging.logLevel" value="ALL">
+    <when-property-is name="gwt.logging.enabled" value="TRUE"/>
+  </set-property>
+  <set-property name="jre.logging.logLevel" value="SEVERE">
+    <when-property-is name="gwt.logging.enabled" value="SEVERE"/>
+  </set-property>
+  <set-property name="jre.logging.logLevel" value="WARNING">
+    <when-property-is name="gwt.logging.enabled" value="WARNING"/>
+  </set-property>
+  <set-property name="jre.logging.logLevel" value="OFF">
+    <when-property-is name="gwt.logging.enabled" value="FALSE"/>
+  </set-property>
+
+
+  <define-property name="gwt.logging.simpleConsoleHandler" values="ENABLED, DISABLED" />
+  <set-property name="gwt.logging.simpleConsoleHandler" value="ENABLED"/>
+
+  <!-- Forward gwt.logging.simpleConsoleHandler to jre.logging.simpleConsoleHandler -->
+  <set-property name="jre.logging.simpleConsoleHandler" value="DISABLED">
+    <when-property-is name="gwt.logging.simpleConsoleHandler" value="DISABLED"/>
+  </set-property>
+
 </module>
diff --git a/user/super/com/google/gwt/emul/java/util/logging/Level.java b/user/super/com/google/gwt/emul/java/util/logging/Level.java
index 72c5305..d549f69 100644
--- a/user/super/com/google/gwt/emul/java/util/logging/Level.java
+++ b/user/super/com/google/gwt/emul/java/util/logging/Level.java
@@ -83,8 +83,7 @@
 
   public static Level parse(String name) {
     Logger.assertLoggingValues();
-    boolean loggingDisabled = System.getProperty("gwt.logging.enabled", "FALSE").equals("FALSE");
-    if (loggingDisabled) {
+    if (System.getProperty("jre.logging.logLevel").equals("OFF")) {
       return null;
     }
 
diff --git a/user/super/com/google/gwt/emul/java/util/logging/LogManager.java b/user/super/com/google/gwt/emul/java/util/logging/LogManager.java
index e5c3b68..cac90af 100644
--- a/user/super/com/google/gwt/emul/java/util/logging/LogManager.java
+++ b/user/super/com/google/gwt/emul/java/util/logging/LogManager.java
@@ -75,7 +75,7 @@
   }
 
   private void addLoggerImpl(Logger logger) {
-    if (System.getProperty("gwt.logging.simpleConsoleHandler", "ENABLED").equals("ENABLED")) {
+    if (System.getProperty("jre.logging.simpleConsoleHandler").equals("ENABLED")) {
       if (logger.getName().isEmpty()) {
         logger.addHandler(new SimpleConsoleLogHandler());
       }
diff --git a/user/super/com/google/gwt/emul/java/util/logging/Logger.java b/user/super/com/google/gwt/emul/java/util/logging/Logger.java
index 305508c..2c0e0b0 100644
--- a/user/super/com/google/gwt/emul/java/util/logging/Logger.java
+++ b/user/super/com/google/gwt/emul/java/util/logging/Logger.java
@@ -27,10 +27,11 @@
 public class Logger {
   public static final String GLOBAL_LOGGER_NAME = "global";
 
-  private static final String LOGGING_ENABLED = System.getProperty("gwt.logging.enabled", "TRUE");
-  private static final boolean LOGGING_WARNING = LOGGING_ENABLED.equals("WARNING");
-  private static final boolean LOGGING_SEVERE = LOGGING_ENABLED.equals("SEVERE");
-  private static final boolean LOGGING_FALSE = LOGGING_ENABLED.equals("FALSE");
+  private static final String LOG_LEVEL = System.getProperty("jre.logging.logLevel");
+  private static final boolean LOGGING_INFO = LOG_LEVEL.equals("INFO");
+  private static final boolean LOGGING_WARNING = LOG_LEVEL.equals("WARNING");
+  private static final boolean LOGGING_SEVERE = LOG_LEVEL.equals("SEVERE");
+  private static final boolean LOGGING_OFF = LOG_LEVEL.equals("OFF");
 
   static {
     assertLoggingValues();
@@ -42,20 +43,25 @@
 
   public static Logger getLogger(String name) {
     // Use shortcut if logging is disabled to avoid parent logger creations in LogManager
-    if (LOGGING_FALSE) {
+    if (LOGGING_OFF) {
       return new Logger(name, null);
     }
     return LogManager.getLogManager().ensureLogger(name);
   }
 
   static void assertLoggingValues() {
-    if (LOGGING_ENABLED.equals("FALSE") || LOGGING_ENABLED.equals("TRUE")
-        || LOGGING_ENABLED.equals("SEVERE") || LOGGING_ENABLED.equals("WARNING")) {
+    if (LOG_LEVEL.equals("ALL")
+        || LOG_LEVEL.equals("INFO")
+        || LOG_LEVEL.equals("WARNING")
+        || LOG_LEVEL.equals("SEVERE")
+        || LOG_LEVEL.equals("OFF")) {
       return;
     }
 
-    throw new RuntimeException("Undefined value for gwt.logging.enabled: '" + LOGGING_ENABLED
-        + "'. Allowed values are TRUE, FALSE, SEVERE, WARNING");
+    throw new AssertionError(
+        "Undefined value for jre.logging.logLevel: '"
+            + LOG_LEVEL
+            + "'. Allowed values are ALL, INFO, WARNING, SEVERE, OFF");
   }
 
   private List<Handler> handlers;
@@ -65,7 +71,7 @@
   private boolean useParentHandlers;
 
   protected Logger(String name, @SuppressWarnings("unused") String resourceName) {
-    if (LOGGING_FALSE) {
+    if (LOGGING_OFF) {
       return;
     }
 
@@ -75,112 +81,112 @@
   }
 
   public void addHandler(Handler handler) {
-    if (LOGGING_FALSE) {
+    if (LOGGING_OFF) {
       return;
     }
     handlers.add(handler);
   }
 
   public void config(String msg) {
-    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+    if (LOGGING_OFF || LOGGING_SEVERE || LOGGING_WARNING || LOGGING_INFO) {
       return;
     }
     log(Level.CONFIG, msg);
   }
 
   public void config(Supplier<String> msgSupplier) {
-    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+    if (LOGGING_OFF || LOGGING_SEVERE || LOGGING_WARNING || LOGGING_INFO) {
       return;
     }
     log(Level.CONFIG, msgSupplier);
   }
 
   public void fine(String msg) {
-    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+    if (LOGGING_OFF || LOGGING_SEVERE || LOGGING_WARNING || LOGGING_INFO) {
       return;
     }
     log(Level.FINE, msg);
   }
 
   public void fine(Supplier<String> msgSupplier) {
-    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+    if (LOGGING_OFF || LOGGING_SEVERE || LOGGING_WARNING || LOGGING_INFO) {
       return;
     }
     log(Level.FINE, msgSupplier);
   }
 
   public void finer(String msg) {
-    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+    if (LOGGING_OFF || LOGGING_SEVERE || LOGGING_WARNING || LOGGING_INFO) {
       return;
     }
     log(Level.FINER, msg);
   }
 
   public void finer(Supplier<String> msgSupplier) {
-    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+    if (LOGGING_OFF || LOGGING_SEVERE || LOGGING_WARNING || LOGGING_INFO) {
       return;
     }
     log(Level.FINER, msgSupplier);
   }
 
   public void finest(String msg) {
-    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+    if (LOGGING_OFF || LOGGING_SEVERE || LOGGING_WARNING || LOGGING_INFO) {
       return;
     }
     log(Level.FINEST, msg);
   }
 
   public void finest(Supplier<String> msgSupplier) {
-    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+    if (LOGGING_OFF || LOGGING_SEVERE || LOGGING_WARNING || LOGGING_INFO) {
       return;
     }
     log(Level.FINEST, msgSupplier);
   }
 
   public void info(String msg) {
-    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+    if (LOGGING_OFF || LOGGING_SEVERE || LOGGING_WARNING) {
       return;
     }
     log(Level.INFO, msg);
   }
 
   public void info(Supplier<String> msgSupplier) {
-    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+    if (LOGGING_OFF || LOGGING_SEVERE || LOGGING_WARNING) {
       return;
     }
     log(Level.INFO, msgSupplier);
   }
 
   public void warning(String msg) {
-    if (LOGGING_FALSE || LOGGING_SEVERE) {
+    if (LOGGING_OFF || LOGGING_SEVERE) {
       return;
     }
     log(Level.WARNING, msg);
   }
 
   public void warning(Supplier<String> msgSupplier) {
-    if (LOGGING_FALSE || LOGGING_SEVERE) {
+    if (LOGGING_OFF || LOGGING_SEVERE) {
       return;
     }
     log(Level.WARNING, msgSupplier);
   }
 
   public void severe(String msg) {
-    if (LOGGING_FALSE) {
+    if (LOGGING_OFF) {
       return;
     }
     log(Level.SEVERE, msg);
   }
 
   public void severe(Supplier<String> msgSupplier) {
-    if (LOGGING_FALSE) {
+    if (LOGGING_OFF) {
       return;
     }
     log(Level.SEVERE, msgSupplier);
   }
 
   public Handler[] getHandlers() {
-    if (LOGGING_FALSE) {
+    if (LOGGING_OFF) {
       return new Handler[0];
     }
 
@@ -188,28 +194,30 @@
   }
 
   public Level getLevel() {
-    return LOGGING_FALSE ? null : level;
+    return LOGGING_OFF ? null : level;
   }
 
   public String getName() {
-    return LOGGING_FALSE ? null : name;
+    return LOGGING_OFF ? null : name;
   }
 
   public Logger getParent() {
-    return LOGGING_FALSE ? null : parent;
+    return LOGGING_OFF ? null : parent;
   }
 
   public boolean getUseParentHandlers() {
-    return LOGGING_FALSE ? false : useParentHandlers;
+    return LOGGING_OFF ? false : useParentHandlers;
   }
 
   public boolean isLoggable(Level messageLevel) {
-    if (LOGGING_FALSE) {
+    if (LOGGING_OFF) {
       return false;
     } else if (LOGGING_SEVERE) {
       return messageLevel.intValue() >= Level.SEVERE.intValue();
     } else if (LOGGING_WARNING) {
       return messageLevel.intValue() >= Level.WARNING.intValue();
+    } else if (LOGGING_INFO) {
+      return messageLevel.intValue() >= Level.INFO.intValue();
     } else {
       return messageLevel.intValue() >= getEffectiveLevel().intValue();
     }
@@ -242,21 +250,21 @@
   }
 
   public void removeHandler(Handler handler) {
-    if (LOGGING_FALSE) {
+    if (LOGGING_OFF) {
       return;
     }
     handlers.remove(handler);
   }
 
   public void setLevel(Level newLevel) {
-    if (LOGGING_FALSE) {
+    if (LOGGING_OFF) {
       return;
     }
     this.level = newLevel;
   }
 
   public void setParent(Logger newParent) {
-    if (LOGGING_FALSE) {
+    if (LOGGING_OFF) {
       return;
     }
     if (newParent != null) {
@@ -265,7 +273,7 @@
   }
 
   public void setUseParentHandlers(boolean newUseParentHandlers) {
-    if (LOGGING_FALSE) {
+    if (LOGGING_OFF) {
       return;
     }
     this.useParentHandlers = newUseParentHandlers;
