Metadata-driven tag converter updates.
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html_dti.xml b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html_dti.xml
index ccf1ba3..11e43e4 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html_dti.xml
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html_dti.xml
@@ -6,6 +6,78 @@
 	id="http://java.sun.com/jsf/html"
 	type="tagFile">
 
+	<entity id="column" type="tag">
+		<trait id="dt-info">
+			<value xsi:type="dti:DTInfo">
+				<tag-convert-info classname="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.ColumnOperation"/>
+				<tag-decorate-info id="vpd-decorate-design"
+					multiLevel="true"
+				/>
+			</value>
+		</trait>
+	</entity>
+
+	<entity id="commandButton" type="tag">
+		<trait id="dt-info">
+			<value xsi:type="dti:DTInfo">
+				<tag-convert-info classname="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.CommandButtonOperation"/>
+				<tag-decorate-info id="vpd-decorate-design"
+					multiLevel="true"
+					widget="true"
+					setNonVisualChildElements="true"
+				/>
+				<tag-decorate-info id="vpd-decorate-preview">
+					<resolve-attribute-value attributeName="value"/>
+				</tag-decorate-info>
+			</value>
+		</trait>
+	</entity>
+
+	<entity id="commandLink" type="tag">
+		<trait id="dt-info">
+			<value xsi:type="dti:DTInfo">
+				<tag-convert-info>
+					<operation id="CreateElementOperation">
+						<parameter value="a"/>
+					</operation>
+					<operation id="CopyAllAttributesOperation"/>
+					<operation id="RenameAttributeOperation">
+						<parameter value="styleClass"/>
+						<parameter value="class"/>
+					</operation>
+					<operation id="CreateAttributeOperation">
+						<parameter value="href"/>
+						<parameter value="#"/>
+					</operation>
+					<operation id="ConvertAttributeToTextOperation">
+						<parameter value="value"/>
+					</operation>
+					<operation id="CopyChildrenOperation"/>
+				</tag-convert-info>
+				<tag-decorate-info id="vpd-decorate-design"
+					multiLevel="true"
+					needBorderDecorator="true"
+				/>
+				<tag-decorate-info id="vpd-decorate-preview"
+					resolveChildText="true"
+				/>
+			</value>
+		</trait>
+	</entity>
+
+	<entity id="dataTable" type="tag">
+		<trait id="dt-info">
+			<value xsi:type="dti:DTInfo">
+				<tag-convert-info classname="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.DataTableOperation"/>
+				<tag-decorate-info id="vpd-decorate-design"
+					multiLevel="true"
+					needBorderDecorator="true"
+					needTableDecorator="true"
+				/>
+			</value>
+		</trait>
+	</entity>
+
 	<entity id="form" type="tag">
 		<trait id="dt-info">
 			<value xsi:type="dti:DTInfo">
@@ -199,6 +271,35 @@
 		</trait>
 	</entity>
 
+	<entity id="outputFormat" type="tag">
+		<trait id="dt-info">
+			<value xsi:type="dti:DTInfo">
+				<tag-convert-info>
+					<operation id="CreateElementOperation">
+						<parameter value="span"/>
+					</operation>
+					<operation id="CopyAllAttributesOperation"/>
+					<operation id="RenameAttributeOperation">
+						<parameter value="styleClass"/>
+						<parameter value="class"/>
+					</operation>
+					<operation id="ConvertAttributeToTextOperation">
+						<parameter value="value"/>
+					</operation>
+				</tag-convert-info>
+				<tag-decorate-info id="vpd-decorate-design"
+					needBorderDecorator="true"
+					multiLevel="true"
+					widget="true"
+					setNonVisualChildElements="true"
+				/>
+				<tag-decorate-info id="vpd-decorate-preview"
+					resolveChildText="true"
+				/>
+			</value>
+		</trait>
+	</entity>
+
 	<entity id="outputLabel" type="tag">
 		<trait id="dt-info">
 			<value xsi:type="dti:DTInfo">
@@ -228,6 +329,36 @@
 		</trait>
 	</entity>
 
+	<entity id="outputLink" type="tag">
+		<trait id="dt-info">
+			<value xsi:type="dti:DTInfo">
+				<tag-convert-info>
+					<operation id="CreateElementOperation">
+						<parameter value="a"/>
+					</operation>
+					<operation id="CopyAllAttributesOperation"/>
+					<operation id="RenameAttributeOperation">
+						<parameter value="styleClass"/>
+						<parameter value="class"/>
+					</operation>
+					<operation id="CreateAttributeOperation">
+						<parameter value="href"/>
+						<parameter value="#"/>
+					</operation>
+					<operation id="RenameAttributeOperation">
+						<parameter value="value"/>
+						<parameter value="href"/>
+					</operation>
+					<operation id="CopyChildrenOperation"/>
+				</tag-convert-info>
+				<tag-decorate-info id="vpd-decorate-design"
+					multiLevel="true"
+					needBorderDecorator="true"
+				/>
+			</value>
+		</trait>
+	</entity>
+
 	<entity id="outputText" type="tag">
 		<trait id="dt-info">
 			<value xsi:type="dti:DTInfo">
@@ -270,4 +401,38 @@
 		</trait>
 	</entity>
 
+	<entity id="panelGroup" type="tag">
+		<trait id="dt-info">
+			<value xsi:type="dti:DTInfo">
+				<tag-convert-info>
+					<operation id="CreateElementOperation">
+						<parameter value="div"/>
+					</operation>
+					<operation id="CopyAllAttributesOperation"/>
+					<operation id="RenameAttributeOperation">
+						<parameter value="styleClass"/>
+						<parameter value="class"/>
+					</operation>
+					<operation id="CopyChildrenOperation"/>
+				</tag-convert-info>
+				<tag-decorate-info id="vpd-decorate-design"
+					multiLevel="true"
+					needBorderDecorator="true"
+				/>
+			</value>
+		</trait>
+	</entity>
+
+	<entity id="selectBooleanCheckbox" type="tag">
+		<trait id="dt-info">
+			<value xsi:type="dti:DTInfo">
+				<tag-convert-info classname="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.SelectBooleanCheckboxOperation"/>
+				<tag-decorate-info id="vpd-decorate-design"
+					multiLevel="true"
+					widget="true"
+				/>
+			</value>
+		</trait>
+	</entity>
+
 </md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/ColumnOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/ColumnOperation.java
new file mode 100644
index 0000000..daa0fb2
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/ColumnOperation.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2005 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Ian Trimble - initial API and implementation
+ *******************************************************************************/ 
+package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
+import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CreateAttributeOperation;
+import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * ITransformOperation implementation specifically for the "column" JSF (HTML)
+ * Element. 
+ * 
+ * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
+ * have been called to provide a valid ITagConverterContext instance prior to
+ * a call to the transform(...) method.
+ * 
+ * @author Ian Trimble - Oracle
+ */
+public class ColumnOperation extends AbstractTransformOperation {
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
+	 */
+	public Element transform(Element srcElement, Element curElement) {
+
+		//create "td" Element
+		Element tdElement = createElement("td");
+
+		//get parent Node
+		Node parentNode = srcElement.getParentNode();
+
+		//process if parentNode is a "dataTable" Element
+		if (parentNode != null && parentNode.getNodeType() == Node.ELEMENT_NODE && parentNode.getLocalName().equals("dataTable")) {
+			//tokenize "columnClasses" attribute into a List
+			List columnClassesList = new ArrayList();
+			String columnClassesAttribute = ((Element)parentNode).getAttribute("columnClasses");
+			if (columnClassesAttribute != null && columnClassesAttribute.length() > 0) {
+				StringTokenizer tokenizer = new StringTokenizer(columnClassesAttribute, ", ");
+				while (tokenizer.hasMoreTokens()) {
+					columnClassesList.add(tokenizer.nextToken());
+				}
+			}
+			//set "class" attribute
+			int offset = EditModelQuery.getInstance().getSameTypeNodeIndex(srcElement);
+			if (offset < columnClassesList.size()) {
+				new CreateAttributeOperation("class", (String)columnClassesList.get(offset)).transform(srcElement, tdElement);
+			}
+		}
+
+		//add non-transparent (?), non-facet children (for further processing)
+        if (EditModelQuery.getInstance().hasNonTransparentChild(srcElement, new String[] {"facet"})) {
+        	Node childNode = srcElement.getFirstChild();
+        	int index = 0;
+        	while (childNode != null) {
+        		if (!(childNode instanceof Element) || !JSFDOMUtil.isFacet((Element)childNode)) {
+        			tagConverterContext.addChild(childNode, new ConvertPosition(tdElement, index++));
+        		}
+        		childNode = childNode.getNextSibling();
+        	}
+        } else {
+        	//append single space for esthetics of the "td" Element
+        	appendChildText(" ", tdElement);
+        }
+
+		return tdElement;
+	}
+
+}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/CommandButtonOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/CommandButtonOperation.java
new file mode 100644
index 0000000..e646b97
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/CommandButtonOperation.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2005 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Ian Trimble - initial API and implementation
+ *******************************************************************************/ 
+package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
+
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CopyAllAttributesOperation;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CreateAttributeOperation;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.RenameAttributeOperation;
+import org.w3c.dom.Element;
+
+/**
+ * ITransformOperation implementation specifically for the "commandButton" JSF
+ * (HTML) Element. 
+ * 
+ * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
+ * have been called to provide a valid ITagConverterContext instance prior to
+ * a call to the transform(...) method.
+ * 
+ * @author Ian Trimble - Oracle
+ */
+public class CommandButtonOperation extends AbstractTransformOperation {
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
+	 */
+	public Element transform(Element srcElement, Element curElement) {
+		Element inputElement = null;
+		//create input element, copy all attributes, rename "styleClass" attribute to "class"
+		inputElement = createElement("input");
+		new CopyAllAttributesOperation().transform(srcElement, inputElement);
+		new RenameAttributeOperation("styleClass", "class").transform(srcElement, inputElement);
+		//get "image" attribute from srcElement
+		String imageAttr = srcElement.getAttribute("image");
+		String type = "submit"; //("submit" is default)
+		if (imageAttr != null && imageAttr.length() > 0) {
+			//"image" attribute exists
+			type = "image";
+			new RenameAttributeOperation("image", "src").transform(srcElement, inputElement);
+		} else {
+			//"image" attribute not present
+			String typeAttr = srcElement.getAttribute("type");
+			if (typeAttr != null && typeAttr.length() > 0) {
+				type = typeAttr;
+			}
+		}
+		//overwrite copied "type" attribute
+		new CreateAttributeOperation("type", type).transform(srcElement, inputElement);
+		return inputElement;
+	}
+
+}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/DataTableOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/DataTableOperation.java
new file mode 100644
index 0000000..9201022
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/DataTableOperation.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2005 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Ian Trimble - initial API and implementation
+ *******************************************************************************/ 
+package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CopyAllAttributesOperation;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CreateAttributeOperation;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.RenameAttributeOperation;
+import org.w3c.dom.Element;
+
+/**
+ * ITransformOperation implementation specifically for the "dataTable" JSF
+ * (HTML) Element. 
+ * 
+ * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
+ * have been called to provide a valid ITagConverterContext instance prior to
+ * a call to the transform(...) method.
+ * 
+ * @author Ian Trimble - Oracle
+ */
+public class DataTableOperation extends AbstractTransformOperation {
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
+	 */
+	public Element transform(Element srcElement, Element curElement) {
+		Element tableElement = null;
+		//create table element, copy all attributes, rename "styleClass" attribute to "class"
+		tableElement = createElement("table");
+		new CopyAllAttributesOperation().transform(srcElement, tableElement);
+		new RenameAttributeOperation("styleClass", "class").transform(srcElement, tableElement);
+		//build thead
+		buildHeaderOrFooter(srcElement, tableElement, true);
+		//build tbody
+		buildBody(srcElement, tableElement);
+		//build tfoot
+		buildHeaderOrFooter(srcElement, tableElement, false);
+		return tableElement;
+	}
+
+	private void buildHeaderOrFooter(Element srcElement, Element tableElement, boolean isHeader) {
+		//setup vars depending on whether we are building thead or tfoot
+		String facetName = isHeader ? "header" : "footer";
+		String headerOrFooterTagName = isHeader ? "thead" : "tfoot";
+		String thOrTdTagName = isHeader ? "th" : "td";
+		String headerClassOrFooterClassAttrName = isHeader ? "headerClass" : "footerClass";
+
+		//look for facet ("header" or "footer")
+		Element facetElement = getChildFacetByName(srcElement, facetName);
+
+		//get list of child "column" elements
+		List columnElementList = getChildElements(srcElement, "column");
+
+		//look for facet ("header" or "footer") on child "column" elements
+		boolean hasColumnFacet = false;
+		Iterator itColumnElementList = columnElementList.iterator();
+		while (itColumnElementList.hasNext()) {
+			Element columnElement = (Element)itColumnElementList.next();
+			Element columnFacet = getChildFacetByName(columnElement, facetName);
+			if (columnFacet != null) {
+				hasColumnFacet = true;
+				break;
+			}
+		}
+
+		//test if we even need to build header or footer
+		if (facetElement == null && !hasColumnFacet) {
+			return;
+		}
+
+		//append "thead" or "tfoot" Element
+		Element headerOrFooterElement = appendChildElement(headerOrFooterTagName, tableElement);
+
+		//if facetElement exists, build appropriate thead or tfoot children
+		if (facetElement != null) {
+			//append "tr" Element
+			Element trElement = appendChildElement("tr", headerOrFooterElement);
+			//append "th" or "td" Element
+			Element thOrTdElement = appendChildElement(thOrTdTagName, trElement);
+			//set "class" attribute
+			String headerClassOrFooterClassAttribute = srcElement.getAttribute(headerClassOrFooterClassAttrName);
+			if (headerClassOrFooterClassAttribute != null && headerClassOrFooterClassAttribute.length() > 0) {
+				new CreateAttributeOperation("class", headerClassOrFooterClassAttribute).transform(srcElement, thOrTdElement);
+			}
+			//set "colspan" attribute
+			if (columnElementList.size() > 0) {
+				new CreateAttributeOperation("colspan", String.valueOf(columnElementList.size())).transform(srcElement, thOrTdElement);
+			}
+			//add facet Element as child (to be processed further)
+			tagConverterContext.addChild(facetElement, new ConvertPosition(thOrTdElement, 0));
+		}
+
+		//if any child column has "header" or "footer" facet, build "tr" element
+		if (hasColumnFacet) {
+			//append "tr" Element
+			Element trElement = appendChildElement("tr", headerOrFooterElement);
+			//iterate through columnElementList
+			itColumnElementList = columnElementList.iterator();
+			while (itColumnElementList.hasNext()) {
+				Element columnElement = (Element)itColumnElementList.next();
+				//get "header" or "footer" facet of column
+				Element columnFacet = getChildFacetByName(columnElement, facetName);
+				//append "th" or "td" Element
+				Element thOrTdElement = appendChildElement(thOrTdTagName, trElement);
+				//set "class" attribute
+				String headerClassOrFooterClassAttribute = srcElement.getAttribute(headerClassOrFooterClassAttrName);
+				if (headerClassOrFooterClassAttribute != null && headerClassOrFooterClassAttribute.length() > 0) {
+					new CreateAttributeOperation("class", headerClassOrFooterClassAttribute).transform(srcElement, thOrTdElement);
+				}
+				//if facet exists, add facet Element as child (to be processed further)
+				if (columnFacet != null) {
+					tagConverterContext.addChild(columnFacet, new ConvertPosition(thOrTdElement, 0));
+				}
+			}
+		}
+	}
+
+	private void buildBody(Element srcElement, Element tableElement) {
+		//append "tbody" element
+		Element tbodyElement = appendChildElement("tbody", tableElement);
+		//append "tr" element
+		Element trElement = appendChildElement("tr", tbodyElement);
+		//parse "rowClasses" attribute and set "class" attribute
+		String rowClassesAttribute = srcElement.getAttribute("rowClasses");
+		if (rowClassesAttribute != null && rowClassesAttribute.length() > 0) {
+			StringTokenizer tokenizer = new StringTokenizer(rowClassesAttribute, ", ");
+			if (tokenizer.hasMoreTokens()) {
+				new CreateAttributeOperation("class", tokenizer.nextToken()).transform(srcElement, trElement);
+			}
+		}
+		//add child columns (to be processed further)
+		List columnElementList = getChildElements(srcElement, "column");
+		Iterator itColumnElementList = columnElementList.iterator();
+		int index = 0;
+		while (itColumnElementList.hasNext()) {
+			Element columnElement = (Element)itColumnElementList.next();
+			tagConverterContext.addChild(columnElement, new ConvertPosition(trElement, index++));
+		}
+	}
+
+	/**
+	 * Gets a child Element of the specified parent Element that has the node
+	 * name "facet" and the specified value of the "name" attribute.
+	 * 
+	 * @param srcElement Parent Element instance.
+	 * @param facetName Name of the facet Element for which to search.
+	 * @return Child Element that is a facet with the specified name.
+	 */
+	private Element getChildFacetByName(Element srcElement, String facetName) {
+		Element element = null;
+		List facets = getChildElements(srcElement, "facet");
+		Iterator itFacets = facets.iterator();
+		while (itFacets.hasNext()) {
+			Element facet = (Element)itFacets.next();
+			if (facet.getAttribute("name").equals(facetName)) {
+				element = facet;
+				break;
+			}
+		}
+		return element;
+	}
+
+}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java
index ded28b7..c9f37cc 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java
@@ -58,7 +58,7 @@
 			String basename = srcElement.getAttribute(IJSFConstants.ATTR_BASENAME);
 			if (var != null && basename != null && var.length() > 0 && basename.length() > 0) {
 				String basePath =
-					basename.replace(".", IFileFolderConstants.PATH_SEPARATOR) +
+					basename.replace('.', IFileFolderConstants.PATH_SEPARATOR.charAt(0)) +
 							IFileFolderConstants.DOT +
 							IFileFolderConstants.EXT_PROPERTIES;
 				if (srcElement instanceof IDOMNode) {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/PanelGridOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/PanelGridOperation.java
index 8dc6d1a..170871e 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/PanelGridOperation.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/PanelGridOperation.java
@@ -16,12 +16,9 @@
 import java.util.StringTokenizer;
 
 import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITransformOperation;
 import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AppendChildElementOperation;
 import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CopyAllAttributesOperation;
 import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CreateAttributeOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CreateElementOperation;
 import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.RenameAttributeOperation;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -129,32 +126,6 @@
 	}
 
 	/**
-	 * Creates a new Element.
-	 * 
-	 * @param tagName Name of Element to be created.
-	 * @return New Element instance.
-	 */
-	protected Element createElement(String tagName) {
-		ITransformOperation operation = new CreateElementOperation(tagName);
-		operation.setTagConverterContext(tagConverterContext);
-		return operation.transform(null, null);
-	}
-
-	/**
-	 * Creates and appends a new child Element.
-	 * 
-	 * @param tagName Name of child Element to be created.
-	 * @param parentElement Element instance to which to append the new
-	 * Element.
-	 * @return New Element instance.
-	 */
-	protected Element appendChildElement(String tagName, Element parentElement) {
-		ITransformOperation operation = new AppendChildElementOperation(tagName);
-		operation.setTagConverterContext(tagConverterContext);
-		return operation.transform(null, parentElement);
-	}
-
-	/**
 	 * Gets a child Element of the specified parent Element that has the node
 	 * name "facet" and the specified value of the "name" attribute.
 	 * 
@@ -162,18 +133,15 @@
 	 * @param facetName Name of the facet Element for which to search.
 	 * @return Child Element that is a facet with the specified name.
 	 */
-	protected Element getChildFacetByName(Element srcElement, String facetName) {
+	private Element getChildFacetByName(Element srcElement, String facetName) {
 		Element element = null;
-		NodeList childNodes = srcElement.getChildNodes();
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node childNode = childNodes.item(i);
-			if (childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getLocalName().equalsIgnoreCase("facet")) {
-				Element facetElement = (Element)childNode;
-				String facetElementName = facetElement.getAttribute("name");
-				if (facetElementName != null && facetElementName.equals(facetName)) {
-					element = facetElement;
-					break;
-				}
+		List facets = getChildElements(srcElement, "facet");
+		Iterator itFacets = facets.iterator();
+		while (itFacets.hasNext()) {
+			Element facet = (Element)itFacets.next();
+			if (facet.getAttribute("name").equals(facetName)) {
+				element = facet;
+				break;
 			}
 		}
 		return element;
@@ -187,7 +155,7 @@
 	 * @return List of child Elements of the specified parent Element that does
 	 * not include any child "facet" Elements.
 	 */
-	protected List getChildElementsSkipFacets(Element srcElement) {
+	private List getChildElementsSkipFacets(Element srcElement) {
 		List childElementsList = new ArrayList();
 		NodeList childNodes = srcElement.getChildNodes();
 		for (int i = 0; i < childNodes.getLength(); i++) {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectBooleanCheckboxOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectBooleanCheckboxOperation.java
new file mode 100644
index 0000000..b2907ee
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectBooleanCheckboxOperation.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2005 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Ian Trimble - initial API and implementation
+ *******************************************************************************/ 
+package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
+
+import org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITransformOperation;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CopyAllAttributesOperation;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CreateAttributeOperation;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CreateElementOperation;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.RenameAttributeOperation;
+import org.w3c.dom.Element;
+
+/**
+ * ITransformOperation implementation specifically for the
+ * "selectBooleanCheckbox" JSF (HTML) Element. 
+ * 
+ * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
+ * have been called to provide a valid ITagConverterContext instance prior to
+ * a call to the transform(...) method.
+ * 
+ * @author Ian Trimble - Oracle
+ */
+public class SelectBooleanCheckboxOperation extends AbstractTransformOperation {
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
+	 */
+	public Element transform(Element srcElement, Element curElement) {
+		Element inputElement = null;
+		//create input element, copy all attributes, rename "styleClass" attribute to "class"
+		inputElement = createElement("input");
+		new CopyAllAttributesOperation().transform(srcElement, inputElement);
+		new RenameAttributeOperation("styleClass", "class").transform(srcElement, inputElement);
+		//set "type" attribute to "checkbox"
+		new CreateAttributeOperation("type", "checkbox").transform(srcElement, inputElement);
+		//test "value" attribute value == true and set "checked" attribute appropriately
+		String valueAttr = srcElement.getAttribute("value");
+		if (valueAttr != null && valueAttr.equalsIgnoreCase(Boolean.TRUE.toString())) {
+			new CreateAttributeOperation("checked", "checked").transform(srcElement, inputElement);
+		}
+		return inputElement;
+	}
+
+	/**
+	 * Creates a new Element.
+	 * 
+	 * @param tagName Name of Element to be created.
+	 * @return New Element instance.
+	 */
+	protected Element createElement(String tagName) {
+		ITransformOperation operation = new CreateElementOperation(tagName);
+		operation.setTagConverterContext(tagConverterContext);
+		return operation.transform(null, null);
+	}
+
+}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/provisional/DTHTMLOutputRenderer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/provisional/DTHTMLOutputRenderer.java
index 7d2ae5d..003902a 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/provisional/DTHTMLOutputRenderer.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/provisional/DTHTMLOutputRenderer.java
@@ -18,6 +18,7 @@
 import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
 import org.eclipse.jst.pagedesigner.PDPlugin;
 import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AppendChildElementOperation;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AppendChildTextOperation;
 import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.ConvertAttributeToTextOperation;
 import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CopyAllAttributesOperation;
 import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CopyAttributeOperation;
@@ -127,6 +128,14 @@
 									boolean makeChildCurrent = Boolean.valueOf(((Parameter)parameters.get(1)).getValue()).booleanValue();
 									transformer.appendTransformOperation(new AppendChildElementOperation(elementName, makeChildCurrent));
 								}
+							} else if (opID.equals("AppendChildTextOperation")) {
+								EList parameters = operation.getParameters();
+								if (parameters.size() < 1) {
+									log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
+									return null;
+								}
+								String content = ((Parameter)parameters.get(0)).getValue();
+								transformer.appendTransformOperation(new AppendChildTextOperation(content));
 							} else if (opID.equals("ConvertAttributeToTextOperation")) {
 								EList parameters = operation.getParameters();
 								if (parameters.size() < 1) {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/provisional/AbstractTransformOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/provisional/AbstractTransformOperation.java
index 85151b5..5bfa7cf 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/provisional/AbstractTransformOperation.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/provisional/AbstractTransformOperation.java
@@ -10,9 +10,14 @@
  *******************************************************************************/ 
 package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITagConverterContext;
 import org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITransformOperation;
 import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 /**
  * Abstract ITransformOperation implementation. Maintains ITagConverterContext
@@ -41,4 +46,66 @@
 		this.tagConverterContext = tagConverterContext;
 	}
 
+	/**
+	 * Creates a new Element.
+	 * 
+	 * @param tagName Name of Element to be created.
+	 * @return New Element instance.
+	 */
+	protected Element createElement(String tagName) {
+		ITransformOperation operation = new CreateElementOperation(tagName);
+		operation.setTagConverterContext(tagConverterContext);
+		return operation.transform(null, null);
+	}
+
+	/**
+	 * Creates and appends a new child Element.
+	 * 
+	 * @param tagName Name of child Element to be created.
+	 * @param parentElement Element instance to which to append the new
+	 * Element.
+	 * @return New Element instance.
+	 */
+	protected Element appendChildElement(String tagName, Element parentElement) {
+		ITransformOperation operation = new AppendChildElementOperation(tagName);
+		operation.setTagConverterContext(tagConverterContext);
+		return operation.transform(null, parentElement);
+	}
+
+	/**
+	 * Creates and appends a new child Text.
+	 * 
+	 * @param content Content of new child Text.
+	 * @param parentElement Element instance to which to append the new Text.
+	 */
+	protected void appendChildText(String content, Element parentElement) {
+		ITransformOperation operation = new AppendChildTextOperation(content);
+		operation.setTagConverterContext(tagConverterContext);
+		operation.transform(null, parentElement);
+	}
+
+	/**
+	 * Gets collection of child Element instances who's local name matches
+	 * specified tag name.
+	 * 
+	 * @param srcNode Source Node instance.
+	 * @param tagName Tag local name.
+	 * @return Collection of child Element instances who's local name matches
+	 * specified tag name.
+	 */
+	protected List getChildElements(Node srcNode, String tagName) {
+		List childElements = new ArrayList();
+		NodeList childNodes = srcNode.getChildNodes();
+		for (int i = 0; i < childNodes.getLength(); i++) {
+			Node curNode = childNodes.item(i);
+			if (curNode.getNodeType() == Node.ELEMENT_NODE) {
+				String curNodeName = curNode.getLocalName();
+				if (curNode != null && curNodeName.equals(tagName)) {
+					childElements.add((Element)curNode);
+				}
+			}
+		}
+		return childElements;
+	}
+
 }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/provisional/AppendChildTextOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/provisional/AppendChildTextOperation.java
new file mode 100644
index 0000000..36be326
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/provisional/AppendChildTextOperation.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2005 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Ian Trimble - initial API and implementation
+ *******************************************************************************/ 
+package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Text;
+
+/**
+ * ITransformOperation implementation that appends a child Text.
+ * 
+ * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
+ * have been called to provide a valid ITagConverterContext instance prior to
+ * a call to the transform(...) method.
+ * 
+ * @author Ian Trimble - Oracle
+ */
+public class AppendChildTextOperation extends AbstractTransformOperation {
+
+	private String content;
+
+	/**
+	 * Constructs an instance with the specified content.
+	 * 
+	 * @param content Content of child Text to be created.
+	 */
+	public AppendChildTextOperation(String content) {
+		this.content = content;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
+	 */
+	public Element transform(Element srcElement, Element curElement) {
+		if (tagConverterContext != null && curElement != null && content != null && content.length() > 0) {
+			Text childText = tagConverterContext.createText(content);
+			curElement.appendChild(childText);
+		}
+		return curElement;
+	}
+
+}