diff --git a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/autocompletion/InsertResourceBundleReferenceProposal.java b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/autocompletion/InsertResourceBundleReferenceProposal.java
index 308dac1..68088f8 100644
--- a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/autocompletion/InsertResourceBundleReferenceProposal.java
+++ b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/autocompletion/InsertResourceBundleReferenceProposal.java
@@ -58,7 +58,7 @@
 		String key = dialog.getSelectedResource();
 		Locale locale = dialog.getSelectedLocale();
 
-		reference = ASTutilsUI.insertExistingBundleRef(document, resource,
+		reference = ASTutilsUI.insertExistingBundleRef(null, resource,
 				offset, length, resourceBundleId, key, locale);
 	}
 
diff --git a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/autocompletion/NewResourceBundleEntryProposal.java b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/autocompletion/NewResourceBundleEntryProposal.java
index 8a68647..393762d 100644
--- a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/autocompletion/NewResourceBundleEntryProposal.java
+++ b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/autocompletion/NewResourceBundleEntryProposal.java
@@ -53,7 +53,7 @@
     @Override
     public void apply(IDocument document) {
 
-        CreateResourceBundleEntryDialog dialog = new CreateResourceBundleEntryDialog(
+        final CreateResourceBundleEntryDialog dialog = new CreateResourceBundleEntryDialog(
                 Display.getDefault().getActiveShell());
 
         DialogConfiguration config = dialog.new DialogConfiguration();
@@ -74,13 +74,13 @@
 
         try {
             if (!bundleContext) {
-                reference = ASTutilsUI.insertNewBundleRef(document, resource,
+                reference = ASTutilsUI.insertNewBundleRef(null, resource,
                         startPos, endPos - startPos, resourceBundleId, key);
             } else {
                 document.replace(startPos, endPos - startPos, key);
                 reference = key + "\"";
             }
-            ResourceBundleManager.rebuildProject(resource);
+            //ResourceBundleManager.rebuildProject(resource);
         } catch (Exception e) {
             Logger.logError(e);
         }
diff --git a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/quickfix/ExportToResourceBundleResolution.java b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/quickfix/ExportToResourceBundleResolution.java
index bcceaed..3b30d97 100644
--- a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/quickfix/ExportToResourceBundleResolution.java
+++ b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/quickfix/ExportToResourceBundleResolution.java
@@ -23,9 +23,14 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.jface.dialogs.InputDialog;
 import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IMarkerResolution2;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.texteditor.ITextEditor;
 
 public class ExportToResourceBundleResolution implements IMarkerResolution2 {
 
@@ -83,7 +88,8 @@
                     .insertNewBundleRef(document, resource, startPos, endPos,
                             dialog.getSelectedResourceBundle(),
                             dialog.getSelectedKey());
-
+            
+            document.replace(startPos, 0, "");
             textFileBuffer.commit(null, false);
         } catch (Exception e) {
             e.printStackTrace();
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 d40dcc2..a60bd22 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
@@ -54,7 +54,7 @@
             int position = marker.getAttribute(IMarker.CHAR_START, 0);
 
             ASTutils.createReplaceNonInternationalisationComment(cu, document,
-                    position);
+                    position, 1);
             textFileBuffer.commit(null, false);
 
         } catch (JavaModelException e) {
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 e2d6f1c..8d619cd 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
@@ -41,7 +41,6 @@
 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;
@@ -55,307 +54,318 @@
 
 public class ASTutilsUI {
 
-    public static ICompilationUnit getCompilationUnit(IResource resource) {
-        return (ICompilationUnit) JavaCore.create(resource,
-                JavaCore.create(resource.getProject()));
-    }
+	public static ICompilationUnit getCompilationUnit(IResource resource) {
+		return (ICompilationUnit) JavaCore.create(resource,
+				JavaCore.create(resource.getProject()));
+	}
 
-    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
-                SharedASTProvider.WAIT_YES, null);
+	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
+				SharedASTProvider.WAIT_YES, null);
 
-        return cu;
-    }
+		return cu;
+	}
 
-    public static String insertNewBundleRef(IDocument document,
-            IResource resource, int startPos, int endPos,
-            String resourceBundleId, String key) {
-        boolean createRBReference = false;
-        String reference = "";
+	public static String insertNewBundleRef(IDocument origDocument,
+			IResource resource, int startPos, int endPos,
+			String resourceBundleId, String key) {
+		boolean createRBReference = false;
+		String reference = "";
 
-        try {
-            // creation of DOM/AST from a ICompilationUnit
-            ICompilationUnit cu = getCompilationUnit(resource);
-            CompilationUnit astRoot = getAstRoot(cu);
-            AST ast = astRoot.getAST();
+		try {
+			final ICompilationUnit cu = getCompilationUnit(resource);
+			final CompilationUnit astRoot = getAstRoot(cu);
+			final AST ast = astRoot.getAST();
+			final ASTRewrite rewriter = ASTRewrite.create(ast);
+			IDocument document;
 
-            ASTRewrite rewriter = ASTRewrite.create(ast);
-            final String source = cu.getSource();
-            document = new Document(source);
+			if (origDocument == null) {
+				final String source = cu.getSource();
+				document = new Document(source);
+			} else {
+				document = origDocument;
+			}
 
-            String variableName = ASTutils.resolveRBReferenceVar(document,
-                    resource, startPos, resourceBundleId, astRoot);
-            if (variableName == null) {
-                variableName = ASTutils.getNonExistingRBRefName(
-                        resourceBundleId, astRoot);
-                createRBReference = true;
-            }
+			String variableName = ASTutils.resolveRBReferenceVar(document,
+					resource, startPos, resourceBundleId, astRoot);
+			if (variableName == null) {
+				variableName = ASTutils.getNonExistingRBRefName(
+						resourceBundleId, astRoot);
+				createRBReference = true;
+			}
 
-            try {
-                reference = ASTutils.createResourceReference(resourceBundleId,
-                        key, null, resource, startPos, variableName, ast,
-                        rewriter, astRoot);
+			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 (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) == '\"') {
+						endPos++;
+					}
 
-                    if ((startPos + endPos) < document.getLength()
-                            && document.get().charAt(startPos + endPos - 1) == ';') {
-                        endPos--;
-                    }
+					if ((startPos + endPos) < document.getLength()
+							&& document.get().charAt(startPos + endPos - 1) == ';') {
+						endPos--;
+					}
 
-                    document.replace(startPos, endPos, reference);
+					document.replace(startPos, endPos, reference);
 
-                }
-                // create non-internationalisation-comment
-                ASTutils.createReplaceNonInternationalisationComment(astRoot,
-                        document, startPos);
-            } catch (BadLocationException e) {
-                e.printStackTrace();
-            }
+				}
+				// create non-internationalisation-comment
+				ASTutils.createReplaceNonInternationalisationComment(astRoot,
+						document, startPos, reference == null ? 0 : 1);
+			} catch (BadLocationException e) {
+				e.printStackTrace();
+			}
 
-            if (createRBReference) {
-                ASTutils.createResourceBundleReference(resource, startPos,
-                        document, resourceBundleId, null, true, variableName,
-                        astRoot, ast, rewriter);
-            }
+			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 text edits
+			TextEdit edits = rewriter.rewriteAST(document, null);
 
-            // computation of the new source code
-            try {
-                edits.apply(document);
-                String newSource = document.get();
+			// computation of the new source code
+			try {
+				edits.apply(document);
 
-                // 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 (origDocument == null) {
+					String newSource = document.get();
 
-        return reference;
-    }
+					// 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);
+		}
 
-    public static String insertExistingBundleRef(IDocument document,
-            IResource resource, int offset, int length,
-            String resourceBundleId, String key, Locale locale) {
-        boolean createRBReference = false;
-        String reference = "";
+		return reference;
+	}
 
-        try {
+	public static String insertExistingBundleRef(IDocument origDocument,
+			IResource resource, int startPos, int length,
+			String resourceBundleId, String key, Locale locale) {
+		boolean createRBReference = false;
+		String reference = "";
 
-            ICompilationUnit cu = getCompilationUnit(resource);
+		try {
+			final ICompilationUnit cu = getCompilationUnit(resource);
+			final CompilationUnit astRoot = getAstRoot(cu);
+			final AST ast = astRoot.getAST();
+			final ASTRewrite rewriter = ASTRewrite.create(ast);
+			IDocument document;
 
-            // creation of DOM/AST from a ICompilationUnit
-            CompilationUnit astRoot = getAstRoot(cu);
-            AST ast = astRoot.getAST();
+			if (origDocument == null) {
+				final String source = cu.getSource();
+				document = new Document(source);
+			} else {
+				document = origDocument;
+			}
 
-            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;
+			}
 
-            String variableName = ASTutils.resolveRBReferenceVar(document,
-                    resource, offset, resourceBundleId, astRoot);
+			reference = ASTutils.createResourceReference(resourceBundleId, key,
+					locale, resource, startPos, variableName, ast, rewriter,
+					astRoot);
 
-            if (variableName == null) {
-                variableName = ASTutils.getNonExistingRBRefName(
-                        resourceBundleId, astRoot);
-                createRBReference = true;
-            }
+			if (reference != null) {
+				try {
+					document.replace(startPos, length, reference);
+				} catch (BadLocationException e) {
+					Logger.logError(e);
+					return null;
+				}
+			}
+			// create non-internationalisation-comment
+			ASTutils.createReplaceNonInternationalisationComment(astRoot,
+					document, startPos, reference == null ? 0 : 1);
 
-            reference = ASTutils.createResourceReference(resourceBundleId, key,
-                    locale, resource, offset, variableName, ast, rewriter,
-                    astRoot);
+			// TODO retrieve cu in the same way as in createResourceReference
+			// the current version does not parse method bodies
 
-            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);
+			if (createRBReference) {
+				ASTutils.createResourceBundleReference(resource, startPos,
+						document, resourceBundleId, locale, true, variableName,
+						astRoot, ast, rewriter);
+			}
 
-            // TODO retrieve cu in the same way as in createResourceReference
-            // the current version does not parse method bodies
+			// computation of the text edits
+			TextEdit edits = rewriter.rewriteAST(document, null);
 
-            if (createRBReference) {
-                ASTutils.createResourceBundleReference(resource, offset,
-                        document, resourceBundleId, locale, true, variableName,
-                        astRoot, ast, rewriter);
-            }
+			// computation of the new source code
+			try {
+				edits.apply(document);
+				
+				if (origDocument == null) {
+					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);
+			}
 
-            // computation of the text edits
-            TextEdit edits = rewriter.rewriteAST(document, null);
+		} catch (JavaModelException e) {
+			Logger.logError(e);
+		}
 
-            // computation of the new source code
-            try {
-                edits.apply(document);
-                String newSource = document.get();
+		return reference;
+	}
 
-                // update of the compilation unit
-                cu.getBuffer().setContents(newSource);
-            } catch (MalformedTreeException e) {
-                Logger.logError(e);
-            } catch (BadLocationException e) {
-                Logger.logError(e);
-            }
+	/**
+	 * 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
+	 *            The Id of the resource bundle, which contains the old key
+	 * @param selectedLocale
+	 *            The {@link Locale} to change
+	 * @param oldKey
+	 *            The name of the key to change
+	 * @param newKey
+	 *            The name of the key, which replaces the old one
+	 * @param enumPath
+	 *            The path of the enum file (needs:
+	 *            {@link IPath#toPortableString()})
+	 */
+	public static void refactorKey(final String projectName,
+			final String resourceBundleId, final String selectedLocale,
+			final String oldKey, final String newKey, final String enumPath) {
 
-        } catch (JavaModelException e) {
-            Logger.logError(e);
-        }
+		// contains file and line
+		final List<String> changeSet = new ArrayList<String>();
 
-        return reference;
-    }
+		ResourceBundleManager manager = ResourceBundleManager
+				.getManager(projectName);
+		IProject project = manager.getProject();
 
-    /**
-     * 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
-     *            The Id of the resource bundle, which contains the old key
-     * @param selectedLocale
-     *            The {@link Locale} to change
-     * @param oldKey
-     *            The name of the key to change
-     * @param newKey
-     *            The name of the key, which replaces the old one
-     * @param enumPath
-     *            The path of the enum file (needs:
-     *            {@link IPath#toPortableString()})
-     */
-    public static void refactorKey(final String projectName,
-            final String resourceBundleId, final String selectedLocale,
-            final String oldKey, final String newKey, final String enumPath) {
+		try {
+			project.accept(new IResourceVisitor() {
 
-        // contains file and line
-        final List<String> changeSet = new ArrayList<String>();
+				/**
+				 * First step of filtering. Only classes, which import
+				 * 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
+				public boolean visit(IResource resource) throws CoreException {
+					if (!(resource instanceof IFile)
+							|| !resource.getFileExtension().equals("java")) {
+						return true;
+					}
 
-        ResourceBundleManager manager = ResourceBundleManager
-                .getManager(projectName);
-        IProject project = manager.getProject();
+					final ICompilationUnit icu = getCompilationUnit(resource);
+					final CompilationUnit cu = getAstRoot(icu);
 
-        try {
-            project.accept(new IResourceVisitor() {
+					// step 1: import filter
+					for (Object obj : cu.imports()) {
+						ImportDeclaration imp = (ImportDeclaration) obj;
+						String importName = imp.getName().toString();
+						if ("java.util.ResourceBundle".equals(importName)) {
+							PrimitiveRefactoringVisitor prv = new PrimitiveRefactoringVisitor(
+									cu, resourceBundleId, oldKey, newKey,
+									changeSet);
+							cu.accept(prv);
+							prv.saveChanges();
+							break;
+						} else if ("ch.qos.cal10n.MessageConveyor"
+								.equals(importName)) { // Cal10n
+							Cal10nRefactoringVisitor crv = new Cal10nRefactoringVisitor(
+									cu, oldKey, newKey, enumPath, changeSet);
+							cu.accept(crv);
+							crv.saveChanges();
+							break;
+						}
+					}
 
-                /**
-                 * First step of filtering. Only classes, which import
-                 * 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
-                public boolean visit(IResource resource) throws CoreException {
-                    if (!(resource instanceof IFile)
-                            || !resource.getFileExtension().equals("java")) {
-                        return true;
-                    }
+					return false;
+				}
+			});
+		} catch (CoreException e) {
+			Logger.logError(e);
+		}
 
-                    final ICompilationUnit icu = getCompilationUnit(resource);
-                    final CompilationUnit cu = getAstRoot(icu);
+		if (enumPath != null) { // Cal10n support, change the enum file
+			IFile file = project.getFile(enumPath.substring(project.getName()
+					.length() + 1));
+			final CompilationUnit enumCu = getAstRoot(getCompilationUnit(file));
 
-                    // step 1: import filter
-                    for (Object obj : cu.imports()) {
-                        ImportDeclaration imp = (ImportDeclaration) obj;
-                        String importName = imp.getName().toString();
-                        if ("java.util.ResourceBundle".equals(importName)) {
-                            PrimitiveRefactoringVisitor prv = new PrimitiveRefactoringVisitor(
-                                    cu, resourceBundleId, oldKey, newKey,
-                                    changeSet);
-                            cu.accept(prv);
-                            prv.saveChanges();
-                            break;
-                        } else if ("ch.qos.cal10n.MessageConveyor"
-                                .equals(importName)) { // Cal10n
-                            Cal10nRefactoringVisitor crv = new Cal10nRefactoringVisitor(
-                                    cu, oldKey, newKey, enumPath, changeSet);
-                            cu.accept(crv);
-                            crv.saveChanges();
-                            break;
-                        }
-                    }
+			Cal10nEnumRefactoringVisitor enumVisitor = new Cal10nEnumRefactoringVisitor(
+					enumCu, oldKey, newKey, changeSet);
+			enumCu.accept(enumVisitor);
+		}
 
-                    return false;
-                }
-            });
-        } catch (CoreException e) {
-            Logger.logError(e);
-        }
+		// change backend
+		RBManager rbManager = RBManager.getInstance(projectName);
+		IMessagesBundleGroup messagesBundleGroup = rbManager
+				.getMessagesBundleGroup(resourceBundleId);
 
-        if (enumPath != null) { // Cal10n support, change the enum file
-            IFile file = project.getFile(enumPath.substring(project.getName()
-                    .length() + 1));
-            final CompilationUnit enumCu = getAstRoot(getCompilationUnit(file));
+		DirtyHack.setFireEnabled(false); // now the editor won't get dirty
+		// but with this change, we have to write it manually down ->
+		// rbManager.writeToFile
+		if (KeyRefactoringDialog.ALL_LOCALES.equals(selectedLocale)) {
+			messagesBundleGroup.renameMessageKeys(oldKey, newKey);
 
-            Cal10nEnumRefactoringVisitor enumVisitor = new Cal10nEnumRefactoringVisitor(
-                    enumCu, oldKey, newKey, changeSet);
-            enumCu.accept(enumVisitor);
-        }
+		} else {
+			IMessagesBundle messagesBundle = messagesBundleGroup
+					.getMessagesBundle(LocaleUtils.getLocaleByDisplayName(
+							manager.getProvidedLocales(resourceBundleId),
+							selectedLocale));
+			messagesBundle.renameMessageKey(oldKey, newKey);
+			// rbManager.fireResourceChanged(messagesBundle); ??
+		}
+		DirtyHack.setFireEnabled(true);
 
-        // change backend
-        RBManager rbManager = RBManager.getInstance(projectName);
-        IMessagesBundleGroup messagesBundleGroup = rbManager
-                .getMessagesBundleGroup(resourceBundleId);
+		rbManager.fireEditorChanged(); // notify Resource Bundle View
+		rbManager.writeToFile(rbManager
+				.getMessagesBundleGroup(resourceBundleId));
 
-        DirtyHack.setFireEnabled(false); // now the editor won't get dirty
-        // but with this change, we have to write it manually down ->
-        // rbManager.writeToFile
-        if (KeyRefactoringDialog.ALL_LOCALES.equals(selectedLocale)) {
-            messagesBundleGroup.renameMessageKeys(oldKey, newKey);
+		// show the summary dialog
+		KeyRefactoringSummaryDialog summaryDialog = new KeyRefactoringSummaryDialog(
+				Display.getDefault().getActiveShell());
 
-        } else {
-            IMessagesBundle messagesBundle = messagesBundleGroup
-                    .getMessagesBundle(LocaleUtils.getLocaleByDisplayName(
-                            manager.getProvidedLocales(resourceBundleId),
-                            selectedLocale));
-            messagesBundle.renameMessageKey(oldKey, newKey);
-            // rbManager.fireResourceChanged(messagesBundle); ??
-        }
-        DirtyHack.setFireEnabled(true);
+		DialogConfiguration config = summaryDialog.new DialogConfiguration();
+		config.setPreselectedKey(oldKey);
+		config.setNewKey(newKey);
+		config.setPreselectedBundle(resourceBundleId);
+		config.setProjectName(projectName);
 
-        rbManager.fireEditorChanged(); // notify Resource Bundle View
-        rbManager.writeToFile(rbManager
-                .getMessagesBundleGroup(resourceBundleId));
+		summaryDialog.setDialogConfiguration(config);
+		summaryDialog.setChangeSet(changeSet);
 
-        // show the summary dialog
-        KeyRefactoringSummaryDialog summaryDialog = new KeyRefactoringSummaryDialog(
-                Display.getDefault().getActiveShell());
-
-        DialogConfiguration config = summaryDialog.new DialogConfiguration();
-        config.setPreselectedKey(oldKey);
-        config.setNewKey(newKey);
-        config.setPreselectedBundle(resourceBundleId);
-        config.setProjectName(projectName);
-
-        summaryDialog.setDialogConfiguration(config);
-        summaryDialog.setChangeSet(changeSet);
-
-        summaryDialog.open();
-    }
+		summaryDialog.open();
+	}
 
 }
diff --git a/org.eclipse.babel.tapiji.tools.java/src/org/eclipse/babel/tapiji/tools/java/util/ASTutils.java b/org.eclipse.babel.tapiji.tools.java/src/org/eclipse/babel/tapiji/tools/java/util/ASTutils.java
index 5eb9901..00e2a94 100644
--- a/org.eclipse.babel.tapiji.tools.java/src/org/eclipse/babel/tapiji/tools/java/util/ASTutils.java
+++ b/org.eclipse.babel.tapiji.tools.java/src/org/eclipse/babel/tapiji/tools/java/util/ASTutils.java
@@ -422,14 +422,14 @@
 	}
 
 	public static void createReplaceNonInternationalisationComment(
-			CompilationUnit cu, IDocument doc, int position) {
+			CompilationUnit cu, IDocument doc, int position, int nonNlsOffset) {
 		int i = findNonInternationalisationPosition(cu, doc, position);
 
 		IRegion reg;
 		try {
 			reg = doc.getLineInformationOfOffset(position);
 			doc.replace(reg.getOffset() + reg.getLength(), 0, " //$NON-NLS-"
-					+ i + "$");
+					+ (i + nonNlsOffset) + "$");
 		} catch (BadLocationException e) {
 			Logger.logError(e);
 		}
@@ -590,7 +590,7 @@
 
 		List<StringLiteral> strings = lsfinder.getStrings();
 
-		return strings.size() + 1;
+		return strings.size();
 	}
 
 	public static boolean existsNonInternationalisationComment(
@@ -637,7 +637,7 @@
 				// ignore string which is on given position
 			} else if (commentFrag.matches("^\\$non-nls-\\d+\\$$")) {
 				int iString = findNonInternationalisationPosition(cu, doc,
-						literal.getStartPosition());
+						literal.getStartPosition())+1;
 				int iComment = new Integer(commentFrag.substring(9, 10));
 				if (iString == iComment) {
 					return true;
@@ -887,6 +887,7 @@
 			try {
 				if (line == document.getLineOfOffset(node.getStartPosition())
 						&& node.getStartPosition() < position) {
+					Logger.logInfo(node.getLiteralValue());
 					strings.add(node);
 					return true;
 				}
