diff --git a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/ConstantStringHover.java b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/ConstantStringHover.java
index 93d8463..799ad81 100644
--- a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/ConstantStringHover.java
+++ b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/ConstantStringHover.java
@@ -44,7 +44,7 @@
             return;
         }
 
-        CompilationUnit cu = ASTutilsUI.getCompilationUnit(typeRoot);
+        CompilationUnit cu = ASTutilsUI.getAstRoot(typeRoot);
 
         if (cu == null) {
             return;
diff --git a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/JavaResourceAuditor.java b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/JavaResourceAuditor.java
index cecf043..a1e1e70 100644
--- a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/JavaResourceAuditor.java
+++ b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/JavaResourceAuditor.java
@@ -4,7 +4,7 @@
  * 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:
  *     Martin Reiterer - initial API and implementation
  ******************************************************************************/
@@ -44,7 +44,7 @@
     public JavaResourceAuditor() {
         this.reset();
     }
-    
+
     @Override
     public String[] getFileEndings() {
         return new String[] { "java" };
@@ -58,7 +58,8 @@
                 resource.getProject().getName());
 
         // get a reference to the shared AST of the loaded CompilationUnit
-        CompilationUnit cu = ASTutilsUI.getCompilationUnit(resource);
+        CompilationUnit cu = ASTutilsUI.getAstRoot(ASTutilsUI
+                .getCompilationUnit(resource));
         if (cu == null) {
             System.out.println("Cannot audit resource: "
                     + resource.getFullPath());
diff --git a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/MessageCompletionProposalComputer.java b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/MessageCompletionProposalComputer.java
index 17de6ae..6c48d4f 100644
--- a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/MessageCompletionProposalComputer.java
+++ b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/MessageCompletionProposalComputer.java
@@ -4,7 +4,7 @@
  * 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:
  * 	   Martin Reiterer - initial API and implementation
  *     Alexej Strelzow - integrated refactoring mechanism
@@ -82,7 +82,8 @@
                 csav = new ResourceAuditVisitor(null, manager.getProject()
                         .getName());
 
-                cu = ASTutilsUI.getCompilationUnit(resource);
+                cu = ASTutilsUI.getAstRoot(ASTutilsUI
+                        .getCompilationUnit(resource));
 
                 cu.accept(csav);
             }
diff --git a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/quickfix/IgnoreStringFromInternationalization.java b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/quickfix/IgnoreStringFromInternationalization.java
index 67429aa..d40dcc2 100644
--- a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/quickfix/IgnoreStringFromInternationalization.java
+++ b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/quickfix/IgnoreStringFromInternationalization.java
@@ -4,7 +4,7 @@
  * 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:
  *     Martin Reiterer - initial API and implementation
  ******************************************************************************/
@@ -38,7 +38,8 @@
     public void run(IMarker marker) {
         IResource resource = marker.getResource();
 
-        CompilationUnit cu = ASTutilsUI.getCompilationUnit(resource);
+        CompilationUnit cu = ASTutilsUI.getAstRoot(ASTutilsUI
+                .getCompilationUnit(resource));
 
         ITextFileBufferManager bufferManager = FileBuffers
                 .getTextFileBufferManager();
diff --git a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/refactoring/RefactoringService.java b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/refactoring/RefactoringService.java
index d69bcaf..35f720f 100644
--- a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/refactoring/RefactoringService.java
+++ b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/refactoring/RefactoringService.java
@@ -4,7 +4,7 @@
  * 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:
  *     Alexej Strelzow - initial API and implementation
  ******************************************************************************/
@@ -27,7 +27,7 @@
 
 /**
  * Service class, which can be used to execute key refactorings.
- * 
+ *
  * @author Alexej Strelzow
  */
 public class RefactoringService implements IRefactoringService {
@@ -74,7 +74,8 @@
     public void openRefactorDialog(IFile file, int selectionOffset) {
 
         String projectName = file.getProject().getName();
-        CompilationUnit cu = ASTutilsUI.getCompilationUnit(file);
+        CompilationUnit cu = ASTutilsUI.getAstRoot(ASTutilsUI
+                .getCompilationUnit(file));
 
         StringLiteral literal = ASTutils.getStringLiteralAtPos(cu,
                 selectionOffset);
diff --git a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/util/ASTutilsUI.java b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/util/ASTutilsUI.java
index d799870..e2d6f1c 100644
--- a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/util/ASTutilsUI.java
+++ b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/util/ASTutilsUI.java
@@ -4,7 +4,7 @@
  * 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:
  *     Martin Reiterer - initial API and implementation
  *     Alexej Strelzow - seperation of ui/non-ui (methods moved from ASTUtils)
@@ -37,15 +37,17 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.ITypeRoot;
 import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.dom.AST;
+import org.eclipse.jdt.core.dom.ASTParser;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.ImportDeclaration;
 import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
 import org.eclipse.jdt.ui.SharedASTProvider;
 import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.Document;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.text.edits.MalformedTreeException;
@@ -53,20 +55,12 @@
 
 public class ASTutilsUI {
 
-    public static CompilationUnit getCompilationUnit(IResource resource) {
-        IJavaElement je = JavaCore.create(resource,
+    public static ICompilationUnit getCompilationUnit(IResource resource) {
+        return (ICompilationUnit) JavaCore.create(resource,
                 JavaCore.create(resource.getProject()));
-        // get the type of the currently loaded resource
-        ITypeRoot typeRoot = ((ICompilationUnit) je);
-
-        if (typeRoot == null) {
-            return null;
-        }
-
-        return getCompilationUnit(typeRoot);
     }
 
-    public static CompilationUnit getCompilationUnit(ITypeRoot typeRoot) {
+    public static CompilationUnit getAstRoot(ITypeRoot typeRoot) {
         // get a reference to the shared AST of the loaded CompilationUnit
         CompilationUnit cu = SharedASTProvider.getAST(typeRoot,
         // do not wait for AST creation
@@ -78,68 +72,84 @@
     public static String insertNewBundleRef(IDocument document,
             IResource resource, int startPos, int endPos,
             String resourceBundleId, String key) {
-    	boolean createRBReference = false;
+        boolean createRBReference = false;
         String reference = "";
 
-        CompilationUnit cu = getCompilationUnit(resource);
-        AST ast = cu.getAST();
-        ASTRewrite rewriter = ASTRewrite.create(ast);
-
-        String variableName = ASTutils.resolveRBReferenceVar(document,
-                resource, startPos, resourceBundleId, cu);
-        if (variableName == null) {
-        	variableName = ASTutils.getNonExistingRBRefName(resourceBundleId, cu);
-        	createRBReference = true;
-        }
-
         try {
-            reference = ASTutils.createResourceReference(resourceBundleId, key,
-                    null, resource, startPos, variableName, ast, rewriter, cu);
+            // creation of DOM/AST from a ICompilationUnit
+            ICompilationUnit cu = getCompilationUnit(resource);
+            CompilationUnit astRoot = getAstRoot(cu);
+            AST ast = astRoot.getAST();
 
-            if (reference != null) {
-	            if (startPos > 0 && document.get().charAt(startPos - 1) == '\"') {
-	                startPos--;
-	                endPos++;
-	            }
-	
-	            if ((startPos + endPos) < document.getLength()
-	                    && document.get().charAt(startPos + endPos) == '\"') {
-	                endPos++;
-	            }
-	
-	            if ((startPos + endPos) < document.getLength()
-	                    && document.get().charAt(startPos + endPos - 1) == ';') {
-	                endPos--;
-	            }
-	
-	            document.replace(startPos, endPos, reference);
+            ASTRewrite rewriter = ASTRewrite.create(ast);
+            final String source = cu.getSource();
+            document = new Document(source);
 
+            String variableName = ASTutils.resolveRBReferenceVar(document,
+                    resource, startPos, resourceBundleId, astRoot);
+            if (variableName == null) {
+                variableName = ASTutils.getNonExistingRBRefName(
+                        resourceBundleId, astRoot);
+                createRBReference = true;
             }
-            // create non-internationalisation-comment
-            //ASTutils.createReplaceNonInternationalisationComment(cu, document,
-            //        startPos);
-        } catch (BadLocationException e) {
-            e.printStackTrace();
+
+            try {
+                reference = ASTutils.createResourceReference(resourceBundleId,
+                        key, null, resource, startPos, variableName, ast,
+                        rewriter, astRoot);
+
+                if (reference != null) {
+                    if (startPos > 0
+                            && document.get().charAt(startPos - 1) == '\"') {
+                        startPos--;
+                        endPos++;
+                    }
+
+                    if ((startPos + endPos) < document.getLength()
+                            && document.get().charAt(startPos + endPos) == '\"') {
+                        endPos++;
+                    }
+
+                    if ((startPos + endPos) < document.getLength()
+                            && document.get().charAt(startPos + endPos - 1) == ';') {
+                        endPos--;
+                    }
+
+                    document.replace(startPos, endPos, reference);
+
+                }
+                // create non-internationalisation-comment
+                ASTutils.createReplaceNonInternationalisationComment(astRoot,
+                        document, startPos);
+            } catch (BadLocationException e) {
+                e.printStackTrace();
+            }
+
+            if (createRBReference) {
+                ASTutils.createResourceBundleReference(resource, startPos,
+                        document, resourceBundleId, null, true, variableName,
+                        astRoot, ast, rewriter);
+            }
+
+            // computation of the text edits
+            TextEdit edits = rewriter.rewriteAST(document, null);
+
+            // computation of the new source code
+            try {
+                edits.apply(document);
+                String newSource = document.get();
+
+                // update of the compilation unit
+                cu.getBuffer().setContents(newSource);
+            } catch (MalformedTreeException e) {
+                Logger.logError(e);
+            } catch (BadLocationException e) {
+                Logger.logError(e);
+            }
+        } catch (JavaModelException e) {
+            Logger.logError(e);
         }
 
-        if (createRBReference) {
-            ASTutils.createResourceBundleReference(resource, startPos,
-                    document, resourceBundleId, null, true, variableName, cu, ast, rewriter);
-        }
-
-        // computation of the text edits
-        TextEdit edits = rewriter.rewriteAST(document, null);
-
-        // computation of the new source code
-        try {
-			edits.apply(document);
-		} catch (MalformedTreeException e) {
-			Logger.logError(e);
-		} catch (BadLocationException e) {
-			Logger.logError(e);
-		}
-        
-        
         return reference;
     }
 
@@ -149,52 +159,72 @@
         boolean createRBReference = false;
         String reference = "";
 
-        CompilationUnit cu = getCompilationUnit(resource);
-        AST ast = cu.getAST();
-        ASTRewrite rewriter = ASTRewrite.create(ast);
-
-        String variableName = ASTutils.resolveRBReferenceVar(document,
-                resource, offset, resourceBundleId, cu);
-        if (variableName == null) {
-        	variableName = ASTutils.getNonExistingRBRefName(resourceBundleId, cu);
-        	createRBReference = true;
-        }
-
-        reference = ASTutils.createResourceReference(resourceBundleId, key,
-                locale, resource, offset, variableName, ast, rewriter, cu);
-
-        if (reference != null) {
-	        try {
-				document.replace(offset, length, reference);
-			} catch (BadLocationException e) {
-				Logger.logError(e);
-				return null;
-			}
-        }
-        // create non-internationalisation-comment
-        //ASTutils.createReplaceNonInternationalisationComment(cu, document,
-        //        offset);
-
-        // TODO retrieve cu in the same way as in createResourceReference
-        // the current version does not parse method bodies
-
-        if (createRBReference) {
-            ASTutils.createResourceBundleReference(resource, offset, document,
-                    resourceBundleId, locale, true, variableName, cu, ast, rewriter);
-        }
-        
-        // computation of the text edits
-        TextEdit edits = rewriter.rewriteAST(document, null);
-
-        // computation of the new source code
         try {
-			edits.apply(document);
-		} catch (MalformedTreeException e) {
-			Logger.logError(e);
-		} catch (BadLocationException e) {
-			Logger.logError(e);
-		}
-        
+
+            ICompilationUnit cu = getCompilationUnit(resource);
+
+            // creation of DOM/AST from a ICompilationUnit
+            CompilationUnit astRoot = getAstRoot(cu);
+            AST ast = astRoot.getAST();
+
+            ASTRewrite rewriter = ASTRewrite.create(ast);
+            final String source = cu.getSource();
+            document = new Document(source);
+
+            String variableName = ASTutils.resolveRBReferenceVar(document,
+                    resource, offset, resourceBundleId, astRoot);
+
+            if (variableName == null) {
+                variableName = ASTutils.getNonExistingRBRefName(
+                        resourceBundleId, astRoot);
+                createRBReference = true;
+            }
+
+            reference = ASTutils.createResourceReference(resourceBundleId, key,
+                    locale, resource, offset, variableName, ast, rewriter,
+                    astRoot);
+
+            if (reference != null) {
+                try {
+                    document.replace(offset, length, reference);
+                } catch (BadLocationException e) {
+                    Logger.logError(e);
+                    return null;
+                }
+            }
+            // create non-internationalisation-comment
+            ASTutils.createReplaceNonInternationalisationComment(astRoot,
+                    document, offset);
+
+            // TODO retrieve cu in the same way as in createResourceReference
+            // the current version does not parse method bodies
+
+            if (createRBReference) {
+                ASTutils.createResourceBundleReference(resource, offset,
+                        document, resourceBundleId, locale, true, variableName,
+                        astRoot, ast, rewriter);
+            }
+
+            // computation of the text edits
+            TextEdit edits = rewriter.rewriteAST(document, null);
+
+            // computation of the new source code
+            try {
+                edits.apply(document);
+                String newSource = document.get();
+
+                // update of the compilation unit
+                cu.getBuffer().setContents(newSource);
+            } catch (MalformedTreeException e) {
+                Logger.logError(e);
+            } catch (BadLocationException e) {
+                Logger.logError(e);
+            }
+
+        } catch (JavaModelException e) {
+            Logger.logError(e);
+        }
+
         return reference;
     }
 
@@ -202,7 +232,7 @@
      * Performs the refactoring of messages key. The key can be a {@link String}
      * or an Enumeration! If it is an enumeration, then the enumPath needs to be
      * provided!
-     * 
+     *
      * @param projectName
      *            The name of the project, where the resource bundle file is in
      * @param resourceBundleId
@@ -236,7 +266,7 @@
                  * java.util.ResourceBundle or ch.qos.cal10n.MessageConveyor
                  * will be changed. An exception is the enum file, which gets
                  * referenced by the Cal10n framework.
-                 * 
+                 *
                  * {@inheritDoc}
                  */
                 @Override
@@ -246,7 +276,8 @@
                         return true;
                     }
 
-                    final CompilationUnit cu = getCompilationUnit(resource);
+                    final ICompilationUnit icu = getCompilationUnit(resource);
+                    final CompilationUnit cu = getAstRoot(icu);
 
                     // step 1: import filter
                     for (Object obj : cu.imports()) {
@@ -279,7 +310,7 @@
         if (enumPath != null) { // Cal10n support, change the enum file
             IFile file = project.getFile(enumPath.substring(project.getName()
                     .length() + 1));
-            final CompilationUnit enumCu = getCompilationUnit(file);
+            final CompilationUnit enumCu = getAstRoot(getCompilationUnit(file));
 
             Cal10nEnumRefactoringVisitor enumVisitor = new Cal10nEnumRefactoringVisitor(
                     enumCu, oldKey, newKey, changeSet);
