diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateJspTaglibsMojo.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateJspTaglibsMojo.java
index 788bb54..3fbecae 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateJspTaglibsMojo.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateJspTaglibsMojo.java
@@ -18,6 +18,38 @@
  */
 package org.apache.myfaces.trinidadbuild.plugin.faces;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.StringWriter;
+
+import java.lang.reflect.Modifier;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamResult;
+
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.project.MavenProject;
 import org.apache.myfaces.trinidadbuild.plugin.faces.generator.taglib.AbstractConverterTagGenerator;
@@ -43,40 +75,14 @@
 import org.apache.myfaces.trinidadbuild.plugin.faces.util.Util;
 import org.apache.myfaces.trinidadbuild.plugin.faces.util.ValidatorFilter;
 import org.apache.myfaces.trinidadbuild.plugin.faces.util.XIncludeFilter;
+
 import org.codehaus.plexus.util.FileUtils;
+
 import org.xml.sax.EntityResolver;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 import org.xml.sax.XMLReader;
 
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.stream.XMLOutputFactory;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.stream.StreamResult;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.StringWriter;
-import java.lang.reflect.Modifier;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
 
 /**
  * @version $Id$
@@ -550,7 +556,7 @@
 
     stream.writeCharacters("\n      ");
     stream.writeStartElement("name");
-    
+
     if (property != null)
       stream.writeCharacters(property.getJspPropertyName());
     else
@@ -579,7 +585,7 @@
           stream.writeCharacters("true");
           stream.writeEndElement();
         }
-        
+
         if (property.isMethodExpression() || property.isMethodBinding())
         {
           stream.writeCharacters("\n    ");
@@ -638,7 +644,7 @@
           // As of JSF 1.2, "id" can be set via an rtexprvalue (but
           // *not* by a ValueExpression) - it has to be evaluated
           // in the JSP
-          if ("id".equals(propertyName) && !disableIdExpressions)
+          if (property.isRtexprvalue() || ("id".equals(propertyName) && !disableIdExpressions))
             stream.writeCharacters("true");
           else
             stream.writeCharacters("false");
@@ -767,7 +773,7 @@
         else
         {
           converterGen = new MyFacesConverterTagGenerator(is12(), getLicenseHeader(), getLog());
-          validatorGen = new MyFacesValidatorTagGenerator(is12(), getLicenseHeader(), getLog());    
+          validatorGen = new MyFacesValidatorTagGenerator(is12(), getLicenseHeader(), getLog());
         }
         int count = 0;
         while (components.hasNext())
@@ -792,7 +798,7 @@
 
   class ComponentTagHandlerGenerator
   {
-    
+
     private Set initComponentList(ComponentBean component,
                                   String fullSuperclassName)
     {
@@ -815,7 +821,7 @@
     {
       ComponentTagGenerator generator;
       Set componentList;
-      
+
       String fullSuperclassName = component.findJspTagSuperclass();
       if (fullSuperclassName == null)
       {
@@ -823,21 +829,21 @@
                       + ", generation of this Tag is skipped");
         return;
       }
-      
+
       componentList = initComponentList(component, fullSuperclassName);
-      
+
       String fullClassName = component.getTagClass();
       try
       {
         getLog().debug("Generating " + fullClassName);
-        
+
         String sourcePath = Util.convertClassToSourcePath(fullClassName, ".java");
         File targetFile = new File(generatedSourceDirectory, sourcePath);
-        
+
         targetFile.getParentFile().mkdirs();
         StringWriter sw = new StringWriter();
         PrettyWriter out = new PrettyWriter(sw);
-        
+
         if (component.isTrinidadComponent())
         {
           generator = new TrinidadComponentTagGenerator(_is12());
@@ -851,15 +857,15 @@
 
         String className = Util.getClassFromFullClass(fullClassName);
         String packageName = Util.getPackageFromFullClass(fullClassName);
-        
+
         // header/copyright
         writePreamble(out);
-        
+
         // package
         out.println("package " + packageName + ";");
-        
+
         out.println();
-        
+
         String superclassName = Util.getClassFromFullClass(fullSuperclassName);
         if (superclassName.equals(className))
         {
@@ -867,15 +873,15 @@
         }
         String componentFullClass = component.getComponentClass();
         String componentClass = Util.getClassFromFullClass(componentFullClass);
-        
+
         generator.writeImports(out, null, packageName, fullSuperclassName, superclassName, componentList);
-        
+
         generator.writeClassBegin(out, className, superclassName, component, null);
-        
+
         int modifiers = component.getTagClassModifiers();
         generator.writeConstructor(out, component, modifiers);
-        
-        
+
+
         if (!Modifier.isAbstract(modifiers))
         {
           generator.writeGetComponentType(out, component);
@@ -887,10 +893,10 @@
         generator.writePropertyMembers(out, componentList);
         generator.writeSetPropertiesMethod(out, componentClass, componentList);
         generator.writeReleaseMethod(out, componentList);
-        
+
         generator.writeClassEnd(out);
         out.close();
-        
+
         // delay write in case of error
         // timestamp should not be updated when an error occurs
         // delete target file first, because it is readonly
@@ -1026,6 +1032,7 @@
 
   /**
    * @parameter
+   * @deprecated
    */
   protected boolean disableIdExpressions;
 
@@ -1034,7 +1041,7 @@
    */
   protected boolean coerceStrings;
 
-  
+
   /**
    * @parameter
    */
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/PropertyBean.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/PropertyBean.java
index 18fb37d..d641ea1 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/PropertyBean.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/PropertyBean.java
@@ -6,9 +6,9 @@
  *  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
@@ -24,12 +24,12 @@
  */
 public class PropertyBean extends AttributeBean
 {
-    public void setUseMaxTime(boolean _useMaxTime) 
+    public void setUseMaxTime(boolean _useMaxTime)
     {
       this._useMaxTime = _useMaxTime;
     }
-    
-    public boolean getUseMaxTime() 
+
+    public boolean getUseMaxTime()
     {
       return _useMaxTime;
     }
@@ -132,7 +132,7 @@
   /**
    * Sets the transient flag of this property.
    *
-   * @param transient  the property transient flag
+   * @param transient_ the property transient flag
    */
   public void setTransient(
     boolean transient_)
@@ -154,7 +154,7 @@
   /**
    * Sets the list flag of this property.
    *
-   * @param list  the property list flag
+   * @param list_ the property list flag
    */
   public void setList(
     boolean list_)
@@ -215,6 +215,23 @@
   }
 
   /**
+   * Set the property as allowing ${} syntax
+   * @param rtexprvalue the rtexrvalue value
+   */
+  public void setRtexprvalue(boolean rtexprvalue)
+  {
+    _rtexprvalue = rtexprvalue;
+  }
+
+  /**
+   * Return the rtexrvalue flag
+   */
+  public boolean isRtexprvalue()
+  {
+    return _rtexprvalue;
+  }
+
+  /**
    * Sets the alias of this property.
    *
    * @param aliasOf  the property alias
@@ -428,7 +445,7 @@
 
     return _fieldPropertyName;
   }
-  
+
   /**
    * If the property should be hidden from documentation
    * @return If the facet should be hidden
@@ -436,7 +453,7 @@
   public boolean isHidden()
   {
     return _hidden;
-  }  
+  }
 
   /**
    * Set if this facet should be hidden from documentation
@@ -451,7 +468,7 @@
    * Sets the property deprecated flag
    * @param deprecated
    */
-  public void setDeprecated(String deprecated) 
+  public void setDeprecated(String deprecated)
   {
     this._deprecated = deprecated;
   }
@@ -473,21 +490,22 @@
   {
     return _noOp;
   }
-  
+
   /**
-   * Invoked if the no-op extended property meta-data is provided for the component 
+   * Invoked if the no-op extended property meta-data is provided for the component
    * property.
    */
-  public void makeNoOp() 
+  public void makeNoOp()
   {
     this._noOp = true;
   }
-  
+
   private String  _aliasOf;
   private String  _jspPropertyName;
   private String  _fieldPropertyName;
   private boolean _required;
   private boolean _literalOnly;
+  private boolean _rtexprvalue;
   private boolean _stateHolder;
   private boolean _transient;
   private boolean _list;
