diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/SelectTag.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/SelectTag.java
index 575fb00..412e5d6 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/SelectTag.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/SelectTag.java
@@ -40,6 +40,7 @@
 import org.apache.empire.jsf2.app.TextResolver;
 import org.apache.empire.jsf2.controls.InputAttachedObjectsHandler;
 import org.apache.empire.jsf2.controls.InputControl;
+import org.apache.empire.jsf2.controls.InputControl.DisabledType;
 import org.apache.empire.jsf2.controls.InputControl.InputInfo;
 import org.apache.empire.jsf2.controls.InputControlManager;
 import org.apache.empire.jsf2.controls.SelectInputControl;
@@ -155,9 +156,9 @@
         }
 
         @Override
-        public boolean isFieldReadOnly()
+        public DisabledType getDisabled()
         {
-            return false;
+            return (SelectTag.this.isDisabled() ? DisabledType.DISABLED : DisabledType.NO);
         }
 
         @Override
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/CheckboxInputControl.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/CheckboxInputControl.java
index 20fc7e9..1d6b129 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/CheckboxInputControl.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/CheckboxInputControl.java
@@ -30,6 +30,7 @@
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.UnexpectedReturnValueException;
+import org.apache.empire.jsf2.controls.InputControl.DisabledType;
 
 public class CheckboxInputControl extends InputControl
 {
@@ -96,21 +97,12 @@
         }
         HtmlSelectBooleanCheckbox input = (HtmlSelectBooleanCheckbox) comp;
         // disabled
-        Object dis = ii.getAttributeEx("disabled");
-        if (dis != null)
-        {
-            input.setDisabled(ObjectUtils.getBoolean(dis));
-        }
-        // field-readOnly
-        if (ObjectUtils.getBoolean(dis) == false)
-        {
-            input.setReadonly(ii.isFieldReadOnly());
-            input.setDisabled(ii.isFieldReadOnly());
-        }
+        boolean disabled = ii.isDisabled();
+        input.setDisabled(disabled);
         // check phase
         if (phaseId==PhaseId.RENDER_RESPONSE)
         {   // style
-            addRemoveDisabledStyle(input, input.isDisabled());
+            addRemoveDisabledStyle(input, disabled);
             // set value
             setInputValue(input, ii);
         }
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java
index f940c72..38b902a 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java
@@ -87,6 +87,17 @@
     }
 
     /**
+     * DisabledType
+     * @author doebele
+     */
+    public enum DisabledType 
+    {
+        NO,
+        READONLY,
+        DISABLED;
+    }
+    
+    /**
      * This interface allows access to a value and its metainformation
      * used with the renderData function
      */
@@ -137,7 +148,7 @@
         
         boolean isDisabled(); // disabled or readOnly
 
-        boolean isFieldReadOnly(); // not disabled only readOnly (for input[type=text] only!)
+        DisabledType getDisabled();
         // input
 
         String getInputId();
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/RadioInputControl.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/RadioInputControl.java
index 5231521..feb929d 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/RadioInputControl.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/RadioInputControl.java
@@ -39,6 +39,7 @@
 import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.UnexpectedReturnValueException;
 import org.apache.empire.jsf2.app.TextResolver;
+import org.apache.empire.jsf2.controls.InputControl.DisabledType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -137,7 +138,7 @@
         // add
         compList.add(input);
         // style
-        addRemoveDisabledStyle(input, input.isDisabled());
+        addRemoveDisabledStyle(input, disabled);
         addRemoveInvalidStyle(input, ii.hasError());
         // Set Value
         setInputValue(input, ii);
@@ -165,7 +166,7 @@
         }
         if (phaseId==PhaseId.RENDER_RESPONSE)
         {   // style
-            addRemoveDisabledStyle(input, input.isDisabled());
+            addRemoveDisabledStyle(input, disabled);
             addRemoveInvalidStyle(input, ii.hasError());
             // set value
             setInputValue(input, ii);
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
index 9f39584..be78fed0 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
@@ -82,14 +82,14 @@
         // copy Attributes
         copyAttributes(parent, ii, input);
         // disabled
-        boolean disabled = ii.isDisabled() || ii.isFieldReadOnly();
+        boolean disabled = ii.isDisabled();
         input.setDisabled(disabled);
         // Options
         initOptions(input, ii.getTextResolver(), ii);
         // add
         compList.add(input);
         // style
-        addRemoveDisabledStyle(input, input.isDisabled());
+        addRemoveDisabledStyle(input, disabled);
         addRemoveInvalidStyle(input, ii.hasError());
         // Set Value
         setInputValue(input, ii);
@@ -116,7 +116,7 @@
         }
         if (phaseId==PhaseId.RENDER_RESPONSE)
         {   // style
-            addRemoveDisabledStyle(input, input.isDisabled());
+            addRemoveDisabledStyle(input, disabled);
             addRemoveInvalidStyle(input, ii.hasError());
             // set value
             setInputValue(input, ii);
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextAreaInputControl.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextAreaInputControl.java
index ed890d5..02a713e 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextAreaInputControl.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextAreaInputControl.java
@@ -30,6 +30,7 @@
 import org.apache.empire.commons.StringUtils;
 import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.UnexpectedReturnValueException;
+import org.apache.empire.jsf2.controls.InputControl.DisabledType;
 import org.apache.empire.jsf2.controls.InputControl.ValueInfo;
 
 public class TextAreaInputControl extends InputControl
@@ -107,16 +108,15 @@
         }
         HtmlInputTextarea input = (HtmlInputTextarea)comp;
         // disabled
-        Object dis = ii.getAttributeEx("disabled");
-        if (dis!=null)
-            input.setDisabled(ObjectUtils.getBoolean(dis));
-        // field-readOnly
-        if (ObjectUtils.getBoolean(dis)==false)
-            input.setReadonly(ii.isFieldReadOnly());
+        DisabledType disabled = ii.getDisabled();
+        if (disabled!=null)
+        {   input.setReadonly((disabled==DisabledType.READONLY));
+            input.setDisabled((disabled==DisabledType.DISABLED));
+        }
         // Set Value
         if (phaseId==PhaseId.RENDER_RESPONSE)
         {   // style
-            addRemoveDisabledStyle(input, (input.isDisabled() || input.isReadonly()));
+            addRemoveDisabledStyle(input, (disabled!=null && disabled!=DisabledType.NO));
             addRemoveInvalidStyle(input, ii.hasError());
             // set value
             setInputValue(input, ii);
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextInputControl.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextInputControl.java
index ad71344..479ae51 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextInputControl.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextInputControl.java
@@ -43,6 +43,7 @@
 import org.apache.empire.data.DataType;
 import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.UnexpectedReturnValueException;
+import org.apache.empire.jsf2.controls.InputControl.DisabledType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -126,20 +127,15 @@
         // modified
         addRemoveStyle(input, InputControl.STYLECLASS_MODIFIED, ii.isModified());
         // disabled
-        Object dis = ii.getAttributeEx("disabled");
-        if (dis != null)
-        {
-            input.setDisabled(ObjectUtils.getBoolean(dis));
-        }
-        // field-readOnly
-        if (ObjectUtils.getBoolean(dis) == false)
-        {
-            input.setReadonly(ii.isFieldReadOnly());
+        DisabledType disabled = ii.getDisabled();
+        if (disabled!=null)
+        {   input.setReadonly((disabled==DisabledType.READONLY));
+            input.setDisabled((disabled==DisabledType.DISABLED));
         }
         // set value
         if (phaseId==PhaseId.RENDER_RESPONSE)
         {   // style
-            addRemoveDisabledStyle(input, (input.isDisabled() || input.isReadonly()));
+            addRemoveDisabledStyle(input, (disabled!=null && disabled!=DisabledType.NO));
             addRemoveInvalidStyle(input, ii.hasError());
             // set value
             setInputValue(input, ii);
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
index 8fea07a..3c52da4 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
@@ -69,6 +69,7 @@
 import org.apache.empire.jsf2.components.LinkTag;
 import org.apache.empire.jsf2.components.RecordTag;
 import org.apache.empire.jsf2.controls.InputControl;
+import org.apache.empire.jsf2.controls.InputControl.DisabledType;
 import org.apache.empire.jsf2.controls.InputControlManager;
 import org.apache.empire.jsf2.controls.SelectInputControl;
 import org.apache.empire.jsf2.controls.TextAreaInputControl;
@@ -79,6 +80,7 @@
 public class TagEncodingHelper implements NamingContainer
 {
     private final static String SPACE = " ";
+    
     /**
      * ColumnExprWrapper
      * wraps a ColumnExpr object into a Column interface object
@@ -341,21 +343,14 @@
         @Override
         public boolean isDisabled()
         {
-            // check attribute
-            Object val = getAttributeValueEx("disabled");
-            if (val != null && ObjectUtils.getBoolean(val))
-                return true;
-            // not disabeld
-            return false;
+            DisabledType disabled = TagEncodingHelper.this.getDisabled(); 
+            return (disabled!=null && disabled!=DisabledType.NO);
         }
-
+        
         @Override
-        public boolean isFieldReadOnly()
-        {   // Check tag
-            if (!(component instanceof UIInput))
-                return true;
-            // column read only
-            return TagEncodingHelper.this.isReadOnly();
+        public DisabledType getDisabled()
+        {            
+            return TagEncodingHelper.this.getDisabled();
         }
         
         @Override
@@ -816,12 +811,9 @@
         }
         // check attribute
         Object val = getTagAttributeValue("readonly");
-        if (val != null)
-        {   // check
-            if (StringUtils.valueOf(val).equalsIgnoreCase("never"))
-                return false;
-            if (ObjectUtils.getBoolean(val))
-                return true;
+        if (!ObjectUtils.isEmpty(val))
+        {   // override
+            return ObjectUtils.getBoolean(val);
         }
         // check record component
         if (recordTag != null && recordTag.isReadOnly())
@@ -857,6 +849,11 @@
 
     public boolean isReadOnly()
     {
+        // component 
+        if (!(component instanceof UIInput))
+        {   log.warn("Component is not of type UIInput");
+            return true;
+        }
         // Check Record
         if (isRecordReadOnly())
             return true;
@@ -869,6 +866,27 @@
         // column
         return getColumn().isReadOnly();
     }
+    
+    public DisabledType getDisabled()
+    {
+        // component 
+        if (!(component instanceof UIInput))
+        {   log.warn("Component is not of type UIInput");
+            return DisabledType.READONLY;
+        }
+        // Check attribute
+        Object dis = getAttributeValueEx("disabled");
+        if (ObjectUtils.isEmpty(dis))
+            return null; // not provided!
+        // direct
+        if (dis instanceof DisabledType)
+            return (DisabledType)dis;
+        // readonly
+        if (String.valueOf(dis).equalsIgnoreCase("readonly"))
+            return DisabledType.READONLY;
+        // other
+        return (ObjectUtils.getBoolean(dis) ? DisabledType.DISABLED : DisabledType.NO);
+    }
 
     public boolean isValueRequired()
     {
