diff --git a/java/res/values-de/config.xml b/java/res/values-de/config.xml
new file mode 100644
index 0000000..272ff32
--- /dev/null
+++ b/java/res/values-de/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** 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.
+*/
+-->
+
+<resources>
+    <bool name="config_require_umlaut_processing">true</bool>
+</resources>
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index 64e2c67..300aaa4 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -78,4 +78,5 @@
     </string-array>
     <!--  Screen metrics for logging. 0 = "mdpi", 1 = "hdpi", 2 = "xlarge" -->
     <integer name="log_screen_metrics">0</integer>
+    <bool name="config_require_umlaut_processing">false</bool>
 </resources>
diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml
index 1b122be..5130767 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -72,7 +72,6 @@
             android:label="@string/subtype_mode_de_keyboard"
             android:imeSubtypeLocale="de"
             android:imeSubtypeMode="keyboard"
-            android:imeSubtypeExtraValue="requiresGermanUmlautProcessing"
     />
 <!--     <subtype android:icon="@drawable/ic_subtype_mic" -->
 <!--             android:label="@string/subtype_mode_de_voice" -->
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index fa90fce..58e9099 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -63,18 +63,12 @@
 
     private final KeyboardSwitcher mKeyboardSwitcher = KeyboardSwitcher.getInstance();
 
-    public static class Flag {
-        public final String mName;
-        public final int mValue;
-
-        public Flag(String name, int value) {
-            mName = name;
-            mValue = value;
-        }
-    }
-
     public static final Flag FLAG_REQUIRES_GERMAN_UMLAUT_PROCESSING =
-            new Flag("requiresGermanUmlautProcessing", 0x1);
+            new Flag(R.bool.config_require_umlaut_processing, 0x1);
+
+    // Can create a new flag from extravalue :
+    // public static final Flag FLAG_MYFLAG =
+    //         new Flag("my_flag", 0x02);
 
     private static final Flag[] ALL_FLAGS = {
         // Here should reside all flags that trigger some special processing
@@ -118,12 +112,12 @@
                 return null;
             }
         }
-        sInstance.mFlags = initFlags(ALL_FLAGS, SubtypeSwitcher.getInstance());
+        sInstance.mFlags = Flag.initFlags(ALL_FLAGS, context, SubtypeSwitcher.getInstance());
         return sInstance;
     }
 
-    /* package for test */ static BinaryDictionary initDictionary(File dictionary, long startOffset,
-            long length, int dicTypeId, Flag[] flagArray) {
+    /* package for test */ static BinaryDictionary initDictionary(Context context, File dictionary,
+            long startOffset, long length, int dicTypeId, Flag[] flagArray) {
         synchronized (sInstance) {
             sInstance.closeInternal();
             if (dictionary.isFile()) {
@@ -134,19 +128,10 @@
                 return null;
             }
         }
-        sInstance.mFlags = initFlags(flagArray, null);
+        sInstance.mFlags = Flag.initFlags(flagArray, context, null);
         return sInstance;
     }
 
-    private static int initFlags(Flag[] flagArray, SubtypeSwitcher switcher) {
-        int flags = 0;
-        for (Flag entry : flagArray) {
-            if (switcher == null || switcher.currentSubtypeContainsExtraValueKey(entry.mName))
-                flags |= entry.mValue;
-        }
-        return flags;
-    }
-
     static {
         Utils.loadNativeLibrary();
     }
@@ -179,6 +164,7 @@
                 sInstance.mDicTypeId = dicTypeId;
             }
         }
+        sInstance.mFlags = Flag.initFlags(ALL_FLAGS, context, SubtypeSwitcher.getInstance());
         return sInstance;
     }
 
diff --git a/java/src/com/android/inputmethod/latin/Flag.java b/java/src/com/android/inputmethod/latin/Flag.java
new file mode 100644
index 0000000..3cb8f7e
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/Flag.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * 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.android.inputmethod.latin;
+
+import android.content.Context;
+import android.content.res.Resources;
+
+public class Flag {
+    public final String mName;
+    public final int mResource;
+    public final int mMask;
+    public final int mSource;
+
+    static private final int SOURCE_CONFIG = 1;
+    static private final int SOURCE_EXTRAVALUE = 2;
+
+    public Flag(int resourceId, int mask) {
+        mName = null;
+        mResource = resourceId;
+        mSource = SOURCE_CONFIG;
+        mMask = mask;
+    }
+
+    public Flag(String name, int mask) {
+        mName = name;
+        mResource = 0;
+        mSource = SOURCE_EXTRAVALUE;
+        mMask = mask;
+    }
+
+    // If context/switcher are null, set all related flags in flagArray to on.
+    public static int initFlags(Flag[] flagArray, Context context, SubtypeSwitcher switcher) {
+        int flags = 0;
+        final Resources res = null == context ? null : context.getResources();
+        for (Flag entry : flagArray) {
+            switch (entry.mSource) {
+                case Flag.SOURCE_CONFIG:
+                    if (res == null || res.getBoolean(entry.mResource))
+                        flags |= entry.mMask;
+                    break;
+                case Flag.SOURCE_EXTRAVALUE:
+                    if (switcher == null ||
+                            switcher.currentSubtypeContainsExtraValueKey(entry.mName))
+                        flags |= entry.mMask;
+                    break;
+            }
+        }
+        return flags;
+    }
+}
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 0cc9d41..cd7f71c 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -112,10 +112,10 @@
                 dictionaryResId));
     }
 
-    /* package for test */ Suggest(File dictionary, long startOffset, long length,
-            BinaryDictionary.Flag[] flagArray) {
-        init(null, BinaryDictionary.initDictionary(dictionary, startOffset, length, DIC_MAIN,
-                flagArray));
+    /* package for test */ Suggest(Context context, File dictionary, long startOffset, long length,
+            Flag[] flagArray) {
+        init(null, BinaryDictionary.initDictionary(context, dictionary, startOffset, length,
+                DIC_MAIN, flagArray));
     }
 
     private void init(Context context, BinaryDictionary mainDict) {
