diff --git a/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/util/signature/SignatureUtilityTest.java b/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/util/signature/SignatureUtilityTest.java
index eccaa7d..a5ff6c5 100644
--- a/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/util/signature/SignatureUtilityTest.java
+++ b/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/util/signature/SignatureUtilityTest.java
@@ -4,10 +4,9 @@
 package org.eclipse.scout.sdk.internal.test.util.signature;
 
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
 
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.Signature;
@@ -168,27 +167,27 @@
 
   @Test
   public void testGenericResolver01() throws Exception {
-    Map<String, ITypeGenericMapping> collector = new HashMap<String, ITypeGenericMapping>();
+    LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>();
     String superTypeSignature = Signature.createTypeSignature("signature.tests.generic.AbstractClass01<" + String.class.getName() + "," + Integer.class.getName() + ">", true);
-    SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), null, superTypeSignature, null, collector);
+    SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), superTypeSignature, null, collector);
     Assert.assertEquals(Signature.createTypeSignature(String.class.getName(), true), collector.get("signature.tests.generic.IInterface01").getParameterSignature("GENERIC"));
     Assert.assertEquals(Signature.createTypeSignature(Integer.class.getName(), true), collector.get("signature.tests.generic.IInterface02").getParameterSignature("A"));
   }
 
   @Test
   public void testGenericResolver02() throws Exception {
-    Map<String, ITypeGenericMapping> collector = new HashMap<String, ITypeGenericMapping>();
+    LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>();
     String superTypeSignature = Signature.createTypeSignature("signature.tests.generic.AbstractClass02<" + Integer.class.getName() + ">", true);
-    SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), null, superTypeSignature, null, collector);
+    SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), superTypeSignature, null, collector);
     Assert.assertEquals(Signature.createTypeSignature(String.class.getName(), true), collector.get("signature.tests.generic.IInterface01").getParameterSignature("GENERIC"));
     Assert.assertEquals(Signature.createTypeSignature(List.class.getName() + "<" + Integer.class.getName() + ">", true), collector.get("signature.tests.generic.IInterface02").getParameterSignature("A"));
   }
 
   @Test
   public void testGenericResolver03() throws Exception {
-    Map<String, ITypeGenericMapping> collector = new HashMap<String, ITypeGenericMapping>();
+    LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>();
     String superTypeSignature = Signature.createTypeSignature("org.eclipse.scout.rt.client.ui.form.fields.smartfield.AbstractSmartField<" + Integer.class.getName() + ">", true);
-    SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), null, superTypeSignature, null, collector);
+    SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), superTypeSignature, null, collector);
     Assert.assertEquals(Signature.createTypeSignature(Integer.class.getName(), true), collector.get("org.eclipse.scout.rt.client.ui.form.fields.smartfield.AbstractSmartField").getParameterSignature("T"));
   }
 
diff --git a/org.eclipse.scout.sdk.testing/src/org/eclipse/scout/sdk/testing/codegen/ApiTestGenerator.java b/org.eclipse.scout.sdk.testing/src/org/eclipse/scout/sdk/testing/codegen/ApiTestGenerator.java
index 3819418..2c96a9f 100644
--- a/org.eclipse.scout.sdk.testing/src/org/eclipse/scout/sdk/testing/codegen/ApiTestGenerator.java
+++ b/org.eclipse.scout.sdk.testing/src/org/eclipse/scout/sdk/testing/codegen/ApiTestGenerator.java
@@ -40,7 +40,7 @@
 /**
  * <h3>{@link ApiTestGenerator}</h3>
  * 
- *  @author Andreas Hoegger
+ * @author Andreas Hoegger
  * @since 3.10.0 26.08.2013
  */
 public class ApiTestGenerator {
@@ -256,7 +256,7 @@
     try {
       for (IAnnotation a : annotatable.getAnnotations()) {
         String annotationSignature = SignatureUtility.getResolvedSignature(Signature.createTypeSignature(a.getElementName(), false), resolveContext);
-        source.append(sdkAssertRef).append(".assertAnnotation(").append(annotatableRef).append(", \"").append(SignatureUtility.getFullyQuallifiedName(annotationSignature)).append("\");").append(NL);
+        source.append(sdkAssertRef).append(".assertAnnotation(").append(annotatableRef).append(", \"").append(SignatureUtility.getFullyQualifiedName(annotationSignature)).append("\");").append(NL);
       }
     }
     catch (CoreException e) {
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/services/JavaElementCommentBuilderService.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/services/JavaElementCommentBuilderService.java
index 084f641..f123860 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/services/JavaElementCommentBuilderService.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/services/JavaElementCommentBuilderService.java
@@ -62,7 +62,7 @@
 /**
  * <h3>{@link JavaElementCommentBuilderService}</h3>
  * 
- *  @author Andreas Hoegger
+ * @author Andreas Hoegger
  * @since 3.10.0 12.07.2013
  */
 @SuppressWarnings("restriction")
@@ -224,9 +224,9 @@
           seeBuilder.append(interfaceFqn).append("#").append(methodSourceBuilder.getElementName()).append("(");
           Iterator<MethodParameter> parameterIterator = methodSourceBuilder.getParameters().iterator();
           if (parameterIterator.hasNext()) {
-            seeBuilder.append(SignatureUtility.getFullyQuallifiedName(parameterIterator.next().getSignature()));
+            seeBuilder.append(SignatureUtility.getFullyQualifiedName(parameterIterator.next().getSignature()));
             while (parameterIterator.hasNext()) {
-              seeBuilder.append(", ").append(SignatureUtility.getFullyQuallifiedName(parameterIterator.next().getSignature()));
+              seeBuilder.append(", ").append(SignatureUtility.getFullyQualifiedName(parameterIterator.next().getSignature()));
             }
           }
           seeBuilder.append(")");
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/ITypeGenericMapping.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/ITypeGenericMapping.java
index 40b8d8f..3963742 100644
--- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/ITypeGenericMapping.java
+++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/ITypeGenericMapping.java
@@ -13,26 +13,32 @@
 import java.util.Map;
 
 /**
- * <h3>{@link ITypeGenericMapping}</h3> ...
+ * <h3>{@link ITypeGenericMapping}</h3>
  * 
- *  @author Andreas Hoegger
+ * @author Andreas Hoegger
  * @since 3.9.0 04.04.2013
  */
 public interface ITypeGenericMapping {
 
   /**
-   * @return
+   * @return The fully qualified name of the class the generic mappings belong to.
    */
-  String getFullyQuallifiedName();
+  String getFullyQualifiedName();
 
   /**
+   * Gets the signature of the generic parameter with the given name.
+   * 
    * @param paramName
-   * @return
+   *          The name of the generic parameter (e.g. "T" or "VALUE_TYPE")
+   * @return The signature of the generic type with the given name or null if the class that belongs to this instance
+   *         does not define a generic type with the given name.
    */
   String getParameterSignature(String paramName);
 
   /**
-   * @return
+   * Gets a unmodifiable map of all generic types with their corresponding signature.
+   * 
+   * @return The generic type to signature mapping.
    */
   Map<String, String> getParameters();
 
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/SignatureUtility.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/SignatureUtility.java
index 085d034..038f140 100644
--- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/SignatureUtility.java
+++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/SignatureUtility.java
@@ -3,6 +3,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
@@ -26,11 +27,11 @@
 
 public final class SignatureUtility {
 
-  private final static Pattern QUALIFIED_SIG_REGEX = Pattern.compile("^([\\+\\[]*)([^\\<\\(\\;]*)(.*)$");
-  private final static Pattern SIG_REPLACEMENT_REGEX = Pattern.compile("[\\.\\$]{1}");
-  public final static Pattern DOLLAR_REPLACEMENT_REGEX = Pattern.compile("\\$");
-  private final static Pattern PARAM_SIG_REPLACEMENT_REGEX = Pattern.compile("^([^\\:]*)\\:(.*)$");
-  private final static Pattern SIG_END = Pattern.compile("(^.*)\\;$");
+  private static final Pattern QUALIFIED_SIG_REGEX = Pattern.compile("^([\\+\\[]*)([^\\<\\(\\;]*)(.*)$");
+  private static final Pattern SIG_REPLACEMENT_REGEX = Pattern.compile("[\\.\\$]{1}");
+  private static final Pattern PARAM_SIG_REPLACEMENT_REGEX = Pattern.compile("^([^\\:]*)\\:(.*)$");
+  private static final Pattern SIG_END = Pattern.compile("(^.*)\\;$");
+  public static final Pattern DOLLAR_REPLACEMENT_REGEX = Pattern.compile("\\$");
 
   /**
    * Character constant indicating an arbitrary array type in a signature.
@@ -49,6 +50,36 @@
   private SignatureUtility() {
   }
 
+  public static String unboxPrimitiveSignature(String signature) {
+    if (Signature.getTypeSignatureKind(signature) == Signature.BASE_TYPE_SIGNATURE) {
+      if (Signature.SIG_BOOLEAN.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Boolean.class.getName());
+      }
+      else if (Signature.SIG_BYTE.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Byte.class.getName());
+      }
+      else if (Signature.SIG_CHAR.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Character.class.getName());
+      }
+      else if (Signature.SIG_DOUBLE.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Double.class.getName());
+      }
+      else if (Signature.SIG_FLOAT.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Float.class.getName());
+      }
+      else if (Signature.SIG_INT.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Integer.class.getName());
+      }
+      else if (Signature.SIG_LONG.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Long.class.getName());
+      }
+      else if (Signature.SIG_SHORT.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Short.class.getName());
+      }
+    }
+    return signature;
+  }
+
   /**
    * To get the signature kind of the given signature. If a signature starts with '|' it is a arbitrary array signature
    * otherwise see {@link Signature#getTypeSignatureKind(String)}.
@@ -66,8 +97,6 @@
       return ARBITRARY_ARRAY_SIGNATURE;
     }
     else {
-      //private final static Pattern SIMPLE_NAME_REGEX = Pattern.compile("^[\\[]*([^\\<]*).*(\\;)$");
-      // signature = SIMPLE_NAME_REGEX.matcher(signature).replaceAll("$1$2");
       return Signature.getTypeSignatureKind(signature);
     }
   }
@@ -105,7 +134,7 @@
   public static String getResolvedSignature(String signature, IType signatureOwner, IType contextType) throws CoreException {
     Map<String, String> genericParameters = null;
     if (TypeUtility.exists(contextType) && TypeUtility.exists(signatureOwner)) {
-      Map<String, ITypeGenericMapping> collector = new HashMap<String, ITypeGenericMapping>();
+      LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>();
       resolveGenericParametersInSuperHierarchy(contextType, new String[0], contextType.newSupertypeHierarchy(new NullProgressMonitor()), collector);
       ITypeGenericMapping mapping = collector.get(signatureOwner.getFullyQualifiedName());
       if (mapping != null) {
@@ -134,7 +163,7 @@
    * To get the simple type reference name within a context represented by the given importValidator. Every fully
    * qualified type name will be passed to the importValidator to decide if the import is already in use.
    * 
-   * @param fullyQuallifiedTypeName
+   * @param fullyQualifiedTypeName
    *          e.g. java.lang.String (not a signature).
    * @param importValidator
    *          to evaluate all fully qualified names for create an import and use simple names.
@@ -150,14 +179,6 @@
    * @throws CoreException
    * @see {@link ScoutSignature#getTypeReference(String, IType, IType, IImportValidator)}
    */
-  public static String getTypeReference(String signature) throws CoreException {
-    return getTypeReference(signature, null, null, new FullyQuallifiedValidator());
-  }
-
-  /**
-   * @throws CoreException
-   * @see {@link ScoutSignature#getTypeReference(String, IType, IType, IImportValidator)}
-   */
   public static String getTypeReference(String signature, IImportValidator importValidator) throws CoreException {
     return getTypeReference(signature, null, null, importValidator);
   }
@@ -172,9 +193,9 @@
 
   /**
    * <h4>Examples</h4> <xmp>
-   * getTypeReferenceImpl("Ljava.lang.String;", typeA, typeA, fullyQuallifiedImpValidator)
+   * getTypeReferenceImpl("Ljava.lang.String;", typeA, typeA, fullyQualifiedImpValidator)
    * -> java.lang.String
-   * getTypeReferenceImpl("QList<?QString>;", typeA, typeA, fullyQuallifiedImpValidator)
+   * getTypeReferenceImpl("QList<?QString>;", typeA, typeA, fullyQualifiedImpValidator)
    * -> java.util.List<? extends java.lang.String>
    * </xmp>
    * 
@@ -190,7 +211,7 @@
    *          an import validator to decide simple name vs. fully qualified name.
    * @return the type reference
    * @throws CoreException
-   * @see {@link FullyQuallifiedValidator}, {@link IImportValidator}, {@link SimpleImportValidator}
+   * @see {@link FullyQualifiedValidator}, {@link IImportValidator}, {@link SimpleImportValidator}
    */
   private static String getTypeReference(String signature, IType signatureOwner, IType contextType, IImportValidator validator) throws CoreException {
     StringBuilder sigBuilder = new StringBuilder();
@@ -291,7 +312,7 @@
    * @throws CoreException
    */
   public static String[] getMethodParameterSignatureResolved(IMethod jdtMethod, IType contextType) throws CoreException {
-    Map<String, ITypeGenericMapping> genericMapperCollector = new HashMap<String, ITypeGenericMapping>();
+    LinkedHashMap<String, ITypeGenericMapping> genericMapperCollector = new LinkedHashMap<String, ITypeGenericMapping>();
     resolveGenericParametersInSuperHierarchy(contextType, new String[0], contextType.newSupertypeHierarchy(new NullProgressMonitor()), genericMapperCollector);
     ITypeGenericMapping mapping = genericMapperCollector.get(jdtMethod.getDeclaringType().getFullyQualifiedName());
     Map<String, String> parameters = null;
@@ -359,12 +380,11 @@
     return returnTypeSignature;
   }
 
-  public static String ensureSourceTypeParametersAreCorrect(String signature, IType signatureOwner) throws JavaModelException {
+  private static String ensureSourceTypeParametersAreCorrect(String signature, IType signatureOwner) throws JavaModelException {
     if (!TypeUtility.exists(signatureOwner) || signatureOwner.isBinary()) {
       return signature;
     }
     else {
-
       ITypeParameter[] typeParameters = signatureOwner.getTypeParameters();
       if (typeParameters != null && typeParameters.length > 0) {
         for (ITypeParameter tp : typeParameters) {
@@ -382,38 +402,14 @@
    * 'methodname(param1Signature,param2Signature)'.
    * 
    * @param method
-   * @return an unique method identifier of the given method
-   * @throws CoreException
-   */
-  public static String getMethodIdentifier(IMethod method) throws CoreException {
-    StringBuilder methodIdBuilder = new StringBuilder(method.getElementName());
-    methodIdBuilder.append("(");
-    String[] resolvedParamSignatures = getMethodParameterSignatureResolved(method);
-    for (int i = 0; i < resolvedParamSignatures.length; i++) {
-      methodIdBuilder.append(resolvedParamSignatures[i]);
-      if (i + 1 < resolvedParamSignatures.length) {
-        methodIdBuilder.append(",");
-      }
-    }
-    methodIdBuilder.append(")");
-    return methodIdBuilder.toString();
-  }
-
-  /**
-   * returns a unique identifier of a scout method. The identifier looks like
-   * 'methodname(param1Signature,param2Signature)'.
-   * 
-   * @param method
-   * @param contextType
-   *          the type in what context the method appears, used for generic bindings.
    * @return
    * @throws CoreException
    */
-  public static String getMethodIdentifier(IMethod method, IType contextType) throws CoreException {
+  public static String getMethodIdentifier(IMethod method) throws CoreException {
     StringBuilder methodIdBuilder = new StringBuilder();
     methodIdBuilder.append(method.getElementName());
     methodIdBuilder.append("(");
-    String[] resolvedParamSignatures = getMethodParameterSignatureResolved(method, contextType);
+    String[] resolvedParamSignatures = getMethodParameterSignatureResolved(method, method.getDeclaringType());
     for (int i = 0; i < resolvedParamSignatures.length; i++) {
       methodIdBuilder.append(resolvedParamSignatures[i]);
       if (i + 1 < resolvedParamSignatures.length) {
@@ -467,7 +463,6 @@
       String[] superClassParameterSignatures = Signature.getTypeArguments(superClassSignature);
       if (superClassParameterSignatures.length < parameterIndex + 1) {
         return SignatureCache.createTypeSignature(Object.class.getName());
-        // throw new IllegalArgumentException("Lost parameter '" + typeParameterSignature + "' in hierarchy at '" + hType.getFullyQualifiedName() + "'.");
       }
       else {
         // translate
@@ -478,7 +473,13 @@
     return typeParameterSignature;
   }
 
-  public static String getFullyQuallifiedName(String signature) {
+  /**
+   * Gets the fully qualified name of the given signature.
+   * 
+   * @param signature
+   * @return The fully qualified name of the given signature.
+   */
+  public static String getFullyQualifiedName(String signature) {
     signature = Signature.getTypeErasure(signature);
     int arrayCount = Signature.getArrayCount(signature);
     if (arrayCount > 0) {
@@ -488,6 +489,13 @@
     return fqn;
   }
 
+  /**
+   * Checks if the given signature contains type arguments.
+   * 
+   * @param sig
+   *          The signature to check
+   * @return true if the given signature has type arguments, false otherwise.
+   */
   public static boolean isGenericSignature(String sig) {
     String[] params = Signature.getTypeArguments(sig);
     return params != null && params.length > 0;
@@ -504,7 +512,7 @@
         String simpleSignature = m.group(2);
         String postfix = m.group(3);
         if (startsWith(simpleSignature, Signature.C_UNRESOLVED)) {
-          String simpleName = Signature.getSignatureSimpleName(simpleSignature + ";");
+          String simpleName = Signature.getSignatureSimpleName(simpleSignature + Signature.C_SEMICOLON);
           String referencedTypeSignature = getReferencedTypeSignature(jdtType, simpleName, false);
           if (referencedTypeSignature != null) {
             simpleSignature = SIG_END.matcher(referencedTypeSignature).replaceAll("$1");
@@ -524,7 +532,11 @@
     }
   }
 
-  public static void resolveGenericParametersInSuperHierarchy(String signature, String[] parameterSignatures, String superTypeSignature, String[] interfaceSignatures, Map<String/*fullyQuallifiedName*/, ITypeGenericMapping> collector) throws CoreException {
+  public static void resolveGenericParametersInSuperHierarchy(String signature, String superTypeSignature, String[] interfaceSignatures, LinkedHashMap<String/*fullyQualifiedName*/, ITypeGenericMapping> collector) throws CoreException {
+    resolveGenericParametersInSuperHierarchy(signature, new String[0], superTypeSignature, interfaceSignatures, collector);
+  }
+
+  private static void resolveGenericParametersInSuperHierarchy(String signature, String[] parameterSignatures, String superTypeSignature, String[] interfaceSignatures, LinkedHashMap<String/*fullyQualifiedName*/, ITypeGenericMapping> collector) throws CoreException {
     TypeGenericMapping typeDesc = new TypeGenericMapping(Signature.getSignatureQualifier(signature) + "." + Signature.getSignatureSimpleName(signature));
     String[] localParameterSignatures = Signature.getTypeParameters(signature);
     if (localParameterSignatures.length > 0) {
@@ -532,7 +544,7 @@
         typeDesc.addParameter(Signature.getSignatureSimpleName(localParameterSignatures[i]), parameterSignatures[i]);
       }
     }
-    collector.put(typeDesc.getFullyQuallifiedName(), typeDesc);
+    collector.put(typeDesc.getFullyQualifiedName(), typeDesc);
 
     // super type
     if (superTypeSignature != null) {
@@ -568,24 +580,51 @@
         }
       }
     }
-
   }
 
-  public static void resolveGenericParametersInSuperHierarchy(IType type, String[] parameterSignatures, ITypeHierarchy hierarchy, Map<String/*fullyQuallifiedName*/, ITypeGenericMapping> collector) throws CoreException {
+  public static String resolveGenericParameterInSuperHierarchy(IType startType, ITypeHierarchy superHierarchy, String genericDefiningSuperTypeFqn, String paramName) throws CoreException {
+    LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>();
+    resolveGenericParametersInSuperHierarchy(startType, new String[]{}, superHierarchy, collector);
+    ITypeGenericMapping genericMapping = collector.get(genericDefiningSuperTypeFqn);
+    if (genericMapping != null) {
+      return genericMapping.getParameterSignature(paramName);
+    }
+    return null;
+  }
+
+  public static void resolveGenericParametersInSuperHierarchy(IType type, ITypeHierarchy hierarchy, LinkedHashMap<String/*fullyQualifiedName*/, ITypeGenericMapping> collector) throws CoreException {
+    resolveGenericParametersInSuperHierarchy(type, new String[]{}, hierarchy, collector);
+  }
+
+  private static void resolveGenericParametersInSuperHierarchy(IType type, String[] parameterSignatures, ITypeHierarchy hierarchy, LinkedHashMap<String/*fullyQualifiedName*/, ITypeGenericMapping> collector) throws CoreException {
     if (!TypeUtility.exists(type)) {
       return;
     }
     TypeGenericMapping typeDesc = new TypeGenericMapping(type.getFullyQualifiedName());
     ITypeParameter[] typeParameters = type.getTypeParameters();
+    HashMap<String, String> paramsUnresolved = new HashMap<String, String>(typeParameters.length);
+    for (ITypeParameter par : typeParameters) {
+      String[] boundsSignatures = par.getBoundsSignatures();
+      if (boundsSignatures != null && boundsSignatures.length > 0) {
+        paramsUnresolved.put(par.getElementName(), par.getBoundsSignatures()[0]);
+      }
+    }
+
     for (int i = 0; i < typeParameters.length; i++) {
       if (parameterSignatures.length > i) {
         typeDesc.addParameter(typeParameters[i].getElementName(), parameterSignatures[i]);
       }
       else {
-        typeDesc.addParameter(typeParameters[i].getElementName(), SignatureCache.createTypeSignature(Object.class.getName()));
+        String[] boundsSignatures = typeParameters[i].getBoundsSignatures();
+        if (boundsSignatures != null && boundsSignatures.length > 0) {
+          typeDesc.addParameter(typeParameters[i].getElementName(), getResolvedSignature(type, paramsUnresolved, boundsSignatures[0]));
+        }
+        else {
+          typeDesc.addParameter(typeParameters[i].getElementName(), SignatureCache.createTypeSignature(Object.class.getName()));
+        }
       }
     }
-    collector.put(typeDesc.getFullyQuallifiedName(), typeDesc);
+    collector.put(typeDesc.getFullyQualifiedName(), typeDesc);
     // super class
     if (!Flags.isInterface(type.getFlags())) {
       String superclassTypeSignature = type.getSuperclassTypeSignature();
@@ -653,10 +692,16 @@
       case Signature.TYPE_VARIABLE_SIGNATURE:
         // try to resolve type
         String sig = parameterSignatures.get(Signature.getSignatureSimpleName(unresolvedSignature));
+        if (startsWith(sig, Signature.C_UNRESOLVED) && TypeUtility.exists(contextType)) {
+          String simpleName = Signature.getSignatureSimpleName(sig);
+          String referencedTypeSignature = getReferencedTypeSignature(contextType, simpleName, false);
+          if (referencedTypeSignature != null) {
+            sig = referencedTypeSignature;
+          }
+        }
         sigBuilder.append(sig);
         break;
       case Signature.CLASS_TYPE_SIGNATURE:
-
         String[] typeArguments = Signature.getTypeArguments(unresolvedSignature);
         unresolvedSignature = Signature.getTypeErasure(unresolvedSignature);
         unresolvedSignature = SIG_REPLACEMENT_REGEX.matcher(unresolvedSignature).replaceAll(".");
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/internal/TypeGenericMapping.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/internal/TypeGenericMapping.java
index cb806dd..6fa9aff 100644
--- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/internal/TypeGenericMapping.java
+++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/internal/TypeGenericMapping.java
@@ -11,7 +11,8 @@
 package org.eclipse.scout.sdk.util.signature.internal;
 
 import java.util.Collections;
-import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -20,22 +21,22 @@
 /**
  * <h3>{@link TypeGenericMapping}</h3> ...
  * 
- *  @author Andreas Hoegger
+ * @author Andreas Hoegger
  * @since 3.9.0 20.03.2013
  */
 public class TypeGenericMapping implements ITypeGenericMapping {
 
-  private final String m_fullyQuallifiedName;
-  private Map<String /*parameter name*/, String /*param signature*/> m_parameters;
+  private final String m_fullyQualifiedName;
+  private final Map<String /*parameter name*/, String /*param signature*/> m_parameters;
 
   public TypeGenericMapping(String fullyQualliefiedName) {
-    m_fullyQuallifiedName = fullyQualliefiedName;
-    m_parameters = new HashMap<String, String>();
+    m_fullyQualifiedName = fullyQualliefiedName;
+    m_parameters = new LinkedHashMap<String, String>();
   }
 
   @Override
-  public String getFullyQuallifiedName() {
-    return m_fullyQuallifiedName;
+  public String getFullyQualifiedName() {
+    return m_fullyQualifiedName;
   }
 
   public void addParameter(String name, String signature) {
@@ -54,10 +55,18 @@
 
   @Override
   public String toString() {
-    StringBuilder builder = new StringBuilder(getFullyQuallifiedName());
-    for (Entry<String, String> e : m_parameters.entrySet()) {
-      builder.append("\n  ").append(e.getKey()).append(" -> ").append(e.getValue());
+    StringBuilder builder = new StringBuilder(getFullyQualifiedName());
+    builder.append('{');
+    if (!m_parameters.isEmpty()) {
+      Iterator<Entry<String, String>> iterator = m_parameters.entrySet().iterator();
+      Entry<String, String> e = iterator.next();
+      builder.append(e.getKey()).append(" -> ").append(e.getValue());
+      while (iterator.hasNext()) {
+        e = iterator.next();
+        builder.append(" | ").append(e.getKey()).append(" -> ").append(e.getValue());
+      }
     }
+    builder.append('}');
     return builder.toString();
   }
 }
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeUtility.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeUtility.java
index d00be11..4088fc8 100644
--- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeUtility.java
+++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeUtility.java
@@ -246,7 +246,7 @@
     if (signature == null) {
       return null;
     }
-    return getType(SignatureUtility.getFullyQuallifiedName(signature));
+    return getType(SignatureUtility.getFullyQualifiedName(signature));
   }
 
   /**
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/AbstractTableSourceBuilder.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/AbstractTableSourceBuilder.java
index 8642644..1151acb 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/AbstractTableSourceBuilder.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/AbstractTableSourceBuilder.java
@@ -14,6 +14,7 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.Signature;
+import org.eclipse.scout.sdk.extensions.runtime.classes.IRuntimeClasses;
 import org.eclipse.scout.sdk.util.signature.SignatureUtility;
 import org.eclipse.scout.sdk.util.type.TypeUtility;
 import org.eclipse.scout.sdk.util.typecache.ITypeHierarchy;
@@ -36,9 +37,17 @@
   }
 
   protected String getColumnSignature(IType type, ITypeHierarchy columnHierarchy) throws IllegalArgumentException, CoreException {
-    if (type == null || Object.class.getName().equals(type.getFullyQualifiedName())) {
+    if (!TypeUtility.exists(type) || Object.class.getName().equals(type.getFullyQualifiedName())) {
       return null;
     }
+
+    // try IColumn first
+    String sig = SignatureUtility.resolveGenericParameterInSuperHierarchy(type, columnHierarchy.getJdtHierarchy(), IRuntimeClasses.IColumn, "T");
+    if (sig != null) {
+      return sig;
+    }
+
+    // try other models
     IType superType = columnHierarchy.getSuperclass(type);
     if (TypeUtility.exists(superType)) {
       if (TypeUtility.isGenericType(superType)) {
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/WizardStepNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/WizardStepNewOperation.java
index 5f74cab..9ceccab 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/WizardStepNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/WizardStepNewOperation.java
@@ -99,7 +99,7 @@
     }
     // form
     if (getForm() != null) {
-      String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature());
+      String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature());
       if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractWizardStep)) {
         // update generic in supertype signature
         StringBuilder superTypeSigBuilder = new StringBuilder(superTypeFqn);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/CalendarFieldNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/CalendarFieldNewOperation.java
index 4e90048..64a6193 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/CalendarFieldNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/CalendarFieldNewOperation.java
@@ -84,7 +84,7 @@
       nlsMethodBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(getNlsEntry()));
       newOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(nlsMethodBuilder), nlsMethodBuilder);
     }
-    String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature());
+    String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature());
     if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractCalendarField)) {
       // create inner type calendar
       ITypeSourceBuilder calendarBuilder = new TypeSourceBuilder(SdkProperties.TYPE_NAME_CALENDARFIELD_CALENDAR);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/PlannerFieldNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/PlannerFieldNewOperation.java
index 1dc22b3..87008bf 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/PlannerFieldNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/PlannerFieldNewOperation.java
@@ -74,7 +74,7 @@
     FormFieldNewOperation newOp = new FormFieldNewOperation(getTypeName(), getDeclaringType());
     newOp.setSibling(getSibling());
     newOp.setSuperTypeSignature(getSuperTypeSignature());
-    String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature());
+    String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature());
     if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractPlannerField)) {
       // super type sig
       StringBuilder superTypeSigBuilder = new StringBuilder(superTypeFqn);
@@ -134,7 +134,7 @@
     ITypeSourceBuilder activityMapBuilder = new TypeSourceBuilder(SdkProperties.TYPE_NAME_PLANNERFIELD_ACTIVITYMAP);
     activityMapBuilder.setFlags(Flags.AccPublic);
     String activityMapSuperTypeSig = RuntimeClasses.getSuperTypeSignature(RuntimeClasses.IActivityMap, getDeclaringType().getJavaProject());
-    String superTypeFqn = SignatureUtility.getFullyQuallifiedName(activityMapSuperTypeSig);
+    String superTypeFqn = SignatureUtility.getFullyQualifiedName(activityMapSuperTypeSig);
     if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractActivityMap) ||
         CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractExtensibleActivityMap)) {
       // super type sig
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeBoxNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeBoxNewOperation.java
index 197c8c7..882fd7c 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeBoxNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeBoxNewOperation.java
@@ -81,7 +81,7 @@
       nlsMethodBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(getNlsEntry()));
       newOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(nlsMethodBuilder), nlsMethodBuilder);
     }
-    String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature());
+    String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature());
     if (CompareUtility.equals(superTypeFqn, IRuntimeClasses.AbstractTreeBox)) {
       // create inner type calendar
       ITypeSourceBuilder treeBuilder = new TypeSourceBuilder(SdkProperties.TYPE_NAME_TREEBOX_TREE);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeFieldNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeFieldNewOperation.java
index 87f8366..a71cd7c 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeFieldNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeFieldNewOperation.java
@@ -84,7 +84,7 @@
       nlsMethodBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(getNlsEntry()));
       newOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(nlsMethodBuilder), nlsMethodBuilder);
     }
-    String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature());
+    String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature());
     if (CompareUtility.equals(superTypeFqn, IRuntimeClasses.AbstractTreeField)) {
       // create inner type calendar
       ITypeSourceBuilder treeBuilder = new TypeSourceBuilder(SdkProperties.TYPE_NAME_TREEBOX_TREE);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/table/TableFieldNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/table/TableFieldNewOperation.java
index 0f8dd9c..78cd566 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/table/TableFieldNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/table/TableFieldNewOperation.java
@@ -85,7 +85,7 @@
       nlsMethodBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(getNlsEntry()));
       newOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(nlsMethodBuilder), nlsMethodBuilder);
     }
-    String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature());
+    String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature());
     // TODO aho check generic type table!!!
     if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractTableField)) {
       // create inner type table
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/page/PageNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/page/PageNewOperation.java
index 03289ac..2f65525 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/page/PageNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/page/PageNewOperation.java
@@ -84,7 +84,7 @@
 
   @Override
   public void run(IProgressMonitor monitor, IWorkingCopyManager workingCopyManager) throws CoreException, IllegalArgumentException {
-    String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature());
+    String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature());
 
     PrimaryTypeNewOperation newOp = new PrimaryTypeNewOperation(getTypeName(), getPackageNamePage(), getPageJavaProject());
     newOp.setIcuCommentSourceBuilder(CommentSourceBuilderFactory.createPreferencesCompilationUnitCommentBuilder());
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/sourcebuilder/method/MethodSourceBuilderFactory.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/sourcebuilder/method/MethodSourceBuilderFactory.java
index c48ac2c..376253a 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/sourcebuilder/method/MethodSourceBuilderFactory.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/sourcebuilder/method/MethodSourceBuilderFactory.java
@@ -10,7 +10,7 @@
  ******************************************************************************/
 package org.eclipse.scout.sdk.sourcebuilder.method;
 
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -39,7 +39,7 @@
 /**
  * <h3>{@link MethodSourceBuilderFactory}</h3> ...
  * 
- *  @author Andreas Hoegger
+ * @author Andreas Hoegger
  * @since 3.10.0 07.03.2013
  */
 public final class MethodSourceBuilderFactory {
@@ -144,8 +144,8 @@
       return null;
     }
     else {
-      Map<String, ITypeGenericMapping> genericMapping = new HashMap<String, ITypeGenericMapping>();
-      SignatureUtility.resolveGenericParametersInSuperHierarchy(SignatureCache.createTypeSignature(typeSourceBuilder.getElementName()), new String[0],
+      LinkedHashMap<String, ITypeGenericMapping> genericMapping = new LinkedHashMap<String, ITypeGenericMapping>();
+      SignatureUtility.resolveGenericParametersInSuperHierarchy(SignatureCache.createTypeSignature(typeSourceBuilder.getElementName()),
           typeSourceBuilder.getSuperTypeSignature(), typeSourceBuilder.getInterfaceSignatures().toArray(new String[typeSourceBuilder.getInterfaceSignatures().size()]), genericMapping);
 
       MethodSourceBuilder builder = new MethodSourceBuilder(methodName);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/ScoutTypeUtility.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/ScoutTypeUtility.java
index 20b87b7..2ae6996 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/ScoutTypeUtility.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/ScoutTypeUtility.java
@@ -976,9 +976,17 @@
   }
 
   public static String computeFormFieldGenericType(IType type, ITypeHierarchy formFieldHierarchy) throws CoreException {
-    if (type == null || type.getFullyQualifiedName().equals(Object.class.getName())) {
+    if (!TypeUtility.exists(type) || type.getFullyQualifiedName().equals(Object.class.getName())) {
       return null;
     }
+
+    // try value fields
+    String sig = SignatureUtility.resolveGenericParameterInSuperHierarchy(type, formFieldHierarchy.getJdtHierarchy(), IRuntimeClasses.IValueField, "T");
+    if (sig != null) {
+      return sig;
+    }
+
+    // for own models
     IType superType = formFieldHierarchy.getSuperclass(type);
     if (TypeUtility.exists(superType)) {
       if (TypeUtility.isGenericType(superType)) {
@@ -1010,7 +1018,7 @@
           replacement = Matcher.quoteReplacement(replacement.substring(0, replacement.length() - 1));
           signature = signature.replaceAll("[T,L,Q]" + signatureMapping.get(i).getSuperTypeGenericParameterName(), replacement);
         }
-        return SignatureUtility.getResolvedSignature(signature, type);
+        return SignatureUtility.getResolvedSignature(signature, type, type);
       }
       else {
         return computeFormFieldGenericType(superType, formFieldHierarchy);
