ASSIGNED - bug 420195: Proposal support in Java editor 
https://bugs.eclipse.org/bugs/show_bug.cgi?id=420195

Code Content Assist.
diff --git a/org.eclipse.scout.sdk.ui/plugin.xml b/org.eclipse.scout.sdk.ui/plugin.xml
index 6e167be..10d286e 100644
--- a/org.eclipse.scout.sdk.ui/plugin.xml
+++ b/org.eclipse.scout.sdk.ui/plugin.xml
@@ -687,6 +687,27 @@
       </proposalCategory>
    </extension>
    <extension
+         id="org.eclipse.scout.sdk.ui.formfield"
+         name="Scout form field proposals"
+         point="org.eclipse.jdt.ui.javaCompletionProposalComputer">
+      <javaCompletionProposalComputer
+            activate="true"
+            categoryId="org.eclipse.scout.sdk.ui.proposalCategory"
+            class="org.eclipse.scout.sdk.ui.internal.extensions.codecompletion.ScoutSdkProposalComputer">
+         <partition
+               type="__dftl_partition_content_type">
+         </partition>
+      </javaCompletionProposalComputer>
+   </extension>
+   <extension
+         id="org.eclipse.scout.sdk.ui.proposalCategory"
+         name="Scout Items"
+         point="org.eclipse.jdt.ui.javaCompletionProposalComputer">
+      <proposalCategory
+            icon="resources/icons/eclipse_scout.gif">
+      </proposalCategory>
+   </extension>
+   <extension
          id="product"
          point="org.eclipse.core.runtime.products">
       <product
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/AbstractSdkProposal.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/AbstractSdkProposal.java
new file mode 100644
index 0000000..32ad937
--- /dev/null
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/AbstractSdkProposal.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * 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.ui.internal.extensions.codecompletion;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.ISourceRange;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension2;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension3;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension4;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.scout.sdk.util.type.ITypeFilter;
+import org.eclipse.scout.sdk.util.type.TypeComparators;
+import org.eclipse.scout.sdk.util.type.TypeUtility;
+import org.eclipse.swt.graphics.Point;
+
+/**
+ * <h3>{@link AbstractSdkProposal}</h3>
+ * 
+ * @author aho
+ * @since 3.10.0 25.10.2013
+ */
+public abstract class AbstractSdkProposal implements IJavaCompletionProposal, ICompletionProposalExtension, ICompletionProposalExtension2, ICompletionProposalExtension3, ICompletionProposalExtension4 {
+
+  @Override
+  public int getRelevance() {
+    return 0;
+  }
+
+  @Override
+  public void apply(IDocument document) {
+  }
+
+  @Override
+  public void apply(IDocument document, char trigger, int offset) {
+  }
+
+  @Override
+  public String getAdditionalProposalInfo() {
+    return null;
+  }
+
+  @Override
+  public IContextInformation getContextInformation() {
+    return null;
+  }
+
+  @Override
+  public int getContextInformationPosition() {
+    return 0;
+  }
+
+  @Override
+  public IInformationControlCreator getInformationControlCreator() {
+    return null;
+  }
+
+  @Override
+  public int getPrefixCompletionStart(IDocument document, int completionOffset) {
+    return 0;
+  }
+
+  @Override
+  public CharSequence getPrefixCompletionText(IDocument document, int completionOffset) {
+    return null;
+  }
+
+  @Override
+  public Point getSelection(IDocument document) {
+    return null;
+  }
+
+  @Override
+  public boolean isValidFor(IDocument document, int offset) {
+    return false;
+  }
+
+  @Override
+  public char[] getTriggerCharacters() {
+    return null;
+  }
+
+  @Override
+  public boolean isAutoInsertable() {
+    return false;
+  }
+
+  @Override
+  public void unselected(ITextViewer viewer) {
+  }
+
+  protected Point findTriggerWordRange(IDocument document, int offset) throws BadLocationException {
+    IRegion lineRange = document.getLineInformationOfOffset(offset);
+    // find start
+    int startOffest = -1;
+    int index = offset - 1;
+
+    while (index > 0 && index > lineRange.getOffset() && isValidChar(document.getChar(index))) {
+      index--;
+    }
+    startOffest = index;
+
+    // find end
+    int endOffset = -1;
+    index = offset;
+    while ((document.getLength() > index && index < (lineRange.getOffset() + lineRange.getLength())) && isValidChar(document.getChar(index))) {
+      index++;
+    }
+    endOffset = index;
+    if (startOffest > -1 && endOffset > -1 && startOffest <= endOffset) {
+      return new Point(startOffest, endOffset);
+    }
+    return null;
+  }
+
+  /**
+   * @param declaringType
+   * @param offset
+   * @param subtypeFilter
+   * @return
+   * @throws JavaModelException
+   */
+  protected IJavaElement findSibling(IType declaringType, int offset, ITypeFilter subtypeFilter) throws JavaModelException {
+    IType[] innerTypes = TypeUtility.getInnerTypes(declaringType, subtypeFilter, TypeComparators.getSourceRangeComparator());
+    IType sibling = null;
+    for (IType t : innerTypes) {
+      ISourceRange sourceRange = t.getSourceRange();
+      if (sourceRange.getOffset() > offset) {
+        sibling = t;
+        break;
+      }
+    }
+
+    return sibling;
+  }
+
+  private boolean isValidChar(char c) {
+    // 0-9
+    if (c >= 48 && c <= 57) {
+      return true;
+    }
+    // A-Z
+    if (c >= 65 && c <= 90) {
+      return true;
+    }
+    // a-z
+    if (c >= 97 && c <= 122) {
+      return true;
+    }
+    // special characters
+    switch (c) {
+      case '-':
+      case '_':
+        return true;
+    }
+    return false;
+  }
+}
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/CodeNewProposal.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/CodeNewProposal.java
new file mode 100644
index 0000000..607193f
--- /dev/null
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/CodeNewProposal.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * 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.ui.internal.extensions.codecompletion;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.scout.sdk.Texts;
+import org.eclipse.scout.sdk.extensions.runtime.classes.IRuntimeClasses;
+import org.eclipse.scout.sdk.ui.fields.proposal.SiblingProposal;
+import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.internal.SdkIcons;
+import org.eclipse.scout.sdk.ui.operation.sourceedit.SourceEditOperation;
+import org.eclipse.scout.sdk.ui.wizard.IWorkspaceWizard;
+import org.eclipse.scout.sdk.ui.wizard.ScoutWizardDialog;
+import org.eclipse.scout.sdk.ui.wizard.code.CodeNewWizard;
+import org.eclipse.scout.sdk.util.type.TypeFilters;
+import org.eclipse.scout.sdk.util.type.TypeUtility;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.text.edits.ReplaceEdit;
+
+/**
+ * <h3>{@link CodeNewProposal}</h3>
+ * 
+ * @author aho
+ * @since 3.10.0 25.10.2013
+ */
+public class CodeNewProposal extends AbstractSdkProposal {
+
+  private IType m_declaringType;
+
+  CodeNewProposal(IType declaringType) {
+    m_declaringType = declaringType;
+  }
+
+  public IType getDeclaringType() {
+    return m_declaringType;
+  }
+
+  @Override
+  public String getDisplayString() {
+    return Texts.get("Action_newTypeX", "Code");
+  }
+
+  @Override
+  public Image getImage() {
+    return ScoutSdkUi.getImage(SdkIcons.CodeAdd);
+  }
+
+  @Override
+  public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) {
+    CodeNewWizard wizard = new CodeNewWizard();
+
+    String codeName = null;
+    try {
+      IDocument document = viewer.getDocument();
+      Point wordRange = findTriggerWordRange(document, offset);
+      if (wordRange != null) {
+        codeName = document.get(wordRange.x, wordRange.y - wordRange.x);
+        // remove proposal text
+        SourceEditOperation removeProposalTextOp = new SourceEditOperation(new ReplaceEdit(wordRange.x, wordRange.y - wordRange.x, ""), viewer.getDocument(), ScoutSdkUi.getDisplay());
+        wizard.addAdditionalPerformFinishOperation(removeProposalTextOp, IWorkspaceWizard.ORDER_BEFORE_WIZARD);
+      }
+    }
+    catch (BadLocationException e) {
+      ScoutSdkUi.logWarning(e);
+    }
+
+    wizard.initWizard(getDeclaringType());
+    if (codeName != null) {
+      wizard.getCodeNewWizardPage().setTypeName(codeName.trim());
+    }
+    // sibling check
+    try {
+      IJavaElement sibling = findSibling(getDeclaringType(), offset, TypeFilters.getSubtypeFilter(TypeUtility.getType(IRuntimeClasses.ICode), TypeUtility.getLocalTypeHierarchy(getDeclaringType())));
+      if (sibling != null) {
+        wizard.getCodeNewWizardPage().setSibling(new SiblingProposal(sibling));
+      }
+    }
+    catch (JavaModelException e) {
+      ScoutSdkUi.logWarning("could not find sibling.", e);
+    }
+
+    ScoutWizardDialog wizardDialog = new ScoutWizardDialog(wizard);
+    wizardDialog.open();
+  }
+
+  @Override
+  public void selected(ITextViewer viewer, boolean smartToggle) {
+  }
+
+  @Override
+  public boolean validate(IDocument document, int offset, DocumentEvent event) {
+    return true;
+  }
+
+}
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/ScoutSdkProposalComputer.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/ScoutSdkProposalComputer.java
new file mode 100644
index 0000000..256252e
--- /dev/null
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/ScoutSdkProposalComputer.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * 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.ui.internal.extensions.codecompletion;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext;
+import org.eclipse.jdt.ui.text.java.IJavaCompletionProposalComputer;
+import org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.scout.sdk.extensions.runtime.classes.IRuntimeClasses;
+import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.util.jdt.JdtUtility;
+import org.eclipse.scout.sdk.util.type.TypeUtility;
+import org.osgi.framework.Bundle;
+
+/**
+ * <h3>{@link ScoutSdkProposalComputer}</h3>
+ * 
+ * @author Andreas Hoegger
+ * @since 3.10.0 25.10.2013
+ */
+public class ScoutSdkProposalComputer implements IJavaCompletionProposalComputer {
+
+  @Override
+  public void sessionStarted() {
+  }
+
+  @Override
+  public List<ICompletionProposal> computeCompletionProposals(ContentAssistInvocationContext context, IProgressMonitor monitor) {
+    List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>();
+    if (!(context instanceof JavaContentAssistInvocationContext)
+        || Platform.getBundle(ScoutSdkUi.PLUGIN_ID).getState() != Bundle.ACTIVE) {
+      return proposals;
+    }
+    try {
+      JavaContentAssistInvocationContext javaContext = (JavaContentAssistInvocationContext) context;
+      ICompilationUnit icu = javaContext.getCompilationUnit();
+      IJavaElement element = JdtUtility.findJavaElement(icu, context.getInvocationOffset(), 0);
+      if (element.getElementType() == IJavaElement.TYPE) {
+        IType declaringType = (IType) element;
+        if (TypeUtility.isSubtype(TypeUtility.getType(IRuntimeClasses.ICodeType), declaringType, declaringType.newSupertypeHierarchy(monitor)) ||
+            TypeUtility.isSubtype(TypeUtility.getType(IRuntimeClasses.ICode), declaringType, declaringType.newSupertypeHierarchy(monitor))) {
+          proposals.add(new CodeNewProposal(declaringType));
+        }
+      }
+    }
+    catch (CoreException e) {
+      e.printStackTrace();
+    }
+
+    return proposals;
+  }
+
+  @Override
+  public List<IContextInformation> computeContextInformation(ContentAssistInvocationContext context, IProgressMonitor monitor) {
+    return null;
+  }
+
+  @Override
+  public void sessionEnded() {
+  }
+
+  @Override
+  public String getErrorMessage() {
+    return null;
+  }
+
+}
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/operation/sourceedit/SourceEditOperation.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/operation/sourceedit/SourceEditOperation.java
new file mode 100644
index 0000000..76441e1
--- /dev/null
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/operation/sourceedit/SourceEditOperation.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * 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.ui.operation.sourceedit;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.scout.commons.holders.Holder;
+import org.eclipse.scout.sdk.operation.IOperation;
+import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.util.typecache.IWorkingCopyManager;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.text.edits.MalformedTreeException;
+import org.eclipse.text.edits.TextEdit;
+
+/**
+ * <h3>{@link SourceEditOperation}</h3>
+ * 
+ * @author Andreas Hoegger
+ * @since 3.10.0 28.10.2013
+ */
+public class SourceEditOperation implements IOperation {
+
+  private TextEdit m_edit;
+  private IDocument m_document;
+  private Display m_display;
+
+  public SourceEditOperation(TextEdit edit, IDocument document, Display display) {
+    m_edit = edit;
+    m_document = document;
+    m_display = display;
+
+  }
+
+  @Override
+  public String getOperationName() {
+    return "Replace source...";
+  }
+
+  @Override
+  public void validate() throws IllegalArgumentException {
+    if (getEdit() == null) {
+      throw new IllegalArgumentException("Edit can not be null.");
+    }
+    if (getDocument() == null) {
+      throw new IllegalArgumentException("Document can not be null.");
+    }
+  }
+
+  @Override
+  public void run(IProgressMonitor monitor, IWorkingCopyManager workingCopyManager) throws CoreException, IllegalArgumentException {
+    final Holder<CoreException> exceptionHolder = new Holder<CoreException>(CoreException.class);
+    getDisplay().syncExec(new Runnable() {
+      @Override
+      public void run() {
+        try {
+          getEdit().apply(getDocument());
+        }
+        catch (MalformedTreeException e) {
+          exceptionHolder.setValue(new CoreException(new Status(IStatus.ERROR, ScoutSdkUi.PLUGIN_ID, "Edit could not be applied", e)));
+        }
+        catch (BadLocationException e) {
+          exceptionHolder.setValue(new CoreException(new Status(IStatus.ERROR, ScoutSdkUi.PLUGIN_ID, "Edit could not be applied", e)));
+        }
+      }
+    });
+    if (exceptionHolder.getValue() != null) {
+      throw exceptionHolder.getValue();
+    }
+  }
+
+  public TextEdit getEdit() {
+    return m_edit;
+  }
+
+  public IDocument getDocument() {
+    return m_document;
+  }
+
+  public Display getDisplay() {
+    return m_display;
+  }
+
+}
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/AbstractWorkspaceWizard.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/AbstractWorkspaceWizard.java
index 3b69b83..e912cbf 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/AbstractWorkspaceWizard.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/AbstractWorkspaceWizard.java
@@ -10,9 +10,15 @@
  ******************************************************************************/
 package org.eclipse.scout.sdk.ui.wizard;
 
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TreeMap;
+
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.scout.commons.CompareUtility;
+import org.eclipse.scout.commons.CompositeObject;
 import org.eclipse.scout.sdk.jobs.OperationJob;
 import org.eclipse.scout.sdk.operation.IOperation;
 import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
@@ -22,9 +28,32 @@
 /**
  * <h3>AbstractProcessWizard</h3> ...
  */
-public class AbstractWorkspaceWizard extends AbstractWizard {
+public class AbstractWorkspaceWizard extends AbstractWizard implements IWorkspaceWizard {
+
+  public Map<CompositeObject, IOperation> m_performFinishOperations;
 
   public AbstractWorkspaceWizard() {
+    m_performFinishOperations = new TreeMap<CompositeObject, IOperation>();
+  }
+
+  @Override
+  public IOperation addAdditionalPerformFinishOperation(IOperation op, double orderNr) {
+    return m_performFinishOperations.put(new CompositeObject(orderNr, op), op);
+  }
+
+  @Override
+  public IOperation removeAdditionalPerformFinishOperation(IOperation op) {
+    CompositeObject key = null;
+    for (Entry<CompositeObject, IOperation> e : m_performFinishOperations.entrySet()) {
+      if (CompareUtility.equals(e.getValue(), op)) {
+        key = e.getKey();
+        break;
+      }
+    }
+    if (key != null) {
+      return m_performFinishOperations.remove(key);
+    }
+    return null;
   }
 
   @Override
@@ -45,7 +74,9 @@
         return false;
       }
       P_PerformFinishOperation performFinishOperation = new P_PerformFinishOperation(getShell().getDisplay());
-      OperationJob job = new OperationJob(performFinishOperation);
+      m_performFinishOperations.put(new CompositeObject(IWorkspaceWizard.ORDER_DEFAULT, performFinishOperation), performFinishOperation);
+
+      OperationJob job = new OperationJob(m_performFinishOperations.values());
       job.schedule();
       return true;
     }
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/IWorkspaceWizard.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/IWorkspaceWizard.java
new file mode 100644
index 0000000..8d2a83e
--- /dev/null
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/IWorkspaceWizard.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * 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.ui.wizard;
+
+import org.eclipse.scout.sdk.operation.IOperation;
+
+/**
+ * <h3>{@link IWorkspaceWizard}</h3>
+ * 
+ * @author aho
+ * @since 3.10.0 28.10.2013
+ */
+public interface IWorkspaceWizard {
+
+  public static final double ORDER_DEFAULT = 0;
+  public static final double ORDER_BEFORE_WIZARD = -10;
+  public static final double ORDER_AFTER_WIZARD = 10;
+
+  IOperation addAdditionalPerformFinishOperation(IOperation op, double orderNr);
+
+  IOperation removeAdditionalPerformFinishOperation(IOperation op);
+
+}
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizard.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizard.java
index f132f2f..e2b1b09 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizard.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizard.java
@@ -36,6 +36,10 @@
     m_page1.setSuperType(superType);
   }
 
+  public CodeNewWizardPage getCodeNewWizardPage() {
+    return m_page1;
+  }
+
   @Override
   protected void postFinishDisplayThread() {
     IType createdField = m_page1.getCreatedCode();
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizardPage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizardPage.java
index e1c0102..27b1a9b 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizardPage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizardPage.java
@@ -129,7 +129,6 @@
 
     m_typeNameField = getFieldToolkit().createStyledTextField(parent, Texts.get("TypeName"), labelColWidthPercent);
     m_typeNameField.setReadOnlySuffix(SdkProperties.SUFFIX_CODE);
-    m_typeNameField.setText(m_typeName);
     m_typeNameField.addModifyListener(new ModifyListener() {
       @Override
       public void modifyText(ModifyEvent e) {
@@ -137,6 +136,7 @@
         pingStateChanging();
       }
     });
+    m_typeNameField.setText(m_typeName);
 
     m_superTypeField = getFieldToolkit().createJavaElementProposalField(parent, Texts.get("SuperType"),
         new AbstractJavaElementContentProvider() {
@@ -341,10 +341,10 @@
   public void setTypeName(String typeName) {
     try {
       setStateChanging(true);
-      m_typeName = typeName;
       if (isControlCreated()) {
         m_typeNameField.setText(typeName);
       }
+      m_typeName = typeName;
     }
     finally {
       setStateChanging(false);
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/internal/typecache/WorkingCopyManager.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/internal/typecache/WorkingCopyManager.java
index c818dd2..a81bea8 100644
--- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/internal/typecache/WorkingCopyManager.java
+++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/internal/typecache/WorkingCopyManager.java
@@ -43,6 +43,7 @@
 
   @Override
   public boolean register(ICompilationUnit icu, IProgressMonitor monitor) throws JavaModelException {
+    SdkUtilActivator.logInfo(getClass().getSimpleName() + ": register workingcopy for " + icu.getElementName());
     if (icu.isReadOnly()) {
       throw new IllegalArgumentException("try to get a working copy of the read only icu '" + icu.getElementName() + "'.");
     }
@@ -58,6 +59,7 @@
 
   @Override
   public void unregisterAll(IProgressMonitor monitor) {
+    SdkUtilActivator.logInfo(getClass().getSimpleName() + ": unregister all workingcopies");
     synchronized (LOCK) {
       for (Iterator<ICompilationUnit> it = m_workingCopies.iterator(); it.hasNext();) {
         releaseCompilationUnit(it.next(), monitor);
@@ -68,6 +70,7 @@
 
   @Override
   public void unregister(ICompilationUnit icu, IProgressMonitor monitor) {
+    SdkUtilActivator.logInfo(getClass().getSimpleName() + ": unregister workingcopy for: '" + icu.getElementName() + "'");
     synchronized (LOCK) {
       if (m_workingCopies.remove(icu)) {
         releaseCompilationUnit(icu, monitor);
@@ -75,7 +78,12 @@
     }
   }
 
+  public void discardAll(IProgressMonitor monitor) {
+
+  }
+
   private void releaseCompilationUnit(ICompilationUnit icu, IProgressMonitor monitor) {
+
     try {
       if (!monitor.isCanceled()) {
         icu.commitWorkingCopy(true, monitor);
@@ -107,6 +115,7 @@
 
   @Override
   public void reconcile(ICompilationUnit icu, IProgressMonitor monitor) throws CoreException {
+    SdkUtilActivator.logInfo(getClass().getSimpleName() + ": reconcile compilation unit '" + icu.getElementName() + "'");
     synchronized (LOCK) {
       if (!m_workingCopies.contains(icu)) {
         throw new CoreException(new ScoutStatus("compilation unit " + icu.getElementName() + " has not been registered"));
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeComparators.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeComparators.java
index fd6ef55..24e0597 100644
--- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeComparators.java
+++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeComparators.java
@@ -12,7 +12,9 @@
 
 import java.util.Comparator;
 
+import org.eclipse.jdt.core.ISourceRange;
 import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.scout.commons.CompositeObject;
 
 /**
@@ -47,6 +49,33 @@
     }
   };
 
+  protected final static Comparator<IType> SOURCE_RANGE_COMPARATOR = new Comparator<IType>() {
+
+    @Override
+    public int compare(IType t1, IType t2) {
+      if (t1 == null && t2 == null) {
+        return 0;
+      }
+      else if (t1 == null) {
+        return -1;
+      }
+      else if (t2 == null) {
+        return 1;
+      }
+      else {
+        try {
+          ISourceRange t1Range = t1.getSourceRange();
+          ISourceRange t2Range = t2.getSourceRange();
+          return t1Range.getOffset() - t2Range.getOffset();
+        }
+        catch (JavaModelException e) {
+          throw new IllegalArgumentException(e);
+        }
+
+      }
+    }
+  };
+
   public static Comparator<IType> getTypeNameComparator() {
     return NAME_COMPARATOR;
   }
@@ -54,4 +83,8 @@
   public static Comparator<IType> getHashCodeComparator() {
     return HASH_CODE_COMPARATOR;
   }
+
+  public static Comparator<IType> getSourceRangeComparator() {
+    return SOURCE_RANGE_COMPARATOR;
+  }
 }
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/jobs/AbstractWorkspaceBlockingJob.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/jobs/AbstractWorkspaceBlockingJob.java
index 398199d..66da84d 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/jobs/AbstractWorkspaceBlockingJob.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/jobs/AbstractWorkspaceBlockingJob.java
@@ -69,6 +69,7 @@
         }
         Status errorStatus = new Status(Status.ERROR, ScoutSdk.PLUGIN_ID, e.getMessage(), e);
         ScoutSdk.log(errorStatus);
+        monitor.setCanceled(true);
         return errorStatus;
       }
     }