You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lo...@apache.org on 2018/11/14 10:28:22 UTC

[myfaces-tobago] branch master updated: TOBAGO-1931: TobagoBundle class doesn't work correctly

This is an automated email from the ASF dual-hosted git repository.

lofwyr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/myfaces-tobago.git


The following commit(s) were added to refs/heads/master by this push:
     new f8b6737  TOBAGO-1931: TobagoBundle class doesn't work correctly
f8b6737 is described below

commit f8b67370486cfabf02aa930e9c5c63ed3937f915
Author: Udo Schnurpfeil <lo...@apache.org>
AuthorDate: Wed Nov 14 11:27:41 2018 +0100

    TOBAGO-1931: TobagoBundle class doesn't work correctly
---
 tobago-core/src/main/faces-config/faces-config.xml |   2 +-
 .../apache/myfaces/tobago/component/Sorter.java    |  12 +-
 .../myfaces/tobago/context/TobagoBundle.java       | 139 -------
 .../myfaces/tobago/context/TobagoContext.java      |  30 +-
 .../tobago/context/TobagoMessageBundle.java        |  44 ---
 .../tobago/context/TobagoResourceBundle.java       |  41 --
 .../tobago/internal/component/AbstractUIFile.java  |   4 +-
 .../component/AbstractUISelectBoolean.java         |   4 +-
 .../component/AbstractUISelectOneBase.java         |   8 +-
 .../tobago/internal/component/AbstractUISheet.java |   1 +
 .../internal/renderkit/renderer/FileRenderer.java  |   4 +-
 .../renderkit/renderer/ObjectRenderer.java         |   8 +-
 .../internal/renderkit/renderer/PageRenderer.java  |   4 +-
 .../internal/renderkit/renderer/SheetRenderer.java |  26 +-
 .../apache/myfaces/tobago/util/MessageUtils.java   |  33 +-
 .../apache/myfaces/tobago/util/ResourceUtils.java  |  58 +++
 .../tobago/validator/FileItemValidator.java        |  12 +-
 .../validator/SubmittedValueLengthValidator.java   |  12 +-
 .../myfaces/tobago/context/TobagoMessage.xml       |  45 ---
 .../tobago/context/TobagoMessageBundle.properties  |  21 +
 .../context/TobagoMessageBundle_de.properties      |  22 ++
 .../context/TobagoMessageBundle_en.properties      |   1 +
 .../context/TobagoMessageBundle_es.properties      |  22 ++
 .../myfaces/tobago/context/TobagoMessage_de.xml    |  49 ---
 .../myfaces/tobago/context/TobagoMessage_es.xml    |  46 ---
 .../myfaces/tobago/context/TobagoResource.xml      |  89 -----
 .../tobago/context/TobagoResourceBundle.properties |  52 +++
 .../context/TobagoResourceBundle_de.properties     |  51 +++
 .../context/TobagoResourceBundle_en.properties     |   1 +
 .../context/TobagoResourceBundle_es.properties     |  52 +++
 .../myfaces/tobago/context/TobagoResource_de.xml   |  91 -----
 .../myfaces/tobago/context/TobagoResource_es.xml   |  90 -----
 .../internal/config/AbstractTobagoTestBase.java    |   8 +
 .../myfaces/tobago/util/MessageUtilsUnitTest.java  |  87 +++++
 .../tobago/util/ResourcesUtilsUnitTest.java        |  52 +++
 .../test/resources/tobago-config-2.3-replace.xml   |  44 ++-
 .../src/test/resources/tobago-config-2.3.xml       |  80 ++++
 .../tobago/example/demo/DemoController.java        |   5 +-
 .../{DemoBundle.java => Migration5Controller.java} |  25 +-
 .../tobago/example/demo/NavigationNode.java        |  19 +-
 .../tobago/example/demo/NavigationTree.java        |   2 +-
 .../myfaces/tobago/example/demo/Salutation.java    |   4 +-
 .../tobago/example/demo/TreeSelectController.java  |  15 +
 .../src/main/resources/logback.xml                 |   5 +-
 .../apache/myfaces/tobago/example/demo/Demo.xml    | 432 ---------------------
 .../tobago/example/demo/DemoBundle.properties      | 281 ++++++++++++++
 .../tobago/example/demo/DemoBundle_de.properties   | 108 ++++++
 .../tobago/example/demo/DemoBundle_en.properties   |   4 +
 .../tobago/example/demo/DemoBundle_ja.properties   |   4 +
 .../tobago/example/demo/DemoBundle_ru.properties   |   4 +
 .../apache/myfaces/tobago/example/demo/Demo_de.xml | 192 ---------
 .../tobago/example/demo/demo_en.properties.xml     |  24 --
 .../tobago/example/demo/demo_ja.properties.xml     |  24 --
 .../tobago/example/demo/demo_ru.properties.xml     |  24 --
 .../95-migration/ConvertXmlToProperties.java       |  32 ++
 .../50-migration/95-migration/migration50.xhtml    |  58 +++
 .../content/10-intro/50-migration/migration.xhtml  |   4 +
 .../090-tree/01-select/tree-select.xhtml           |   8 +-
 .../src/main/webapp/navigation.xhtml               |   2 +-
 59 files changed, 1169 insertions(+), 1452 deletions(-)

diff --git a/tobago-core/src/main/faces-config/faces-config.xml b/tobago-core/src/main/faces-config/faces-config.xml
index 52dfa05..66f9275 100644
--- a/tobago-core/src/main/faces-config/faces-config.xml
+++ b/tobago-core/src/main/faces-config/faces-config.xml
@@ -27,7 +27,7 @@
 
   <application>
     <default-render-kit-id>tobago</default-render-kit-id>
-    <message-bundle>org.apache.myfaces.tobago.context.TobagoResourceBundle</message-bundle>
+    <message-bundle>org.apache.myfaces.tobago.context.TobagoMessageBundle</message-bundle>
     <resource-bundle>
       <base-name>org.apache.myfaces.tobago.context.TobagoResourceBundle</base-name>
       <var>tobagoResourceBundle</var>
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Sorter.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Sorter.java
index 8c2571a..7a987e8 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Sorter.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Sorter.java
@@ -231,8 +231,16 @@ public class Sorter {
   }
 
   private void addNotSortableMessage(final FacesContext facesContext, final UIColumn column) {
-    MessageUtils.addMessage(facesContext, column, FacesMessage.SEVERITY_WARN,
-        AbstractUISheet.NOT_SORTABLE_MESSAGE_ID, new Object[]{MessageUtils.getLabel(facesContext, column)});
+    if (column != null) {
+      final String label = MessageUtils.getLabel(facesContext, column);
+      facesContext.addMessage(column.getClientId(facesContext),
+          MessageUtils.getMessage(
+              facesContext, FacesMessage.SEVERITY_WARN, AbstractUISheet.NOT_SORTABLE_COL_MESSAGE_ID, label));
+    } else {
+      facesContext.addMessage(null,
+          MessageUtils.getMessage(
+              facesContext, FacesMessage.SEVERITY_WARN, AbstractUISheet.NOT_SORTABLE_MESSAGE_ID));
+    }
   }
 
   private UIComponent getFirstSortableChild(final List<UIComponent> children) {
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/context/TobagoBundle.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/context/TobagoBundle.java
deleted file mode 100644
index 2d0e442..0000000
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/context/TobagoBundle.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 org.apache.myfaces.tobago.context;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Locale;
-import java.util.Properties;
-import java.util.ResourceBundle;
-import java.util.Set;
-
-/**
- * This class works like the Java resource bundle mechanism for a named resource bundle
- * and adds the functionality of the tobago themes and also supports XML properties files.
- * This class should be extended and used in the faces-config.xml.
- *
- * @since 1.5.0
- */
-public class TobagoBundle extends ResourceBundle {
-
-  private static final Logger LOG = LoggerFactory.getLogger(TobagoBundle.class);
-
-  private String bundleName;
-  private ResourceBundle bundle;
-
-  public TobagoBundle(final String bundleName) {
-    this.bundleName = bundleName;
-    this.bundle = ResourceBundle.getBundle(bundleName, new XmlTobagoBundle.XMLResourceBundleControl());
-  }
-
-  @Override
-  protected Object handleGetObject(final String key) {
-    if (LOG.isDebugEnabled()) {
-      LOG.debug("Searching for '{}' in bundle '{}'", key, bundleName);
-    }
-    return bundle.getObject(key);
-  }
-
-  @Override
-  public Enumeration<String> getKeys() {
-    return Collections.enumeration(Collections.emptyList());
-  }
-
-  public String getBundleName() {
-    return bundleName;
-  }
-
-  public static class XmlTobagoBundle extends ResourceBundle {
-
-    private static final String XML = "xml";
-
-    private Properties props;
-
-    private XmlTobagoBundle(final InputStream stream) throws IOException {
-      props = new Properties();
-      props.loadFromXML(stream);
-    }
-
-    @Override
-    protected Object handleGetObject(final String key) {
-      return props.getProperty(key);
-    }
-
-    @Override
-    public Enumeration<String> getKeys() {
-      final Set<String> handleKeys = props.stringPropertyNames();
-      return Collections.enumeration(handleKeys);
-    }
-
-    public static class XMLResourceBundleControl extends Control {
-
-      @Override
-      public List<String> getFormats(final String baseName) {
-        return Collections.singletonList(XML);
-      }
-
-      @Override
-      public ResourceBundle newBundle(
-          final String baseName, final Locale locale, final String format, final ClassLoader loader,
-          final boolean reload)
-          throws IllegalAccessException, InstantiationException,
-          IOException {
-
-        if ((baseName == null) || (locale == null) || (format == null) || (loader == null)) {
-          throw new NullPointerException();
-        }
-        ResourceBundle bundle = null;
-        if (!format.equals(XML)) {
-          return null;
-        }
-
-        final String bundleName = toBundleName(baseName, locale);
-        final String resourceName = toResourceName(bundleName, format);
-        final URL url = loader.getResource(resourceName);
-        if (url == null) {
-          return null;
-        }
-        final URLConnection connection = url.openConnection();
-        if (connection == null) {
-          return null;
-        }
-        if (reload) {
-          connection.setUseCaches(false);
-        }
-        try (final BufferedInputStream bis = new BufferedInputStream(connection.getInputStream())) {
-          bundle = new XmlTobagoBundle(bis);
-        }
-
-        return bundle;
-      }
-    }
-  }
-}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/context/TobagoContext.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/context/TobagoContext.java
index 7650a08..cb23516 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/context/TobagoContext.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/context/TobagoContext.java
@@ -21,16 +21,21 @@ package org.apache.myfaces.tobago.context;
 
 import org.apache.myfaces.tobago.config.TobagoConfig;
 import org.apache.myfaces.tobago.internal.util.CookieUtils;
+import org.apache.myfaces.tobago.util.MessageUtils;
+import org.apache.myfaces.tobago.util.ResourceUtils;
 import org.apache.myfaces.tobago.util.VariableResolverUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.faces.bean.ManagedBean;
 import javax.faces.bean.RequestScoped;
+import javax.faces.component.UIViewRoot;
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 import javax.servlet.http.HttpServletRequest;
 import java.io.Serializable;
+import java.util.Locale;
+import java.util.ResourceBundle;
 
 @ManagedBean
 @RequestScoped
@@ -40,20 +45,31 @@ public class TobagoContext implements Serializable {
 
   private static final Logger LOG = LoggerFactory.getLogger(TobagoContext.class);
 
-  private static final TobagoResourceBundle RESOURCE_BUNDLE = new TobagoResourceBundle();
-  private static final TobagoMessageBundle MESSAGE_BUNDLE = new TobagoMessageBundle();
-
   private Theme theme;
   private UserAgent userAgent;
   private String focusId;
   private String enctype;
 
-  public TobagoResourceBundle getResourceBundle() {
-    return RESOURCE_BUNDLE;
+  /**
+   * @deprecated Please use {@link ResourceUtils#getString} in Java or #{tobagoResourceBundle.key} in Facelets.
+   */
+  @Deprecated
+  public ResourceBundle getResourceBundle() {
+    final UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
+    final Locale locale = viewRoot != null
+        ? viewRoot.getLocale() : FacesContext.getCurrentInstance().getApplication().getDefaultLocale();
+    return ResourceBundle.getBundle("tobagoResourceBundle", locale);
   }
 
-  public TobagoMessageBundle getMessageBundle() {
-    return MESSAGE_BUNDLE;
+  /**
+   * @deprecated Please use {@link MessageUtils}.
+   */
+  @Deprecated
+  public ResourceBundle getMessageBundle() {
+    final UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
+    final Locale locale = viewRoot != null
+        ? viewRoot.getLocale() : FacesContext.getCurrentInstance().getApplication().getDefaultLocale();
+    return ResourceBundle.getBundle("org.apache.myfaces.tobago.context.TobagoMessage", locale);
   }
 
   public TobagoConfig getTobagoConfig() {
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/context/TobagoMessageBundle.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/context/TobagoMessageBundle.java
deleted file mode 100644
index 420273b..0000000
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/context/TobagoMessageBundle.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 org.apache.myfaces.tobago.context;
-
-import javax.faces.context.FacesContext;
-
-/**
- * This ResourceBundle encapsulate the messages (e. g. validation) of Tobago components.
- * This class works like the Java resource bundle mechanism for the resource bundle {@value BUNDLE_NAME}.
- * Supports XML properties files.
- *
- * @since 1.5.0
- */
-public class TobagoMessageBundle extends TobagoBundle {
-
-  public static final String VAR = "tobagoMessageBundle";
-  public static final String BUNDLE_NAME = "org.apache.myfaces.tobago.context.TobagoMessage";
-
-  public TobagoMessageBundle() {
-    super(BUNDLE_NAME);
-  }
-
-
-  public static String getString(final FacesContext facesContext, final String key) {
-    return facesContext.getApplication().getResourceBundle(facesContext, VAR).getString(key);
-  }
-}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/context/TobagoResourceBundle.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/context/TobagoResourceBundle.java
deleted file mode 100644
index 4fa73fc..0000000
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/context/TobagoResourceBundle.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 org.apache.myfaces.tobago.context;
-
-import javax.faces.context.FacesContext;
-
-/**
- * This ResourceBundle encapsulate string resources of Tobago components.
- * This class works like the Java resource bundle mechanism for the resource bundle {@value BUNDLE_NAME}.
- * Supports XML properties files.
- */
-public class TobagoResourceBundle extends TobagoBundle {
-
-  public static final String VAR = "tobagoResourceBundle";
-  public static final String BUNDLE_NAME = "org.apache.myfaces.tobago.context.TobagoResource";
-
-  public TobagoResourceBundle() {
-    super(BUNDLE_NAME);
-  }
-
-  public static String getString(final FacesContext facesContext, final String key) {
-    return facesContext.getApplication().getResourceBundle(facesContext, VAR).getString(key);
-  }
-}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIFile.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIFile.java
index 0ae94ac..46ebb8c 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIFile.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIFile.java
@@ -56,8 +56,8 @@ public abstract class AbstractUIFile extends UIInput implements SupportsLabelLay
   }
 
   private void addErrorMessage(final FacesContext facesContext) {
-    MessageUtils.addMessage(
-        facesContext, this, FacesMessage.SEVERITY_ERROR, REQUIRED_MESSAGE_ID, new Object[]{getId()});
+    facesContext.addMessage(getClientId(facesContext),
+        MessageUtils.getMessage(facesContext, FacesMessage.SEVERITY_ERROR, REQUIRED_MESSAGE_ID, getId()));
   }
 
   public abstract boolean isDisabled();
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectBoolean.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectBoolean.java
index 82f78d6..816bb40 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectBoolean.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectBoolean.java
@@ -54,8 +54,8 @@ public abstract class AbstractUISelectBoolean extends UISelectBoolean
       if (convertedValue instanceof Boolean && !((Boolean) convertedValue)
           // String: e. g. if there is no ValueExpression
           || convertedValue instanceof String && !Boolean.parseBoolean((String) convertedValue)) {
-        MessageUtils.addMessage(
-            facesContext, this, FacesMessage.SEVERITY_ERROR, REQUIRED_MESSAGE_ID, new Object[]{getId()});
+        facesContext.addMessage(getClientId(facesContext),
+            MessageUtils.getMessage(facesContext, FacesMessage.SEVERITY_ERROR, REQUIRED_MESSAGE_ID, getId()));
         setValid(false);
         return;
       }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectOneBase.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectOneBase.java
index 696edb4..0a01357 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectOneBase.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectOneBase.java
@@ -24,7 +24,6 @@ import org.apache.myfaces.tobago.component.Visual;
 import org.apache.myfaces.tobago.util.MessageUtils;
 
 import javax.faces.application.FacesMessage;
-import javax.faces.component.UIInput;
 import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.context.FacesContext;
 
@@ -38,7 +37,7 @@ public abstract class AbstractUISelectOneBase extends javax.faces.component.UISe
 
   @Override
   public void validate(final FacesContext facesContext) {
-    if (isRequired()  && !isReadonly()) {
+    if (isRequired() && !isReadonly()) {
       final Object submittedValue = getSubmittedValue();
       if (submittedValue == null || "".equals(submittedValue)) {
         if (getRequiredMessage() != null) {
@@ -46,8 +45,9 @@ public abstract class AbstractUISelectOneBase extends javax.faces.component.UISe
           facesContext.addMessage(getClientId(facesContext), new FacesMessage(FacesMessage.SEVERITY_ERROR,
               requiredMessage, requiredMessage));
         } else {
-          MessageUtils.addMessage(facesContext, this, FacesMessage.SEVERITY_ERROR,
-              UIInput.REQUIRED_MESSAGE_ID, new Object[]{MessageUtils.getLabel(facesContext, this)});
+          facesContext.addMessage(getClientId(facesContext),
+              MessageUtils.getMessage(facesContext, FacesMessage.SEVERITY_ERROR, MESSAGE_VALUE_REQUIRED,
+                  MessageUtils.getLabel(facesContext, this)));
         }
         setValid(false);
       }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISheet.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISheet.java
index 48be4f4..b9174c4 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISheet.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISheet.java
@@ -72,6 +72,7 @@ public abstract class AbstractUISheet extends AbstractUIData
   public static final String COMPONENT_TYPE = "org.apache.myfaces.tobago.Data";
 
   public static final String SORTER_ID = "sorter";
+  public static final String NOT_SORTABLE_COL_MESSAGE_ID = "org.apache.myfaces.tobago.Sheet.SORTING_COL_ERROR";
   public static final String NOT_SORTABLE_MESSAGE_ID = "org.apache.myfaces.tobago.Sheet.SORTING_ERROR";
 
   private SheetState state;
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FileRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FileRenderer.java
index e01226e..d828f14 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FileRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FileRenderer.java
@@ -20,7 +20,6 @@
 package org.apache.myfaces.tobago.internal.renderkit.renderer;
 
 import org.apache.myfaces.tobago.context.TobagoContext;
-import org.apache.myfaces.tobago.context.TobagoResourceBundle;
 import org.apache.myfaces.tobago.internal.component.AbstractUIFile;
 import org.apache.myfaces.tobago.internal.util.HtmlRendererUtils;
 import org.apache.myfaces.tobago.internal.util.HttpPartWrapper;
@@ -36,6 +35,7 @@ import org.apache.myfaces.tobago.renderkit.html.HtmlButtonTypes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
 import org.apache.myfaces.tobago.renderkit.html.HtmlInputTypes;
 import org.apache.myfaces.tobago.util.ComponentUtils;
+import org.apache.myfaces.tobago.util.ResourceUtils;
 import org.apache.myfaces.tobago.validator.FileItemValidator;
 import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
 import org.slf4j.Logger;
@@ -164,7 +164,7 @@ public class FileRenderer extends MessageLayoutRendererBase implements Component
     writer.writeIdAttribute(fieldId);
     writer.writeClassAttribute(TobagoClass.FILE__REAL);
     writer.writeNameAttribute(clientId);
-    final String multiFormat = TobagoResourceBundle.getString(facesContext, "tobago.file.multiFormat");
+    final String multiFormat = ResourceUtils.getString(facesContext,"tobago.file.multiFormat");
     writer.writeAttribute(DataAttributes.dynamic("tobago-file-multi-format"), multiFormat, true);
     // readonly seems not making sense in browsers.
     writer.writeAttribute(HtmlAttributes.DISABLED, file.isDisabled() || file.isReadonly());
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ObjectRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ObjectRenderer.java
index d1b43d9..b342c6d 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ObjectRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ObjectRenderer.java
@@ -21,7 +21,6 @@ package org.apache.myfaces.tobago.internal.renderkit.renderer;
 
 import org.apache.myfaces.tobago.component.UIObject;
 import org.apache.myfaces.tobago.context.Markup;
-import org.apache.myfaces.tobago.context.TobagoResourceBundle;
 import org.apache.myfaces.tobago.internal.util.HtmlRendererUtils;
 import org.apache.myfaces.tobago.internal.util.JsonUtils;
 import org.apache.myfaces.tobago.renderkit.RendererBase;
@@ -29,6 +28,7 @@ import org.apache.myfaces.tobago.renderkit.css.TobagoClass;
 import org.apache.myfaces.tobago.renderkit.html.DataAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
+import org.apache.myfaces.tobago.util.ResourceUtils;
 import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
 
 import javax.faces.component.UIComponent;
@@ -60,14 +60,12 @@ public class ObjectRenderer extends RendererBase {
         object.getCustomClass(),
         markup != null && markup.contains(Markup.SPREAD) ? TobagoClass.SPREAD : null);
 
-    String noframes = TobagoResourceBundle.getString(facesContext, "browser.noframe.message.prefix");
-    writer.writeText(noframes);
+    writer.writeText(ResourceUtils.getString(facesContext, "browser.noframe.message.prefix"));
     writer.writeText(" ");
     if (object.getSrc() != null) {
       writer.writeText(object.getSrc());
     }
-    noframes = TobagoResourceBundle.getString(facesContext, "browser.noframe.message.postfix");
-    writer.writeText(" " + noframes);
+    writer.writeText(" " + ResourceUtils.getString(facesContext, "browser.noframe.message.postfix"));
 
     writer.endElement(HtmlElements.IFRAME);
   }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/PageRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/PageRenderer.java
index a31df82..4dcf0e2 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/PageRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/PageRenderer.java
@@ -29,7 +29,6 @@ import org.apache.myfaces.tobago.config.TobagoConfig;
 import org.apache.myfaces.tobago.context.Markup;
 import org.apache.myfaces.tobago.context.Theme;
 import org.apache.myfaces.tobago.context.TobagoContext;
-import org.apache.myfaces.tobago.context.TobagoResourceBundle;
 import org.apache.myfaces.tobago.internal.component.AbstractUIMeta;
 import org.apache.myfaces.tobago.internal.component.AbstractUIPage;
 import org.apache.myfaces.tobago.internal.component.AbstractUIScript;
@@ -51,6 +50,7 @@ import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
 import org.apache.myfaces.tobago.renderkit.html.HtmlInputTypes;
 import org.apache.myfaces.tobago.util.ComponentUtils;
+import org.apache.myfaces.tobago.util.ResourceUtils;
 import org.apache.myfaces.tobago.webapp.Secret;
 import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
 import org.slf4j.Logger;
@@ -358,7 +358,7 @@ public class PageRenderer extends RendererBase {
     writer.startElement(HtmlElements.NOSCRIPT);
     writer.startElement(HtmlElements.DIV);
     writer.writeClassAttribute(TobagoClass.PAGE__NOSCRIPT);
-    writer.writeText(TobagoResourceBundle.getString(facesContext, "pageNoscript"));
+    writer.writeText(ResourceUtils.getString(facesContext, "pageNoscript"));
     writer.endElement(HtmlElements.DIV);
     writer.endElement(HtmlElements.NOSCRIPT);
     writer.endElement(HtmlElements.DIV);
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java
index 5830322..84f3112 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java
@@ -30,7 +30,6 @@ import org.apache.myfaces.tobago.component.UIPanel;
 import org.apache.myfaces.tobago.component.UIReload;
 import org.apache.myfaces.tobago.component.UISheet;
 import org.apache.myfaces.tobago.context.Markup;
-import org.apache.myfaces.tobago.context.TobagoResourceBundle;
 import org.apache.myfaces.tobago.event.PageActionEvent;
 import org.apache.myfaces.tobago.event.SheetAction;
 import org.apache.myfaces.tobago.event.SortActionEvent;
@@ -69,6 +68,7 @@ import org.apache.myfaces.tobago.renderkit.html.HtmlButtonTypes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
 import org.apache.myfaces.tobago.renderkit.html.HtmlInputTypes;
 import org.apache.myfaces.tobago.util.ComponentUtils;
+import org.apache.myfaces.tobago.util.ResourceUtils;
 import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -374,7 +374,7 @@ public class SheetRenderer extends RendererBase {
         writer.startElement(HtmlElements.LI);
         writer.writeClassAttribute(BootstrapClass.PAGE_ITEM);
         writer.writeAttribute(HtmlAttributes.TITLE,
-            TobagoResourceBundle.getString(facesContext, "sheetPagingInfoRowPagingTip"), true);
+            ResourceUtils.getString(facesContext, "sheetPagingInfoRowPagingTip"), true);
         writer.startElement(HtmlElements.SPAN);
         writer.writeClassAttribute(TobagoClass.SHEET__PAGING_TEXT, BootstrapClass.PAGE_LINK);
         if (sheet.getRowCount() != 0) {
@@ -400,8 +400,7 @@ public class SheetRenderer extends RendererBase {
           }
           final String inputMarker = "{#}";
           final Object[] args = {inputMarker, last1 == -1 ? "?" : last1, unknown ? "" : sheet.getRowCount()};
-          final MessageFormat detail = new MessageFormat(
-              TobagoResourceBundle.getString(facesContext, key), locale);
+          final MessageFormat detail = new MessageFormat(ResourceUtils.getString(facesContext, key), locale);
           final String formatted = detail.format(args);
           final int pos = formatted.indexOf(inputMarker);
           if (pos >= 0) {
@@ -425,7 +424,7 @@ public class SheetRenderer extends RendererBase {
             writer.writeText(formatted);
           }
         } else {
-          writer.write(TobagoResourceBundle.getString(facesContext, "sheetPagingInfoEmptyRow"));
+          writer.write(ResourceUtils.getString(facesContext, "sheetPagingInfoEmptyRow"));
         }
         ComponentUtils.removeFacet(sheet, Facets.pagerRow);
         writer.endElement(HtmlElements.SPAN);
@@ -474,7 +473,7 @@ public class SheetRenderer extends RendererBase {
         writer.startElement(HtmlElements.SPAN);
         writer.writeClassAttribute(TobagoClass.SHEET__PAGING_TEXT, BootstrapClass.PAGE_LINK);
         writer.writeAttribute(HtmlAttributes.TITLE,
-            TobagoResourceBundle.getString(facesContext, "sheetPagingInfoPagePagingTip"), true);
+            ResourceUtils.getString(facesContext, "sheetPagingInfoPagePagingTip"), true);
         if (sheet.getRowCount() != 0) {
           final Locale locale = facesContext.getViewRoot().getLocale();
           final int first = sheet.getCurrentPage() + 1;
@@ -496,8 +495,7 @@ public class SheetRenderer extends RendererBase {
           }
           final String inputMarker = "{#}";
           final Object[] args = {inputMarker, pages == -1 ? "?" : pages};
-          final MessageFormat detail = new MessageFormat(
-              TobagoResourceBundle.getString(facesContext, key), locale);
+          final MessageFormat detail = new MessageFormat(ResourceUtils.getString(facesContext, key), locale);
           final String formatted = detail.format(args);
           final int pos = formatted.indexOf(inputMarker);
           if (pos >= 0) {
@@ -521,7 +519,7 @@ public class SheetRenderer extends RendererBase {
             writer.writeText(formatted);
           }
         } else {
-          writer.writeText(TobagoResourceBundle.getString(facesContext, "sheetPagingInfoEmptyPage"));
+          writer.writeText(ResourceUtils.getString(facesContext, "sheetPagingInfoEmptyPage"));
         }
         ComponentUtils.removeFacet(sheet, Facets.pagerPage);
         writer.endElement(HtmlElements.SPAN);
@@ -950,7 +948,7 @@ public class SheetRenderer extends RendererBase {
                 } else {
                   tip += " - ";
                 }
-                tip += TobagoResourceBundle.getString(facesContext, "sheetTipSorting");
+                tip += ResourceUtils.getString(facesContext, "sheetTipSorting");
 
                 markup = markup.add(Markup.SORTABLE);
 
@@ -958,10 +956,10 @@ public class SheetRenderer extends RendererBase {
                 if (column.getId().equals(sheetState.getSortedColumnId())) {
                   final String sortTitle;
                   if (sheetState.isAscending()) {
-                    sortTitle = TobagoResourceBundle.getString(facesContext, "sheetAscending");
+                    sortTitle = ResourceUtils.getString(facesContext, "sheetAscending");
                     markup = markup.add(Markup.ASCENDING);
                   } else {
-                    sortTitle = TobagoResourceBundle.getString(facesContext, "sheetDescending");
+                    sortTitle = ResourceUtils.getString(facesContext, "sheetDescending");
                     markup = markup.add(Markup.DESCENDING);
                   }
                   if (sortTitle != null) {
@@ -981,7 +979,7 @@ public class SheetRenderer extends RendererBase {
               writer.writeClassAttribute(TobagoClass.SHEET__COLUMN_SELECTOR);
               writer.writeAttribute(
                   HtmlAttributes.TITLE,
-                  TobagoResourceBundle.getString(facesContext, "sheetMenuSelect"),
+                  ResourceUtils.getString(facesContext, "sheetMenuSelect"),
                   true);
               writer.endElement(HtmlElements.INPUT);
             } else {
@@ -1092,7 +1090,7 @@ public class SheetRenderer extends RendererBase {
     }
 
     final Locale locale = facesContext.getViewRoot().getLocale();
-    final String message = TobagoResourceBundle.getString(facesContext, action.getBundleKey());
+    final String message = ResourceUtils.getString(facesContext, action.getBundleKey());
     final String tip = new MessageFormat(message, locale).format(new Integer[]{target}); // needed fot ToPage
 
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/util/MessageUtils.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/util/MessageUtils.java
index aaed48f..919517b68 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/util/MessageUtils.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/util/MessageUtils.java
@@ -20,13 +20,11 @@
 package org.apache.myfaces.tobago.util;
 
 import org.apache.myfaces.tobago.application.LabelValueExpressionFacesMessage;
-import org.apache.myfaces.tobago.context.TobagoContext;
-import org.apache.myfaces.tobago.context.TobagoMessageBundle;
-import org.apache.myfaces.tobago.context.TobagoResourceBundle;
 
 import javax.el.ValueExpression;
 import javax.faces.application.FacesMessage;
 import javax.faces.component.UIComponent;
+import javax.faces.component.UIViewRoot;
 import javax.faces.context.FacesContext;
 import java.text.MessageFormat;
 import java.util.Locale;
@@ -34,8 +32,9 @@ import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 
 /**
- * Utility to create and add {@link FacesMessage} object to the context. The message will be internationalized with a
- * bundle in the following order: <ol> <li>Application bundle</li> <li>Tobago bundle</li> <li>Default JSF bundle</li>
+ * Utility to get internationalized error messages and create and add {@link FacesMessage} object to the context. The
+ * message will be internationalized with a bundle in the following order: <ol> <li>Application bundle</li> <li>Tobago
+ * bundle</li> <li>Default JSF bundle</li>
  * </ol>
  */
 public final class MessageUtils {
@@ -45,14 +44,30 @@ public final class MessageUtils {
   private MessageUtils() {
   }
 
+  /**
+   * @deprecated Since 5.0.0. Please use {@link #getMessage(FacesContext, FacesMessage.Severity, String, Object...)}.
+   */
+  @Deprecated
   public static void addMessage(
       final FacesContext facesContext, final UIComponent component, final FacesMessage.Severity severity,
       final String messageId, final Object[] args) {
     facesContext.addMessage(component != null ? component.getClientId(facesContext) : null,
-        getMessage(facesContext, facesContext.getViewRoot().getLocale(), severity, messageId, args));
+        getMessage(facesContext, severity, messageId, args));
   }
 
   public static FacesMessage getMessage(
+      final FacesContext facesContext, final FacesMessage.Severity severity, final String messageId,
+      final Object... args) {
+    final UIViewRoot viewRoot = facesContext.getViewRoot();
+    final Locale locale = viewRoot != null ? viewRoot.getLocale() : null;
+    return getMessage(facesContext, locale, severity, messageId, args);
+  }
+
+  /**
+   * @deprecated Since 5.0.0. Please use {@link #getMessage(FacesContext, FacesMessage.Severity, String, Object...)}.
+   */
+  @Deprecated
+  public static FacesMessage getMessage(
       final FacesContext facesContext, final Locale locale,
       final FacesMessage.Severity severity, final String messageId, final Object... args) {
 
@@ -61,7 +76,8 @@ public final class MessageUtils {
     String detail = getBundleString(appBundle, messageId + DETAIL_SUFFIX);
 
     if (summary == null || detail == null) {
-      final TobagoMessageBundle tobagoMessages = TobagoContext.getInstance(facesContext).getMessageBundle();
+      final ResourceBundle tobagoMessages
+          = ResourceBundle.getBundle("org.apache.myfaces.tobago.context.TobagoMessageBundle", locale);
       if (summary == null) {
         summary = getBundleString(tobagoMessages, messageId);
       }
@@ -70,7 +86,8 @@ public final class MessageUtils {
       }
 
       if (summary == null || detail == null) {
-        final TobagoResourceBundle tobagoBundle = TobagoContext.getInstance(facesContext).getResourceBundle();
+        final ResourceBundle tobagoBundle
+            = ResourceBundle.getBundle("org.apache.myfaces.tobago.context.TobagoResourceBundle", locale);
         if (summary == null) {
           summary = getBundleString(tobagoBundle, messageId);
         }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/util/ResourceUtils.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/util/ResourceUtils.java
new file mode 100644
index 0000000..ca33afb
--- /dev/null
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/util/ResourceUtils.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.myfaces.tobago.util;
+
+import javax.faces.application.Application;
+import javax.faces.context.FacesContext;
+import java.util.ResourceBundle;
+
+public class ResourceUtils {
+
+  public static final String TOBAGO_RESOURCE_BUNDLE = "tobagoResourceBundle";
+
+  public static String getString(final String key) {
+    final FacesContext facesContext = FacesContext.getCurrentInstance();
+    final Application application = facesContext.getApplication();
+    final ResourceBundle resourceBundle = application.getResourceBundle(facesContext, TOBAGO_RESOURCE_BUNDLE);
+    return resourceBundle.getString(key);
+  }
+
+  public static String getString(final FacesContext facesContext, final String key) {
+    return facesContext.getApplication().getResourceBundle(facesContext, TOBAGO_RESOURCE_BUNDLE).getString(key);
+  }
+
+  public static String getString(final FacesContext facesContext, final Application application, final String key) {
+    return application.getResourceBundle(facesContext, TOBAGO_RESOURCE_BUNDLE).getString(key);
+  }
+
+  public static String getString(final String bundle, final String key) {
+    final FacesContext facesContext = FacesContext.getCurrentInstance();
+    return facesContext.getApplication().getResourceBundle(facesContext, bundle).getString(key);
+  }
+
+  public static String getString(final FacesContext facesContext, final String bundle, final String key) {
+    return facesContext.getApplication().getResourceBundle(facesContext, bundle).getString(key);
+  }
+
+  public static String getString(
+      final FacesContext facesContext, final Application application, final String bundle, final String key) {
+    return application.getResourceBundle(facesContext, bundle).getString(key);
+  }
+}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/validator/FileItemValidator.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/validator/FileItemValidator.java
index e5bd3c9..55dda6f 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/validator/FileItemValidator.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/validator/FileItemValidator.java
@@ -57,10 +57,8 @@ public class FileItemValidator implements Validator, StateHolder {
     if (value != null && component instanceof AbstractUIFile) {
       final Part file = (Part) value;
       if (maxSize != null && file.getSize() > maxSize) {
-        final FacesMessage facesMessage = MessageUtils.getMessage(
-            facesContext, facesContext.getViewRoot().getLocale(), FacesMessage.SEVERITY_ERROR,
-            SIZE_LIMIT_MESSAGE_ID, maxSize, component.getId());
-        throw new ValidatorException(facesMessage);
+        throw new ValidatorException(MessageUtils.getMessage(
+            facesContext, FacesMessage.SEVERITY_ERROR, SIZE_LIMIT_MESSAGE_ID, maxSize, component.getId()));
       }
       // Check only a valid file
       if (file.getSize() > 0 && contentType != null && contentType.length > 0) {
@@ -78,10 +76,8 @@ public class FileItemValidator implements Validator, StateHolder {
           } else {
             message = Arrays.toString(contentType);
           }
-          final FacesMessage facesMessage = MessageUtils.getMessage(
-              facesContext, facesContext.getViewRoot().getLocale(), FacesMessage.SEVERITY_ERROR,
-              CONTENT_TYPE_MESSAGE_ID, message, component.getId());
-          throw new ValidatorException(facesMessage);
+          throw new ValidatorException(MessageUtils.getMessage(
+              facesContext, FacesMessage.SEVERITY_ERROR, CONTENT_TYPE_MESSAGE_ID, message, component.getId()));
         }
       }
     }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/validator/SubmittedValueLengthValidator.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/validator/SubmittedValueLengthValidator.java
index b907530..6dad7d3 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/validator/SubmittedValueLengthValidator.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/validator/SubmittedValueLengthValidator.java
@@ -83,16 +83,12 @@ public class SubmittedValueLengthValidator extends LengthValidator {
     if (value != null && uiComponent instanceof EditableValueHolder) {
       final String submittedValue = ((EditableValueHolder) uiComponent).getSubmittedValue().toString();
       if (maximum != null && submittedValue.length() > maximum) {
-        final Object[] args = {maximum, uiComponent.getId()};
-        final FacesMessage facesMessage = MessageUtils.getMessage(facesContext,
-            facesContext.getViewRoot().getLocale(), FacesMessage.SEVERITY_ERROR, MAXIMUM_MESSAGE_ID, args);
-        throw new ValidatorException(facesMessage);
+        throw new ValidatorException(MessageUtils.getMessage(
+            facesContext, FacesMessage.SEVERITY_ERROR, MAXIMUM_MESSAGE_ID, maximum, uiComponent.getId()));
       }
       if (minimum != null && submittedValue.length() < minimum) {
-        final Object[] args = {minimum, uiComponent.getId()};
-        final FacesMessage facesMessage = MessageUtils.getMessage(facesContext,
-            facesContext.getViewRoot().getLocale(), FacesMessage.SEVERITY_ERROR, MINIMUM_MESSAGE_ID, args);
-        throw new ValidatorException(facesMessage);
+        throw new ValidatorException(MessageUtils.getMessage(
+            facesContext, FacesMessage.SEVERITY_ERROR, MINIMUM_MESSAGE_ID, minimum, uiComponent.getId()));
       }
     }
   }
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessage.xml b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessage.xml
deleted file mode 100644
index c1b1457..0000000
--- a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessage.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
--->
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-
-<properties>
-
-  <!-- requiredvalidator -->
-  <entry key="tobago.requiredvalidator.message.empty.summary">Required field.</entry>
-  <entry key="tobago.requiredvalidator.message.empty.detail">Field is required.</entry>
-
-  <!-- longrangevalidator -->
-  <entry key="tobago.longrangevalidator.message.range.summary">Not in range.</entry>
-  <entry key="tobago.longrangevalidator.message.range.detail">Value must be between {0} and {1}.</entry>
-  <entry key="tobago.longrangevalidator.message.type.summary">Wrong type.</entry>
-  <entry key="tobago.longrangevalidator.message.type.detail">Value is not of the correct type.</entry>
-  <entry key="tobago.message.number_conversion_error.summary">Unable to convert number.</entry>
-  <entry key="tobago.message.number_conversion_error.detail">Unable to convert ''{0}'' to number type {1}.</entry>
-  <entry key="tobago.message.conversion_error.summary">Unable to convert.</entry>
-  <entry key="tobago.message.conversion_error.detail">Unable to convert ''{0}'' to type {1}.</entry>
-  <entry key="tobago.tree.MESSAGE_NOT_LEAF">Only leaf selection allowed.</entry>
-  <entry key="tobago.SelectOne.MESSAGE_VALUE_REQUIRED">Selection required</entry>
-
-  <entry key="org.apache.myfaces.tobago.Sheet.SORTING_ERROR">Sorting not possible!</entry>
-  <entry key="org.apache.myfaces.tobago.Sheet.SORTING_ERROR_detail">Can't sort the column ''{0}''!</entry>
-  <entry key="org.apache.myfaces.tobago.FileItemValidator.CONTENT_TYPE">Content type error</entry>
-  <entry key="org.apache.myfaces.tobago.FileItemValidator.CONTENT_TYPE_detail">The given file is not content type of "{0}".</entry>
-  <entry key="org.apache.myfaces.tobago.FileItemValidator.SIZE_LIMIT">File size error</entry>
-  <entry key="org.apache.myfaces.tobago.FileItemValidator.SIZE_LIMIT_detail">The uploaded file exceeded the maximum size of {0} bytes.</entry>
-
-</properties>
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessageBundle.properties b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessageBundle.properties
new file mode 100644
index 0000000..f9c29c9
--- /dev/null
+++ b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessageBundle.properties
@@ -0,0 +1,21 @@
+#Converted from './tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessage.xml'
+#Thu Sep 20 20:54:31 CEST 2018
+org.apache.myfaces.tobago.FileItemValidator.CONTENT_TYPE=Content type error
+org.apache.myfaces.tobago.FileItemValidator.CONTENT_TYPE_detail=The given file is not content type of ''{0}''.
+org.apache.myfaces.tobago.FileItemValidator.SIZE_LIMIT=File too large
+org.apache.myfaces.tobago.FileItemValidator.SIZE_LIMIT_detail=The uploaded file exceeded the maximum size of {0} bytes.
+org.apache.myfaces.tobago.Sheet.SORTING_ERROR=Sorting not possible!
+org.apache.myfaces.tobago.Sheet.SORTING_COL_ERROR_detail=Can't sort the column ''{0}''\!
+tobago.SelectOne.MESSAGE_VALUE_REQUIRED=Selection required
+tobago.longrangevalidator.message.range.detail=Value must be between {0} and {1}.
+tobago.longrangevalidator.message.range.summary=Not in range.
+tobago.longrangevalidator.message.type.detail=Value is not of the correct type.
+tobago.longrangevalidator.message.type.summary=Wrong type.
+tobago.message.conversion_error.detail=Unable to convert ''{0}'' to type {1}.
+tobago.message.conversion_error.summary=Unable to convert.
+tobago.message.number_conversion_error.detail=Unable to convert ''{0}'' to number type {1}.
+tobago.message.number_conversion_error.summary=Unable to convert number.
+tobago.requiredvalidator.message.empty.detail=Field is required.
+tobago.requiredvalidator.message.empty.summary=Required field.
+tobago.tree.MESSAGE_NOT_LEAF=Only leaf selection allowed.
+org.apache.myfaces.tobago.Sheet.SORTING_COL_ERROR=Sorting not possible!
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessageBundle_de.properties b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessageBundle_de.properties
new file mode 100644
index 0000000..2888447
--- /dev/null
+++ b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessageBundle_de.properties
@@ -0,0 +1,22 @@
+#Converted from './tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessage_de.xml'
+#Thu Sep 20 20:54:31 CEST 2018
+org.apache.myfaces.tobago.FileItemValidator.CONTENT_TYPE=Dateityp Fehler
+org.apache.myfaces.tobago.FileItemValidator.CONTENT_TYPE_detail=Die hochgeladene Datei ist nicht vom Typ ''{0}''.
+org.apache.myfaces.tobago.FileItemValidator.SIZE_LIMIT=Datei zu gro\u00DF
+org.apache.myfaces.tobago.FileItemValidator.SIZE_LIMIT_detail=Die Gr\u00F6\u00DFe der hochgeladenen Datei darf nicht gr\u00F6\u00DFer als {1} Bytes sein.
+org.apache.myfaces.tobago.Sheet.SORTING_ERROR=Sortieren nicht m\u00F6glich!
+org.apache.myfaces.tobago.Sheet.SORTING_COL_ERROR_detail=Nach Spalte ''{0}'' kann nicht sortiert werden\!
+tobago.SelectOne.MESSAGE_VALUE_REQUIRED=Eine Auswahl wird ben\u00F6tigt\!
+tobago.ajax.response.error=Server Error\: Fehler beim Bearbeiten der Anfrage. Eventuell ein Session Timeout\!
+tobago.longrangevalidator.message.range.detail=Wert muss zwischen {0} und {1} liegen.
+tobago.longrangevalidator.message.range.summary=Bereichs\u00FCberschreitung.
+tobago.longrangevalidator.message.type.detail=Wert hat den falschen Typ.
+tobago.longrangevalidator.message.type.summary=Falscher Typ.
+tobago.message.conversion_error.detail=''{0}'' kann nicht zum Typ {1} umgewandelt werden.
+tobago.message.conversion_error.summary=Konvertierung nicht m\u00F6glich.
+tobago.message.number_conversion_error.detail=''{0}'' kann nicht zum Typ {1} umgewandelt werden.
+tobago.message.number_conversion_error.summary=Zahl kann nicht konvertiert werden.
+tobago.requiredvalidator.message.empty.detail=Feld ben\u00F6tigt eine Eingabe\!
+tobago.requiredvalidator.message.empty.summary=Pflichtfeld
+tobago.tree.MESSAGE_NOT_LEAF=Es d\u00FCrfen nur Endknoten ausgew\u00E4hlt werden.
+org.apache.myfaces.tobago.Sheet.SORTING_COL_ERROR=Sortieren nicht m\u00F6glich!
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessageBundle_en.properties b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessageBundle_en.properties
new file mode 100644
index 0000000..68325fa
--- /dev/null
+++ b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessageBundle_en.properties
@@ -0,0 +1 @@
+# dummy
\ No newline at end of file
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessageBundle_es.properties b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessageBundle_es.properties
new file mode 100644
index 0000000..7f6624b
--- /dev/null
+++ b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessageBundle_es.properties
@@ -0,0 +1,22 @@
+#Converted from './tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessage_es.xml'
+#Thu Sep 20 20:54:31 CEST 2018
+org.apache.myfaces.tobago.FileItemValidator.CONTENT_TYPE=Error de tipo de contenido
+org.apache.myfaces.tobago.FileItemValidator.CONTENT_TYPE_detail=El archivo no es del tipo de contenido ''{0}''.
+org.apache.myfaces.tobago.FileItemValidator.SIZE_LIMIT=Error en el tama\u00F1o del archivo
+org.apache.myfaces.tobago.FileItemValidator.SIZE_LIMIT_detail=El archivo subido excede el m\u00E1ximo tama\u00F1o de {0} bytes.
+org.apache.myfaces.tobago.Sheet.SORTING_ERROR=No se puede ordenar!
+org.apache.myfaces.tobago.Sheet.SORTING_COL_ERROR_detail=Despu\u00E9s de columna ''{0}'' no se puede ordenar!
+tobago.SelectOne.MESSAGE_VALUE_REQUIRED=Se requiere seleccionar.
+tobago.ajax.response.error=Error en el servidor: No hay respuesta del servidor. Probablemente debido a un tiempo agotado de sesion!
+tobago.longrangevalidator.message.range.detail=El valor debe de ser entre {0} y {1}.
+tobago.longrangevalidator.message.range.summary=Fuera de rango.
+tobago.longrangevalidator.message.type.detail=El valor no es del tipo correcto.
+tobago.longrangevalidator.message.type.summary=Tipo erroneo.
+tobago.message.conversion_error.detail=No se puede convertir ''{0}'' al tipo {1}.
+tobago.message.conversion_error.summary=No se puede convertir.
+tobago.message.number_conversion_error.detail=No se puede convertir ''{0}'' a tipo de n\u00FAmero {1}.
+tobago.message.number_conversion_error.summary=N\u00FAmero no se puede convertir.
+tobago.requiredvalidator.message.empty.detail=Campo es requerido.
+tobago.requiredvalidator.message.empty.summary=Campo requerido.
+tobago.tree.MESSAGE_NOT_LEAF=Solo se permite seleccionar hojas.
+org.apache.myfaces.tobago.Sheet.SORTING_COL_ERROR=No se puede ordenar!
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessage_de.xml b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessage_de.xml
deleted file mode 100644
index d475d3d..0000000
--- a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessage_de.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
--->
-<!-- $Source$ -->
-
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-
-<properties>
-
-  <!-- requiredvalidator -->
-  <entry key="tobago.requiredvalidator.message.empty.summary">Pflichtfeld</entry>
-  <entry key="tobago.requiredvalidator.message.empty.detail">Feld benötigt eine Eingabe!</entry>
-
-  <!-- longrangevalidator -->
-  <entry key="tobago.longrangevalidator.message.range.summary">Bereichsüberschreitung.</entry>
-  <entry key="tobago.longrangevalidator.message.range.detail">Wert muss zwischen {0} und {1} liegen.</entry>
-  <entry key="tobago.longrangevalidator.message.type.summary">Falscher Typ.</entry>
-  <entry key="tobago.longrangevalidator.message.type.detail">Wert hat den falschen Typ.</entry>
-  <entry key="tobago.message.number_conversion_error.summary">Zahl kann nicht konvertiert werden.</entry>
-  <entry key="tobago.message.number_conversion_error.detail">''{0}'' kann nicht zum Typ {1} umgewandelt werden.</entry>
-  <entry key="tobago.message.conversion_error.summary">Konvertierung nicht möglich.</entry>
-  <entry key="tobago.message.conversion_error.detail">''{0}'' kann nicht zum Typ {1} umgewandelt werden.</entry>
-  <entry key="tobago.tree.MESSAGE_NOT_LEAF">Es dürfen nur Endknoten ausgewählt werden.</entry>
-  <entry key="tobago.SelectOne.MESSAGE_VALUE_REQUIRED">Eine Auswahl wird benötigt!</entry>
-
-  <entry key="tobago.ajax.response.error">Server Error: Fehler beim Bearbeiten der Anfrage. Eventuell ein Session Timeout!</entry>
-  <entry key="org.apache.myfaces.tobago.Sheet.SORTING_ERROR">Sortieren nicht möglich!</entry>
-  <entry key="org.apache.myfaces.tobago.Sheet.SORTING_ERROR_detail">Nach Spalte ''{0}'' kann nicht sortiert werden!</entry>
-  <entry key="org.apache.myfaces.tobago.FileItemValidator.CONTENT_TYPE">Dateityp Fehler</entry>
-  <entry key="org.apache.myfaces.tobago.FileItemValidator.CONTENT_TYPE_detail">Die hochgeladene Datei ist nicht vom Typ "{0}".</entry>
-  <entry key="org.apache.myfaces.tobago.FileItemValidator.SIZE_LIMIT">Dateigröße Fehler</entry>
-  <entry key="org.apache.myfaces.tobago.FileItemValidator.SIZE_LIMIT_detail">Die Größe der hochgeladenen Datei darf nicht größer als {1} Bytes sein.</entry>
-
-</properties>
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessage_es.xml b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessage_es.xml
deleted file mode 100644
index 6ddd5f4..0000000
--- a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoMessage_es.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
--->
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-
-<properties>
-
-  <!-- requiredvalidator -->
-  <entry key="tobago.requiredvalidator.message.empty.summary">Campo requerido.</entry>
-  <entry key="tobago.requiredvalidator.message.empty.detail">Campo es requerido.</entry>
-
-  <!-- longrangevalidator -->
-  <entry key="tobago.longrangevalidator.message.range.summary">Fuera de rango.</entry>
-  <entry key="tobago.longrangevalidator.message.range.detail">El valor debe de ser entre {0} y {1}.</entry>
-  <entry key="tobago.longrangevalidator.message.type.summary">Tipo erroneo.</entry>
-  <entry key="tobago.longrangevalidator.message.type.detail">El valor no es del tipo correcto.</entry>
-  <entry key="tobago.message.number_conversion_error.summary">Número no se puede convertir.</entry>
-  <entry key="tobago.message.number_conversion_error.detail">No se puede convertir ''{0}'' a tipo de número {1}.</entry>
-  <entry key="tobago.message.conversion_error.summary">No se puede convertir.</entry>
-  <entry key="tobago.message.conversion_error.detail">No se puede convertir ''{0}'' al tipo {1}.</entry>
-  <entry key="tobago.tree.MESSAGE_NOT_LEAF">Solo se permite seleccionar hojas.</entry>
-  <entry key="tobago.SelectOne.MESSAGE_VALUE_REQUIRED">Se requiere seleccionar.</entry>
-
-  <entry key="tobago.ajax.response.error">Error en el servidor: No hay respuesta del servidor. Probablemente debido a un tiempo agotado de sesion!</entry>
-  <entry key="org.apache.myfaces.tobago.Sheet.SORTING_ERROR">Después de columna ''{0}'' no se puede ordenar!</entry>
-  <entry key="org.apache.myfaces.tobago.Sheet.SORTING_ERROR_detail">No se puede ordenar!</entry>
-  <entry key="org.apache.myfaces.tobago.FileItemValidator.CONTENT_TYPE">Error de tipo de contenido</entry>
-  <entry key="org.apache.myfaces.tobago.FileItemValidator.CONTENT_TYPE_detail">El archivo no es del tipo de contenido "{0}".</entry>
-  <entry key="org.apache.myfaces.tobago.FileItemValidator.SIZE_LIMIT">Error en el tamaño del archivo</entry>
-  <entry key="org.apache.myfaces.tobago.FileItemValidator.SIZE_LIMIT_detail">El archivo subido excede el máximo tamaño de {0} bytes.</entry>
-
-</properties>
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResource.xml b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResource.xml
deleted file mode 100644
index c0c855f..0000000
--- a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResource.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
--->
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-
-<properties>
-
-  <!-- Page -->
-  <entry key="pageNoscript">This site requires JavaScript, but JavaScript is currently not activated in your browser. To enable JavaScript you may consult your browsers the documentation.</entry>
-
-  <!-- Client Configuration -->
-  <entry key="configTitle">Client configuration of the Tobago framework</entry>
-  <entry key="configTheme">Theme</entry>
-  <entry key="configThemeText">Which theme should be used?</entry>
-  <entry key="configLocale">Locale</entry>
-  <entry key="configLocaleText">Which locale should be used?</entry>
-  <entry key="configContentType">Content type</entry>
-  <entry key="configContentTypeText">Which Content-Type should be used?</entry>
-  <entry key="configSubmit">Submit</entry>
-  <entry key="configButtonText">Configuration</entry>
-  <entry key="configCachecoverage">Cache coverage</entry>
-
-  <!-- File-->
-  <entry key="tobago.file.multiFormat">{} files selected</entry>
-
-  <!-- Sheet -->
-  <entry key="sheetFirst">First Page</entry>
-  <entry key="sheetPrev">Previous Page</entry>
-  <entry key="sheetNext">Next Page</entry>
-  <entry key="sheetLast">Last Page</entry>
-  <entry key="sheetToPage">Page {0}</entry>
-  <entry key="sheetTipSorting">Click to sort this column</entry>
-  <entry key="sheetAscending">Ascending</entry>
-  <entry key="sheetDescending">Descending</entry>
-  <entry key="sheetPagingInfoRows">Rows {0} to {1} of {2}</entry>
-  <entry key="sheetPagingInfoSingleRow">Row {0} of {2}</entry>
-  <entry key="sheetPagingInfoUndefinedRows">Rows {0} to {1}</entry>
-  <entry key="sheetPagingInfoUndefinedSingleRow">Row {0}</entry>
-  <entry key="sheetPagingInfoEmptyRow">No rows available</entry>
-  <entry key="sheetPagingInfoRowPagingTip">Click here, to change the first displayed row</entry>
-  <entry key="sheetPagingInfoPages">Page {0} of {1}</entry>
-  <entry key="sheetPagingInfoSinglePage">Page {0} of {1}</entry>
-  <entry key="sheetPagingInfoUndefinedPages">Page {0}</entry>
-  <entry key="sheetPagingInfoUndefinedSinglePage">Page {0}</entry>
-  <entry key="sheetPagingInfoEmptyPage"/>
-  <entry key="sheetPagingInfoPagePagingTip">Click here, to change the displayed page</entry>
-  <entry key="sheetMenuSelect">Select all</entry>
-
-  <!-- Tree -->
-  <entry key="treeNew">New</entry>
-  <entry key="treeDelete">Delete</entry>
-  <entry key="treeEdit">Edit</entry>
-  <entry key="treeCut">Cut</entry>
-  <entry key="treeCopy">Copy</entry>
-  <entry key="treePaste">Paste</entry>
-  <entry key="treeMoveUp">Move Up</entry>
-  <entry key="treeMoveDown">Move Down</entry>
-  <entry key="treeNodeNew">New Node</entry>
-
-  <!-- datePicker -->
-  <entry key="datePickerTitle">Date Picker</entry>
-  <entry key="datePickerOk">OK</entry>
-  <entry key="datePickerCancel">Cancel</entry>
-
-  <!-- in - input suggest -->
-  <entry key="tobago.in.inputSuggest.moreElements">There are more matching entries…</entry>
-
-  <!-- messages -->
-  <entry key="tobago.message.confirmation.title">Messages</entry>
-  <entry key="tobago.message.confirmation.okay">OK</entry>
-
-  <entry key="browser.noframe.message.prefix">Your user agent does not support frames or is currently configured not to display frames. However, you may visit the related document manually: </entry>
-  <entry key="browser.noframe.message.postfix"></entry>
-
-</properties>
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle.properties b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle.properties
new file mode 100644
index 0000000..6345249
--- /dev/null
+++ b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle.properties
@@ -0,0 +1,52 @@
+#Converted from './tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResource.xml'
+#Thu Sep 20 20:54:31 CEST 2018
+browser.noframe.message.postfix=
+browser.noframe.message.prefix=Your user agent does not support frames or is currently configured not to display frames. However, you may visit the related document manually\: 
+configButtonText=Configuration
+configCachecoverage=Cache coverage
+configContentType=Content type
+configContentTypeText=Which Content-Type should be used?
+configLocale=Locale
+configLocaleText=Which locale should be used?
+configSubmit=Submit
+configTheme=Theme
+configThemeText=Which theme should be used?
+configTitle=Client configuration of the Tobago framework
+datePickerCancel=Cancel
+datePickerOk=OK
+datePickerTitle=Date Picker
+pageNoscript=This site requires JavaScript, but JavaScript is currently not activated in your browser. To enable JavaScript you may consult your browsers the documentation.
+sheetAscending=Ascending
+sheetDescending=Descending
+sheetFirst=First Page
+sheetLast=Last Page
+sheetMenuSelect=Select all
+sheetNext=Next Page
+sheetPagingInfoEmptyPage=
+sheetPagingInfoEmptyRow=No rows available
+sheetPagingInfoPagePagingTip=Click here, to change the displayed page
+sheetPagingInfoPages=Page {0} of {1}
+sheetPagingInfoRowPagingTip=Click here, to change the first displayed row
+sheetPagingInfoRows=Rows {0} to {1} of {2}
+sheetPagingInfoSinglePage=Page {0} of {1}
+sheetPagingInfoSingleRow=Row {0} of {2}
+sheetPagingInfoUndefinedPages=Page {0}
+sheetPagingInfoUndefinedRows=Rows {0} to {1}
+sheetPagingInfoUndefinedSinglePage=Page {0}
+sheetPagingInfoUndefinedSingleRow=Row {0}
+sheetPrev=Previous Page
+sheetTipSorting=Click to sort this column
+sheetToPage=Page {0}
+tobago.file.multiFormat={} files selected
+tobago.in.inputSuggest.moreElements=There are more matching entries\u2026
+tobago.message.confirmation.okay=OK
+tobago.message.confirmation.title=Messages
+treeCopy=Copy
+treeCut=Cut
+treeDelete=Delete
+treeEdit=Edit
+treeMoveDown=Move Down
+treeMoveUp=Move Up
+treeNew=New
+treeNodeNew=New Node
+treePaste=Paste
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_de.properties b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_de.properties
new file mode 100644
index 0000000..22c83de
--- /dev/null
+++ b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_de.properties
@@ -0,0 +1,51 @@
+#Converted from './tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResource_de.xml'
+#Thu Sep 20 20:54:31 CEST 2018
+browser.noframe.message.postfix=
+browser.noframe.message.prefix=Ihr Browser stellt keine so genannten Frames dar. Den Inhalt k\u00F6nnen Sie hier erreichen\:
+configButtonText=Einstellungen
+configCachecoverage=Cache Abdeckung
+configContentType=Inhaltstyp
+configContentTypeText=Welcher Inhaltstyp (Content-Type) soll verwendet werden?
+configLocale=Sprache
+configLocaleText=Welche Sprache/Region soll verwendet werden?
+configSubmit=\u00C4ndern
+configTheme=Design
+configThemeText=Welches Design soll verwendet werden?
+configTitle=Konfiguration des Clients des Tobago-Frameworks
+datePickerCancel=Abbrechen
+datePickerOk=OK
+datePickerTitle=Datumsauswahl
+pageNoscript=Diese Seite ben\u00F6tigt JavaScript, allerdings ist JavaScript in Ihrem Browser derzeit deaktiviert. Um JavaScript zu aktivieren, lesen Sie ggf. die Anleitung Ihres Browsers.
+sheetAscending=aufsteigend sortiert
+sheetDescending=absteigend sortiert
+sheetFirst=erste Seite
+sheetLast=letzte Seite
+sheetMenuSelect=Alles ausw\u00E4hlen
+sheetNext=n\u00E4chste Seite
+sheetPagingInfoEmptyPage=
+sheetPagingInfoEmptyRow=Keine Zeilen verf&uuml;gbar
+sheetPagingInfoPagePagingTip=Hier klicken, zum Eingeben der anzuzeigenden Seite.
+sheetPagingInfoPages=Seite {0} von {1}
+sheetPagingInfoRowPagingTip=Hier klicken, zum Eingeben der ersten anzuzeigenden Zeile.
+sheetPagingInfoRows=Zeilen {0} bis {1} von {2}
+sheetPagingInfoSinglePage=Seite {0} von {1}
+sheetPagingInfoSingleRow=Zeile {0} von {2}
+sheetPagingInfoUndefinedPages=Seite {0}
+sheetPagingInfoUndefinedRows=Zeilen {0} bis {1}
+sheetPagingInfoUndefinedSinglePage=Seite {0}
+sheetPagingInfoUndefinedSingleRow=Zeile {0}
+sheetPrev=vorherige Seite
+sheetTipSorting=nach dieser Spalte sortieren
+sheetToPage=Seite {0}
+tobago.file.multiFormat={} Dateien ausgew\u00E4hlt
+tobago.in.inputSuggest.moreElements=Es gibt weitere passende Eintr\u00E4ge\u2026
+tobago.message.confirmation.title=Meldungen
+treeCopy=Kopieren
+treeCut=Ausschneiden
+treeDelete=L\u00F6schen
+treeEdit=Bearbeiten
+treeMoveDown=Nach unten verschieben
+treeMoveUp=Nach oben verschieben
+treeNew=Neu
+treeNodeNew=Neuer Knoten
+treePaste=Einf\u00FCgen
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_en.properties b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_en.properties
new file mode 100644
index 0000000..7986d11
--- /dev/null
+++ b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_en.properties
@@ -0,0 +1 @@
+#dummy
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_es.properties b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_es.properties
new file mode 100644
index 0000000..4731b23
--- /dev/null
+++ b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_es.properties
@@ -0,0 +1,52 @@
+#Converted from './tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResource_es.xml'
+#Thu Sep 20 20:54:31 CEST 2018
+browser.noframe.message.postfix=
+browser.noframe.message.prefix=Tu navegador no soporta frames o est\u00E1 configurado para no desplegar frames. Como sea, puedes visitar el documento relacionado\: 
+configButtonText=Configuracion
+configCachecoverage=Cobertura de cache
+configContentType=Tipo de contenido
+configContentTypeText=\u00BFQue tipo de contenido debe de ser utilizado?
+configLocale=Idioma
+configLocaleText=\u00BFQue idioma debe de ser utilizado?
+configSubmit=Enviar
+configTheme=Tema
+configThemeText=\u00BFQue tema debe de ser utilizado?
+configTitle=Configuraci\u00F3n cliente del framework Tobago
+datePickerCancel=Cancelar
+datePickerOk=Enviar
+datePickerTitle=Escoger fecha
+pageNoscript=Esta p\u00E1gina requiere JavaScript, pero JavaScript no se activa actualmente en su navegador. Para permitir JavaScript usted puede consultar la documentaci\u00F3n del navegador.
+sheetAscending=Ascendente
+sheetDescending=Descendente
+sheetFirst=Primera P\u00E1gina
+sheetLast=\u00DAltima P\u00E1gina
+sheetMenuSelect=Seleccionar todo
+sheetNext=P\u00E1gina Siguiente
+sheetPagingInfoEmptyPage=
+sheetPagingInfoEmptyRow=No hay registros disponibles
+sheetPagingInfoPagePagingTip=Click aqu\u00ED, para cambiar el nombre desplegado.
+sheetPagingInfoPages=P\u00E1gina {0} de {1}
+sheetPagingInfoRowPagingTip=Click aqui, para cambiar el primer registro desplegado.
+sheetPagingInfoRows=Registros {0} {1} de {2}
+sheetPagingInfoSinglePage=P\u00E1gina {0} de {1}
+sheetPagingInfoSingleRow=Registro {0} de {2}
+sheetPagingInfoUndefinedPages=P\u00E1gina {0}
+sheetPagingInfoUndefinedRows=Registros {0} {1}
+sheetPagingInfoUndefinedSinglePage=P\u00E1gina {0}
+sheetPagingInfoUndefinedSingleRow=Registro {0}
+sheetPrev=P\u00E1gina Anterior
+sheetTipSorting=Ordenar por esta columna
+sheetToPage=P\u00E1gina {0}
+tobago.ajax.response.error=Error en el servidor\: No hay respuesta del servidor. Probablemente debido a un tiempo agotado de sesion\!
+tobago.file.multiFormat={} archivos seleccionados
+tobago.in.inputSuggest.moreElements=Hay m\u00E1s entradas aparejadas\u2026
+tobago.message.confirmation.title=Aviso
+treeCopy=Copiar
+treeCut=Cortar
+treeDelete=Borrar
+treeEdit=Editar
+treeMoveDown=Mover hacia abajo
+treeMoveUp=Mover hacia arriba
+treeNew=Nuevo
+treeNodeNew=Nuevo nodo
+treePaste=Pegar
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResource_de.xml b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResource_de.xml
deleted file mode 100644
index 9d2ed4b..0000000
--- a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResource_de.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
--->
-<!-- $Source$ -->
-
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-
-<properties>
-
-  <!-- Page -->
-  <entry key="pageNoscript">Diese Seite benötigt JavaScript, allerdings ist JavaScript in Ihrem Browser derzeit deaktiviert. Um JavaScript zu aktivieren, lesen Sie ggf. die Anleitung Ihres Browsers.</entry>
-
-  <!-- Client Configuration -->
-  <entry key="configTitle">Konfiguration des Clients des Tobago-Frameworks</entry>
-  <entry key="configTheme">Design</entry>
-  <entry key="configThemeText">Welches Design soll verwendet werden?</entry>
-  <entry key="configLocale">Sprache</entry>
-  <entry key="configLocaleText">Welche Sprache/Region soll verwendet werden?</entry>
-  <entry key="configContentType">Inhaltstyp</entry>
-  <entry key="configContentTypeText">Welcher Inhaltstyp (Content-Type) soll verwendet werden?</entry>
-  <entry key="configSubmit">Ändern</entry>
-  <entry key="configButtonText">Einstellungen</entry>
-  <entry key="configCachecoverage">Cache Abdeckung</entry>
-
-  <!-- File-->
-  <entry key="tobago.file.multiFormat">{} Dateien ausgewählt</entry>
-
-  <!-- Sheet -->
-  <entry key="sheetFirst">erste Seite</entry>
-  <entry key="sheetPrev">vorherige Seite</entry>
-  <entry key="sheetNext">nächste Seite</entry>
-  <entry key="sheetLast">letzte Seite</entry>
-  <entry key="sheetToPage">Seite {0}</entry>
-  <entry key="sheetTipSorting">nach dieser Spalte sortieren</entry>
-  <entry key="sheetAscending">aufsteigend sortiert</entry>
-  <entry key="sheetDescending">absteigend sortiert</entry>
-  <entry key="sheetPagingInfoRows">Zeilen {0} bis {1} von {2}</entry>
-  <entry key="sheetPagingInfoSingleRow">Zeile {0} von {2}</entry>
-  <entry key="sheetPagingInfoUndefinedRows">Zeilen {0} bis {1}</entry>
-  <entry key="sheetPagingInfoUndefinedSingleRow">Zeile {0}</entry>
-  <entry key="sheetPagingInfoEmptyRow">Keine Zeilen verf&amp;uuml;gbar</entry>
-  <entry key="sheetPagingInfoRowPagingTip">Hier klicken, zum Eingeben der ersten anzuzeigenden Zeile.</entry>
-  <entry key="sheetPagingInfoPages">Seite {0} von {1}</entry>
-  <entry key="sheetPagingInfoSinglePage">Seite {0} von {1}</entry>
-  <entry key="sheetPagingInfoUndefinedPages">Seite {0}</entry>
-  <entry key="sheetPagingInfoUndefinedSinglePage">Seite {0}</entry>
-  <entry key="sheetPagingInfoEmptyPage"/>
-  <entry key="sheetPagingInfoPagePagingTip">Hier klicken, zum Eingeben der anzuzeigenden Seite.</entry>
-  <entry key="sheetMenuSelect">Alles auswählen</entry>
-
-  <!-- Tree -->
-  <entry key="treeNew">Neu</entry>
-  <entry key="treeDelete">Löschen</entry>
-  <entry key="treeEdit">Bearbeiten</entry>
-  <entry key="treeCut">Ausschneiden</entry>
-  <entry key="treeCopy">Kopieren</entry>
-  <entry key="treePaste">Einfügen</entry>
-  <entry key="treeMoveUp">Nach oben verschieben</entry>
-  <entry key="treeMoveDown">Nach unten verschieben</entry>
-  <entry key="treeNodeNew">Neuer Knoten</entry>
-
-  <!-- datePicker -->
-  <entry key="datePickerTitle">Datumsauswahl</entry>
-  <entry key="datePickerOk">OK</entry>
-  <entry key="datePickerCancel">Abbrechen</entry>
-
-  <!-- in - input suggest -->
-  <entry key="tobago.in.inputSuggest.moreElements">Es gibt weitere passende Einträge…</entry>
-
-  <!-- messages -->
-  <entry key="tobago.message.confirmation.title">Meldungen</entry>
-
-  <entry key="browser.noframe.message.prefix">Ihr Browser stellt keine so genannten Frames dar. Den Inhalt können Sie hier erreichen:</entry>
-  <entry key="browser.noframe.message.postfix"></entry>
-
-</properties>
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResource_es.xml b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResource_es.xml
deleted file mode 100644
index fd2aa04..0000000
--- a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResource_es.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
--->
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-
-<properties>
-
-  <!-- Page -->
-  <entry key="pageNoscript">Esta página requiere JavaScript, pero JavaScript no se activa actualmente en su navegador. Para permitir JavaScript usted puede consultar la documentación del navegador.</entry>
-
-  <!-- Client Configuration -->
-  <entry key="configTitle">Configuración cliente del framework Tobago</entry>
-  <entry key="configTheme">Tema</entry>
-  <entry key="configThemeText">¿Que tema debe de ser utilizado?</entry>
-  <entry key="configLocale">Idioma</entry>
-  <entry key="configLocaleText">¿Que idioma debe de ser utilizado?</entry>
-  <entry key="configContentType">Tipo de contenido</entry>
-  <entry key="configContentTypeText">¿Que tipo de contenido debe de ser utilizado?</entry>
-  <entry key="configSubmit">Enviar</entry>
-  <entry key="configButtonText">Configuracion</entry>
-  <entry key="configCachecoverage">Cobertura de cache</entry>
-
-  <!-- File-->
-  <entry key="tobago.file.multiFormat">{} archivos seleccionados</entry>
-
-  <!-- Sheet -->
-  <entry key="sheetFirst">Primera Página</entry>
-  <entry key="sheetPrev">Página Anterior</entry>
-  <entry key="sheetNext">Página Siguiente</entry>
-  <entry key="sheetLast">Última Página</entry>
-  <entry key="sheetToPage">Página {0}</entry>
-  <entry key="sheetTipSorting">Ordenar por esta columna</entry>
-  <entry key="sheetAscending">Ascendente</entry>
-  <entry key="sheetDescending">Descendente</entry>
-  <entry key="sheetPagingInfoRows">Registros {0} {1} de {2}</entry>
-  <entry key="sheetPagingInfoSingleRow">Registro {0} de {2}</entry>
-  <entry key="sheetPagingInfoUndefinedRows">Registros {0} {1}</entry>
-  <entry key="sheetPagingInfoUndefinedSingleRow">Registro {0}</entry>
-  <entry key="sheetPagingInfoEmptyRow">No hay registros disponibles</entry>
-  <entry key="sheetPagingInfoRowPagingTip">Click aqui, para cambiar el primer registro desplegado.</entry>
-  <entry key="sheetPagingInfoPages">Página {0} de {1}</entry>
-  <entry key="sheetPagingInfoSinglePage">Página {0} de {1}</entry>
-  <entry key="sheetPagingInfoUndefinedPages">Página {0}</entry>
-  <entry key="sheetPagingInfoUndefinedSinglePage">Página {0}</entry>
-  <entry key="sheetPagingInfoEmptyPage"/>
-  <entry key="sheetPagingInfoPagePagingTip">Click aquí, para cambiar el nombre desplegado.</entry>
-  <entry key="sheetMenuSelect">Seleccionar todo</entry>
-
-  <!-- Tree -->
-  <entry key="treeNew">Nuevo</entry>
-  <entry key="treeDelete">Borrar</entry>
-  <entry key="treeEdit">Editar</entry>
-  <entry key="treeCut">Cortar</entry>
-  <entry key="treeCopy">Copiar</entry>
-  <entry key="treePaste">Pegar</entry>
-  <entry key="treeMoveUp">Mover hacia arriba</entry>
-  <entry key="treeMoveDown">Mover hacia abajo</entry>
-  <entry key="treeNodeNew">Nuevo nodo</entry>
-
-  <!-- datePicker -->
-  <entry key="datePickerTitle">Escoger fecha</entry>
-  <entry key="datePickerOk">Enviar</entry>
-  <entry key="datePickerCancel">Cancelar</entry>
-
-  <!-- in - input suggest -->
-  <entry key="tobago.in.inputSuggest.moreElements">Hay más entradas aparejadas…</entry>
-
-  <!-- messages -->
-  <entry key="tobago.message.confirmation.title">Aviso</entry>
-
-  <entry key="tobago.ajax.response.error">Error en el servidor: No hay respuesta del servidor. Probablemente debido a un tiempo agotado de sesion!</entry>
-
-  <entry key="browser.noframe.message.prefix">Tu navegador no soporta frames o está configurado para no desplegar frames. Como sea, puedes visitar el documento relacionado: </entry>
-  <entry key="browser.noframe.message.postfix"></entry>
-
-</properties>
diff --git a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/AbstractTobagoTestBase.java b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/AbstractTobagoTestBase.java
index e2fa01a..6f303e1 100644
--- a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/AbstractTobagoTestBase.java
+++ b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/AbstractTobagoTestBase.java
@@ -20,6 +20,7 @@
 package org.apache.myfaces.tobago.internal.config;
 
 import org.apache.myfaces.test.base.junit4.AbstractJsfTestCase;
+import org.apache.myfaces.test.config.ResourceBundleVarNames;
 import org.apache.myfaces.test.mock.MockFacesContext;
 import org.apache.myfaces.test.mock.MockHttpServletRequest;
 import org.apache.myfaces.tobago.component.UIButton;
@@ -46,6 +47,8 @@ import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.Locale;
 
+import static org.apache.myfaces.tobago.util.ResourceUtils.TOBAGO_RESOURCE_BUNDLE;
+
 /**
  * <p>Abstract JUnit test case base class, which sets up the JavaServer Faces
  * mock object environment for a particular simulated request.
@@ -107,6 +110,11 @@ public abstract class AbstractTobagoTestBase extends AbstractJsfTestCase {
     application.addComponent(UIPopup.COMPONENT_TYPE, UIPopup.class.getName());
     application.addComponent(UIStyle.COMPONENT_TYPE, UIStyle.class.getName());
 
+    application.setMessageBundle("org.apache.myfaces.tobago.context.TobagoMessageBundle");
+
+    ResourceBundleVarNames.addVarName(TOBAGO_RESOURCE_BUNDLE,
+        "org.apache.myfaces.tobago.context.TobagoResourceBundle");
+
     tobagoConfig.lock();
   }
 
diff --git a/tobago-core/src/test/java/org/apache/myfaces/tobago/util/MessageUtilsUnitTest.java b/tobago-core/src/test/java/org/apache/myfaces/tobago/util/MessageUtilsUnitTest.java
new file mode 100644
index 0000000..1593c8e
--- /dev/null
+++ b/tobago-core/src/test/java/org/apache/myfaces/tobago/util/MessageUtilsUnitTest.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.myfaces.tobago.util;
+
+import org.apache.myfaces.tobago.internal.config.AbstractTobagoTestBase;
+import org.apache.myfaces.tobago.validator.FileItemValidator;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.faces.application.FacesMessage;
+import java.util.Locale;
+
+public class MessageUtilsUnitTest extends AbstractTobagoTestBase {
+
+  @Test
+  public void testDummy() {
+    final FacesMessage dummy = MessageUtils.getMessage(
+        facesContext,
+        FacesMessage.SEVERITY_INFO,
+        "dummy");
+    Assert.assertEquals("dummy", dummy.getSummary());
+    Assert.assertEquals("dummy", dummy.getDetail());
+  }
+
+  @Test
+  public void testDefault() {
+    final FacesMessage locale = MessageUtils.getMessage(
+        facesContext,
+        FacesMessage.SEVERITY_INFO,
+        FileItemValidator.CONTENT_TYPE_MESSAGE_ID, "application/pdf");
+    Assert.assertEquals("Content type error", locale.getSummary());
+    Assert.assertEquals("The given file is not content type of 'application/pdf'.", locale.getDetail());
+  }
+
+  @Test
+  public void testGermany() {
+    facesContext.getViewRoot().setLocale(Locale.GERMANY);
+
+    final FacesMessage locale = MessageUtils.getMessage(
+        facesContext,
+        FacesMessage.SEVERITY_INFO,
+        FileItemValidator.CONTENT_TYPE_MESSAGE_ID, "application/pdf");
+    Assert.assertEquals("Dateityp Fehler", locale.getSummary());
+    Assert.assertEquals("Die hochgeladene Datei ist nicht vom Typ 'application/pdf'.", locale.getDetail());
+  }
+
+  @Test
+  public void testSpanish() {
+    facesContext.getViewRoot().setLocale(Locale.forLanguageTag("es"));
+
+    final FacesMessage locale = MessageUtils.getMessage(
+        facesContext,
+        FacesMessage.SEVERITY_INFO,
+        FileItemValidator.CONTENT_TYPE_MESSAGE_ID, "application/pdf");
+    Assert.assertEquals("Error de tipo de contenido", locale.getSummary());
+    Assert.assertEquals("El archivo no es del tipo de contenido 'application/pdf'.", locale.getDetail());
+  }
+
+  @Test
+  public void testFallback() {
+    facesContext.getViewRoot().setLocale(Locale.forLanguageTag("ja"));
+
+    final FacesMessage locale = MessageUtils.getMessage(
+        facesContext,
+        FacesMessage.SEVERITY_INFO,
+        FileItemValidator.CONTENT_TYPE_MESSAGE_ID, "application/pdf");
+    Assert.assertEquals("Content type error", locale.getSummary());
+    Assert.assertEquals("The given file is not content type of 'application/pdf'.", locale.getDetail());
+  }
+}
diff --git a/tobago-core/src/test/java/org/apache/myfaces/tobago/util/ResourcesUtilsUnitTest.java b/tobago-core/src/test/java/org/apache/myfaces/tobago/util/ResourcesUtilsUnitTest.java
new file mode 100644
index 0000000..cf4cc58
--- /dev/null
+++ b/tobago-core/src/test/java/org/apache/myfaces/tobago/util/ResourcesUtilsUnitTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.myfaces.tobago.util;
+
+import org.apache.myfaces.tobago.internal.config.AbstractTobagoTestBase;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Locale;
+
+public class ResourcesUtilsUnitTest extends AbstractTobagoTestBase {
+
+  @Test
+  public void testDefault() {
+    Assert.assertEquals("Locale", ResourceUtils.getString("configLocale"));
+  }
+
+  @Test
+  public void testGermany() {
+    facesContext.getViewRoot().setLocale(Locale.GERMANY);
+    Assert.assertEquals("Sprache", ResourceUtils.getString("configLocale"));
+  }
+
+  @Test
+  public void testSpanish() {
+    facesContext.getViewRoot().setLocale(Locale.forLanguageTag("es"));
+    Assert.assertEquals("Idioma", ResourceUtils.getString("configLocale"));
+ }
+
+  @Test
+  public void testFallback() {
+    facesContext.getViewRoot().setLocale(Locale.forLanguageTag("ja"));
+    Assert.assertEquals("Locale", ResourceUtils.getString("configLocale"));
+  }
+}
diff --git a/tobago-example/tobago-example-demo/src/main/resources/logback.xml b/tobago-core/src/test/resources/tobago-config-2.3-replace.xml
similarity index 52%
copy from tobago-example/tobago-example-demo/src/main/resources/logback.xml
copy to tobago-core/src/test/resources/tobago-config-2.3-replace.xml
index 1606b19..142509d 100644
--- a/tobago-example/tobago-example-demo/src/main/resources/logback.xml
+++ b/tobago-core/src/test/resources/tobago-config-2.3-replace.xml
@@ -17,21 +17,37 @@
  * limitations under the License.
 -->
 
-<!-- XXX Schema is NOT official from logback -->
-<configuration
-    xmlns="http://ch.qos.logback/xml/ns/logback"
+<tobago-config
+    xmlns="http://myfaces.apache.org/tobago/tobago-config"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback https://raw.github.com/enricopulatzo/logback-XSD/master/src/main/xsd/logback.xsd">
+    xsi:schemaLocation="http://myfaces.apache.org/tobago/tobago-config http://myfaces.apache.org/tobago/tobago-config-2.3.xsd"
+    version="2.3">
 
-  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
-    <encoder>
-      <pattern>%date{"yyyy-MM-dd'T'HH:mm:ss,SSSXXX", UTC} %-5level [%-20.20thread] %-50.50logger{50}:%-20.20method:%-4.4line [%mdc] %msg%n</pattern>
-    </encoder>
-  </appender>
+  <name>my-name-replace</name>
 
-  <logger name="org.apache.myfaces.tobago.example.demo" level="debug"/>
+  <ordering>
+    <after>
+      <name>my-name</name>
+    </after>
+  </ordering>
 
-  <root level="info">
-    <appender-ref ref="console" />
-  </root>
-</configuration>
+  <theme-config>
+    <default-theme>my-theme-3</default-theme>
+  </theme-config>
+
+  <theme-definitions>
+    <theme-definition>
+      <name>my-theme-3</name>
+      <resource-path>/my/path-1</resource-path>
+      <fallback>my-theme-3</fallback>
+      <resources production="true">
+        <excludes>
+          <script name="script-3.js"/>
+        </excludes>
+        <script name="script-3-replacement.js" priority="3"/>
+      </resources>
+    </theme-definition>
+
+  </theme-definitions>
+
+</tobago-config>
diff --git a/tobago-core/src/test/resources/tobago-config-2.3.xml b/tobago-core/src/test/resources/tobago-config-2.3.xml
new file mode 100644
index 0000000..609aa6e
--- /dev/null
+++ b/tobago-core/src/test/resources/tobago-config-2.3.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+-->
+
+<tobago-config
+    xmlns="http://myfaces.apache.org/tobago/tobago-config"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://myfaces.apache.org/tobago/tobago-config http://myfaces.apache.org/tobago/tobago-config-2.3.xsd"
+    version="2.3">
+
+  <name>my-name</name>
+
+  <ordering>
+    <after>
+      <name>my-after</name>
+    </after>
+    <before>
+      <name>my-before-1</name>
+      <name>my-before-2</name>
+    </before>
+  </ordering>
+
+  <theme-config>
+    <default-theme>my-theme-1</default-theme>
+    <supported-theme>my-theme-2</supported-theme>
+  </theme-config>
+
+  <create-session-secret>false</create-session-secret>
+  <check-session-secret>false</check-session-secret>
+  <prevent-frame-attacks>false</prevent-frame-attacks>
+  <set-nosniff-header>false</set-nosniff-header>
+
+  <theme-definitions>
+    <theme-definition>
+      <name>my-theme-1</name>
+      <display-name>My Theme 1</display-name>
+      <resource-path>/my/path-1</resource-path>
+      <versioned>true</versioned>
+      <resources production="true">
+        <script name="script-1.js" priority="1"/>
+        <script name="script-undefined-a.js"/>
+        <script name="script-4.js" priority="4"/>
+        <script name="script-undefined-b.js"/>
+        <script name="script-3.js" priority="3"/>
+        <script name="script-undefined-c.js"/>
+        <script name="script-5.js" priority="5"/>
+        <script name="script-undefined-d.js"/>
+        <script name="script-2.js" priority="2"/>
+        <script name="script-undefined-e.js"/>
+        <style name="style-2.css" priority="2"/>
+        <style name="style.css"/>
+        <style name="style-1.css" priority="1"/>
+      </resources>
+    </theme-definition>
+
+    <theme-definition>
+      <name>my-theme-2</name>
+      <resource-path>/my/path-1</resource-path>
+      <fallback>my-theme-2</fallback>
+      <resources production="false"/>
+    </theme-definition>
+
+  </theme-definitions>
+
+</tobago-config>
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/DemoController.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/DemoController.java
index 2d2a903..1ddf353 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/DemoController.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/DemoController.java
@@ -23,6 +23,7 @@ import org.apache.deltaspike.core.api.scope.WindowScoped;
 import org.apache.myfaces.tobago.component.UISheet;
 import org.apache.myfaces.tobago.model.SelectItem;
 import org.apache.myfaces.tobago.model.Selectable;
+import org.apache.myfaces.tobago.util.ResourceUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -100,7 +101,9 @@ public class DemoController implements Serializable {
   private static SelectItem[] getSelectItems(final Selectable[] keys) {
     final SelectItem[] items = new SelectItem[keys.length];
     for (int i = 0; i < items.length; i++) {
-      final String label = DemoBundle.getString(FacesContext.getCurrentInstance(), keys[i].name());
+      final FacesContext facesContext = FacesContext.getCurrentInstance();
+      final String label
+          = ResourceUtils.getString(facesContext, "demoBundle", keys[i].name());
       if (LOG.isTraceEnabled()) {
         LOG.trace("label = " + label + "");
       }
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/DemoBundle.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Migration5Controller.java
similarity index 60%
rename from tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/DemoBundle.java
rename to tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Migration5Controller.java
index 782516d..e3c7af1 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/DemoBundle.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Migration5Controller.java
@@ -19,24 +19,15 @@
 
 package org.apache.myfaces.tobago.example.demo;
 
-import org.apache.myfaces.tobago.context.TobagoBundle;
+import javax.inject.Named;
+import javax.inject.Singleton;
+import java.io.Serializable;
 
-import javax.faces.context.FacesContext;
+@Singleton
+@Named
+public class Migration5Controller extends SourceFileReader implements Serializable {
 
-/**
- * Resources of the demo application.
- */
-public class DemoBundle extends TobagoBundle {
-
-  public static final String VAR = "demoBundle";
-  public static final String BUNDLE_NAME = "org.apache.myfaces.tobago.example.demo.Demo";
-
-  public DemoBundle() {
-    super(BUNDLE_NAME);
+  public String getJavaSource() {
+    return getSource("ConvertXmlToProperties.java");
   }
-
-  public static String getString(final FacesContext facesContext, final String key) {
-    return facesContext.getApplication().getResourceBundle(facesContext, VAR).getString(key);
-  }
-
 }
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/NavigationNode.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/NavigationNode.java
index 4e385d0..ef20690 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/NavigationNode.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/NavigationNode.java
@@ -23,7 +23,6 @@ import org.apache.myfaces.tobago.model.TreePath;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.faces.context.FacesContext;
 import javax.swing.tree.DefaultMutableTreeNode;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -33,8 +32,8 @@ public class NavigationNode extends DefaultMutableTreeNode implements Comparable
   private static final Logger LOG = LoggerFactory.getLogger(NavigationNode.class);
 
   private final String name;
+  private final String key;
   private final String branch;
-  private final String title;
   private final String outcome;
 
   private NavigationTree tree;
@@ -52,16 +51,8 @@ public class NavigationNode extends DefaultMutableTreeNode implements Comparable
     matcher.find();
     branch = matcher.group(1);
     name = matcher.group(2);
-    final String extension = matcher.group(3);
-    final String key = name.replaceAll("\\+|\\-", "_");
-    String t;
-    try {
-      t = DemoBundle.getString(FacesContext.getCurrentInstance(), key);
-    } catch (final Exception e) {
-      LOG.error("Not found key '{}' in bundle", key);
-      t = name;
-    }
-    title = t;
+//    final String extension = matcher.group(3);
+    key = name.replaceAll("[+-]", "_");
   }
 
   @Override
@@ -97,8 +88,8 @@ public class NavigationNode extends DefaultMutableTreeNode implements Comparable
     return branch;
   }
 
-  public String getTitle() {
-    return title;
+  public String getKey() {
+    return key;
   }
 
   public String getOutcome() {
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/NavigationTree.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/NavigationTree.java
index 8d26fff..23e4664 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/NavigationTree.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/NavigationTree.java
@@ -93,7 +93,7 @@ public class NavigationTree implements Serializable {
 //    map.put(tree.getBranch(), tree);
 
     for (final NavigationNode node : nodes) {
-      LOG.info("node='{}' with title '{}'", node.getName(), node.getTitle());
+      LOG.info("Creating node='{}'", node.getName());
       map.put(node.getBranch(), node);
       final String parent = node.getBranch().substring(0, node.getBranch().lastIndexOf('/'));
       if (!parent.equals("")) { // is root
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Salutation.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Salutation.java
index e809047..10c5f7b 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Salutation.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Salutation.java
@@ -19,7 +19,7 @@
 
 package org.apache.myfaces.tobago.example.demo;
 
-import javax.faces.context.FacesContext;
+import org.apache.myfaces.tobago.util.ResourceUtils;
 
 public enum Salutation {
 
@@ -27,7 +27,7 @@ public enum Salutation {
 
   public String getLabel() {
     // XXX This implementation is only for demo. This should be optimized/cached.
-    return DemoBundle.getString(FacesContext.getCurrentInstance(), getClass().getSimpleName() + "_" + name());
+    return ResourceUtils.getString("demoBundle", Salutation.class.getSimpleName() + "_" + name());
   }
 
   public String getIcon() {
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TreeSelectController.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TreeSelectController.java
index dca962c..80fcd9a 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TreeSelectController.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TreeSelectController.java
@@ -19,6 +19,8 @@
 
 package org.apache.myfaces.tobago.example.demo;
 
+import org.apache.myfaces.tobago.model.Selectable;
+
 import javax.enterprise.context.SessionScoped;
 import javax.inject.Named;
 import javax.swing.tree.DefaultMutableTreeNode;
@@ -28,6 +30,15 @@ import java.io.Serializable;
 @Named
 public class TreeSelectController implements Serializable {
 
+  private static final Selectable[] TREE_SELECT_MODE_KEYS = {
+    Selectable.none,
+    Selectable.single,
+    Selectable.singleLeafOnly,
+    Selectable.multi,
+    Selectable.multiLeafOnly,
+    Selectable.multiCascade
+  };
+
   private DefaultMutableTreeNode sample;
   private String selectable = "multi";
 
@@ -35,6 +46,10 @@ public class TreeSelectController implements Serializable {
     sample = CategoryTree.createSample();
   }
 
+  public Selectable[] getSelectModes() {
+    return TREE_SELECT_MODE_KEYS;
+  }
+
   public DefaultMutableTreeNode getSample() {
     return sample;
   }
diff --git a/tobago-example/tobago-example-demo/src/main/resources/logback.xml b/tobago-example/tobago-example-demo/src/main/resources/logback.xml
index 1606b19..312360e 100644
--- a/tobago-example/tobago-example-demo/src/main/resources/logback.xml
+++ b/tobago-example/tobago-example-demo/src/main/resources/logback.xml
@@ -25,7 +25,10 @@
 
   <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
     <encoder>
-      <pattern>%date{"yyyy-MM-dd'T'HH:mm:ss,SSSXXX", UTC} %-5level [%-20.20thread] %-50.50logger{50}:%-20.20method:%-4.4line [%mdc] %msg%n</pattern>
+      <!-- wide -->
+      <!--<pattern>%date{"yyyy-MM-dd'T'HH:mm:ss,SSSXXX", UTC} %-5level [%-20.20thread] %-50.50logger{50}:%-20.20method:%-4.4line [%mdc] %msg%n</pattern>-->
+      <!-- small -->
+      <pattern>%date{"ss,SSS"} %1level %-20.20logger{20}:%-4.4line %msg%n</pattern>
     </encoder>
   </appender>
 
diff --git a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/Demo.xml b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/Demo.xml
deleted file mode 100644
index ee998c2..0000000
--- a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/Demo.xml
+++ /dev/null
@@ -1,432 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
--->
-
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-
-<properties>
- <entry key="tobago_url">http://myfaces.apache.org/tobago</entry>
-
-  <entry key="notTranslated">Sorry, not completely translated yet.</entry>
-  <entry key="pageTitle">Tobago Demo</entry>
-
-  <entry key="login">Login</entry>
-
-  <!-- menu -->
-  <entry key="menu_config">Configuration</entry>
-  <entry key="menu_themes">Theme</entry>
-  <entry key="menu_locale">Language</entry>
-  <entry key="menu_test">Test</entry>
-  <entry key="menu_runTest">Run Test</entry>
-  <entry key="menu_closeTest">Close Test</entry>
-  <entry key="menu_runTestAll">Run all tests</entry>
-  <entry key="menu_accessAllPages">Access all pages</entry>
-
-  <!-- navigate -->
-  <entry key="intro">Intro</entry>
-  <entry key="getting_started">Getting started</entry>
-  <entry key="whats_new">What's new?</entry>
-  <entry key="new_in_4_3">Tobago 4.3</entry>
-  <entry key="new_in_4_2">Tobago 4.2</entry>
-  <entry key="new_in_4_1">Tobago 4.1</entry>
-  <entry key="new_in_4_0">Tobago 4</entry>
-  <entry key="new_in_3_1">Tobago 3.1</entry>
-  <entry key="new_in_3_0">Tobago 3</entry>
-  <entry key="new_in_2_2">Tobago 2.2</entry>
-  <entry key="new_in_2_1">Tobago 2.1</entry>
-  <entry key="new_in_2_0">Tobago 2</entry>
-  <entry key="migration">Migration</entry>
-  <entry key="migration15">1.0 to 1.5</entry>
-  <entry key="migration20">1.5 to 2</entry>
-  <entry key="migration30">2 to 3</entry>
-  <entry key="migration40">3 to 4</entry>
-  <entry key="compatibility">Compatibility</entry>
-  <entry key="faq">FAQ</entry>
-  <entry key="api">API</entry>
-  <entry key="download">Download</entry>
-  <entry key="release_checklist">Release Checklist</entry>
-
-  <!-- navigate : components -->
-  <entry key="component">Components</entry>
-  <entry key="input">Input Fields</entry>
-  <entry key="in">Input</entry>
-  <entry key="suggest">Suggest</entry>
-  <entry key="textarea">Text Area</entry>
-  <entry key="date">Date</entry>
-  <entry key="group">Input Group</entry>
-  <entry key="stars">5 Star Rating</entry>
-  <entry key="output">Output Fields</entry>
-  <entry key="out">Output</entry>
-  <entry key="label">Label</entry>
-  <entry key="messages">Messages</entry>
-  <entry key="figure">Figure</entry>
-  <entry key="image">Image</entry>
-  <entry key="progress">Progress Bar</entry>
-  <entry key="object">External Object (iframe)</entry>
-  <entry key="select">Select Controls</entry>
-  <entry key="selectBooleanCheckbox">Checkbox</entry>
-  <entry key="selectBooleanToggle">Toggle</entry>
-  <entry key="selectOneChoice">Dropdown Box</entry>
-  <entry key="selectOneRadio">Radio Button</entry>
-  <entry key="selectOneListbox">Singleselection List</entry>
-  <entry key="selectManyCheckbox">Checkbox Group</entry>
-  <entry key="selectManyListbox">Multiselection List</entry>
-  <entry key="selectManyShuttle">Shuttle List</entry>
-  <entry key="command">Commands</entry>
-  <entry key="button_link">Link &amp; Button</entry>
-  <entry key="default_command">Default Command</entry>
-  <entry key="buttons">Button Group</entry>
-  <entry key="buttons_customizer">Button Group Customizer</entry>
-  <entry key="links">Link Group</entry>
-  <entry key="badge">Badge</entry>
-  <entry key="container">Container</entry>
-  <entry key="box">Content Box</entry>
-  <entry key="panel">Panel</entry>
-  <entry key="separator">Separator</entry>
-  <entry key="section">Section</entry>
-  <entry key="header_footer">Header / Footer</entry>
-  <entry key="bar">Bar</entry>
-  <entry key="popup">Popup Dialog</entry>
-  <entry key="tab">Tab Group</entry>
-  <entry key="tab_client">Client side</entry>
-  <entry key="tab_ajax">Ajax</entry>
-  <entry key="tab_server">Server side</entry>
-  <entry key="sheet">Sheet Control</entry>
-  <entry key="sheet_column_content">Column Content</entry>
-  <entry key="sheet_sorting">Sorting</entry>
-  <entry key="sheet_column_selector">Column Selector</entry>
-  <entry key="sheet_event">Event</entry>
-  <entry key="sheet_markup">Markup</entry>
-  <entry key="sheet_style">Styling</entry>
-  <entry key="sheet_dropdown">Dropdown Box</entry>
-  <entry key="sheet_filter">Filtering</entry>
-  <entry key="sheet_static_header">Static Header</entry>
-  <entry key="sheet_multi_header">Multi Header</entry>
-  <entry key="sheet_tree">Column Tree</entry>
-  <entry key="sheet_editable">Editable Sheet</entry>
-  <entry key="tree">Tree Control</entry>
-  <entry key="tree_command_types">Command</entry>
-  <entry key="tree_select">Select</entry>
-  <entry key="tree_editor">Tree Editor</entry>
-  <entry key="tree_menu">Tree Menu</entry>
-  <entry key="tree_listbox">Tree List</entry>
-  <entry key="upload">File Upload</entry>
-  <entry key="wysiwyg_editor">WYSIWYG Editor</entry>
-  <entry key="tinymce">TinyMCE</entry>
-  <entry key="ckeditor">CKEditor</entry>
-
-  <!-- navigate : concept -->
-  <entry key="concept">Concepts</entry>
-  <entry key="validation">Validation</entry>
-  <entry key="content_validation">Content Validation</entry>
-  <entry key="validation_jsr303">JSR 303: Bean Validation</entry>
-  <entry key="severity">Severity</entry>
-  <entry key="conversion">Conversion</entry>
-  <entry key="form">Forms</entry>
-  <entry key="form_required">Required Forms</entry>
-  <entry key="form_ajax">Ajax Forms</entry>
-  <entry key="theme">Themes</entry>
-  <entry key="conversation">Conversation Scope</entry>
-  <entry key="layout">Layout</entry>
-  <entry key="flow_layout">FlowLayout</entry>
-  <entry key="flex_layout">FlexLayout</entry>
-  <entry key="segment_layout">SegmentLayout</entry>
-  <entry key="labeled_layout">LabeledLayout</entry>
-  <entry key="grid_layout">GridLayout</entry>
-  <entry key="format">Formatting</entry>
-  <entry key="exception_handler">Ajax Exception Handler</entry>
-  <entry key="transition">Transition</entry>
-  <entry key="behavior">Behavior</entry>
-  <entry key="for_each">For Each</entry>
-  <entry key="collapsible">Collapsible</entry>
-  <entry key="collapsible_box">Content Box</entry>
-  <entry key="collapsible_popup">Popup</entry>
-  <entry key="collapsible_panel">Panel</entry>
-  <entry key="collapsible_section">Section</entry>
-  <entry key="accessKey">Access Keys</entry>
-  <entry key="dataAttribute">Data Attributes</entry>
-  <entry key="security">Security</entry>
-  <entry key="content_security_policy">Content Security Policy</entry>
-  <entry key="sanitize">Sanitize</entry>
-  <entry key="roles">Roles</entry>
-
-  <!-- navigate : deprecated -->
-  <entry key="deprecated">Deprecated</entry>
-  <entry key="tx">TX Tag Library</entry>
-  <entry key="suggest_method">SuggestMethod</entry>
-  <entry key="toolBar">Toolbar</entry>
-  <entry key="menubar">Menubar</entry>
-
-  <!-- navigate : test -->
-  <entry key="test">Tests</entry>
-  <entry key="sheet_types">Sheet Content</entry>
-  <entry key="manual">Manual Tests</entry>
-
-  <entry key="validation-severity">Severity</entry>
-  <entry key="browser">Browser</entry>
-  <entry key="locale">Locale</entry>
-
-  <entry key="bestPractice">Best Practice</entry>
-  <entry key="error">Error Handling</entry>
-  <entry key="theme">Themes</entry>
-  <entry key="transition">Transition</entry>
-  <entry key="nonFacesResponse">Non Faces Resp.</entry>
-  <entry key="toolBarCustomizer">User Customized UI</entry>
-  <entry key="faceletsAsResources">Facelets As Resource</entry>
-  <entry key="non-faces-request">Non Faces Request</entry>
-
-  <entry key="reference_intro">Ref. (under constr.)</entry>
-  <entry key="reference_command">Command</entry>
-  <entry key="reference_container">Container</entry>
-  <entry key="reference_inputSuggest">Input suggest</entry>
-  <entry key="reference_menu">Menu</entry>
-  <entry key="reference_output">Output</entry>
-  <entry key="reference_object">Object</entry>
-  <entry key="reference_popup">Popup</entry>
-  <entry key="reference_progress">Progress</entry>
-  <entry key="reference_select">Select</entry>
-  <entry key="reference_sheet">Sheet</entry>
-  <entry key="reference_tab">Tab</entry>
-  <entry key="reference_time">Time</entry>
-  <entry key="reference_tree">Tree</entry>
-  <entry key="reference_tool">Tool Bar</entry>
-  <entry key="reference_partial">Partial</entry>
-  <entry key="reference_upload">Upload</entry>
-
-  <entry key="submit">Submit</entry>
-  <entry key="cancel">Cancel</entry>
-
-  <entry key="footer_previous">Prev</entry>
-  <entry key="footer_next">Next</entry>
-  <entry key="footer_viewSource">View Source</entry>
-
-  <!-- Tag Library Documentation URL -->
-  <entry key="tagDocUrl">https://myfaces.apache.org/tobago/doc</entry>
-
-<!--  basicControls -->
-  <entry key="basic_sampleInputTitle">Basic Input Examples</entry>
-  <entry key="basic_sampleSelectTitle">Basic Select Examples</entry>
-  <entry key="basic_sampleLinkTitle">Basic Controls Examples</entry>
-  <entry key="Salutation_UNKNOWN">none</entry>
-  <entry key="Salutation_MR">Mr.</entry>
-  <entry key="Salutation_MRS">Mrs.</entry>
-  <entry key="basic_textboxLabel">Inputfield</entry>
-  <entry key="basic_textboxTip">A simple input field</entry>
-  <entry key="basic_suggestLabel">Suggest (AJAX)</entry>
-  <entry key="basic_suggestTip">Please type in "po" for example</entry>
-  <entry key="basic_dateLabel">Date</entry>
-  <entry key="basic_timeLabel">Time</entry>
-  <entry key="basic_textareaLabel">Textarea</entry>
-  <entry key="basic_linkAction">Click Link</entry>
-  <entry key="basic_buttonAction">Click Button</entry>
-  <entry key="basic_lastActionLabel">Last Click</entry>
-  <entry key="basic_text_input">Input controls for different kinds of text: single-line, multiline, formated.</entry>
-  <entry key="basic_text_select">Select controls allow input of one or multiple options.</entry>
-  <entry key="basic_text_action">Control elements for site navigation and to execute actions.</entry>
-
-
-<!--  sheet -->
-<entry key="sheet_text">The sheet control is a simple solution for displaying table based
-  information. The essential features are:
-    &lt;ul style="margin-top: 2px;"&gt;
-    &lt;li style="line-height: 130%;"&gt;Paging: A defined range of data is displayed.
-      Navigation is done with arrow buttons.&lt;/li&gt;
-    &lt;li style="line-height: 130%;"&gt;Sorting: By clicking a column header the
-    appropriate column is sorted.&lt;/li&gt;
-    &lt;li style="line-height: 130%;"&gt;Inline-Editing: If needed, the values of
-    cell contents can be directly changed or inserted by the user.&lt;/li&gt;
-    &lt;li style="line-height: 130%;"&gt;The column width can be resized by simply
-    drag and drop the column border.
-    &lt;/ul&gt;
-    This example shows an application specific sorter, which sorts the sun to the top every time.
-</entry>
-<entry key="sheet_resetLabel">Reset</entry>
-<entry key="sheet_resetTip">Reset the modified widths of the columns in the sheet.</entry>
-<entry key="sheet_configTip">Click here to edit display attributes of the sheet.</entry>
-<entry key="sheet_configTitle">Sheet configuration</entry>
-
-<!--  tree -->
-<entry key="tree_text">The tree control displays a tree which is generated from application data. The key features are:
-    &lt;ul style="margin-top: 2px;"&gt;
-    &lt;li style="line-height: 130%;"&gt;Attributes control the rendering of the tree.&lt;/li&gt;
-    &lt;li style="line-height: 130%;"&gt;The possibility to define the tree as "single" or "multiselect", i.e. select one or multiple nodes of the tree.
-    &lt;li style="line-height: 130%;"&gt;Editing mode for simple handling of tree structures inside the application.&lt;/li&gt;
-    &lt;/ul&gt;
-    Furthermore there is a TreeListbox Control, which can be described as a vertical tree. This is handy for categorization actions.
-  </entry>
-<entry key="treeShowIcons">show icons</entry>
-<entry key="treeShowRoot">show root node</entry>
-<entry key="treeShowJunctions">show junction tree</entry>
-<entry key="treeShowRootJunction">show first junction</entry>
-<entry key="treeMultiselect">selectable</entry>
-<entry key="treeMutable">mutable</entry>
-<entry key="treeLabel">Tre_e</entry>
-<entry key="treeListboxLabel">Listbo_x</entry>
-
-
-<entry key="none">Not selectable</entry>
-<entry key="single">Single selection</entry>
-<entry key="singleLeafOnly">Single selection, Leafs only</entry>
-<entry key="multi">Multi selection</entry>
-<entry key="multiLeafOnly">Multi selection, Leafs only</entry>
-<entry key="siblingLeafOnly">Multi selection, Leafs on same level only</entry>
-
-
-
-<!--  tab -->
-<entry key="tab_text">The tab control provides so called tab panels.
-    &lt;ul style="margin-top: 2px;"&gt;
-    &lt;li style="line-height: 130%;"&gt;Control can take place on server- or clientside.&lt;/li&gt;
-    &lt;li style="line-height: 130%;"&gt;Tab controls can be nested.&lt;/li&gt;
-    &lt;li style="line-height: 130%;"&gt;Inside each tab control any other controls   can be used.&lt;/li&gt;
-    &lt;/ul&gt;
-  </entry>
-<entry key="tabSwitchTypeClient">Client side tabbing</entry>
-<entry key="tabSwitchTypeReloadTag">Server side tabbing (Ajax)</entry>
-<entry key="tabSwitchTypeReloadPage">Server side tabbing (Full Reload)</entry>
-<entry key="tabPlanet">Data of the _Planets</entry>
-<entry key="tabInsolar">In the _Solarsystem</entry>
-<entry key="closeButtonTip">Hide this tab for one request cycle</entry>
-<entry key="tabMoons">_Moons</entry>
-
-
-<!--  solar -->
-<entry key="solarPlanetDiameter">Diameter</entry>
-<entry key="solarPlanetMass">Mass</entry>
-<entry key="solarPlanetSunDistance">Distance of the Sun</entry>
-<entry key="solarPlanetTimeOfCirculation">Time of Circulation</entry>
-<entry key="solarArrayName">Name</entry>
-<entry key="solarArrayNumber">#</entry>
-<entry key="solarArrayNumberTip">Number</entry>
-<entry key="solarArrayOrbit">Orbits</entry>
-<entry key="solarArrayDistance">Distance</entry>
-<entry key="solarArrayPeriod">Period</entry>
-<entry key="solarArrayPopulation">Population</entry>
-<entry key="solarPagingSheet">Sheet with Paging</entry>
-
-
-<!--  toolbar -->
-<entry key="toolbar_closePopupAction">Close popup window</entry>
-<entry key="toolbar_popupText">To close this popup window click close button.</entry>
-<entry key="toolbar_dropDownAction">DropDown</entry>
-<entry key="toolbar_sampleTitle">Toolbar Example</entry>
-<entry key="toolbar_text1">Toolbars can be used for context sensitive actions inside box controls.
-&lt;ul style="margin-top: 2px;"&gt;
-&lt;li style="line-height: 130%;"&gt;Toolbars can consist of images, text or both.&lt;/li&gt;
-&lt;li style="line-height: 130%;"&gt;Toolbars can be completly integrated into a box header.&lt;/li&gt;
-&lt;li style="line-height: 130%;"&gt;Actions can be displayed as drop down menues.&lt;/li&gt;
-&lt;/ul&gt;
-  </entry>
-<entry key="right">right</entry>
-<entry key="bottom">bottom</entry>
-<entry key="off">off</entry>
-<entry key="small">small</entry>
-<entry key="big">big</entry>
-
-
-<!--  validation -->
-<entry key="validation_description">Description</entry>
-<entry key="validation_number">Number</entry>
-<entry key="validation_price">Price</entry>
-<entry key="validation_custom">Custom Validator</entry>  
-<entry key="validation_submit">Submit</entry>
-
-<entry key="validation_text">Tobago provides easy to use possibilities for validation of user input.
-    &lt;ul style="margin-top: 2px;"&gt;
-    &lt;li style="line-height: 130%;"&gt;Syntactic and semantic validation is available.&lt;/li&gt;
-    &lt;li style="line-height: 130%;"&gt;Error messages can be positioned anywhere in the   user interface.&lt;/li&gt;
-    &lt;li style="line-height: 130%;"&gt;Input elements, which are affected by the   validation can be highlighted.&lt;/li&gt;
-    &lt;/ul&gt;
-</entry>
-
-<!--  form -->
-<entry key="form_outTitle">Outer form</entry>
-<entry key="form_text1">&lt;li style="line-height: 130%;"&gt;Values in the first form are being
-  stored temporarily by submitting the second form while the value in the second
-  form is written into the model.&lt;/li&gt;
-&lt;li style="line-height: 130%;"&gt;By submitting both form each value is stored into
-  the model.&lt;/li&gt;
-&lt;li style="line-height: 130%;"&gt;If the first input contains an error but the second
-  one validates, the validation of the first form is deactivated.&lt;/li&gt;
-  </entry>
-<entry key="form_in1Title">First inner form</entry>
-<entry key="form_in2Title">Second inner form</entry>
-<entry key="newValue1">New model-value</entry>
-<entry key="modelValue1">Value in model</entry>
-<entry key="submitForm1">Submit Form 1</entry>
-<entry key="newValue2">New model-value</entry>
-<entry key="modelValue2">Value in model</entry>
-<entry key="submitForm2">Submit Form 2</entry>
-<entry key="submitAll">Submit all Forms</entry>
-
-
-
-
-<!--  theme -->
-<entry key="theme_title">Theme settings</entry>
-<entry key="theme_text">Tobago supports a big variety of displaying controls,
-  so called designs or themes.
-    &lt;ul style="margin-top: 2px;"&gt;
-    &lt;li style="line-height: 130%;"&gt;Choosing of themes can be application wide,   user or group specific.&lt;/li&gt;
-    &lt;li style="line-height: 130%;"&gt;Images and other resources can be theme   dependant as well as the application pages can be designed seperatly   for each supported theme.&lt;/li&gt;
-    &lt;/ul&gt;
-</entry>
-
-<!--  locale -->
-<entry key="locale_title">Locale settings</entry>
-<entry key="locale_label">Locale</entry>
-<entry key="locale_submit">Submit</entry>
-<entry key="locale_text">Tobago supports internationalization and localization.
-    &lt;ul style="margin-top: 2px;"&gt;
-    &lt;li style="line-height: 130%;"&gt;Unicode is used internally.&lt;/li&gt;
-    &lt;li style="line-height: 130%;"&gt;Content in different languages can be provided by resource bundles.&lt;/li&gt;
-    &lt;li style="line-height: 130%;"&gt;Like content, images and scripts can be localized.&lt;/li&gt;
-    &lt;/ul&gt;
-</entry>
-
-  <!-- Themes -->
-  <entry key="themesText1">&lt;b&gt;Theme configuration&lt;/b&gt; &lt;br /&gt;&lt;br
-    /&gt;
-    In Tobago it's easy to give an application a well designed look. You can use
-    prepared themes like speyside or scarborough, just to name two.
-    The only thing you have to do is configure them at the right place. This is
-    done in the tobago-config.xml by defining a default theme.</entry>
-
-  <entry key="themesCodeExampleTitle">Code Example</entry>
-  <entry key="themesCodeExample">...
-&lt;tobago-config&gt;
-            &lt;theme-config&gt;
-                        &lt;default-theme&gt;speyside&lt;/default-theme&gt;
-            &lt;/theme-config&gt;
-            &lt;resource-dir&gt;tobago&lt;/resource-dir&gt;
-&lt;/tobago-config&gt;
-...</entry>
-  <entry key="theme_photo">The Standard Theme doesn't have a photo to show</entry>
-
-  <entry key="foreach_text">
-    There are two possibilities to use iterators:&lt;br/>
-    This example uses &lt;b>&amp;lt;c:forEach&gt;&lt;/b>. It works well with the layout manager.&lt;br/>
-    Using &lt;b>&amp;lt;ui:repeat&gt;&lt;/b> doesn't work with the grid layout manager in the moment.
-    The iterated components are on top of each other in the HTML document,
-    because they got have all the same position attributes.&lt;br/></entry>
-
-  <entry key="format1">The equatorial radius of the sun is {0} km.</entry>
-  <entry key="format3">The temperature of the sun is {0} K on the surface, but {1} K in the center and {2} K in the corona.</entry>
-  <entry key="format9">Just reordering: {4} - {1} - {6} - {8} - {5} - {3} - {0} - {7} - {2}</entry>
-
-
-</properties>
diff --git a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle.properties b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle.properties
new file mode 100644
index 0000000..0c625a2
--- /dev/null
+++ b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle.properties
@@ -0,0 +1,281 @@
+#Converted from 'tobago-example/tobago-example-demo/src//main/resources/org/apache/myfaces/tobago/example/demo/Demo.xml'
+#Thu Sep 20 19:43:06 CEST 2018
+Salutation_MR=Mr.
+Salutation_MRS=Mrs.
+Salutation_UNKNOWN=none
+accessKey=Access Keys
+api=API
+badge=Badge
+bar=Bar
+basic_buttonAction=Click Button
+basic_dateLabel=Date
+basic_lastActionLabel=Last Click
+basic_linkAction=Click Link
+basic_sampleInputTitle=Basic Input Examples
+basic_sampleLinkTitle=Basic Controls Examples
+basic_sampleSelectTitle=Basic Select Examples
+basic_suggestLabel=Suggest (AJAX)
+basic_suggestTip=Please type in "po" for example
+basic_text_action=Control elements for site navigation and to execute actions.
+basic_text_input=Input controls for different kinds of text\: single-line, multiline, formated.
+basic_text_select=Select controls allow input of one or multiple options.
+basic_textareaLabel=Textarea
+basic_textboxLabel=Inputfield
+basic_textboxTip=A simple input field
+basic_timeLabel=Time
+behavior=Behavior
+bestPractice=Best Practice
+big=big
+bottom=bottom
+box=Content Box
+browser=Browser
+button_link=Link & Button
+buttons=Button Group
+buttons_customizer=Button Group Customizer
+cancel=Cancel
+ckeditor=CKEditor
+closeButtonTip=Hide this tab for one request cycle
+collapsible=Collapsible
+collapsible_box=Content Box
+collapsible_panel=Panel
+collapsible_popup=Popup
+collapsible_section=Section
+command=Commands
+compatibility=Compatibility
+component=Components
+concept=Concepts
+container=Container
+content_security_policy=Content Security Policy
+content_validation=Content Validation
+conversation=Conversation Scope
+conversion=Conversion
+dataAttribute=Data Attributes
+date=Date
+default_command=Default Command
+deprecated=Deprecated
+download=Download
+error=Error Handling
+exception_handler=Ajax Exception Handler
+faceletsAsResources=Facelets As Resource
+faq=FAQ
+figure=Figure
+flex_layout=FlexLayout
+flow_layout=FlowLayout
+footer_next=Next
+footer_previous=Prev
+footer_viewSource=View Source
+for_each=For Each
+foreach_text=\n    There are two possibilities to use iterators\:<br/>\n    This example uses <b>&lt;c\:forEach></b>. It works well with the layout manager.<br/>\n    Using <b>&lt;ui\:repeat></b> doesn't work with the grid layout manager in the moment.\n    The iterated components are on top of each other in the HTML document,\n    because they got have all the same position attributes.<br/>
+form=Forms
+form_ajax=Ajax Forms
+form_in1Title=First inner form
+form_in2Title=Second inner form
+form_outTitle=Outer form
+form_required=Required Forms
+form_text1=<li style\="line-height\: 130%;">Values in the first form are being\n  stored temporarily by submitting the second form while the value in the second\n  form is written into the model.</li>\n<li style\="line-height\: 130%;">By submitting both form each value is stored into\n  the model.</li>\n<li style\="line-height\: 130%;">If the first input contains an error but the second\n  one validates, the validation of the first form is deactivated.</li>\n  
+format=Formatting
+format1=The equatorial radius of the sun is {0} km.
+format3=The temperature of the sun is {0} K on the surface, but {1} K in the center and {2} K in the corona.
+format9=Just reordering\: {4} - {1} - {6} - {8} - {5} - {3} - {0} - {7} - {2}
+getting_started=Getting started
+grid_layout=GridLayout
+group=Input Group
+header_footer=Header / Footer
+image=Image
+in=Input
+input=Input Fields
+intro=Intro
+label=Label
+labeled_layout=LabeledLayout
+layout=Layout
+links=Link Group
+locale=Locale
+locale_label=Locale
+locale_submit=Submit
+locale_text=Tobago supports internationalization and localization.\n    <ul style\="margin-top\: 2px;">\n    <li style\="line-height\: 130%;">Unicode is used internally.</li>\n    <li style\="line-height\: 130%;">Content in different languages can be provided by resource bundles.</li>\n    <li style\="line-height\: 130%;">Like content, images and scripts can be localized.</li>\n    </ul>\n
+locale_title=Locale settings
+login=Login
+manual=Manual Tests
+menu_accessAllPages=Access all pages
+menu_closeTest=Close Test
+menu_config=Configuration
+menu_locale=Language
+menu_runTest=Run Test
+menu_runTestAll=Run all tests
+menu_test=Test
+menu_themes=Theme
+menubar=Menubar
+messages=Messages
+migration=Migration
+migration15=1.0 to 1.5
+migration20=1.5 to 2
+migration30=2 to 3
+migration40=3 to 4
+modelValue1=Value in model
+modelValue2=Value in model
+multi=Multi selection
+multiCascade=Multi selection, Cascading
+multiLeafOnly=Multi selection, Leafs only
+newValue1=New model-value
+newValue2=New model-value
+new_in_2_0=Tobago 2
+new_in_3_0=Tobago 3
+new_in_4_0=Tobago 4
+new_in_4_1=Tobago 4.1
+new_in_4_2=Tobago 4.2
+non_faces_request=Non Faces Request
+none=Not selectable
+notTranslated=Sorry, not completely translated yet.
+object=External Object (iframe)
+off=off
+out=Output
+output=Output Fields
+pageTitle=Tobago Demo
+panel=Panel
+popup=Popup Dialog
+progress=Progress Bar
+reference_command=Command
+reference_container=Container
+reference_inputSuggest=Input suggest
+reference_intro=Ref. (under constr.)
+reference_menu=Menu
+reference_object=Object
+reference_output=Output
+reference_partial=Partial
+reference_popup=Popup
+reference_progress=Progress
+reference_select=Select
+reference_sheet=Sheet
+reference_tab=Tab
+reference_time=Time
+reference_tool=Tool Bar
+reference_tree=Tree
+reference_upload=Upload
+release_checklist=Release Checklist
+right=right
+roles=Roles
+sanitize=Sanitize
+section=Section
+security=Security
+segment_layout=SegmentLayout
+select=Select Controls
+selectBooleanCheckbox=Checkbox
+selectBooleanToggle=Toggle
+selectManyCheckbox=Checkbox Group
+selectManyListbox=Multiselection List
+selectManyShuttle=Shuttle List
+selectOneChoice=Dropdown Box
+selectOneListbox=Singleselection List
+selectOneRadio=Radio Button
+separator=Separator
+severity=Severity
+sheet=Sheet Control
+sheet_column_content=Column Content
+sheet_column_selector=Column Selector
+sheet_configTip=Click here to edit display attributes of the sheet.
+sheet_configTitle=Sheet configuration
+sheet_dropdown=Dropdown Box
+sheet_editable=Editable Sheet
+sheet_event=Event
+sheet_filter=Filtering
+sheet_markup=Markup
+sheet_multi_header=Multi Header
+sheet_resetLabel=Reset
+sheet_resetTip=Reset the modified widths of the columns in the sheet.
+sheet_sorting=Sorting
+sheet_static_header=Static Header
+sheet_style=Styling
+sheet_text=The sheet control is a simple solution for displaying table based\n  information. The essential features are\:\n    <ul style\="margin-top\: 2px;">\n    <li style\="line-height\: 130%;">Paging\: A defined range of data is displayed.\n      Navigation is done with arrow buttons.</li>\n    <li style\="line-height\: 130%;">Sorting\: By clicking a column header the\n    appropriate column is sorted.</li>\n    <li style\="line-height\: 130%;">Inline-Editing\: If needed, the values  [...]
+sheet_tree=Column Tree
+sheet_types=Sheet Content
+siblingLeafOnly=Multi selection, Leafs on same level only
+single=Single selection
+singleLeafOnly=Single selection, Leafs only
+small=small
+solarArrayDistance=Distance
+solarArrayName=Name
+solarArrayNumber=\#
+solarArrayNumberTip=Number
+solarArrayOrbit=Orbits
+solarArrayPeriod=Period
+solarArrayPopulation=Population
+solarPagingSheet=Sheet with Paging
+solarPlanetDiameter=Diameter
+solarPlanetMass=Mass
+solarPlanetSunDistance=Distance of the Sun
+solarPlanetTimeOfCirculation=Time of Circulation
+stars=5 Star Rating
+submit=Submit
+submitAll=Submit all Forms
+submitForm1=Submit Form 1
+submitForm2=Submit Form 2
+suggest=Suggest
+suggest_method=SuggestMethod
+tab=Tab Group
+tabInsolar=In the _Solarsystem
+tabMoons=_Moons
+tabPlanet=Data of the _Planets
+tabSwitchTypeClient=Client side tabbing
+tabSwitchTypeReloadPage=Server side tabbing (Full Reload)
+tabSwitchTypeReloadTag=Server side tabbing (Ajax)
+tab_ajax=Ajax
+tab_client=Client side
+tab_server=Server side
+tab_text=The tab control provides so called tab panels.\n    <ul style\="margin-top\: 2px;">\n    <li style\="line-height\: 130%;">Control can take place on server- or clientside.</li>\n    <li style\="line-height\: 130%;">Tab controls can be nested.</li>\n    <li style\="line-height\: 130%;">Inside each tab control any other controls   can be used.</li>\n    </ul>\n  
+tagDocUrl=https\://myfaces.apache.org/tobago/doc
+test=Tests
+textarea=Text Area
+theme=Themes
+theme_photo=The Standard Theme doesn't have a photo to show
+theme_text=Tobago supports a big variety of displaying controls,\n  so called designs or themes.\n    <ul style\="margin-top\: 2px;">\n    <li style\="line-height\: 130%;">Choosing of themes can be application wide,   user or group specific.</li>\n    <li style\="line-height\: 130%;">Images and other resources can be theme   dependant as well as the application pages can be designed seperatly   for each supported theme.</li>\n    </ul>\n
+theme_title=Theme settings
+themesCodeExample=...\n<tobago-config>\n    \u00A0       <theme-config>\n    \u00A0           \u00A0       <default-theme>speyside</default-theme>\n    \u00A0       </theme-config>\n    \u00A0       <resource-dir>tobago</resource-dir>\n</tobago-config>\n...
+themesCodeExampleTitle=Code Example
+themesText1=<b>Theme configuration</b> <br /><br\n    />\n    In Tobago it's easy to give an application a well designed look. You can use\n    prepared themes like speyside or scarborough, just to name two.\n    The only thing you have to do is configure them at the right place. This is\n    done in the tobago-config.xml by defining a default theme.
+tinymce=TinyMCE
+tobago_url=http\://myfaces.apache.org/tobago
+toolBar=Toolbar
+toolBarCustomizer=User Customized UI
+toolbar_closePopupAction=Close popup window
+toolbar_dropDownAction=DropDown
+toolbar_popupText=To close this popup window click close button.
+toolbar_sampleTitle=Toolbar Example
+toolbar_text1=Toolbars can be used for context sensitive actions inside box controls.\n<ul style\="margin-top\: 2px;">\n<li style\="line-height\: 130%;">Toolbars can consist of images, text or both.</li>\n<li style\="line-height\: 130%;">Toolbars can be completly integrated into a box header.</li>\n<li style\="line-height\: 130%;">Actions can be displayed as drop down menues.</li>\n</ul>\n  
+transition=Transition
+tree=Tree Control
+treeLabel=Tre_e
+treeListboxLabel=Listbo_x
+treeMultiselect=selectable
+treeMutable=mutable
+treeShowIcons=show icons
+treeShowJunctions=show junction tree
+treeShowRoot=show root node
+treeShowRootJunction=show first junction
+tree_command_types=Command
+tree_editor=Tree Editor
+tree_listbox=Tree List
+tree_menu=Tree Menu
+tree_select=Select
+tree_text=The tree control displays a tree which is generated from application data. The key features are\:\n    <ul style\="margin-top\: 2px;">\n    <li style\="line-height\: 130%;">Attributes control the rendering of the tree.</li>\n    <li style\="line-height\: 130%;">The possibility to define the tree as "single" or "multiselect", i.e. select one or multiple nodes of the tree.\n    <li style\="line-height\: 130%;">Editing mode for simple handling of tree structures inside the applica [...]
+tx=TX Tag Library
+upload=File Upload
+validation=Validation
+validation-severity=Severity
+validation_custom=Custom Validator
+validation_description=Description
+validation_jsr303=JSR 303\: Bean Validation
+validation_number=Number
+validation_price=Price
+validation_submit=Submit
+validation_text=Tobago provides easy to use possibilities for validation of user input.\n    <ul style\="margin-top\: 2px;">\n    <li style\="line-height\: 130%;">Syntactic and semantic validation is available.</li>\n    <li style\="line-height\: 130%;">Error messages can be positioned anywhere in the   user interface.</li>\n    <li style\="line-height\: 130%;">Input elements, which are affected by the   validation can be highlighted.</li>\n    </ul>\n
+whats_new=What's new?
+wysiwyg_editor=WYSIWYG Editor
+new_in_4_3=Tobago 4.3
+new_in_3_1=Tobago 3.1
+new_in_2_2=Tobago 2.2
+migration50=4 to 5
+non_faces_response=Non Faces Response
+partial=Partial / AJAX
+resize=Resizing (todo)
+focus=Focus
+meta=Meta Tag
diff --git a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle_de.properties b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle_de.properties
new file mode 100644
index 0000000..aab0d85
--- /dev/null
+++ b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle_de.properties
@@ -0,0 +1,108 @@
+#Converted from 'tobago-example/tobago-example-demo/src//main/resources/org/apache/myfaces/tobago/example/demo/Demo_de.xml'
+#Thu Sep 20 19:43:06 CEST 2018
+Salutation_MR=Herr
+Salutation_MRS=Frau
+Salutation_UNKNOWN=keine
+basic_buttonAction=Klicke Knopf
+basic_dateLabel=Datum
+basic_lastActionLabel=Letzter Klick
+basic_linkAction=Klicke Link
+basic_sampleInputTitle=Eingabe Beispiele
+basic_sampleLinkTitle=Steuerungs Beispiele
+basic_sampleSelectTitle=Auswahl Beispiele
+basic_suggestLabel=Vorschlag (AJAX)
+basic_suggestTip=Bitte geben Sie beispielsweise "po" ein
+basic_text_action=Steuerelemente f\u00FCr die Navigation und zum Ausf\u00FChren von Aktionen.
+basic_text_input=Eingabefelder f\u00FCr verschiedene Arten von Text\: einzeilig, mehrzeilig, formatiert.
+basic_text_select=Auswahlelemente erlauben die Eingabe von einer oder mehreren Optionen.
+basic_textareaLabel=Textfeld
+basic_textboxLabel=Eingabefeld
+basic_textboxTip=Ein einfaches Eingabefeld
+basic_timeLabel=Uhrzeit
+cancel=Abbrechen
+closeButtonTip=Diesen Reiter f\u00FCr einen Request schlie\u00DFen
+error=Fehlerbehandlung
+form_in1Title=Erstes inneres Formular
+form_in2Title=Zweites inneres Formular
+form_outTitle=\u00C4usseres Formular
+form_text1=<li style\="line-height\: 130%;">Werte in der ersten Form werden beim submit der zweiten form tempor\u00E4r gespeichert, w\u00E4hrend der Wert aus der 2. Form ins Model geschrieben wird.</li><li style\="line-height\: 130%;">Beim submit beider Forms werden beide Werte in Model geschrieben.</li><li style\="line-height\: 130%;">Ist Das erste Input mit einem ung\u00FCltigen Wert gef\u00FCllt und die zweite Form wird mit einem g\u00FCltigen Wert submitted, ist die Validierung f\u00 [...]
+form_text2=Tobago unterst\u00FCtzt verschachtelte Forms und kann jede Form separat behandeln\:<ul style\="margin-top\: 2px;"> <li style\="line-height\: 130%;">Werte k\u00F6nnen separat im Model gespeichert werden, w\u00E4hrend bereits ausgef\u00FCllte andere Forms Ihre Werte (tempor\u00E4r) behalten.</li><li style\="line-height\: 130%;">F\u00FCr den Fall da\u00DF f\u00FCr einzelne Forms Validierung aktiviert ist, der Wert aber nur tempor\u00E4r gespeichert wird, ist die Validierung deakt [...]
+intro_text=<p>Tobago ist ein User-Interface-Framework zur Erstellung von Webanwendungen.\n    Das Framework st\u00FCtzt sich auf JavaServer Faces ab. Das Kernst\u00FCck bildet ein Theme-orientiertes\n    JSF Render Kit.</p>  <p><b>Basis Controls</b><br/> Tobago stellt alle\n    Standardcontrols von HTML zur Verf\u00FCgung wie Eingabefelder, Textfelder, Radiobuttons, Checkboxen und Kn\u00F6pfe.\n    Zus\u00E4tzlich zu den Basis Controls bietet Tobago eine Anzahl komplexer Controls, die ni [...]
+layout_city=Stadt
+layout_co=c/o
+layout_exampleTitle=Layout Beispiel\: Pers\u00F6nliche Informationen
+layout_firstName=Vorname
+layout_lastName=Nachname
+layout_note=Anmerkung
+layout_salutation=Anrede
+layout_street=Stra\u00DFe
+layout_streetNumber=Nr.
+layout_text=Tobago vereinfacht das Gestalten von Webseiten. <ul style\="margin-top\: 2px;"> <li style\="line-height\: 130%;">Bequeme Erstellung von ein- und mehrspaltigen Formularen</li> <li style\="line-height\: 130%;">Zellen k\u00F6nnen mehrere Zeilen und Spalten \u00FCberspannen</li> <li style\="line-height\: 130%;">Automatisches Ausrichten von Beschriftungen f\u00FCr Eingabefelder</li> </ul>
+layout_zipCode=PLZ
+locale=Lokalisierung
+locale_label=Sprache/Land
+locale_submit=\u00DCbernehmen
+locale_text=Tobago unterst\u00FCtzt Internationalisierung und Lokalisierung. <ul style\="margin-top\: 2px;"> <li style\="line-height\: 130%;">Intern wird Unicode verwendet</li> <li style\="line-height\: 130%;">Texte f\u00FCr verschiedene L\u00E4nder und Sprachen k\u00F6nnen in Resource Bundles ausgelagert werden.</li> <li style\="line-height\: 130%;">Zus\u00E4tzlich zu Texten k\u00F6nnen beliebige Resourcen wie Bilder und Skripte lokalisiert werden.</li> </ul>
+locale_title=Sprach- und l\u00E4nderspezifische Einstellungen
+menu_navigate=_Navigation
+modelValue1=Wert im Model
+modelValue2=Wert im Model
+multi=Mehrfachauswahl
+multiCascade=Mehrfachauswahl, kaskadierend
+multiLeafOnly=Mehrfachauswahl, nur Bl\u00E4tter
+newValue1=Neuer Wert
+newValue2=Neuer Wert
+none=Nicht ausw\u00E4hlbar
+notTranslated=Einige Teile dieser Seite sind nicht in allen Sprachen verf\u00FCgbar.
+selectBooleanCheckbox=Checkbox (de)
+overview=\u00DCbersicht
+sheet_configTip=Hier klicken zum Einstellen der Tabellenkonfiguration.
+sheet_configTitle=Tabelle konfigurieren
+sheet_resetTip=Hier klicken um den Orginalzustand der Spaltenbreiten wiederherzustellen.
+sheet_text=Das Sheet-Control bietet eine einfache M\u00F6glichkeit tabellarische Daten darzustellen.\n    Die wichtigsten Eigenschaften sind\: <ul style\="margin-top\: 2px;"> <li style\="line-height\: 130%;">Paging\:\n    Es wird nur ein Teil der Gesamtliste angezeigt.   \u00DCber die Pfeilkn\u00F6pfe kann in der Liste navigiert werden.\n    </li> <li style\="line-height\: 130%;">Sortierung\: Durch Dr\u00FCcken auf die Spalten\u00FCberschrift\n    kann die entsprechende Spalte sortiert w [...]
+siblingLeafOnly=Mehrfach Auswahl, nur Bl\u00E4tter einer Ebene
+single=Einfache Auswahl
+singleLeafOnly=Einfache Auswahl, nur Bl\u00E4tter
+solarArrayDistance=Entfernung
+solarArrayNumberTip=Nummer
+solarArrayPeriod=Umlauf
+solarArrayPopulation=Bev\u00F6lkerung
+solarPagingSheet=Tabelle mit Seitenverwaltung
+solarPlanetDiameter=Durchmesser
+solarPlanetMass=Masse
+solarPlanetSunDistance=Entfernung zur Sonne
+solarPlanetTimeOfCirculation=Umlaufzeit
+submit=\u00DCbernehmen
+submitAll=Alle Formulare \u00DCbernehmen
+submitForm1=Formular 1 \u00DCbernehmen
+submitForm2=Formular 2 \u00DCbernehmen
+tabInsolar=im _Sonnensystem
+tabMoons=Monde
+tabPlanet=_Planetendaten
+tabSwitchTypeClient=Clientseitiges Umschalten
+tabSwitchTypeReloadPage=Vollst\u00E4ndig neu laden
+tabSwitchTypeReloadTag=Serverseitges Umschalten per Ajax
+tab_text=Das Tab-Control stellt so genannte Tab-Panels zur Verf\u00FCgung. <ul style\="margin-top\: 2px;"> <li style\="line-height\: 130%;">Die Steuerung kann server- oder clientseitig erfolgen.</li> <li style\="line-height\: 130%;">Tab-Controls k\u00F6nnen verschachtelt werden.</li> <li style\="line-height\: 130%;">Innerhalb von Tab-Controls k\u00F6nnen wiederum   beliebige Controls angeordnet werden.</li> </ul>
+theme_title=Einstellung des Designs
+themes=Designs
+toolbar=Toolbar
+toolbar_buttonAction=Text Button
+toolbar_closePopupAction=Popup Fenster schlie\u00DFen
+toolbar_dropDownAction=DropDown
+toolbar_popupText=Zum schlie\u00DFen dieses Fensters den Button dr\u00FCcken.
+toolbar_sampleTitle=Toolbar Beispiel
+toolbar_text1=Toolbars werden genutzt um kontextabh\u00E4ngige Aktionen in Box Elementen zur Verf\u00FCgung zu stellen\:\n  <ul style\="margin-top\: 2px;">\n  <li style\="line-height\: 130%;">Toolbars k\u00F6nnen aus Bildern, Text oder beidem bestehen.</li>\n  <li style\="line-height\: 130%;">Toolbars k\u00F6nnen in den Header einer Box integriert werden.</li>\n  <li style\="line-height\: 130%;">Aktionen k\u00F6nnen als Drop Down Men\u00FC dargestellt werden.</li>\n  </ul>\n    
+treeLabel=Tree
+treeListboxLabel=Listbox
+treeMultiselect=Ausw\u00E4hlbar
+treeMutable=Ver\u00E4nderbar
+treeShowIcons=Symbole darstellen
+treeShowJunctions=Linien darstellen
+treeShowRoot=Wurzel darstellen
+treeShowRootJunction=Wurzellinie darstellen
+tree_text=Das Tree-Control stellt einen Baum dar, der aus Applikationsdaten erzeugt wird. Die wichtigsten Eigenschaften sind\: <ul style\="margin-top\: 2px;"> <li style\="line-height\: 130%;">Die Darstellung von Icons und Baumstruktur wird   \u00FCber Attribute gesteuert.</li> <li style\="line-height\: 130%;">Die M\u00F6glichkeit den Baum als "single" oder "multiselect" zu definieren,   also einen oder mehrere Knoten auszuw\u00E4hlbar zu machen.</li> <li style\="line-height\: 130%;">Edit [...]
+validation_description=Beschreibung
+validation_number=Zahl
+validation_price=Preis
+validation_submit=\u00DCbernehmen
+validation_text=Tobago unterst\u00FCtzt komfortable M\u00F6glichkeiten zur Validierung von Benutzereingaben. <ul style\="margin-top\: 2px;"> <li style\="line-height\: 130%;">Es steht syntaktische und sematische Validierung zur Verf\u00FCgung.</li> <li style\="line-height\: 130%;">Fehlermeldungen k\u00F6nnen beliebig im Userinterface plaziert werden.</li> <li style\="line-height\: 130%;">Eingabeelemente, f\u00FCr die Fehleingaben erfolgt sind, k\u00F6nnen hervorgehoben werden.</li> </ul>
diff --git a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle_en.properties b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle_en.properties
new file mode 100644
index 0000000..dc026ed
--- /dev/null
+++ b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle_en.properties
@@ -0,0 +1,4 @@
+#Converted from 'tobago-example/tobago-example-demo/src//main/resources/org/apache/myfaces/tobago/example/demo/Demo_en.xml'
+#Thu Sep 20 19:43:06 CEST 2018
+notTranslated=
+selectBooleanCheckbox=Checkbox (en)
diff --git a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle_ja.properties b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle_ja.properties
new file mode 100644
index 0000000..81d019e
--- /dev/null
+++ b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle_ja.properties
@@ -0,0 +1,4 @@
+#Converted from 'tobago-example/tobago-example-demo/src//main/resources/org/apache/myfaces/tobago/example/demo/Demo_ja.xml'
+#Thu Sep 20 19:43:06 CEST 2018
+notTranslated=\u6B8B\u5FF5\u3001\u5341\u5206\u306B\u307E\u3060\u5909\u63DB\u3055\u308C\u308B
+selectBooleanCheckbox=Checkbox (ja)
diff --git a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle_ru.properties b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle_ru.properties
new file mode 100644
index 0000000..eaea583
--- /dev/null
+++ b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/DemoBundle_ru.properties
@@ -0,0 +1,4 @@
+#Converted from 'tobago-example/tobago-example-demo/src//main/resources/org/apache/myfaces/tobago/example/demo/Demo_ru.xml'
+#Thu Sep 20 19:43:05 CEST 2018
+notTranslated=\u043E\u0433\u043E\u0440\u0447\u0435\u043D\u043D\u043E, \u043F\u043E\u043B\u043D\u043E \u043F\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043D\u043E \u043F\u043E\u043A\u0430
+selectBooleanCheckbox=Checkbox (ru)
diff --git a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/Demo_de.xml b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/Demo_de.xml
deleted file mode 100644
index 03bb7cd..0000000
--- a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/Demo_de.xml
+++ /dev/null
@@ -1,192 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
--->
-
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-
-<properties>
-  <entry key="notTranslated">Einige Teile dieser Seite sind nicht in allen Sprachen verfügbar.</entry>
-
-<!--  menu -->
-  <entry key="menu_navigate">_Navigation</entry>
-
-<!--  navigate -->
-  <entry key="overview">Übersicht</entry>
-  <entry key="toolbar">Toolbar</entry>
-  <entry key="themes">Designs</entry>
-<!-- browser=Browser -->
-  <entry key="locale">Lokalisierung</entry>
-<!-- layout=Layout -->
-
-  <!--<entry key="bestPractice">Best Practice</entry>-->
-  <entry key="error">Fehlerbehandlung</entry>
-
-  <entry key="submit">Übernehmen</entry>
-  <entry key="cancel">Abbrechen</entry>
-
-<!--  intro -->
-  <entry key="intro_text">&lt;p&gt;Tobago ist ein User-Interface-Framework zur Erstellung von Webanwendungen.
-    Das Framework stützt sich auf JavaServer Faces ab. Das Kernstück bildet ein Theme-orientiertes
-    JSF Render Kit.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Basis Controls&lt;/b&gt;&lt;br/&gt; Tobago stellt alle
-    Standardcontrols von HTML zur Verfügung wie Eingabefelder, Textfelder, Radiobuttons, Checkboxen und Knöpfe.
-    Zusätzlich zu den Basis Controls bietet Tobago eine Anzahl komplexer Controls, die nicht direkt von HTML
-    unterstützt werden. Dazu gehören: Sheet, Baum,
-    Karteireiter&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Validierung&lt;/b&gt;&lt;br/&gt; Das Hauptziel von Tobago ist es,
-    dass Entwickeln von Anwendungen, mit denen der Anwender interagieren kann. Um die Interaktion zu verbessern,
-    verfügt Tobago über Möglichkeiten, die Eingaben des Anwenders zu überprüfen und den Anwender bei der Eingabe
-    korrekter Werte zu unterstützen.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Layout&lt;/b&gt;&lt;br/&gt; Tobago bietet einen
-    rafinierten Layoutmanager, den man als Mischung aus klassischem HTML Tabellen Layout und Swing Gridbag Layout
-    verstehen kann.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Weiteres&lt;/b&gt;&lt;br/&gt; Themes, Browser,
-    Internationalisierung&lt;/p&gt;</entry>
-
-<!--  basicControls -->
-  <entry key="basic_sampleInputTitle">Eingabe Beispiele</entry>
-  <entry key="basic_sampleSelectTitle">Auswahl Beispiele</entry>
-  <entry key="basic_sampleLinkTitle">Steuerungs Beispiele</entry>
-  <entry key="Salutation_UNKNOWN">keine</entry>
-  <entry key="Salutation_MR">Herr</entry>
-  <entry key="Salutation_MRS">Frau</entry>
-  <entry key="basic_textboxLabel">Eingabefeld</entry>
-  <entry key="basic_textboxTip">Ein einfaches Eingabefeld</entry>
-  <entry key="basic_suggestLabel">Vorschlag (AJAX)</entry>
-  <entry key="basic_suggestTip">Bitte geben Sie beispielsweise "po" ein</entry>
-  <entry key="basic_dateLabel">Datum</entry>
-  <entry key="basic_timeLabel">Uhrzeit</entry>
-  <entry key="basic_textareaLabel">Textfeld</entry>
-  <entry key="basic_linkAction">Klicke Link</entry>
-  <entry key="basic_buttonAction">Klicke Knopf</entry>
-  <entry key="basic_lastActionLabel">Letzter Klick</entry>
-  <entry key="basic_text_input">Eingabefelder für verschiedene Arten von Text: einzeilig, mehrzeilig, formatiert.</entry>
-  <entry key="basic_text_select">Auswahlelemente erlauben die Eingabe von einer oder mehreren Optionen.</entry>
-  <entry key="basic_text_action">Steuerelemente für die Navigation und zum Ausführen von Aktionen.</entry>
-
-<!--  sheet -->
-  <entry key="sheet_text">Das Sheet-Control bietet eine einfache Möglichkeit tabellarische Daten darzustellen.
-    Die wichtigsten Eigenschaften sind: &lt;ul style="margin-top: 2px;"&gt; &lt;li style="line-height: 130%;"&gt;Paging:
-    Es wird nur ein Teil der Gesamtliste angezeigt.   Über die Pfeilknöpfe kann in der Liste navigiert werden.
-    &lt;/li&gt; &lt;li style="line-height: 130%;"&gt;Sortierung: Durch Drücken auf die Spaltenüberschrift
-    kann die entsprechende Spalte sortiert werden.&lt;/li&gt; &lt;li style="line-height: 130%;"&gt;Inline-Editing:
-    Es können bei Bedarf Werte   direkt in die Tabelle eingegeben werden.
-    &lt;/li&gt; &lt;li style="line-height: 130%;"&gt;Die Spaltenbreite kann direkt mit der Maus
-    manipuliert werden.&lt;/li&gt; &lt;/ul&gt;
-    In diesem Beispiel ist in applikationsspezifischer Sorter hinterlegt, der die Sonne immer oben erscheinen lässt.
-  </entry>
-  <entry key="sheet_resetTip">Hier klicken um den Orginalzustand der Spaltenbreiten wiederherzustellen.</entry>
-  <entry key="sheet_configTip">Hier klicken zum Einstellen der Tabellenkonfiguration.</entry>
-  <entry key="sheet_configTitle">Tabelle konfigurieren</entry>
-
-<!--  tree -->
-  <entry key="tree_text">Das Tree-Control stellt einen Baum dar, der aus Applikationsdaten erzeugt wird. Die wichtigsten Eigenschaften sind: &lt;ul style="margin-top: 2px;"&gt; &lt;li style="line-height: 130%;"&gt;Die Darstellung von Icons und Baumstruktur wird   über Attribute gesteuert.&lt;/li&gt; &lt;li style="line-height: 130%;"&gt;Die Möglichkeit den Baum als "single" oder "multiselect" zu definieren,   also einen oder mehrere Knoten auszuwählbar zu machen.&lt;/li&gt; &lt;li style=" [...]
-  <entry key="treeShowIcons">Symbole darstellen</entry>
-  <entry key="treeShowRoot">Wurzel darstellen</entry>
-  <entry key="treeShowJunctions">Linien darstellen</entry>
-  <entry key="treeShowRootJunction">Wurzellinie darstellen</entry>
-  <entry key="treeMultiselect">Auswählbar</entry>
-  <entry key="treeMutable">Veränderbar</entry>
-  <entry key="treeLabel">Tree</entry>
-  <entry key="treeListboxLabel">Listbox</entry>
-
-  <entry key="none">Nicht Auswählbar</entry>
-  <entry key="single">Einfache Auswahl</entry>
-  <entry key="singleLeafOnly">Einfache Auswahl, nur Blätter</entry>
-  <entry key="multi">Mehrfach Auswahl</entry>
-  <entry key="multiLeafOnly">Mehrfach Auswahl, nur Blätter</entry>
-  <entry key="siblingLeafOnly">Mehrfach Auswahl, nur Blätter einer Ebene</entry>
-
-<!--  tab -->
-  <entry key="tab_text">Das Tab-Control stellt so genannte Tab-Panels zur Verfügung. &lt;ul style="margin-top: 2px;"&gt; &lt;li style="line-height: 130%;"&gt;Die Steuerung kann server- oder clientseitig erfolgen.&lt;/li&gt; &lt;li style="line-height: 130%;"&gt;Tab-Controls können verschachtelt werden.&lt;/li&gt; &lt;li style="line-height: 130%;"&gt;Innerhalb von Tab-Controls können wiederum   beliebige Controls angeordnet werden.&lt;/li&gt; &lt;/ul&gt;</entry>
-  <entry key="tabSwitchTypeClient">Clientseitiges Umschalten</entry>
-  <entry key="tabSwitchTypeReloadTag">Serverseitges Umschalten per Ajax</entry>
-  <entry key="tabSwitchTypeReloadPage">Vollständig neu laden</entry>
-  <entry key="tabPlanet">_Planetendaten</entry>
-  <entry key="tabInsolar">im _Sonnensystem</entry>
-  <entry key="closeButtonTip">Diesen Reiter für einen Request schließen</entry>
-  <entry key="tabMoons">Monde</entry>
-
-<!--  solar -->
-  <entry key="solarPlanetDiameter">Durchmesser</entry>
-  <entry key="solarPlanetMass">Masse</entry>
-  <entry key="solarPlanetSunDistance">Entfernung zur Sonne</entry>
-  <entry key="solarPlanetTimeOfCirculation">Umlaufzeit</entry>
- <!--solarArrayName=Name -->
- <!--solarArrayNumber=raute  -->
-  <entry key="solarArrayNumberTip">Nummer</entry>
- <!--solarArrayOrbit=Orbits -->
-  <entry key="solarArrayDistance">Entfernung</entry>
-  <entry key="solarArrayPeriod">Umlauf</entry>
-  <entry key="solarArrayPopulation">Bevölkerung</entry>
-  <entry key="solarPagingSheet">Tabelle mit Seitenverwaltung</entry>
-
-<!--  toolbar -->
-  <entry key="toolbar_closePopupAction">Popup Fenster schließen</entry>
-  <entry key="toolbar_popupText">Zum schließen dieses Fensters den Button drücken.</entry>
-  <entry key="toolbar_dropDownAction">DropDown</entry>
-  <entry key="toolbar_buttonAction">Text Button</entry>
-  <entry key="toolbar_sampleTitle">Toolbar Beispiel</entry>
-  <entry key="toolbar_text1">Toolbars werden genutzt um kontextabhängige Aktionen in Box Elementen zur Verfügung zu stellen:
-  &lt;ul style="margin-top: 2px;"&gt;
-  &lt;li style="line-height: 130%;"&gt;Toolbars können aus Bildern, Text oder beidem bestehen.&lt;/li&gt;
-  &lt;li style="line-height: 130%;"&gt;Toolbars können in den Header einer Box integriert werden.&lt;/li&gt;
-  &lt;li style="line-height: 130%;"&gt;Aktionen können als Drop Down Menü dargestellt werden.&lt;/li&gt;
-  &lt;/ul&gt;
-    </entry>
-
-<!--  validation -->
-  <entry key="validation_description">Beschreibung</entry>
-  <entry key="validation_number">Zahl</entry>
-  <entry key="validation_price">Preis</entry>
-  <entry key="validation_submit">Übernehmen</entry>
-  <entry key="validation_text">Tobago unterstützt komfortable Möglichkeiten zur Validierung von Benutzereingaben. &lt;ul style="margin-top: 2px;"&gt; &lt;li style="line-height: 130%;"&gt;Es steht syntaktische und sematische Validierung zur Verfügung.&lt;/li&gt; &lt;li style="line-height: 130%;"&gt;Fehlermeldungen können beliebig im Userinterface plaziert werden.&lt;/li&gt; &lt;li style="line-height: 130%;"&gt;Eingabeelemente, für die Fehleingaben erfolgt sind, können hervorgehoben werden [...]
-
-<!--  form -->
-  <entry key="form_outTitle">Äusseres Formular</entry>
-  <entry key="form_text1">&lt;li style="line-height: 130%;"&gt;Werte in der ersten Form werden beim submit der zweiten form temporär gespeichert, während der Wert aus der 2. Form ins Model geschrieben wird.&lt;/li&gt;&lt;li style="line-height: 130%;"&gt;Beim submit beider Forms werden beide Werte in Model geschrieben.&lt;/li&gt;&lt;li style="line-height: 130%;"&gt;Ist Das erste Input mit einem ungültigen Wert gefüllt und die zweite Form wird mit einem gültigen Wert submitted, ist die Val [...]
-  <entry key="form_text2">Tobago unterstützt verschachtelte Forms und kann jede Form separat behandeln:&lt;ul style="margin-top: 2px;"&gt; &lt;li style="line-height: 130%;"&gt;Werte können separat im Model gespeichert werden, während bereits ausgefüllte andere Forms Ihre Werte (temporär) behalten.&lt;/li&gt;&lt;li style="line-height: 130%;"&gt;Für den Fall daß für einzelne Forms Validierung aktiviert ist, der Wert aber nur temporär gespeichert wird, ist die Validierung deaktiviert. Erst  [...]
-  <entry key="form_in1Title">Erstes inneres Formular</entry>
-  <entry key="form_in2Title">Zweites inneres Formular</entry>
-  <entry key="newValue1">Neuer Wert</entry>
-  <entry key="modelValue1">Wert im Model</entry>
-  <entry key="submitForm1">Formular 1 Übernehmen</entry>
-  <entry key="newValue2">Neuer Wert</entry>
-  <entry key="modelValue2">Wert im Model</entry>
-  <entry key="submitForm2">Formular 2 Übernehmen</entry>
-  <entry key="submitAll">Alle Formulare Übernehmen</entry>
-
-<!--  theme -->
-  <entry key="theme_title">Einstellung des Designs</entry>
-
-<!--  locale -->
-  <entry key="locale_title">Sprach- und länderspezifische Einstellungen</entry>
-  <entry key="locale_label">Sprache/Land</entry>
-  <entry key="locale_submit">Übernehmen</entry>
-  <entry key="locale_text">Tobago unterstützt Internationalisierung und Lokalisierung. &lt;ul style="margin-top: 2px;"&gt; &lt;li style="line-height: 130%;"&gt;Intern wird Unicode verwendet&lt;/li&gt; &lt;li style="line-height: 130%;"&gt;Texte für verschiedene Länder und Sprachen können in Resource Bundles ausgelagert werden.&lt;/li&gt; &lt;li style="line-height: 130%;"&gt;Zusätzlich zu Texten können beliebige Resourcen wie Bilder und Skripte lokalisiert werden.&lt;/li&gt; &lt;/ul&gt;</entry>
-
-<!--  layout -->
-  <entry key="layout_exampleTitle">Layout Beispiel: Persönliche Informationen</entry>
-  <entry key="layout_salutation">Anrede</entry>
-  <entry key="layout_firstName">Vorname</entry>
-  <entry key="layout_lastName">Nachname</entry>
-  <entry key="layout_co">c/o</entry>
-  <entry key="layout_street">Straße</entry>
-  <entry key="layout_streetNumber">Nr.</entry>
-  <entry key="layout_zipCode">PLZ</entry>
-  <entry key="layout_city">Stadt</entry>
-  <entry key="layout_note">Anmerkung</entry>
-  <entry key="layout_text">Tobago vereinfacht das Gestalten von Webseiten. &lt;ul style="margin-top: 2px;"&gt; &lt;li style="line-height: 130%;"&gt;Bequeme Erstellung von ein- und mehrspaltigen Formularen&lt;/li&gt; &lt;li style="line-height: 130%;"&gt;Zellen können mehrere Zeilen und Spalten überspannen&lt;/li&gt; &lt;li style="line-height: 130%;"&gt;Automatisches Ausrichten von Beschriftungen für Eingabefelder&lt;/li&gt; &lt;/ul&gt;</entry>
-
-</properties>
diff --git a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/demo_en.properties.xml b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/demo_en.properties.xml
deleted file mode 100644
index 9bd08c2..0000000
--- a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/demo_en.properties.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
--->
-
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-
-<properties>
-  <entry key="notTranslated"></entry>
-</properties>
diff --git a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/demo_ja.properties.xml b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/demo_ja.properties.xml
deleted file mode 100644
index 7f9b0aa..0000000
--- a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/demo_ja.properties.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
--->
-
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-
-<properties>
-  <entry key="notTranslated">残念、十分にまだ変換される</entry>
-</properties>
diff --git a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/demo_ru.properties.xml b/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/demo_ru.properties.xml
deleted file mode 100644
index f00c86b..0000000
--- a/tobago-example/tobago-example-demo/src/main/resources/org/apache/myfaces/tobago/example/demo/demo_ru.properties.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
--->
-
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-
-<properties>
-  <entry key="notTranslated">огорченно, полно переведено пока</entry>
-</properties>
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/10-intro/50-migration/95-migration/ConvertXmlToProperties.java b/tobago-example/tobago-example-demo/src/main/webapp/content/10-intro/50-migration/95-migration/ConvertXmlToProperties.java
new file mode 100644
index 0000000..8798d86
--- /dev/null
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/10-intro/50-migration/95-migration/ConvertXmlToProperties.java
@@ -0,0 +1,32 @@
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.TreeSet;
+
+public class ConvertXmlToProperties {
+
+  public static void main(String[] args) throws Exception {
+
+    final String inXmlFile = args[0];
+    final InputStream inStream = new FileInputStream(inXmlFile);
+    final Properties properties = new Properties();
+    properties.loadFromXML(inStream);
+
+    final String outPropertiesFile = inXmlFile.replace(".xml", ".properties");
+    final OutputStream outStream = new FileOutputStream(outPropertiesFile);
+    final Properties sorted = new Properties() {
+      @Override
+      public synchronized Enumeration<Object> keys() {
+        return Collections.enumeration(new TreeSet<Object>(super.keySet()));
+      }
+    };
+    sorted.putAll(properties);
+    sorted.store(outStream, "Converted from '" + inXmlFile + "'");
+
+    System.out.println("Converted items: " + properties.size());
+  }
+}
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/10-intro/50-migration/95-migration/migration50.xhtml b/tobago-example/tobago-example-demo/src/main/webapp/content/10-intro/50-migration/95-migration/migration50.xhtml
new file mode 100644
index 0000000..76d2046
--- /dev/null
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/10-intro/50-migration/95-migration/migration50.xhtml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+-->
+
+<ui:composition template="/main.xhtml"
+                xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:tc="http://myfaces.apache.org/tobago/component"
+                xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html">
+  <ui:param name="title" value="#{demoBundle.migration50}"/>
+
+  <tc:section label="Migration from Tobago 4.0 to 5.0">
+    <p>
+      There are some migration steps to do, dependent on the application
+      you want to migrate. The steps can be classified by
+    </p>
+
+    <ul>
+      <li><tc:link link="" fragment="page:mainForm:themeBuilding" label="Theme Building"/></li>
+      <li><tc:link link="" fragment="page:mainForm:resourceBundles" label="Resource Bundles"/></li>
+    </ul>
+
+    <tc:section id="themeBuilding" label="Theme Building">
+    </tc:section>
+
+    <tc:section id="resourceBundles" label="Resource Bundles">
+
+      <tc:section id="migration-program" label="Java Class to Migrate from XML to properties">
+        <p>Here is a simple <tc:link label="Java Class" link="ConvertXmlToProperties.java"/>,
+          that may help you to change the layout attributes in the
+          facelets XHTML files.</p>
+        <pre><code class="language-java"><tc:out value="#{migration5Controller.javaSource}" escape="true" keepLineBreaks="false"/></code></pre>
+      </tc:section>
+
+      <tc:section>
+        TobagoContext.getResourceBundle() returns now ResourceBundle
+        TobagoContext.getMessageBundle() returns now ResourceBundle
+      </tc:section>
+
+    </tc:section>
+
+  </tc:section>
+
+</ui:composition>
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/10-intro/50-migration/migration.xhtml b/tobago-example/tobago-example-demo/src/main/webapp/content/10-intro/50-migration/migration.xhtml
index f3b5845..b415f9a 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/content/10-intro/50-migration/migration.xhtml
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/10-intro/50-migration/migration.xhtml
@@ -31,6 +31,10 @@
 
     <ul>
       <li>
+        <tc:link label="#{demoBundle.migration50}"
+                 outcome="/content/10-intro/50-migration/95-migration/migration50.xhtml"/>
+      </li>
+      <li>
         <tc:link label="#{demoBundle.migration40}"
                  outcome="/content/10-intro/50-migration/96-migration/migration40.xhtml"/>
       </li>
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/090-tree/01-select/tree-select.xhtml b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/090-tree/01-select/tree-select.xhtml
index 4737698..f9dd0cb 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/090-tree/01-select/tree-select.xhtml
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/090-tree/01-select/tree-select.xhtml
@@ -50,12 +50,8 @@
           <tc:box label="selectable">
             <tc:selectOneRadio id="selectable" value="#{treeSelectController.selectable}">
               <f:ajax render="examplePanel selectedNodesOutput"/>
-              <tc:selectItem itemLabel="none" itemValue="none"/>
-              <tc:selectItem itemLabel="single" itemValue="single"/>
-              <tc:selectItem itemLabel="singleLeafOnly" itemValue="singleLeafOnly"/>
-              <tc:selectItem itemLabel="multi" itemValue="multi"/>
-              <tc:selectItem itemLabel="multiLeafOnly" itemValue="multiLeafOnly"/>
-              <tc:selectItem itemLabel="multiCascade" itemValue="multiCascade"/>
+              <tc:selectItems var="mode" value="#{treeSelectController.selectModes}"
+                              itemLabel="#{mode.name()} (#{demoBundle[mode.name()]})" itemValue="#{mode.name()}"/>
             </tc:selectOneRadio>
           </tc:box>
         </tc:panel>
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/navigation.xhtml b/tobago-example/tobago-example-demo/src/main/webapp/navigation.xhtml
index 9be9b33..bdef867 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/navigation.xhtml
+++ b/tobago-example/tobago-example-demo/src/main/webapp/navigation.xhtml
@@ -24,7 +24,7 @@
     <tc:treeNode id="node">
       <tc:treeCommand
               id="cmd"
-              label="» #{node.title}"
+              label="» #{demoBundle[node.key]}"
               outcome="#{node.outcome}"/>
     </tc:treeNode>
   </tc:tree>