bug 426714: Add support for customizing field templates using
@InjectFieldTo and @Replace 
https://bugs.eclipse.org/bugs/show_bug.cgi?id=426714

Change-Id: Ib58abe46b88f50bfab87b3d19b0b0ace804770f2
Reviewed-on: https://git.eclipse.org/r/21151
Tested-by: Hudson CI
Reviewed-by: Andi Bur <andi.bur@gmail.com>
IP-Clean: Andi Bur <andi.bur@gmail.com>
diff --git a/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.client/src/formdata/client/ui/template/formfield/replace/AbstractRadioButtonGroupWithFields.java b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.client/src/formdata/client/ui/template/formfield/replace/AbstractRadioButtonGroupWithFields.java
new file mode 100644
index 0000000..5d6d68c
--- /dev/null
+++ b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.client/src/formdata/client/ui/template/formfield/replace/AbstractRadioButtonGroupWithFields.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2010 BSI Business Systems Integration AG.
+ * 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:
+ *     BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package formdata.client.ui.template.formfield.replace;
+
+import org.eclipse.scout.commons.annotations.FormData;
+import org.eclipse.scout.commons.annotations.FormData.DefaultSubtypeSdkCommand;
+import org.eclipse.scout.commons.annotations.FormData.SdkCommand;
+import org.eclipse.scout.commons.annotations.Order;
+import org.eclipse.scout.rt.client.ui.form.fields.button.AbstractRadioButton;
+import org.eclipse.scout.rt.client.ui.form.fields.radiobuttongroup.AbstractRadioButtonGroup;
+import org.eclipse.scout.rt.client.ui.form.fields.stringfield.AbstractStringField;
+
+import formdata.shared.services.process.replace.AbstractRadioButtonGroupWithFieldsData;
+
+/**
+ * @since 3.10.0-M5
+ */
+@FormData(value = AbstractRadioButtonGroupWithFieldsData.class, sdkCommand = SdkCommand.CREATE, defaultSubtypeSdkCommand = DefaultSubtypeSdkCommand.CREATE)
+public abstract class AbstractRadioButtonGroupWithFields extends AbstractRadioButtonGroup<Long> {
+
+  public OptionOneButton getOptionOneButton() {
+    return getFieldByClass(OptionOneButton.class);
+  }
+
+  public OptionTwoButton getOptionTwoButton() {
+    return getFieldByClass(OptionTwoButton.class);
+  }
+
+  public InputStringField getInputStringField() {
+    return getFieldByClass(InputStringField.class);
+  }
+
+  @Order(10)
+  public class OptionOneButton extends AbstractRadioButton {
+
+    @Override
+    protected Long getConfiguredRadioValue() {
+      return 1L;
+    }
+  }
+
+  @Order(20)
+  public class OptionTwoButton extends AbstractRadioButton {
+
+    @Override
+    protected Long getConfiguredRadioValue() {
+      return 2L;
+    }
+  }
+
+  @Order(30)
+  public class InputStringField extends AbstractStringField {
+  }
+}
diff --git a/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.client/src/formdata/client/ui/template/formfield/replace/AbstractTemplateForReplaceBox.java b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.client/src/formdata/client/ui/template/formfield/replace/AbstractTemplateForReplaceBox.java
new file mode 100644
index 0000000..a522bd5
--- /dev/null
+++ b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.client/src/formdata/client/ui/template/formfield/replace/AbstractTemplateForReplaceBox.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2010 BSI Business Systems Integration AG.
+ * 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:
+ *     BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package formdata.client.ui.template.formfield.replace;
+
+import org.eclipse.scout.commons.annotations.FormData;
+import org.eclipse.scout.commons.annotations.FormData.DefaultSubtypeSdkCommand;
+import org.eclipse.scout.commons.annotations.FormData.SdkCommand;
+import org.eclipse.scout.commons.annotations.Order;
+import org.eclipse.scout.rt.client.ui.basic.table.AbstractTable;
+import org.eclipse.scout.rt.client.ui.basic.table.columns.AbstractStringColumn;
+import org.eclipse.scout.rt.client.ui.form.fields.groupbox.AbstractGroupBox;
+import org.eclipse.scout.rt.client.ui.form.fields.stringfield.AbstractStringField;
+
+import formdata.client.ui.template.formfield.AbstractBeanTableField;
+import formdata.shared.services.process.replace.AbstractTemplateForReplaceBoxData;
+
+/**
+ * @since 3.10.0-M5
+ */
+@FormData(value = AbstractTemplateForReplaceBoxData.class, sdkCommand = SdkCommand.CREATE, defaultSubtypeSdkCommand = DefaultSubtypeSdkCommand.CREATE)
+public abstract class AbstractTemplateForReplaceBox extends AbstractGroupBox {
+
+  public TemplateStringField getTemplateStringField() {
+    return getFieldByClass(TemplateStringField.class);
+  }
+
+  public TemplateBox getTemplateBox() {
+    return getFieldByClass(TemplateBox.class);
+  }
+
+  public TemplateTableField getTemplateTableField() {
+    return getFieldByClass(TemplateTableField.class);
+  }
+
+  @Order(10)
+  public class TemplateStringField extends AbstractStringField {
+  }
+
+  @Order(20)
+  public class TemplateBox extends AbstractGroupBox {
+
+    @Order(10)
+    public class TemplateBoxStringField extends AbstractStringField {
+    }
+  }
+
+  @Order(30)
+  public class TemplateTableField extends AbstractBeanTableField<TemplateTableField.Table> {
+
+    public class Table extends AbstractTable {
+
+      public FirstColumn getFirstColumn() {
+        return getColumnSet().getColumnByClass(FirstColumn.class);
+      }
+
+      public SecondColumn getSecondColumn() {
+        return getColumnSet().getColumnByClass(SecondColumn.class);
+      }
+
+      public class FirstColumn extends AbstractStringColumn {
+      }
+
+      public class SecondColumn extends AbstractStringColumn {
+      }
+    }
+  }
+}
diff --git a/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.client/src/formdata/client/ui/template/formfield/replace/RadioButtonForm.java b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.client/src/formdata/client/ui/template/formfield/replace/RadioButtonForm.java
new file mode 100644
index 0000000..1889164
--- /dev/null
+++ b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.client/src/formdata/client/ui/template/formfield/replace/RadioButtonForm.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2010 BSI Business Systems Integration AG.
+ * 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:
+ *     BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package formdata.client.ui.template.formfield.replace;
+
+import org.eclipse.scout.commons.annotations.FormData;
+import org.eclipse.scout.commons.annotations.FormData.SdkCommand;
+import org.eclipse.scout.commons.annotations.Order;
+import org.eclipse.scout.commons.annotations.Replace;
+import org.eclipse.scout.commons.exception.ProcessingException;
+import org.eclipse.scout.rt.client.ui.form.AbstractForm;
+import org.eclipse.scout.rt.client.ui.form.fields.button.AbstractRadioButton;
+import org.eclipse.scout.rt.client.ui.form.fields.groupbox.AbstractGroupBox;
+import org.eclipse.scout.rt.client.ui.form.fields.radiobuttongroup.AbstractRadioButtonGroup;
+import org.eclipse.scout.rt.client.ui.form.fields.stringfield.AbstractStringField;
+
+import formdata.client.ui.template.formfield.replace.RadioButtonForm.MainBox.UsedRadioButtonGroup;
+import formdata.client.ui.template.formfield.replace.RadioButtonForm.MainBox.UsedRadioButtonGroup.InputExStringField;
+import formdata.client.ui.template.formfield.replace.RadioButtonForm.MainBox.UsedRadioButtonGroup.UsageOneUsualStringField;
+import formdata.client.ui.template.formfield.replace.RadioButtonForm.MainBox.UsualRadioButtonGroup;
+import formdata.client.ui.template.formfield.replace.RadioButtonForm.MainBox.UsualRadioButtonGroup.UsualOneButton;
+import formdata.client.ui.template.formfield.replace.RadioButtonForm.MainBox.UsualRadioButtonGroup.UsualStringField;
+import formdata.client.ui.template.formfield.replace.RadioButtonForm.MainBox.UsualRadioButtonGroup.UsualTwoButton;
+import formdata.shared.services.process.replace.RadioButtonFormData;
+
+/**
+ * @since 3.10.0-M5
+ */
+@FormData(value = RadioButtonFormData.class, sdkCommand = SdkCommand.CREATE)
+public class RadioButtonForm extends AbstractForm {
+
+  public RadioButtonForm() throws ProcessingException {
+    super();
+  }
+
+  @Override
+  public MainBox getRootGroupBox() {
+    return (MainBox) super.getRootGroupBox();
+  }
+
+  public UsualRadioButtonGroup getUsualRadioButtonGroup() {
+    return getFieldByClass(UsualRadioButtonGroup.class);
+  }
+
+  public UsualOneButton getUsualOneButton() {
+    return getFieldByClass(UsualOneButton.class);
+  }
+
+  public UsualTwoButton getUsualTwoButton() {
+    return getFieldByClass(UsualTwoButton.class);
+  }
+
+  public UsualStringField getUsualStringField() {
+    return getFieldByClass(UsualStringField.class);
+  }
+
+  public UsedRadioButtonGroup getUsedRadioButtonGroup() {
+    return getFieldByClass(UsedRadioButtonGroup.class);
+  }
+
+  public InputExStringField getInputExStringField() {
+    return getFieldByClass(InputExStringField.class);
+  }
+
+  public UsageOneUsualStringField getUsageOneUsualStringField() {
+    return getFieldByClass(UsageOneUsualStringField.class);
+  }
+
+  public class MainBox extends AbstractGroupBox {
+
+    @Order(10)
+    public class UsualRadioButtonGroup extends AbstractRadioButtonGroup<String> {
+
+      @Order(10)
+      public class UsualOneButton extends AbstractRadioButton {
+        @Override
+        protected String getConfiguredRadioValue() {
+          return "one";
+        }
+      }
+
+      @Order(20)
+      public class UsualTwoButton extends AbstractRadioButton {
+        @Override
+        protected String getConfiguredRadioValue() {
+          return "tow";
+        }
+      }
+
+      @Order(30)
+      public class UsualStringField extends AbstractStringField {
+      }
+    }
+
+    @Order(20)
+    public class UsedRadioButtonGroup extends AbstractRadioButtonGroupWithFields {
+
+      @Replace
+      public class InputExStringField extends InputStringField {
+      }
+
+      @Order(50)
+      public class UsageOneUsualStringField extends AbstractStringField {
+      }
+    }
+  }
+}
diff --git a/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.client/src/formdata/client/ui/template/formfield/replace/TemplateBasedForm.java b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.client/src/formdata/client/ui/template/formfield/replace/TemplateBasedForm.java
new file mode 100644
index 0000000..3886358
--- /dev/null
+++ b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.client/src/formdata/client/ui/template/formfield/replace/TemplateBasedForm.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2010 BSI Business Systems Integration AG.
+ * 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:
+ *     BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package formdata.client.ui.template.formfield.replace;
+
+import org.eclipse.scout.commons.annotations.FormData;
+import org.eclipse.scout.commons.annotations.FormData.SdkCommand;
+import org.eclipse.scout.commons.annotations.Order;
+import org.eclipse.scout.commons.annotations.Replace;
+import org.eclipse.scout.commons.exception.ProcessingException;
+import org.eclipse.scout.rt.client.ui.basic.table.columns.AbstractStringColumn;
+import org.eclipse.scout.rt.client.ui.form.AbstractForm;
+import org.eclipse.scout.rt.client.ui.form.fields.groupbox.AbstractGroupBox;
+import org.eclipse.scout.rt.client.ui.form.fields.stringfield.AbstractStringField;
+
+import formdata.client.ui.template.formfield.replace.TemplateBasedForm.MainBox.UsageOneBox;
+import formdata.client.ui.template.formfield.replace.TemplateBasedForm.MainBox.UsageOneBox.UsageOneStringField;
+import formdata.client.ui.template.formfield.replace.TemplateBasedForm.MainBox.UsageTwoBox;
+import formdata.client.ui.template.formfield.replace.TemplateBasedForm.MainBox.UsualStringField;
+import formdata.shared.services.process.replace.TemplateBasedFormData;
+
+/**
+ * @since 3.10.0-M5
+ */
+@FormData(value = TemplateBasedFormData.class, sdkCommand = SdkCommand.CREATE)
+public class TemplateBasedForm extends AbstractForm {
+
+  public TemplateBasedForm() throws ProcessingException {
+    super();
+  }
+
+  public MainBox getMainBox() {
+    return (MainBox) getRootGroupBox();
+  }
+
+  public UsualStringField getUsualStringField() {
+    return getFieldByClass(UsualStringField.class);
+  }
+
+  public UsageOneBox getUsageOneBox() {
+    return getFieldByClass(UsageOneBox.class);
+  }
+
+  public UsageTwoBox getUsageTwoBox() {
+    return getFieldByClass(UsageTwoBox.class);
+  }
+
+  public UsageOneStringField getUsageOneStringField() {
+    return getFieldByClass(UsageOneStringField.class);
+  }
+
+  public class MainBox extends AbstractGroupBox {
+
+    public class UsualStringField extends AbstractStringField {
+
+    }
+
+    @Order(20)
+    public class UsageOneBox extends AbstractTemplateForReplaceBox {
+
+      @Order(20)
+      public class UsageOneStringField extends AbstractStringField {
+      }
+    }
+
+    @Order(30)
+    public class UsageTwoBox extends AbstractTemplateForReplaceBox {
+
+      @Replace
+      public class UsageTwoTemplateTableField extends TemplateTableField {
+
+        public class UsageTwoTable extends TemplateTableField.Table {
+
+          public UsageTwoFirstColumn getUsageTwoFirstColumn() {
+            return getColumnSet().getColumnByClass(UsageTwoFirstColumn.class);
+          }
+
+          public ThirdColumn getThirdColumn() {
+            return getColumnSet().getColumnByClass(ThirdColumn.class);
+          }
+
+          @Replace
+          public class UsageTwoFirstColumn extends TemplateTableField.Table.FirstColumn {
+          }
+
+          @Order(30)
+          public class ThirdColumn extends AbstractStringColumn {
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.shared/src/formdata/shared/services/process/replace/AbstractRadioButtonGroupWithFieldsData.java b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.shared/src/formdata/shared/services/process/replace/AbstractRadioButtonGroupWithFieldsData.java
new file mode 100644
index 0000000..12f7752
--- /dev/null
+++ b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.shared/src/formdata/shared/services/process/replace/AbstractRadioButtonGroupWithFieldsData.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2010 BSI Business Systems Integration AG.
+ * 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:
+ *     BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package formdata.shared.services.process.replace;
+
+import java.util.Map;
+
+import javax.annotation.Generated;
+
+import org.eclipse.scout.rt.shared.data.form.ValidationRule;
+import org.eclipse.scout.rt.shared.data.form.fields.AbstractValueFieldData;
+
+/**
+ * <b>NOTE:</b><br>
+ * This class is auto generated by the Scout SDK. No manual modifications recommended.
+ * 
+ * @generated
+ */
+@Generated(value = "org.eclipse.scout.sdk.workspace.dto.formdata.FormDataDtoUpdateOperation", comments = "This class is auto generated by the Scout SDK. No manual modifications recommended.")
+public abstract class AbstractRadioButtonGroupWithFieldsData extends AbstractValueFieldData<Long> {
+
+  private static final long serialVersionUID = 1L;
+
+  public AbstractRadioButtonGroupWithFieldsData() {
+  }
+
+  public InputString getInputString() {
+    return getFieldByClass(InputString.class);
+  }
+
+  public static class InputString extends AbstractValueFieldData<String> {
+
+    private static final long serialVersionUID = 1L;
+
+    public InputString() {
+    }
+
+    /**
+     * list of derived validation rules.
+     */
+    @Override
+    protected void initValidationRules(Map<String, Object> ruleMap) {
+      super.initValidationRules(ruleMap);
+      ruleMap.put(ValidationRule.MAX_LENGTH, 4000);
+    }
+  }
+}
diff --git a/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.shared/src/formdata/shared/services/process/replace/AbstractTemplateForReplaceBoxData.java b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.shared/src/formdata/shared/services/process/replace/AbstractTemplateForReplaceBoxData.java
new file mode 100644
index 0000000..3db2cba
--- /dev/null
+++ b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.shared/src/formdata/shared/services/process/replace/AbstractTemplateForReplaceBoxData.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2010 BSI Business Systems Integration AG.
+ * 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:
+ *     BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package formdata.shared.services.process.replace;
+
+import java.util.Map;
+
+import javax.annotation.Generated;
+
+import org.eclipse.scout.rt.shared.data.basic.table.AbstractTableRowData;
+import org.eclipse.scout.rt.shared.data.form.ValidationRule;
+import org.eclipse.scout.rt.shared.data.form.fields.AbstractFormFieldData;
+import org.eclipse.scout.rt.shared.data.form.fields.AbstractValueFieldData;
+import org.eclipse.scout.rt.shared.data.form.fields.tablefield.AbstractTableFieldBeanData;
+
+/**
+ * <b>NOTE:</b><br>
+ * This class is auto generated by the Scout SDK. No manual modifications recommended.
+ * 
+ * @generated
+ */
+@Generated(value = "org.eclipse.scout.sdk.workspace.dto.formdata.FormDataDtoUpdateOperation", comments = "This class is auto generated by the Scout SDK. No manual modifications recommended.")
+public abstract class AbstractTemplateForReplaceBoxData extends AbstractFormFieldData {
+
+  private static final long serialVersionUID = 1L;
+
+  public AbstractTemplateForReplaceBoxData() {
+  }
+
+  public TemplateBoxString getTemplateBoxString() {
+    return getFieldByClass(TemplateBoxString.class);
+  }
+
+  public TemplateString getTemplateString() {
+    return getFieldByClass(TemplateString.class);
+  }
+
+  public TemplateTable getTemplateTable() {
+    return getFieldByClass(TemplateTable.class);
+  }
+
+  public static class TemplateBoxString extends AbstractValueFieldData<String> {
+
+    private static final long serialVersionUID = 1L;
+
+    public TemplateBoxString() {
+    }
+
+    /**
+     * list of derived validation rules.
+     */
+    @Override
+    protected void initValidationRules(Map<String, Object> ruleMap) {
+      super.initValidationRules(ruleMap);
+      ruleMap.put(ValidationRule.MAX_LENGTH, 4000);
+    }
+  }
+
+  public static class TemplateString extends AbstractValueFieldData<String> {
+
+    private static final long serialVersionUID = 1L;
+
+    public TemplateString() {
+    }
+
+    /**
+     * list of derived validation rules.
+     */
+    @Override
+    protected void initValidationRules(Map<String, Object> ruleMap) {
+      super.initValidationRules(ruleMap);
+      ruleMap.put(ValidationRule.MAX_LENGTH, 4000);
+    }
+  }
+
+  public static class TemplateTable extends AbstractTableFieldBeanData {
+
+    private static final long serialVersionUID = 1L;
+
+    public TemplateTable() {
+    }
+
+    @Override
+    public TemplateTableRowData addRow() {
+      return (TemplateTableRowData) super.addRow();
+    }
+
+    @Override
+    public TemplateTableRowData addRow(int rowState) {
+      return (TemplateTableRowData) super.addRow(rowState);
+    }
+
+    @Override
+    public TemplateTableRowData createRow() {
+      return new TemplateTableRowData();
+    }
+
+    @Override
+    public Class<? extends AbstractTableRowData> getRowType() {
+      return TemplateTableRowData.class;
+    }
+
+    @Override
+    public TemplateTableRowData[] getRows() {
+      return (TemplateTableRowData[]) super.getRows();
+    }
+
+    @Override
+    public TemplateTableRowData rowAt(int index) {
+      return (TemplateTableRowData) super.rowAt(index);
+    }
+
+    public void setRows(TemplateTableRowData[] rows) {
+      super.setRows(rows);
+    }
+
+    public static class TemplateTableRowData extends AbstractTableRowData {
+
+      private static final long serialVersionUID = 1L;
+      public static final String first = "first";
+      public static final String second = "second";
+      private String m_first;
+      private String m_second;
+
+      public TemplateTableRowData() {
+      }
+
+      public String getFirst() {
+        return m_first;
+      }
+
+      public void setFirst(String first) {
+        m_first = first;
+      }
+
+      public String getSecond() {
+        return m_second;
+      }
+
+      public void setSecond(String second) {
+        m_second = second;
+      }
+    }
+  }
+}
diff --git a/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.shared/src/formdata/shared/services/process/replace/RadioButtonFormData.java b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.shared/src/formdata/shared/services/process/replace/RadioButtonFormData.java
new file mode 100644
index 0000000..5d3e947
--- /dev/null
+++ b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.shared/src/formdata/shared/services/process/replace/RadioButtonFormData.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2010 BSI Business Systems Integration AG.
+ * 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:
+ *     BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package formdata.shared.services.process.replace;
+
+import java.util.Map;
+
+import javax.annotation.Generated;
+
+import org.eclipse.scout.commons.annotations.Replace;
+import org.eclipse.scout.rt.shared.data.form.AbstractFormData;
+import org.eclipse.scout.rt.shared.data.form.ValidationRule;
+import org.eclipse.scout.rt.shared.data.form.fields.AbstractValueFieldData;
+
+import formdata.shared.services.process.replace.AbstractRadioButtonGroupWithFieldsData.InputString;
+
+/**
+ * <b>NOTE:</b><br>
+ * This class is auto generated by the Scout SDK. No manual modifications recommended.
+ * 
+ * @generated
+ */
+@Generated(value = "org.eclipse.scout.sdk.workspace.dto.formdata.FormDataDtoUpdateOperation", comments = "This class is auto generated by the Scout SDK. No manual modifications recommended.")
+public class RadioButtonFormData extends AbstractFormData {
+
+  private static final long serialVersionUID = 1L;
+
+  public RadioButtonFormData() {
+  }
+
+  public InputExString getInputExString() {
+    return getFieldByClass(InputExString.class);
+  }
+
+  public UsageOneUsualString getUsageOneUsualString() {
+    return getFieldByClass(UsageOneUsualString.class);
+  }
+
+  public UsedRadioButtonGroup getUsedRadioButtonGroup() {
+    return getFieldByClass(UsedRadioButtonGroup.class);
+  }
+
+  public UsualRadioButtonGroup getUsualRadioButtonGroup() {
+    return getFieldByClass(UsualRadioButtonGroup.class);
+  }
+
+  public UsualString getUsualString() {
+    return getFieldByClass(UsualString.class);
+  }
+
+  @Replace
+  public static class InputExString extends InputString {
+
+    private static final long serialVersionUID = 1L;
+
+    public InputExString() {
+    }
+  }
+
+  public static class UsageOneUsualString extends AbstractValueFieldData<String> {
+
+    private static final long serialVersionUID = 1L;
+
+    public UsageOneUsualString() {
+    }
+
+    /**
+     * list of derived validation rules.
+     */
+    @Override
+    protected void initValidationRules(Map<String, Object> ruleMap) {
+      super.initValidationRules(ruleMap);
+      ruleMap.put(ValidationRule.MAX_LENGTH, 4000);
+    }
+  }
+
+  public static class UsedRadioButtonGroup extends AbstractRadioButtonGroupWithFieldsData {
+
+    private static final long serialVersionUID = 1L;
+
+    public UsedRadioButtonGroup() {
+    }
+  }
+
+  public static class UsualRadioButtonGroup extends AbstractValueFieldData<String> {
+
+    private static final long serialVersionUID = 1L;
+
+    public UsualRadioButtonGroup() {
+    }
+  }
+
+  public static class UsualString extends AbstractValueFieldData<String> {
+
+    private static final long serialVersionUID = 1L;
+
+    public UsualString() {
+    }
+
+    /**
+     * list of derived validation rules.
+     */
+    @Override
+    protected void initValidationRules(Map<String, Object> ruleMap) {
+      super.initValidationRules(ruleMap);
+      ruleMap.put(ValidationRule.MAX_LENGTH, 4000);
+    }
+  }
+}
diff --git a/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.shared/src/formdata/shared/services/process/replace/TemplateBasedFormData.java b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.shared/src/formdata/shared/services/process/replace/TemplateBasedFormData.java
new file mode 100644
index 0000000..2c9fd12
--- /dev/null
+++ b/org.eclipse.scout.sdk.test/resources/operation/formData/formdata.shared/src/formdata/shared/services/process/replace/TemplateBasedFormData.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * Copyright (c) 2010 BSI Business Systems Integration AG.
+ * 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:
+ *     BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package formdata.shared.services.process.replace;
+
+import java.util.Map;
+
+import javax.annotation.Generated;
+
+import org.eclipse.scout.commons.annotations.Replace;
+import org.eclipse.scout.rt.shared.data.basic.table.AbstractTableRowData;
+import org.eclipse.scout.rt.shared.data.form.AbstractFormData;
+import org.eclipse.scout.rt.shared.data.form.ValidationRule;
+import org.eclipse.scout.rt.shared.data.form.fields.AbstractValueFieldData;
+
+/**
+ * <b>NOTE:</b><br>
+ * This class is auto generated by the Scout SDK. No manual modifications recommended.
+ * 
+ * @generated
+ */
+@Generated(value = "org.eclipse.scout.sdk.workspace.dto.formdata.FormDataDtoUpdateOperation", comments = "This class is auto generated by the Scout SDK. No manual modifications recommended.")
+public class TemplateBasedFormData extends AbstractFormData {
+
+  private static final long serialVersionUID = 1L;
+
+  public TemplateBasedFormData() {
+  }
+
+  public UsageOneBox getUsageOneBox() {
+    return getFieldByClass(UsageOneBox.class);
+  }
+
+  public UsageTwoBox getUsageTwoBox() {
+    return getFieldByClass(UsageTwoBox.class);
+  }
+
+  public UsualString getUsualString() {
+    return getFieldByClass(UsualString.class);
+  }
+
+  public static class UsageOneBox extends AbstractTemplateForReplaceBoxData {
+
+    private static final long serialVersionUID = 1L;
+
+    public UsageOneBox() {
+    }
+
+    public UsageOneString getUsageOneString() {
+      return getFieldByClass(UsageOneString.class);
+    }
+
+    public static class UsageOneString extends AbstractValueFieldData<String> {
+
+      private static final long serialVersionUID = 1L;
+
+      public UsageOneString() {
+      }
+
+      /**
+       * list of derived validation rules.
+       */
+      @Override
+      protected void initValidationRules(Map<String, Object> ruleMap) {
+        super.initValidationRules(ruleMap);
+        ruleMap.put(ValidationRule.MAX_LENGTH, 4000);
+      }
+    }
+  }
+
+  public static class UsageTwoBox extends AbstractTemplateForReplaceBoxData {
+
+    private static final long serialVersionUID = 1L;
+
+    public UsageTwoBox() {
+    }
+
+    public UsageTwoTemplateTable getUsageTwoTemplateTable() {
+      return getFieldByClass(UsageTwoTemplateTable.class);
+    }
+
+    @Replace
+    public static class UsageTwoTemplateTable extends TemplateTable {
+
+      private static final long serialVersionUID = 1L;
+
+      public UsageTwoTemplateTable() {
+      }
+
+      @Override
+      public UsageTwoTemplateTableRowData addRow() {
+        return (UsageTwoTemplateTableRowData) super.addRow();
+      }
+
+      @Override
+      public UsageTwoTemplateTableRowData addRow(int rowState) {
+        return (UsageTwoTemplateTableRowData) super.addRow(rowState);
+      }
+
+      @Override
+      public UsageTwoTemplateTableRowData createRow() {
+        return new UsageTwoTemplateTableRowData();
+      }
+
+      @Override
+      public Class<? extends AbstractTableRowData> getRowType() {
+        return UsageTwoTemplateTableRowData.class;
+      }
+
+      @Override
+      public UsageTwoTemplateTableRowData[] getRows() {
+        return (UsageTwoTemplateTableRowData[]) super.getRows();
+      }
+
+      @Override
+      public UsageTwoTemplateTableRowData rowAt(int index) {
+        return (UsageTwoTemplateTableRowData) super.rowAt(index);
+      }
+
+      public void setRows(UsageTwoTemplateTableRowData[] rows) {
+        super.setRows(rows);
+      }
+
+      public static class UsageTwoTemplateTableRowData extends TemplateTableRowData {
+
+        private static final long serialVersionUID = 1L;
+        public static final String third = "third";
+        private String m_third;
+
+        public UsageTwoTemplateTableRowData() {
+        }
+
+        public String getThird() {
+          return m_third;
+        }
+
+        public void setThird(String third) {
+          m_third = third;
+        }
+      }
+    }
+  }
+
+  public static class UsualString extends AbstractValueFieldData<String> {
+
+    private static final long serialVersionUID = 1L;
+
+    public UsualString() {
+    }
+
+    /**
+     * list of derived validation rules.
+     */
+    @Override
+    protected void initValidationRules(Map<String, Object> ruleMap) {
+      super.initValidationRules(ruleMap);
+      ruleMap.put(ValidationRule.MAX_LENGTH, 4000);
+    }
+  }
+}
diff --git a/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/operation/formdata/ReplaceWithTemplatesTest.java b/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/operation/formdata/ReplaceWithTemplatesTest.java
new file mode 100644
index 0000000..e814a40
--- /dev/null
+++ b/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/operation/formdata/ReplaceWithTemplatesTest.java
@@ -0,0 +1,560 @@
+/*******************************************************************************
+ * Copyright (c) 2013 BSI Business Systems Integration AG.
+ * 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:
+ *     BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.scout.sdk.internal.test.operation.formdata;
+
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.scout.sdk.testing.SdkAssert;
+import org.eclipse.scout.sdk.testing.TestWorkspaceUtility;
+import org.eclipse.scout.sdk.workspace.dto.formdata.FormDataDtoUpdateOperation;
+import org.junit.Test;
+
+/**
+ * @since 3.10.0-M5
+ */
+public class ReplaceWithTemplatesTest extends AbstractSdkTestWithFormDataProject {
+
+  private static final String TemplateBoxFqn = "formdata.client.ui.template.formfield.replace.AbstractTemplateForReplaceBox";
+  private static final String TemplateBasedFormFqn = "formdata.client.ui.template.formfield.replace.TemplateBasedForm";
+  private static final String TemplateRadioButtonGroupWithFieldsFqn = "formdata.client.ui.template.formfield.replace.AbstractRadioButtonGroupWithFields";
+  private static final String RadioButtonFormFqn = "formdata.client.ui.template.formfield.replace.RadioButtonForm";
+
+  private void createFormData(String typeName) throws Exception {
+    IType field = SdkAssert.assertTypeExists(typeName);
+    FormDataDtoUpdateOperation op = new FormDataDtoUpdateOperation(field);
+    TestWorkspaceUtility.executeAndBuildWorkspace(op);
+  }
+
+  @Test
+  public void testTemplateBoxData() throws Exception {
+    createFormData(TemplateBoxFqn);
+    TestWorkspaceUtility.assertNoCompileErrors();
+    testApiOfAbstractTemplateForReplaceBoxData();
+  }
+
+  @Test
+  public void testTemplateBasedFormData() throws Exception {
+    createFormData(TemplateBasedFormFqn);
+    TestWorkspaceUtility.assertNoCompileErrors();
+    testApiOfTemplateBasedFormData();
+  }
+
+  @Test
+  public void testTemplateRadioButtonGroupWithFields() throws Exception {
+    createFormData(TemplateRadioButtonGroupWithFieldsFqn);
+    TestWorkspaceUtility.assertNoCompileErrors();
+    testApiOfAbstractRadioButtonGroupWithFieldsData();
+  }
+
+  @Test
+  public void testRadioButtonForm() throws Exception {
+    createFormData(RadioButtonFormFqn);
+    TestWorkspaceUtility.assertNoCompileErrors();
+    testApiOfRadioButtonFormData();
+  }
+
+  /**
+   * @Generated with org.eclipse.scout.sdk.testing.codegen.ApiTestGenerator
+   */
+  private void testApiOfAbstractTemplateForReplaceBoxData() throws Exception {
+    // type AbstractTemplateForReplaceBoxData
+    IType abstractTemplateForReplaceBoxData = SdkAssert.assertTypeExists("formdata.shared.services.process.replace.AbstractTemplateForReplaceBoxData");
+    SdkAssert.assertHasFlags(abstractTemplateForReplaceBoxData, 1025);
+    SdkAssert.assertHasSuperTypeSignature(abstractTemplateForReplaceBoxData, "QAbstractFormFieldData;");
+    SdkAssert.assertAnnotation(abstractTemplateForReplaceBoxData, "javax.annotation.Generated");
+
+    // fields of AbstractTemplateForReplaceBoxData
+    SdkAssert.assertEquals("field count of 'AbstractTemplateForReplaceBoxData'", 1, abstractTemplateForReplaceBoxData.getFields().length);
+    IField serialVersionUID = SdkAssert.assertFieldExist(abstractTemplateForReplaceBoxData, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID, "J");
+
+    SdkAssert.assertEquals("method count of 'AbstractTemplateForReplaceBoxData'", 4, abstractTemplateForReplaceBoxData.getMethods().length);
+    IMethod abstractTemplateForReplaceBoxData1 = SdkAssert.assertMethodExist(abstractTemplateForReplaceBoxData, "AbstractTemplateForReplaceBoxData", new String[]{});
+    SdkAssert.assertTrue(abstractTemplateForReplaceBoxData1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(abstractTemplateForReplaceBoxData1, "V");
+    IMethod getTemplateBoxString = SdkAssert.assertMethodExist(abstractTemplateForReplaceBoxData, "getTemplateBoxString", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getTemplateBoxString, "QTemplateBoxString;");
+    IMethod getTemplateString = SdkAssert.assertMethodExist(abstractTemplateForReplaceBoxData, "getTemplateString", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getTemplateString, "QTemplateString;");
+    IMethod getTemplateTable = SdkAssert.assertMethodExist(abstractTemplateForReplaceBoxData, "getTemplateTable", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getTemplateTable, "QTemplateTable;");
+
+    SdkAssert.assertEquals("inner types count of 'AbstractTemplateForReplaceBoxData'", 3, abstractTemplateForReplaceBoxData.getTypes().length);
+    // type TemplateBoxString
+    IType templateBoxString = SdkAssert.assertTypeExists(abstractTemplateForReplaceBoxData, "TemplateBoxString");
+    SdkAssert.assertHasFlags(templateBoxString, 9);
+    SdkAssert.assertHasSuperTypeSignature(templateBoxString, "QAbstractValueFieldData<QString;>;");
+
+    // fields of TemplateBoxString
+    SdkAssert.assertEquals("field count of 'TemplateBoxString'", 1, templateBoxString.getFields().length);
+    IField serialVersionUID1 = SdkAssert.assertFieldExist(templateBoxString, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID1, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID1, "J");
+
+    SdkAssert.assertEquals("method count of 'TemplateBoxString'", 2, templateBoxString.getMethods().length);
+    IMethod templateBoxString1 = SdkAssert.assertMethodExist(templateBoxString, "TemplateBoxString", new String[]{});
+    SdkAssert.assertTrue(templateBoxString1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(templateBoxString1, "V");
+    IMethod initValidationRules = SdkAssert.assertMethodExist(templateBoxString, "initValidationRules", new String[]{"QMap<QString;QObject;>;"});
+    SdkAssert.assertMethodReturnTypeSignature(initValidationRules, "V");
+    SdkAssert.assertAnnotation(initValidationRules, "java.lang.Override");
+    SdkAssert.assertMethodValidationRules(initValidationRules, new String[]{"ruleMap.put(ValidationRule.MAX_LENGTH, 4000);"}, true);
+
+    SdkAssert.assertEquals("inner types count of 'TemplateBoxString'", 0, templateBoxString.getTypes().length);
+    // type TemplateString
+    IType templateString = SdkAssert.assertTypeExists(abstractTemplateForReplaceBoxData, "TemplateString");
+    SdkAssert.assertHasFlags(templateString, 9);
+    SdkAssert.assertHasSuperTypeSignature(templateString, "QAbstractValueFieldData<QString;>;");
+
+    // fields of TemplateString
+    SdkAssert.assertEquals("field count of 'TemplateString'", 1, templateString.getFields().length);
+    IField serialVersionUID2 = SdkAssert.assertFieldExist(templateString, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID2, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID2, "J");
+
+    SdkAssert.assertEquals("method count of 'TemplateString'", 2, templateString.getMethods().length);
+    IMethod templateString1 = SdkAssert.assertMethodExist(templateString, "TemplateString", new String[]{});
+    SdkAssert.assertTrue(templateString1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(templateString1, "V");
+    IMethod initValidationRules1 = SdkAssert.assertMethodExist(templateString, "initValidationRules", new String[]{"QMap<QString;QObject;>;"});
+    SdkAssert.assertMethodReturnTypeSignature(initValidationRules1, "V");
+    SdkAssert.assertAnnotation(initValidationRules1, "java.lang.Override");
+    SdkAssert.assertMethodValidationRules(initValidationRules1, new String[]{"ruleMap.put(ValidationRule.MAX_LENGTH, 4000);"}, true);
+
+    SdkAssert.assertEquals("inner types count of 'TemplateString'", 0, templateString.getTypes().length);
+    // type TemplateTable
+    IType templateTable = SdkAssert.assertTypeExists(abstractTemplateForReplaceBoxData, "TemplateTable");
+    SdkAssert.assertHasFlags(templateTable, 9);
+    SdkAssert.assertHasSuperTypeSignature(templateTable, "QAbstractTableFieldBeanData;");
+
+    // fields of TemplateTable
+    SdkAssert.assertEquals("field count of 'TemplateTable'", 1, templateTable.getFields().length);
+    IField serialVersionUID3 = SdkAssert.assertFieldExist(templateTable, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID3, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID3, "J");
+
+    SdkAssert.assertEquals("method count of 'TemplateTable'", 8, templateTable.getMethods().length);
+    IMethod templateTable1 = SdkAssert.assertMethodExist(templateTable, "TemplateTable", new String[]{});
+    SdkAssert.assertTrue(templateTable1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(templateTable1, "V");
+    IMethod addRow = SdkAssert.assertMethodExist(templateTable, "addRow", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(addRow, "QTemplateTableRowData;");
+    SdkAssert.assertAnnotation(addRow, "java.lang.Override");
+    IMethod addRow1 = SdkAssert.assertMethodExist(templateTable, "addRow", new String[]{"I"});
+    SdkAssert.assertMethodReturnTypeSignature(addRow1, "QTemplateTableRowData;");
+    SdkAssert.assertAnnotation(addRow1, "java.lang.Override");
+    IMethod createRow = SdkAssert.assertMethodExist(templateTable, "createRow", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(createRow, "QTemplateTableRowData;");
+    SdkAssert.assertAnnotation(createRow, "java.lang.Override");
+    IMethod getRowType = SdkAssert.assertMethodExist(templateTable, "getRowType", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getRowType, "QClass<+QAbstractTableRowData;>;");
+    SdkAssert.assertAnnotation(getRowType, "java.lang.Override");
+    IMethod getRows = SdkAssert.assertMethodExist(templateTable, "getRows", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getRows, "[QTemplateTableRowData;");
+    SdkAssert.assertAnnotation(getRows, "java.lang.Override");
+    IMethod rowAt = SdkAssert.assertMethodExist(templateTable, "rowAt", new String[]{"I"});
+    SdkAssert.assertMethodReturnTypeSignature(rowAt, "QTemplateTableRowData;");
+    SdkAssert.assertAnnotation(rowAt, "java.lang.Override");
+    IMethod setRows = SdkAssert.assertMethodExist(templateTable, "setRows", new String[]{"[QTemplateTableRowData;"});
+    SdkAssert.assertMethodReturnTypeSignature(setRows, "V");
+
+    SdkAssert.assertEquals("inner types count of 'TemplateTable'", 1, templateTable.getTypes().length);
+    // type TemplateTableRowData
+    IType templateTableRowData = SdkAssert.assertTypeExists(templateTable, "TemplateTableRowData");
+    SdkAssert.assertHasFlags(templateTableRowData, 9);
+    SdkAssert.assertHasSuperTypeSignature(templateTableRowData, "QAbstractTableRowData;");
+
+    // fields of TemplateTableRowData
+    SdkAssert.assertEquals("field count of 'TemplateTableRowData'", 5, templateTableRowData.getFields().length);
+    IField serialVersionUID4 = SdkAssert.assertFieldExist(templateTableRowData, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID4, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID4, "J");
+    IField first = SdkAssert.assertFieldExist(templateTableRowData, "first");
+    SdkAssert.assertHasFlags(first, 25);
+    SdkAssert.assertFieldSignature(first, "QString;");
+    IField second = SdkAssert.assertFieldExist(templateTableRowData, "second");
+    SdkAssert.assertHasFlags(second, 25);
+    SdkAssert.assertFieldSignature(second, "QString;");
+    IField m_first = SdkAssert.assertFieldExist(templateTableRowData, "m_first");
+    SdkAssert.assertHasFlags(m_first, 2);
+    SdkAssert.assertFieldSignature(m_first, "QString;");
+    IField m_second = SdkAssert.assertFieldExist(templateTableRowData, "m_second");
+    SdkAssert.assertHasFlags(m_second, 2);
+    SdkAssert.assertFieldSignature(m_second, "QString;");
+
+    SdkAssert.assertEquals("method count of 'TemplateTableRowData'", 5, templateTableRowData.getMethods().length);
+    IMethod templateTableRowData1 = SdkAssert.assertMethodExist(templateTableRowData, "TemplateTableRowData", new String[]{});
+    SdkAssert.assertTrue(templateTableRowData1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(templateTableRowData1, "V");
+    IMethod getFirst = SdkAssert.assertMethodExist(templateTableRowData, "getFirst", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getFirst, "QString;");
+    IMethod setFirst = SdkAssert.assertMethodExist(templateTableRowData, "setFirst", new String[]{"QString;"});
+    SdkAssert.assertMethodReturnTypeSignature(setFirst, "V");
+    IMethod getSecond = SdkAssert.assertMethodExist(templateTableRowData, "getSecond", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getSecond, "QString;");
+    IMethod setSecond = SdkAssert.assertMethodExist(templateTableRowData, "setSecond", new String[]{"QString;"});
+    SdkAssert.assertMethodReturnTypeSignature(setSecond, "V");
+
+    SdkAssert.assertEquals("inner types count of 'TemplateTableRowData'", 0, templateTableRowData.getTypes().length);
+  }
+
+  /**
+   * @Generated with org.eclipse.scout.sdk.testing.codegen.ApiTestGenerator
+   */
+  private void testApiOfTemplateBasedFormData() throws Exception {
+    // type TemplateBasedFormData
+    IType templateBasedFormData = SdkAssert.assertTypeExists("formdata.shared.services.process.replace.TemplateBasedFormData");
+    SdkAssert.assertHasFlags(templateBasedFormData, 1);
+    SdkAssert.assertHasSuperTypeSignature(templateBasedFormData, "QAbstractFormData;");
+    SdkAssert.assertAnnotation(templateBasedFormData, "javax.annotation.Generated");
+
+    // fields of TemplateBasedFormData
+    SdkAssert.assertEquals("field count of 'TemplateBasedFormData'", 1, templateBasedFormData.getFields().length);
+    IField serialVersionUID = SdkAssert.assertFieldExist(templateBasedFormData, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID, "J");
+
+    SdkAssert.assertEquals("method count of 'TemplateBasedFormData'", 4, templateBasedFormData.getMethods().length);
+    IMethod templateBasedFormData1 = SdkAssert.assertMethodExist(templateBasedFormData, "TemplateBasedFormData", new String[]{});
+    SdkAssert.assertTrue(templateBasedFormData1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(templateBasedFormData1, "V");
+    IMethod getUsageOneBox = SdkAssert.assertMethodExist(templateBasedFormData, "getUsageOneBox", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getUsageOneBox, "QUsageOneBox;");
+    IMethod getUsageTwoBox = SdkAssert.assertMethodExist(templateBasedFormData, "getUsageTwoBox", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getUsageTwoBox, "QUsageTwoBox;");
+    IMethod getUsualString = SdkAssert.assertMethodExist(templateBasedFormData, "getUsualString", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getUsualString, "QUsualString;");
+
+    SdkAssert.assertEquals("inner types count of 'TemplateBasedFormData'", 3, templateBasedFormData.getTypes().length);
+    // type UsageOneBox
+    IType usageOneBox = SdkAssert.assertTypeExists(templateBasedFormData, "UsageOneBox");
+    SdkAssert.assertHasFlags(usageOneBox, 9);
+    SdkAssert.assertHasSuperTypeSignature(usageOneBox, "QAbstractTemplateForReplaceBoxData;");
+
+    // fields of UsageOneBox
+    SdkAssert.assertEquals("field count of 'UsageOneBox'", 1, usageOneBox.getFields().length);
+    IField serialVersionUID1 = SdkAssert.assertFieldExist(usageOneBox, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID1, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID1, "J");
+
+    SdkAssert.assertEquals("method count of 'UsageOneBox'", 2, usageOneBox.getMethods().length);
+    IMethod usageOneBox1 = SdkAssert.assertMethodExist(usageOneBox, "UsageOneBox", new String[]{});
+    SdkAssert.assertTrue(usageOneBox1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(usageOneBox1, "V");
+    IMethod getUsageOneString = SdkAssert.assertMethodExist(usageOneBox, "getUsageOneString", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getUsageOneString, "QUsageOneString;");
+
+    SdkAssert.assertEquals("inner types count of 'UsageOneBox'", 1, usageOneBox.getTypes().length);
+    // type UsageOneString
+    IType usageOneString = SdkAssert.assertTypeExists(usageOneBox, "UsageOneString");
+    SdkAssert.assertHasFlags(usageOneString, 9);
+    SdkAssert.assertHasSuperTypeSignature(usageOneString, "QAbstractValueFieldData<QString;>;");
+
+    // fields of UsageOneString
+    SdkAssert.assertEquals("field count of 'UsageOneString'", 1, usageOneString.getFields().length);
+    IField serialVersionUID2 = SdkAssert.assertFieldExist(usageOneString, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID2, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID2, "J");
+
+    SdkAssert.assertEquals("method count of 'UsageOneString'", 2, usageOneString.getMethods().length);
+    IMethod usageOneString1 = SdkAssert.assertMethodExist(usageOneString, "UsageOneString", new String[]{});
+    SdkAssert.assertTrue(usageOneString1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(usageOneString1, "V");
+    IMethod initValidationRules = SdkAssert.assertMethodExist(usageOneString, "initValidationRules", new String[]{"QMap<QString;QObject;>;"});
+    SdkAssert.assertMethodReturnTypeSignature(initValidationRules, "V");
+    SdkAssert.assertAnnotation(initValidationRules, "java.lang.Override");
+    SdkAssert.assertMethodValidationRules(initValidationRules, new String[]{"ruleMap.put(ValidationRule.MAX_LENGTH, 4000);"}, true);
+
+    SdkAssert.assertEquals("inner types count of 'UsageOneString'", 0, usageOneString.getTypes().length);
+    // type UsageTwoBox
+    IType usageTwoBox = SdkAssert.assertTypeExists(templateBasedFormData, "UsageTwoBox");
+    SdkAssert.assertHasFlags(usageTwoBox, 9);
+    SdkAssert.assertHasSuperTypeSignature(usageTwoBox, "QAbstractTemplateForReplaceBoxData;");
+
+    // fields of UsageTwoBox
+    SdkAssert.assertEquals("field count of 'UsageTwoBox'", 1, usageTwoBox.getFields().length);
+    IField serialVersionUID3 = SdkAssert.assertFieldExist(usageTwoBox, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID3, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID3, "J");
+
+    SdkAssert.assertEquals("method count of 'UsageTwoBox'", 2, usageTwoBox.getMethods().length);
+    IMethod usageTwoBox1 = SdkAssert.assertMethodExist(usageTwoBox, "UsageTwoBox", new String[]{});
+    SdkAssert.assertTrue(usageTwoBox1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(usageTwoBox1, "V");
+    IMethod getUsageTwoTemplateTable = SdkAssert.assertMethodExist(usageTwoBox, "getUsageTwoTemplateTable", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getUsageTwoTemplateTable, "QUsageTwoTemplateTable;");
+
+    SdkAssert.assertEquals("inner types count of 'UsageTwoBox'", 1, usageTwoBox.getTypes().length);
+    // type UsageTwoTemplateTable
+    IType usageTwoTemplateTable = SdkAssert.assertTypeExists(usageTwoBox, "UsageTwoTemplateTable");
+    SdkAssert.assertHasFlags(usageTwoTemplateTable, 9);
+    SdkAssert.assertHasSuperTypeSignature(usageTwoTemplateTable, "QTemplateTable;");
+    SdkAssert.assertAnnotation(usageTwoTemplateTable, "org.eclipse.scout.commons.annotations.Replace");
+
+    // fields of UsageTwoTemplateTable
+    SdkAssert.assertEquals("field count of 'UsageTwoTemplateTable'", 1, usageTwoTemplateTable.getFields().length);
+    IField serialVersionUID4 = SdkAssert.assertFieldExist(usageTwoTemplateTable, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID4, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID4, "J");
+
+    SdkAssert.assertEquals("method count of 'UsageTwoTemplateTable'", 8, usageTwoTemplateTable.getMethods().length);
+    IMethod usageTwoTemplateTable1 = SdkAssert.assertMethodExist(usageTwoTemplateTable, "UsageTwoTemplateTable", new String[]{});
+    SdkAssert.assertTrue(usageTwoTemplateTable1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(usageTwoTemplateTable1, "V");
+    IMethod addRow = SdkAssert.assertMethodExist(usageTwoTemplateTable, "addRow", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(addRow, "QUsageTwoTemplateTableRowData;");
+    SdkAssert.assertAnnotation(addRow, "java.lang.Override");
+    IMethod addRow1 = SdkAssert.assertMethodExist(usageTwoTemplateTable, "addRow", new String[]{"I"});
+    SdkAssert.assertMethodReturnTypeSignature(addRow1, "QUsageTwoTemplateTableRowData;");
+    SdkAssert.assertAnnotation(addRow1, "java.lang.Override");
+    IMethod createRow = SdkAssert.assertMethodExist(usageTwoTemplateTable, "createRow", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(createRow, "QUsageTwoTemplateTableRowData;");
+    SdkAssert.assertAnnotation(createRow, "java.lang.Override");
+    IMethod getRowType = SdkAssert.assertMethodExist(usageTwoTemplateTable, "getRowType", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getRowType, "QClass<+QAbstractTableRowData;>;");
+    SdkAssert.assertAnnotation(getRowType, "java.lang.Override");
+    IMethod getRows = SdkAssert.assertMethodExist(usageTwoTemplateTable, "getRows", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getRows, "[QUsageTwoTemplateTableRowData;");
+    SdkAssert.assertAnnotation(getRows, "java.lang.Override");
+    IMethod rowAt = SdkAssert.assertMethodExist(usageTwoTemplateTable, "rowAt", new String[]{"I"});
+    SdkAssert.assertMethodReturnTypeSignature(rowAt, "QUsageTwoTemplateTableRowData;");
+    SdkAssert.assertAnnotation(rowAt, "java.lang.Override");
+    IMethod setRows = SdkAssert.assertMethodExist(usageTwoTemplateTable, "setRows", new String[]{"[QUsageTwoTemplateTableRowData;"});
+    SdkAssert.assertMethodReturnTypeSignature(setRows, "V");
+
+    SdkAssert.assertEquals("inner types count of 'UsageTwoTemplateTable'", 1, usageTwoTemplateTable.getTypes().length);
+    // type UsageTwoTemplateTableRowData
+    IType usageTwoTemplateTableRowData = SdkAssert.assertTypeExists(usageTwoTemplateTable, "UsageTwoTemplateTableRowData");
+    SdkAssert.assertHasFlags(usageTwoTemplateTableRowData, 9);
+    SdkAssert.assertHasSuperTypeSignature(usageTwoTemplateTableRowData, "QTemplateTableRowData;");
+
+    // fields of UsageTwoTemplateTableRowData
+    SdkAssert.assertEquals("field count of 'UsageTwoTemplateTableRowData'", 3, usageTwoTemplateTableRowData.getFields().length);
+    IField serialVersionUID5 = SdkAssert.assertFieldExist(usageTwoTemplateTableRowData, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID5, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID5, "J");
+    IField third = SdkAssert.assertFieldExist(usageTwoTemplateTableRowData, "third");
+    SdkAssert.assertHasFlags(third, 25);
+    SdkAssert.assertFieldSignature(third, "QString;");
+    IField m_third = SdkAssert.assertFieldExist(usageTwoTemplateTableRowData, "m_third");
+    SdkAssert.assertHasFlags(m_third, 2);
+    SdkAssert.assertFieldSignature(m_third, "QString;");
+
+    SdkAssert.assertEquals("method count of 'UsageTwoTemplateTableRowData'", 3, usageTwoTemplateTableRowData.getMethods().length);
+    IMethod usageTwoTemplateTableRowData1 = SdkAssert.assertMethodExist(usageTwoTemplateTableRowData, "UsageTwoTemplateTableRowData", new String[]{});
+    SdkAssert.assertTrue(usageTwoTemplateTableRowData1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(usageTwoTemplateTableRowData1, "V");
+    IMethod getThird = SdkAssert.assertMethodExist(usageTwoTemplateTableRowData, "getThird", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getThird, "QString;");
+    IMethod setThird = SdkAssert.assertMethodExist(usageTwoTemplateTableRowData, "setThird", new String[]{"QString;"});
+    SdkAssert.assertMethodReturnTypeSignature(setThird, "V");
+
+    SdkAssert.assertEquals("inner types count of 'UsageTwoTemplateTableRowData'", 0, usageTwoTemplateTableRowData.getTypes().length);
+    // type UsualString
+    IType usualString = SdkAssert.assertTypeExists(templateBasedFormData, "UsualString");
+    SdkAssert.assertHasFlags(usualString, 9);
+    SdkAssert.assertHasSuperTypeSignature(usualString, "QAbstractValueFieldData<QString;>;");
+
+    // fields of UsualString
+    SdkAssert.assertEquals("field count of 'UsualString'", 1, usualString.getFields().length);
+    IField serialVersionUID6 = SdkAssert.assertFieldExist(usualString, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID6, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID6, "J");
+
+    SdkAssert.assertEquals("method count of 'UsualString'", 2, usualString.getMethods().length);
+    IMethod usualString1 = SdkAssert.assertMethodExist(usualString, "UsualString", new String[]{});
+    SdkAssert.assertTrue(usualString1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(usualString1, "V");
+    IMethod initValidationRules1 = SdkAssert.assertMethodExist(usualString, "initValidationRules", new String[]{"QMap<QString;QObject;>;"});
+    SdkAssert.assertMethodReturnTypeSignature(initValidationRules1, "V");
+    SdkAssert.assertAnnotation(initValidationRules1, "java.lang.Override");
+    SdkAssert.assertMethodValidationRules(initValidationRules1, new String[]{"ruleMap.put(ValidationRule.MAX_LENGTH, 4000);"}, true);
+
+    SdkAssert.assertEquals("inner types count of 'UsualString'", 0, usualString.getTypes().length);
+  }
+
+  /**
+   * @Generated with org.eclipse.scout.sdk.testing.codegen.ApiTestGenerator
+   */
+  private void testApiOfAbstractRadioButtonGroupWithFieldsData() throws Exception {
+    // type AbstractRadioButtonGroupWithFieldsData
+    IType abstractRadioButtonGroupWithFieldsData = SdkAssert.assertTypeExists("formdata.shared.services.process.replace.AbstractRadioButtonGroupWithFieldsData");
+    SdkAssert.assertHasFlags(abstractRadioButtonGroupWithFieldsData, 1025);
+    SdkAssert.assertHasSuperTypeSignature(abstractRadioButtonGroupWithFieldsData, "QAbstractValueFieldData<QLong;>;");
+    SdkAssert.assertAnnotation(abstractRadioButtonGroupWithFieldsData, "javax.annotation.Generated");
+
+    // fields of AbstractRadioButtonGroupWithFieldsData
+    SdkAssert.assertEquals("field count of 'AbstractRadioButtonGroupWithFieldsData'", 1, abstractRadioButtonGroupWithFieldsData.getFields().length);
+    IField serialVersionUID = SdkAssert.assertFieldExist(abstractRadioButtonGroupWithFieldsData, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID, "J");
+
+    SdkAssert.assertEquals("method count of 'AbstractRadioButtonGroupWithFieldsData'", 2, abstractRadioButtonGroupWithFieldsData.getMethods().length);
+    IMethod abstractRadioButtonGroupWithFieldsData1 = SdkAssert.assertMethodExist(abstractRadioButtonGroupWithFieldsData, "AbstractRadioButtonGroupWithFieldsData", new String[]{});
+    SdkAssert.assertTrue(abstractRadioButtonGroupWithFieldsData1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(abstractRadioButtonGroupWithFieldsData1, "V");
+    IMethod getInputString = SdkAssert.assertMethodExist(abstractRadioButtonGroupWithFieldsData, "getInputString", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getInputString, "QInputString;");
+
+    SdkAssert.assertEquals("inner types count of 'AbstractRadioButtonGroupWithFieldsData'", 1, abstractRadioButtonGroupWithFieldsData.getTypes().length);
+    // type InputString
+    IType inputString = SdkAssert.assertTypeExists(abstractRadioButtonGroupWithFieldsData, "InputString");
+    SdkAssert.assertHasFlags(inputString, 9);
+    SdkAssert.assertHasSuperTypeSignature(inputString, "QAbstractValueFieldData<QString;>;");
+
+    // fields of InputString
+    SdkAssert.assertEquals("field count of 'InputString'", 1, inputString.getFields().length);
+    IField serialVersionUID1 = SdkAssert.assertFieldExist(inputString, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID1, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID1, "J");
+
+    SdkAssert.assertEquals("method count of 'InputString'", 2, inputString.getMethods().length);
+    IMethod inputString1 = SdkAssert.assertMethodExist(inputString, "InputString", new String[]{});
+    SdkAssert.assertTrue(inputString1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(inputString1, "V");
+    IMethod initValidationRules = SdkAssert.assertMethodExist(inputString, "initValidationRules", new String[]{"QMap<QString;QObject;>;"});
+    SdkAssert.assertMethodReturnTypeSignature(initValidationRules, "V");
+    SdkAssert.assertAnnotation(initValidationRules, "java.lang.Override");
+    SdkAssert.assertMethodValidationRules(initValidationRules, new String[]{"ruleMap.put(ValidationRule.MAX_LENGTH, 4000);"}, true);
+
+    SdkAssert.assertEquals("inner types count of 'InputString'", 0, inputString.getTypes().length);
+  }
+
+  /**
+   * @Generated with org.eclipse.scout.sdk.testing.codegen.ApiTestGenerator
+   */
+  private void testApiOfRadioButtonFormData() throws Exception {
+    // type RadioButtonFormData
+    IType radioButtonFormData = SdkAssert.assertTypeExists("formdata.shared.services.process.replace.RadioButtonFormData");
+    SdkAssert.assertHasFlags(radioButtonFormData, 1);
+    SdkAssert.assertHasSuperTypeSignature(radioButtonFormData, "QAbstractFormData;");
+    SdkAssert.assertAnnotation(radioButtonFormData, "javax.annotation.Generated");
+
+    // fields of RadioButtonFormData
+    SdkAssert.assertEquals("field count of 'RadioButtonFormData'", 1, radioButtonFormData.getFields().length);
+    IField serialVersionUID = SdkAssert.assertFieldExist(radioButtonFormData, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID, "J");
+
+    SdkAssert.assertEquals("method count of 'RadioButtonFormData'", 6, radioButtonFormData.getMethods().length);
+    IMethod radioButtonFormData1 = SdkAssert.assertMethodExist(radioButtonFormData, "RadioButtonFormData", new String[]{});
+    SdkAssert.assertTrue(radioButtonFormData1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(radioButtonFormData1, "V");
+    IMethod getInputExString = SdkAssert.assertMethodExist(radioButtonFormData, "getInputExString", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getInputExString, "QInputExString;");
+    IMethod getUsageOneUsualString = SdkAssert.assertMethodExist(radioButtonFormData, "getUsageOneUsualString", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getUsageOneUsualString, "QUsageOneUsualString;");
+    IMethod getUsedRadioButtonGroup = SdkAssert.assertMethodExist(radioButtonFormData, "getUsedRadioButtonGroup", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getUsedRadioButtonGroup, "QUsedRadioButtonGroup;");
+    IMethod getUsualRadioButtonGroup = SdkAssert.assertMethodExist(radioButtonFormData, "getUsualRadioButtonGroup", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getUsualRadioButtonGroup, "QUsualRadioButtonGroup;");
+    IMethod getUsualString = SdkAssert.assertMethodExist(radioButtonFormData, "getUsualString", new String[]{});
+    SdkAssert.assertMethodReturnTypeSignature(getUsualString, "QUsualString;");
+
+    SdkAssert.assertEquals("inner types count of 'RadioButtonFormData'", 5, radioButtonFormData.getTypes().length);
+    // type InputExString
+    IType inputExString = SdkAssert.assertTypeExists(radioButtonFormData, "InputExString");
+    SdkAssert.assertHasFlags(inputExString, 9);
+    SdkAssert.assertHasSuperTypeSignature(inputExString, "QInputString;");
+    SdkAssert.assertAnnotation(inputExString, "org.eclipse.scout.commons.annotations.Replace");
+
+    // fields of InputExString
+    SdkAssert.assertEquals("field count of 'InputExString'", 1, inputExString.getFields().length);
+    IField serialVersionUID1 = SdkAssert.assertFieldExist(inputExString, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID1, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID1, "J");
+
+    SdkAssert.assertEquals("method count of 'InputExString'", 1, inputExString.getMethods().length);
+    IMethod inputExString1 = SdkAssert.assertMethodExist(inputExString, "InputExString", new String[]{});
+    SdkAssert.assertTrue(inputExString1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(inputExString1, "V");
+
+    SdkAssert.assertEquals("inner types count of 'InputExString'", 0, inputExString.getTypes().length);
+    // type UsageOneUsualString
+    IType usageOneUsualString = SdkAssert.assertTypeExists(radioButtonFormData, "UsageOneUsualString");
+    SdkAssert.assertHasFlags(usageOneUsualString, 9);
+    SdkAssert.assertHasSuperTypeSignature(usageOneUsualString, "QAbstractValueFieldData<QString;>;");
+
+    // fields of UsageOneUsualString
+    SdkAssert.assertEquals("field count of 'UsageOneUsualString'", 1, usageOneUsualString.getFields().length);
+    IField serialVersionUID2 = SdkAssert.assertFieldExist(usageOneUsualString, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID2, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID2, "J");
+
+    SdkAssert.assertEquals("method count of 'UsageOneUsualString'", 2, usageOneUsualString.getMethods().length);
+    IMethod usageOneUsualString1 = SdkAssert.assertMethodExist(usageOneUsualString, "UsageOneUsualString", new String[]{});
+    SdkAssert.assertTrue(usageOneUsualString1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(usageOneUsualString1, "V");
+    IMethod initValidationRules = SdkAssert.assertMethodExist(usageOneUsualString, "initValidationRules", new String[]{"QMap<QString;QObject;>;"});
+    SdkAssert.assertMethodReturnTypeSignature(initValidationRules, "V");
+    SdkAssert.assertAnnotation(initValidationRules, "java.lang.Override");
+    SdkAssert.assertMethodValidationRules(initValidationRules, new String[]{"ruleMap.put(ValidationRule.MAX_LENGTH, 4000);"}, true);
+
+    SdkAssert.assertEquals("inner types count of 'UsageOneUsualString'", 0, usageOneUsualString.getTypes().length);
+    // type UsedRadioButtonGroup
+    IType usedRadioButtonGroup = SdkAssert.assertTypeExists(radioButtonFormData, "UsedRadioButtonGroup");
+    SdkAssert.assertHasFlags(usedRadioButtonGroup, 9);
+    SdkAssert.assertHasSuperTypeSignature(usedRadioButtonGroup, "QAbstractRadioButtonGroupWithFieldsData;");
+
+    // fields of UsedRadioButtonGroup
+    SdkAssert.assertEquals("field count of 'UsedRadioButtonGroup'", 1, usedRadioButtonGroup.getFields().length);
+    IField serialVersionUID3 = SdkAssert.assertFieldExist(usedRadioButtonGroup, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID3, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID3, "J");
+
+    SdkAssert.assertEquals("method count of 'UsedRadioButtonGroup'", 1, usedRadioButtonGroup.getMethods().length);
+    IMethod usedRadioButtonGroup1 = SdkAssert.assertMethodExist(usedRadioButtonGroup, "UsedRadioButtonGroup", new String[]{});
+    SdkAssert.assertTrue(usedRadioButtonGroup1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(usedRadioButtonGroup1, "V");
+
+    SdkAssert.assertEquals("inner types count of 'UsedRadioButtonGroup'", 0, usedRadioButtonGroup.getTypes().length);
+    // type UsualRadioButtonGroup
+    IType usualRadioButtonGroup = SdkAssert.assertTypeExists(radioButtonFormData, "UsualRadioButtonGroup");
+    SdkAssert.assertHasFlags(usualRadioButtonGroup, 9);
+    SdkAssert.assertHasSuperTypeSignature(usualRadioButtonGroup, "QAbstractValueFieldData<QString;>;");
+
+    // fields of UsualRadioButtonGroup
+    SdkAssert.assertEquals("field count of 'UsualRadioButtonGroup'", 1, usualRadioButtonGroup.getFields().length);
+    IField serialVersionUID4 = SdkAssert.assertFieldExist(usualRadioButtonGroup, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID4, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID4, "J");
+
+    SdkAssert.assertEquals("method count of 'UsualRadioButtonGroup'", 1, usualRadioButtonGroup.getMethods().length);
+    IMethod usualRadioButtonGroup1 = SdkAssert.assertMethodExist(usualRadioButtonGroup, "UsualRadioButtonGroup", new String[]{});
+    SdkAssert.assertTrue(usualRadioButtonGroup1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(usualRadioButtonGroup1, "V");
+
+    SdkAssert.assertEquals("inner types count of 'UsualRadioButtonGroup'", 0, usualRadioButtonGroup.getTypes().length);
+    // type UsualString
+    IType usualString = SdkAssert.assertTypeExists(radioButtonFormData, "UsualString");
+    SdkAssert.assertHasFlags(usualString, 9);
+    SdkAssert.assertHasSuperTypeSignature(usualString, "QAbstractValueFieldData<QString;>;");
+
+    // fields of UsualString
+    SdkAssert.assertEquals("field count of 'UsualString'", 1, usualString.getFields().length);
+    IField serialVersionUID5 = SdkAssert.assertFieldExist(usualString, "serialVersionUID");
+    SdkAssert.assertHasFlags(serialVersionUID5, 26);
+    SdkAssert.assertFieldSignature(serialVersionUID5, "J");
+
+    SdkAssert.assertEquals("method count of 'UsualString'", 2, usualString.getMethods().length);
+    IMethod usualString1 = SdkAssert.assertMethodExist(usualString, "UsualString", new String[]{});
+    SdkAssert.assertTrue(usualString1.isConstructor());
+    SdkAssert.assertMethodReturnTypeSignature(usualString1, "V");
+    IMethod initValidationRules1 = SdkAssert.assertMethodExist(usualString, "initValidationRules", new String[]{"QMap<QString;QObject;>;"});
+    SdkAssert.assertMethodReturnTypeSignature(initValidationRules1, "V");
+    SdkAssert.assertAnnotation(initValidationRules1, "java.lang.Override");
+    SdkAssert.assertMethodValidationRules(initValidationRules1, new String[]{"ruleMap.put(ValidationRule.MAX_LENGTH, 4000);"}, true);
+
+    SdkAssert.assertEquals("inner types count of 'UsualString'", 0, usualString.getTypes().length);
+  }
+}
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/formdata/CompositeFormDataTypeSourceBuilder.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/formdata/CompositeFormDataTypeSourceBuilder.java
index 620e87a..6276750 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/formdata/CompositeFormDataTypeSourceBuilder.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/formdata/CompositeFormDataTypeSourceBuilder.java
@@ -66,6 +66,8 @@
         return;
       }
 
+      boolean fieldExtendsTemplateField = false;
+
       if (Flags.isPublic(formField.getFlags())) {
         FormDataAnnotation fieldAnnotation = ScoutTypeUtility.findFormDataAnnotation(formField, declaringTypeHierarchy);
 
@@ -91,6 +93,12 @@
             // fill table bean
             fieldSourceBuilder = new TableFieldBeanFormDataSourceBuilder(formField, formDataTypeName, fieldAnnotation, monitor);
           }
+          else if (declaringTypeHierarchy.isSubtype(TypeUtility.getType(RuntimeClasses.ICompositeField), formField)
+              && !declaringTypeHierarchy.isSubtype(TypeUtility.getType(RuntimeClasses.IValueField), formField)) {
+            // field extends a field template.
+            fieldExtendsTemplateField = true;
+            fieldSourceBuilder = new CompositeFormDataTypeSourceBuilder(formField, formDataTypeName, fieldAnnotation, monitor);
+          }
           else {
             fieldSourceBuilder = new FormDataTypeSourceBuilder(formField, formDataTypeName, fieldAnnotation, monitor);
           }
@@ -107,7 +115,7 @@
           continue;
         }
 
-        if (declaringTypeHierarchy.isSubtype(TypeUtility.getType(RuntimeClasses.ICompositeField), formField)) {
+        if (declaringTypeHierarchy.isSubtype(TypeUtility.getType(RuntimeClasses.ICompositeField), formField) && !fieldExtendsTemplateField) {
           createCompositeFieldFormData(formField, declaringTypeHierarchy, monitor);
         }
       }