diff --git a/org.eclipse.babel.core/src/org/eclipse/babel/core/message/manager/RBManager.java b/org.eclipse.babel.core/src/org/eclipse/babel/core/message/manager/RBManager.java
index 4a25ccc..b9f4a46 100644
--- a/org.eclipse.babel.core/src/org/eclipse/babel/core/message/manager/RBManager.java
+++ b/org.eclipse.babel.core/src/org/eclipse/babel/core/message/manager/RBManager.java
@@ -67,8 +67,7 @@
 
     private static final String TAPIJI_NATURE = "org.eclipse.babel.tapiji.tools.core.ui.nature";
 
-    final static Logger logger = Logger.getLogger(RBManager.class
-            .getSimpleName());
+    final static Logger logger = Logger.getLogger(RBManager.class.getName());
 
     private static IRefactoringService refactorService;
 
diff --git a/org.eclipse.babel.editor/src/org/eclipse/babel/editor/builder/Builder.java b/org.eclipse.babel.editor/src/org/eclipse/babel/editor/builder/Builder.java
index eae906d..282b64e 100644
--- a/org.eclipse.babel.editor/src/org/eclipse/babel/editor/builder/Builder.java
+++ b/org.eclipse.babel.editor/src/org/eclipse/babel/editor/builder/Builder.java
@@ -10,13 +10,14 @@
  ******************************************************************************/
 package org.eclipse.babel.editor.builder;
 
-//import java.io.IOException;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import org.eclipse.babel.core.message.IMessagesBundle;
 import org.eclipse.babel.core.message.internal.MessagesBundle;
@@ -45,275 +46,282 @@
  */
 public class Builder extends IncrementalProjectBuilder {
 
-    public static final String BUILDER_ID = "org.eclipse.babel.editor.rbeBuilder"; //$NON-NLS-1$
+	private static final Logger LOGGER = Logger.getLogger(Builder.class.getName());
+	
+	public static final String BUILDER_ID = "org.eclipse.babel.editor.rbeBuilder"; //$NON-NLS-1$
 
-    private IValidationMarkerStrategy markerStrategy = new FileMarkerStrategy();
+	private IValidationMarkerStrategy markerStrategy = new FileMarkerStrategy();
 
-    class SampleDeltaVisitor implements IResourceDeltaVisitor {
-        /**
-         * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-         */
-        public boolean visit(IResourceDelta delta) throws CoreException {
-            IResource resource = delta.getResource();
-            switch (delta.getKind()) {
-            case IResourceDelta.ADDED:
-                // handle added resource
-                System.out.println("RBE DELTA added");
-                checkBundleResource(resource);
-                break;
-            case IResourceDelta.REMOVED:
-                System.out.println("RBE DELTA Removed"); //$NON-NLS-1$
-                RBManager.getInstance(delta.getResource().getProject())
-                        .notifyResourceRemoved(delta.getResource());
-                // handle removed resource
-                break;
-            case IResourceDelta.CHANGED:
-                System.out.println("RBE DELTA changed");
-                // handle changed resource
-                checkBundleResource(resource);
-                break;
-            }
-            // return true to continue visiting children.
-            return true;
-        }
-    }
+	class SampleDeltaVisitor implements IResourceDeltaVisitor {
+		/**
+		 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
+		 */
+		public boolean visit(IResourceDelta delta) throws CoreException {
+			IResource resource = delta.getResource();
+			
+			// export file ending (.properties) into a configuration constant
+			if (resource instanceof IFile && resource.getName().endsWith(".properties")) {
+				switch (delta.getKind()) {
+				case IResourceDelta.ADDED:
+					// handle added resource
+					LOGGER.log(Level.INFO, "RBE DELTA added");
+					checkBundleResource(resource);
+					break;
+				case IResourceDelta.REMOVED:
+					LOGGER.log(Level.INFO, "RBE DELTA removed");
+					RBManager.getInstance(delta.getResource().getProject())
+							.notifyResourceRemoved(delta.getResource());
+					// handle removed resource
+					break;
+				case IResourceDelta.CHANGED:
+					// handle changed resource
+					LOGGER.log(Level.INFO, "RBE DELTA changed");
+					checkBundleResource(resource);
+					break;
+				}
+			}
+			
+			// return true to continue visiting children.
+			return true;
+		}
+	}
 
-    class SampleResourceVisitor implements IResourceVisitor {
-        public boolean visit(IResource resource) {
-            checkBundleResource(resource);
-            // return true to continue visiting children.
-            return true;
-        }
-    }
+	class SampleResourceVisitor implements IResourceVisitor {
+		public boolean visit(IResource resource) {
+			checkBundleResource(resource);
+			// return true to continue visiting children.
+			return true;
+		}
+	}
 
-    /**
-     * list built during a single build of the properties files. Contains the
-     * list of files that must be validated. The validation is done only at the
-     * end of the visitor. This way the visitor can add extra files to be
-     * visited. For example: if the default properties file is changed, it is a
-     * good idea to rebuild all localized files in the same MessageBundleGroup
-     * even if themselves were not changed.
-     */
-    private Set _resourcesToValidate;
+	/**
+	 * list built during a single build of the properties files. Contains the
+	 * list of files that must be validated. The validation is done only at the
+	 * end of the visitor. This way the visitor can add extra files to be
+	 * visited. For example: if the default properties file is changed, it is a
+	 * good idea to rebuild all localized files in the same MessageBundleGroup
+	 * even if themselves were not changed.
+	 */
+	private Set _resourcesToValidate;
 
-    /**
-     * Index built during a single build.
-     * <p>
-     * The values of that map are message bundles. The key is a resource that
-     * belongs to that message bundle.
-     * </p>
-     */
-    private Map<IFile, MessagesBundleGroup> _alreadBuiltMessageBundle;
+	/**
+	 * Index built during a single build.
+	 * <p>
+	 * The values of that map are message bundles. The key is a resource that
+	 * belongs to that message bundle.
+	 * </p>
+	 */
+	private Map<IFile, MessagesBundleGroup> _alreadBuiltMessageBundle;
 
-    // /** one indexer per project we open and close it at the beginning and the
-    // end of each build. */
-    // private Indexer _indexer = new Indexer();
+	// /** one indexer per project we open and close it at the beginning and the
+	// end of each build. */
+	// private Indexer _indexer = new Indexer();
 
-    /**
-     * @see org.eclipse.core.resources.IncrementalProjectBuilder#build(int,
-     *      java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
-     */
-    protected IProject[] build(int kind, Map args, IProgressMonitor monitor)
-            throws CoreException {
-        try {
-            _alreadBuiltMessageBundle = null;
-            _resourcesToValidate = null;
-            if (kind == FULL_BUILD) {
-                fullBuild(monitor);
-            } else {
-                IResourceDelta delta = getDelta(getProject());
-                if (delta == null) {
-                    fullBuild(monitor);
-                } else {
-                    incrementalBuild(delta, monitor);
-                }
-            }
-        } finally {
-            try {
-                finishBuild();
-            } catch (Exception e) {
-                e.printStackTrace();
-            } finally {
-                // must dispose the message bundles:
-                if (_alreadBuiltMessageBundle != null) {
-                    for (MessagesBundleGroup msgGrp : _alreadBuiltMessageBundle
-                            .values()) {
-                        try {
-                            // msgGrp.dispose(); // TODO: [alst] do we need this
-                            // really?
-                        } catch (Throwable t) {
-                            // FIXME: remove this debugging:
-                            System.err
-                                    .println("error disposing message-bundle-group "
-                                            + msgGrp.getName());
-                            // disregard crashes: we are doing our best effort
-                            // to dispose things.
-                        }
-                    }
-                    _alreadBuiltMessageBundle = null;
-                    _resourcesToValidate = null;
-                }
-                // if (_indexer != null) {
-                // try {
-                // _indexer.close(true);
-                // _indexer.clear();
-                // } catch (CorruptIndexException e) {
-                // e.printStackTrace();
-                // } catch (IOException e) {
-                // e.printStackTrace();
-                // }
-                // }
-            }
-        }
-        return null;
-    }
+	/**
+	 * @see org.eclipse.core.resources.IncrementalProjectBuilder#build(int,
+	 *      java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IProject[] build(int kind, Map args, IProgressMonitor monitor)
+			throws CoreException {
+		try {
+			_alreadBuiltMessageBundle = null;
+			_resourcesToValidate = null;
+			if (kind == FULL_BUILD) {
+				fullBuild(monitor);
+			} else {
+				IResourceDelta delta = getDelta(getProject());
+				if (delta == null) {
+					fullBuild(monitor);
+				} else {
+					incrementalBuild(delta, monitor);
+				}
+			}
+		} finally {
+			try {
+				finishBuild();
+			} catch (Exception e) {
+				e.printStackTrace();
+			} finally {
+				// must dispose the message bundles:
+				if (_alreadBuiltMessageBundle != null) {
+					for (MessagesBundleGroup msgGrp : _alreadBuiltMessageBundle
+							.values()) {
+						try {
+							// msgGrp.dispose(); // TODO: [alst] do we need this
+							// really?
+						} catch (Throwable t) {
+							// FIXME: remove this debugging:
+							System.err
+									.println("error disposing message-bundle-group "
+											+ msgGrp.getName());
+							// disregard crashes: we are doing our best effort
+							// to dispose things.
+						}
+					}
+					_alreadBuiltMessageBundle = null;
+					_resourcesToValidate = null;
+				}
+				// if (_indexer != null) {
+				// try {
+				// _indexer.close(true);
+				// _indexer.clear();
+				// } catch (CorruptIndexException e) {
+				// e.printStackTrace();
+				// } catch (IOException e) {
+				// e.printStackTrace();
+				// }
+				// }
+			}
+		}
+		return null;
+	}
 
-    /**
-     * Collect the resource bundles to validate and index the corresponding
-     * MessageBundleGroup(s).
-     * 
-     * @param resource
-     *            The resource currently validated.
-     */
-    void checkBundleResource(IResource resource) {
-        if (true)
-            return; // TODO [alst]
-        if (resource instanceof IFile
-                && resource.getName().endsWith(".properties")) { //$NON-NLS-1$ //TODO have customized?
-            IFile file = (IFile) resource;
-            if (file.isDerived()) {
-                return;
-            }
-            // System.err.println("Looking at " + file.getFullPath());
-            deleteMarkers(file);
-            MessagesBundleGroup msgBundleGrp = null;
-            if (_alreadBuiltMessageBundle == null) {
-                _alreadBuiltMessageBundle = new HashMap<IFile, MessagesBundleGroup>();
-                _resourcesToValidate = new HashSet();
-            } else {
-                msgBundleGrp = _alreadBuiltMessageBundle.get(file);
-            }
-            if (msgBundleGrp == null) {
-                msgBundleGrp = MessagesBundleGroupFactory.createBundleGroup(
-                        null, file);
-                if (msgBundleGrp != null) {
-                    // index the files for which this MessagesBundleGroup
-                    // should be used for the validation.
-                    // cheaper than creating a group for each on of those
-                    // files.
-                    boolean validateEntireGroup = false;
-                    for (IMessagesBundle msgBundle : msgBundleGrp
-                            .getMessagesBundles()) {
-                        Object src = ((MessagesBundle) msgBundle).getResource()
-                                .getSource();
-                        // System.err.println(src + " -> " + msgBundleGrp);
-                        if (src instanceof IFile) {// when it is a read-only
-                                                   // thing we don't index it.
-                            _alreadBuiltMessageBundle.put((IFile) src,
-                                    msgBundleGrp);
-                            if (!validateEntireGroup && src == resource) {
-                                if (((MessagesBundle) msgBundle).getLocale() == null
-                                        || ((MessagesBundle) msgBundle)
-                                                .getLocale().equals(
-                                                        UIUtils.ROOT_LOCALE)) {
-                                    // ok the default properties have been
-                                    // changed.
-                                    // make sure that all resources in this
-                                    // bundle group
-                                    // are validated too:
-                                    validateEntireGroup = true;
+	/**
+	 * Collect the resource bundles to validate and index the corresponding
+	 * MessageBundleGroup(s).
+	 * 
+	 * @param resource
+	 *            The resource currently validated.
+	 */
+	void checkBundleResource(IResource resource) {
+		if (true)
+			return; // TODO [alst]
+		if (resource instanceof IFile
+				&& resource.getName().endsWith(".properties")) { //$NON-NLS-1$ //TODO have customized?
+			IFile file = (IFile) resource;
+			if (file.isDerived()) {
+				return;
+			}
+			// System.err.println("Looking at " + file.getFullPath());
+			deleteMarkers(file);
+			MessagesBundleGroup msgBundleGrp = null;
+			if (_alreadBuiltMessageBundle == null) {
+				_alreadBuiltMessageBundle = new HashMap<IFile, MessagesBundleGroup>();
+				_resourcesToValidate = new HashSet();
+			} else {
+				msgBundleGrp = _alreadBuiltMessageBundle.get(file);
+			}
+			if (msgBundleGrp == null) {
+				msgBundleGrp = MessagesBundleGroupFactory.createBundleGroup(
+						null, file);
+				if (msgBundleGrp != null) {
+					// index the files for which this MessagesBundleGroup
+					// should be used for the validation.
+					// cheaper than creating a group for each on of those
+					// files.
+					boolean validateEntireGroup = false;
+					for (IMessagesBundle msgBundle : msgBundleGrp
+							.getMessagesBundles()) {
+						Object src = ((MessagesBundle) msgBundle).getResource()
+								.getSource();
+						// System.err.println(src + " -> " + msgBundleGrp);
+						if (src instanceof IFile) {// when it is a read-only
+													// thing we don't index it.
+							_alreadBuiltMessageBundle.put((IFile) src,
+									msgBundleGrp);
+							if (!validateEntireGroup && src == resource) {
+								if (((MessagesBundle) msgBundle).getLocale() == null
+										|| ((MessagesBundle) msgBundle)
+												.getLocale().equals(
+														UIUtils.ROOT_LOCALE)) {
+									// ok the default properties have been
+									// changed.
+									// make sure that all resources in this
+									// bundle group
+									// are validated too:
+									validateEntireGroup = true;
 
-                                    // TODO: eventually something similar.
-                                    // with foo_en.properties changed.
-                                    // then foo_en_US.properties must be
-                                    // revalidated
-                                    // and foo_en_CA.properties as well.
+									// TODO: eventually something similar.
+									// with foo_en.properties changed.
+									// then foo_en_US.properties must be
+									// revalidated
+									// and foo_en_CA.properties as well.
 
-                                }
-                            }
-                        }
-                    }
-                    if (validateEntireGroup) {
-                        for (IMessagesBundle msgBundle : msgBundleGrp
-                                .getMessagesBundles()) {
-                            Object src = ((MessagesBundle) msgBundle)
-                                    .getResource().getSource();
-                            _resourcesToValidate.add(src);
-                        }
-                    }
-                }
-            }
+								}
+							}
+						}
+					}
+					if (validateEntireGroup) {
+						for (IMessagesBundle msgBundle : msgBundleGrp
+								.getMessagesBundles()) {
+							Object src = ((MessagesBundle) msgBundle)
+									.getResource().getSource();
+							_resourcesToValidate.add(src);
+						}
+					}
+				}
+			}
 
-            _resourcesToValidate.add(resource);
+			_resourcesToValidate.add(resource);
 
-        }
-    }
+		}
+	}
 
-    /**
-     * Validates the message bundles collected by the visitor. Makes sure we
-     * validate only once each message bundle and build only once each
-     * MessageBundleGroup it belongs to.
-     */
-    private void finishBuild() {
-        if (_resourcesToValidate != null) {
-            for (Iterator it = _resourcesToValidate.iterator(); it.hasNext();) {
-                IFile resource = (IFile) it.next();
-                MessagesBundleGroup msgBundleGrp = _alreadBuiltMessageBundle
-                        .get(resource);
+	/**
+	 * Validates the message bundles collected by the visitor. Makes sure we
+	 * validate only once each message bundle and build only once each
+	 * MessageBundleGroup it belongs to.
+	 */
+	private void finishBuild() {
+		if (_resourcesToValidate != null) {
+			for (Iterator it = _resourcesToValidate.iterator(); it.hasNext();) {
+				IFile resource = (IFile) it.next();
+				MessagesBundleGroup msgBundleGrp = _alreadBuiltMessageBundle
+						.get(resource);
 
-                if (msgBundleGrp != null) {
-                    // when null it is probably because it was skipped from
-                    // the group because the locale was filtered.
-                    try {
-                        //		System.out.println("Validate " + resource); //$NON-NLS-1$
-                        // TODO check if there is a matching
-                        // EclipsePropertiesEditorResource already open.
-                        // else, create MessagesBundle from
-                        // PropertiesIFileResource
-                        MessagesBundle messagesBundle = msgBundleGrp
-                                .getMessagesBundle(resource);
-                        if (messagesBundle != null) {
-                            Locale locale = messagesBundle.getLocale();
-                            MessagesBundleGroupValidator.validate(msgBundleGrp,
-                                    locale, markerStrategy);
-                        }// , _indexer);
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                } else {
-                    //	System.out.println("Not validating " + resource); //$NON-NLS-1$
-                }
-            }
-        }
-    }
+				if (msgBundleGrp != null) {
+					// when null it is probably because it was skipped from
+					// the group because the locale was filtered.
+					try {
+						//		System.out.println("Validate " + resource); //$NON-NLS-1$
+						// TODO check if there is a matching
+						// EclipsePropertiesEditorResource already open.
+						// else, create MessagesBundle from
+						// PropertiesIFileResource
+						MessagesBundle messagesBundle = msgBundleGrp
+								.getMessagesBundle(resource);
+						if (messagesBundle != null) {
+							Locale locale = messagesBundle.getLocale();
+							MessagesBundleGroupValidator.validate(msgBundleGrp,
+									locale, markerStrategy);
+						}// , _indexer);
+					} catch (Exception e) {
+						e.printStackTrace();
+					}
+				} else {
+					//	System.out.println("Not validating " + resource); //$NON-NLS-1$
+				}
+			}
+		}
+	}
 
-    private void deleteMarkers(IFile file) {
-        try {
-            //            System.out.println("Builder: deleteMarkers"); //$NON-NLS-1$
-            file.deleteMarkers(MessagesEditorPlugin.MARKER_TYPE, false,
-                    IResource.DEPTH_ZERO);
-        } catch (CoreException ce) {
-        }
-    }
+	private void deleteMarkers(IFile file) {
+		try {
+			//            System.out.println("Builder: deleteMarkers"); //$NON-NLS-1$
+			file.deleteMarkers(MessagesEditorPlugin.MARKER_TYPE, false,
+					IResource.DEPTH_ZERO);
+		} catch (CoreException ce) {
+		}
+	}
 
-    protected void fullBuild(final IProgressMonitor monitor)
-            throws CoreException {
-        //        System.out.println("Builder: fullBuild"); //$NON-NLS-1$
-        getProject().accept(new SampleResourceVisitor());
-    }
+	protected void fullBuild(final IProgressMonitor monitor)
+			throws CoreException {
+		//        System.out.println("Builder: fullBuild"); //$NON-NLS-1$
+		getProject().accept(new SampleResourceVisitor());
+	}
 
-    protected void incrementalBuild(IResourceDelta delta,
-            IProgressMonitor monitor) throws CoreException {
-        //        System.out.println("Builder: incrementalBuild"); //$NON-NLS-1$
-        delta.accept(new SampleDeltaVisitor());
-    }
+	protected void incrementalBuild(IResourceDelta delta,
+			IProgressMonitor monitor) throws CoreException {
+		//        System.out.println("Builder: incrementalBuild"); //$NON-NLS-1$
+		delta.accept(new SampleDeltaVisitor());
+	}
 
-    protected void clean(IProgressMonitor monitor) throws CoreException {
-        ResourcesPlugin
-                .getWorkspace()
-                .getRoot()
-                .deleteMarkers(MessagesEditorPlugin.MARKER_TYPE, false,
-                        IResource.DEPTH_INFINITE);
-    }
+	protected void clean(IProgressMonitor monitor) throws CoreException {
+		ResourcesPlugin
+				.getWorkspace()
+				.getRoot()
+				.deleteMarkers(MessagesEditorPlugin.MARKER_TYPE, false,
+						IResource.DEPTH_INFINITE);
+	}
 
 }
diff --git a/org.eclipse.babel.editor/src/org/eclipse/babel/editor/builder/ToggleNatureAction.java b/org.eclipse.babel.editor/src/org/eclipse/babel/editor/builder/ToggleNatureAction.java
index a8be8b6..4294914 100644
--- a/org.eclipse.babel.editor/src/org/eclipse/babel/editor/builder/ToggleNatureAction.java
+++ b/org.eclipse.babel.editor/src/org/eclipse/babel/editor/builder/ToggleNatureAction.java
@@ -10,6 +10,9 @@
  ******************************************************************************/
 package org.eclipse.babel.editor.builder;
 
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
 import org.eclipse.babel.core.util.BabelUtils;
 import org.eclipse.babel.editor.util.UIUtils;
 import org.eclipse.core.resources.IProject;
@@ -24,6 +27,8 @@
 import org.eclipse.ui.IWorkbenchPart;
 
 public class ToggleNatureAction implements IObjectActionDelegate {
+	
+	private static final Logger LOGGER = Logger.getLogger(ToggleNatureAction.class.getName());
 
     /**
      * Method call during the start up of the plugin or during a change of the
@@ -145,7 +150,7 @@
             String[] newNatures = new String[natures.length + 1];
             System.arraycopy(natures, 0, newNatures, 0, natures.length);
             newNatures[natures.length] = Nature.NATURE_ID;
-            System.out.println("New natures: "
+            LOGGER.log(Level.INFO, "New natures: "
                     + BabelUtils.join(newNatures, ", "));
             description.setNatureIds(newNatures);
             project.setDescription(description, null);
diff --git a/org.eclipse.babel.editor/src/org/eclipse/babel/editor/tree/internal/KeyTreeContributor.java b/org.eclipse.babel.editor/src/org/eclipse/babel/editor/tree/internal/KeyTreeContributor.java
index 93a3f26..00b38ba 100644
--- a/org.eclipse.babel.editor/src/org/eclipse/babel/editor/tree/internal/KeyTreeContributor.java
+++ b/org.eclipse.babel.editor/src/org/eclipse/babel/editor/tree/internal/KeyTreeContributor.java
@@ -13,6 +13,8 @@
 import java.lang.reflect.Constructor;
 import java.util.Observable;
 import java.util.Observer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import org.eclipse.babel.core.message.tree.IKeyTreeNode;
 import org.eclipse.babel.core.message.tree.TreeType;
@@ -20,6 +22,7 @@
 import org.eclipse.babel.core.message.tree.internal.IKeyTreeModelListener;
 import org.eclipse.babel.core.message.tree.internal.KeyTreeNode;
 import org.eclipse.babel.editor.IMessagesEditorChangeListener;
+import org.eclipse.babel.editor.builder.Builder;
 import org.eclipse.babel.editor.internal.AbstractMessagesEditor;
 import org.eclipse.babel.editor.internal.MessagesEditorChangeAdapter;
 import org.eclipse.babel.editor.internal.MessagesEditorMarkers;
@@ -60,6 +63,8 @@
  *
  */
 public class KeyTreeContributor implements IKeyTreeContributor {
+	
+	private static final Logger LOGGER = Logger.getLogger(KeyTreeContributor.class.getName());
 
     private AbstractMessagesEditor editor;
     private AbstractKeyTreeModel treeModel;
@@ -310,7 +315,7 @@
                 if (selection != null && selection.getFirstElement() != null) {
                     KeyTreeNode node = (KeyTreeNode) selection
                             .getFirstElement();
-                    System.out.println("viewer key/hash:"
+                    LOGGER.log(Level.INFO, "viewer key/hash:"
                             + node.getMessageKey() + "/" + node.hashCode());
                     editor.setSelectedKey(node.getMessageKey());
                 } else {
diff --git a/org.eclipse.babel.editor/src/org/eclipse/pde/nls/internal/ui/model/ResourceBundle.java b/org.eclipse.babel.editor/src/org/eclipse/pde/nls/internal/ui/model/ResourceBundle.java
index c576dda..c6ac209 100644
--- a/org.eclipse.babel.editor/src/org/eclipse/pde/nls/internal/ui/model/ResourceBundle.java
+++ b/org.eclipse.babel.editor/src/org/eclipse/pde/nls/internal/ui/model/ResourceBundle.java
@@ -104,7 +104,7 @@
 
         if (resource instanceof IFile) {
             if (debug) {
-                System.out.println("Loading " + resource + "...");
+               System.out.println("Loading " + resource + "...");
             }
             IFile file = (IFile) resource;
             InputStream inputStream = file.getContents();
diff --git a/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/ResourceBundleManager.java b/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/ResourceBundleManager.java
index 0b4e2fc..6507902 100644
--- a/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/ResourceBundleManager.java
+++ b/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/ResourceBundleManager.java
@@ -219,7 +219,7 @@
 		if (bundleName.equals("org.example.com")) {
 			Logger.logInfo("adding bundle with id: " + bundleName);
 		}
-		
+
 		resources.put(bundleName, res);
 		allBundles.put(bundleName, new HashSet<IResource>(res));
 		bundleNames.put(bundleName, getResourceBundleName(resource));
@@ -449,7 +449,7 @@
 								bundleName, res.getProject()));
 			}
 		}
-		
+
 		return rbRemoved;
 	}
 
@@ -483,7 +483,7 @@
 					rbRemoved |= excludeSingleResource(resource);
 					monitor.worked(1);
 				}
-				
+
 				if (rbRemoved) {
 					try {
 						res.getProject().build(
@@ -526,7 +526,9 @@
 							// check if the changed resource is a resource
 							// bundle
 							if (org.eclipse.babel.tapiji.tools.core.ui.utils.RBFileUtils
-									.isResourceBundleFile(resource) && !changedResourceBundles.contains(resource)) {
+									.isResourceBundleFile(resource)
+									&& !changedResourceBundles
+											.contains(resource)) {
 								changedResourceBundles.add(resource);
 							}
 							changedResources.add(resource);
@@ -562,14 +564,18 @@
 
 			for (IResource rbResource : changedResourceBundles) {
 				String bundleName = getResourceBundleId(rbResource);
-				//fullBuildRequired &= !resources.containsKey(bundleName);
+
+				// TODO check if fullbuild needs only be triggered if a complete
+				// bundle was excluded
+				// fullBuildRequired &= !resources.containsKey(bundleName);
 
 				this.addBundleResource(rbResource);
 
 				Logger.logInfo("Including resource bundle '"
 						+ rbResource.getFullPath().toOSString() + "'");
-				
-				RBManager.getInstance(rbResource.getProject()).addBundleResource(rbResource);
+				RBManager.getInstance(rbResource.getProject())
+						.addBundleResource(rbResource);
+
 				fireResourceBundleChangedEvent(getResourceBundleId(rbResource),
 						new ResourceBundleChangedEvent(
 								ResourceBundleChangedEvent.INCLUDED,
@@ -584,6 +590,20 @@
 				} catch (CoreException e) {
 					Logger.logError(e);
 				}
+			} else {
+				// trigger incremental build of included resources
+				for (IResource changedResource : changedResources) {
+					try {
+						Logger.logInfo(String.format(
+								"trigger rebuild for resource: %s",
+								changedResource));
+						changedResource.touch(monitor);
+					} catch (CoreException e) {
+						Logger.logError(String.format(
+								"error during rebuild of resource: %s",
+								changedResource), e);
+					}
+				}
 			}
 
 			fireResourceExclusionEvent(new ResourceExclusionEvent(
diff --git a/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/analyzer/ResourceFinder.java b/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/analyzer/ResourceFinder.java
index 0f73345..4677027 100644
--- a/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/analyzer/ResourceFinder.java
+++ b/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/analyzer/ResourceFinder.java
@@ -34,6 +34,8 @@
 
     @Override
     public boolean visit(IResource resource) throws CoreException {
+    	Logger.logInfo(String.format("resource finder is visiting resource %s", resource));
+    	
         if (I18nBuilder.isResourceAuditable(resource, supportedExtensions)) {
             Logger.logInfo("Audit necessary for resource '"
                     + resource.getFullPath().toOSString() + "'");
diff --git a/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/builder/ExtensionManager.java b/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/builder/ExtensionManager.java
index 59f277b..6eed916 100644
--- a/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/builder/ExtensionManager.java
+++ b/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/builder/ExtensionManager.java
@@ -26,55 +26,71 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.jface.util.IPropertyChangeListener;
 
-public class ExtensionManager {
+public final class ExtensionManager {
 
-    // list of registered extension plug-ins
-    private static List<I18nAuditor> extensions = null;
+	// list of registered extension plug-ins
+	private List<I18nAuditor> extensions = null;
 
-    // change listener for builder property change events
-    private static IPropertyChangeListener propertyChangeListener = null;
+	// change listener for builder property change events
+	private IPropertyChangeListener propertyChangeListener = null;
 
-    // file-endings supported by the registered extension plug-ins
-    private static Set<String> supportedFileEndings = new HashSet<String>();
+	// file-endings supported by the registered extension plug-ins
+	private Set<String> supportedFileEndings = new HashSet<String>();
+	
+	// singleton instance
+	private static ExtensionManager INSTANCE = null;
+	
+	private ExtensionManager() {
+		initExtensionManager();
+	}
+	
+	public static ExtensionManager getExtensionManager() {
+		if (INSTANCE == null) {
+			INSTANCE = new ExtensionManager();
+		}
+		
+		return INSTANCE;
+	}
 
-    public static List<I18nAuditor> getRegisteredI18nAuditors() {
-        if (extensions == null) {
-            extensions = new ArrayList<I18nAuditor>();
+	private void initExtensionManager() {
+		extensions = new ArrayList<I18nAuditor>();
 
-            // init default auditors
-            extensions.add(new RBAuditor());
+		// init default auditors
+		extensions.add(new RBAuditor());
 
-            // lookup registered auditor extensions
-            IConfigurationElement[] config = Platform
-                    .getExtensionRegistry()
-                    .getConfigurationElementsFor(Activator.BUILDER_EXTENSION_ID);
+		// lookup registered auditor extensions
+		IConfigurationElement[] config = Platform
+				.getExtensionRegistry()
+				.getConfigurationElementsFor(Activator.BUILDER_EXTENSION_ID);
 
-            try {
-                for (IConfigurationElement e : config) {
-                    addExtensionPlugIn((I18nAuditor) e
-                            .createExecutableExtension("class"));
-                }
-            } catch (CoreException ex) {
-                Logger.logError(ex);
-            }
-        }
+		try {
+			for (IConfigurationElement e : config) {
+				addExtensionPlugIn((I18nAuditor) e
+						.createExecutableExtension("class"));
+			}
+		} catch (CoreException ex) {
+			Logger.logError(ex);
+		}
+	}
+	
+	public List<I18nAuditor> getRegisteredI18nAuditors() {
+		
+		// init builder property change listener
+		if (propertyChangeListener == null) {
+			propertyChangeListener = new BuilderPropertyChangeListener();
+			TapiJIPreferences.addPropertyChangeListener(propertyChangeListener);
+		}
 
-        // init builder property change listener
-        if (propertyChangeListener == null) {
-            propertyChangeListener = new BuilderPropertyChangeListener();
-            TapiJIPreferences.addPropertyChangeListener(propertyChangeListener);
-        }
+		return extensions;
+	}
 
-        return extensions;
-    }
+	public Set<String> getSupportedFileEndings() {
+		return supportedFileEndings;
+	}
 
-    public static Set<String> getSupportedFileEndings() {
-        return supportedFileEndings;
-    }
-
-    private static void addExtensionPlugIn(I18nAuditor extension) {
-        I18nAuditor a = extension;
-        extensions.add(a);
-        supportedFileEndings.addAll(Arrays.asList(a.getFileEndings()));
-    }
+	private void addExtensionPlugIn(I18nAuditor extension) {
+		I18nAuditor a = extension;
+		extensions.add(a);
+		supportedFileEndings.addAll(Arrays.asList(a.getFileEndings()));
+	}
 }
diff --git a/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/builder/I18nBuilder.java b/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/builder/I18nBuilder.java
index ae2b951..9124c82 100644
--- a/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/builder/I18nBuilder.java
+++ b/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/builder/I18nBuilder.java
@@ -44,428 +44,447 @@
 
 public class I18nBuilder extends IncrementalProjectBuilder {
 
-    public static final String BUILDER_ID = ResourceBundleManager.BUILDER_ID;
+	public static final String BUILDER_ID = ResourceBundleManager.BUILDER_ID;
+	
+	private static final ExtensionManager extensionManager = ExtensionManager.getExtensionManager();
 
-    public static I18nAuditor getI18nAuditorByContext(String contextId)
-            throws NoSuchResourceAuditorException {
-        for (I18nAuditor auditor : ExtensionManager.getRegisteredI18nAuditors()) {
-            if (auditor.getContextId().equals(contextId)) {
-                return auditor;
-            }
-        }
-        throw new NoSuchResourceAuditorException();
-    }
+	public static I18nAuditor getI18nAuditorByContext(String contextId)
+			throws NoSuchResourceAuditorException {
+		for (I18nAuditor auditor : extensionManager.getRegisteredI18nAuditors()) {
+			if (auditor.getContextId().equals(contextId)) {
+				return auditor;
+			}
+		}
+		throw new NoSuchResourceAuditorException();
+	}
 
-    public static boolean isResourceAuditable(IResource resource,
-            Set<String> supportedExtensions) {
-        for (String ext : supportedExtensions) {
-            if (resource.getType() == IResource.FILE && !resource.isDerived()
-                    && resource.getFileExtension() != null
-                    && (resource.getFileExtension().equalsIgnoreCase(ext))) {
-                return true;
-            }
-        }
-        return false;
-    }
+	public static boolean isResourceAuditable(IResource resource,
+			Set<String> supportedExtensions) {
+		for (String ext : supportedExtensions) {
+			if (resource.getType() == IResource.FILE && !resource.isDerived()
+					&& resource.getFileExtension() != null
+					&& (resource.getFileExtension().equalsIgnoreCase(ext))) {
+				return true;
+			}
+		}
+		return false;
+	}
 
-    @Override
-    protected IProject[] build(final int kind, Map args,
-            IProgressMonitor monitor) throws CoreException {
+	@Override
+	protected IProject[] build(final int kind, Map args,
+			IProgressMonitor monitor) throws CoreException {
 
-        ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
-            @Override
-            public void run(IProgressMonitor monitor) throws CoreException {
-                if (kind == FULL_BUILD) {
-                    fullBuild(monitor);
-                } else {
-                    // only perform audit if the resource delta is not empty
-                    IResourceDelta resDelta = getDelta(getProject());
+		ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
+			@Override
+			public void run(IProgressMonitor monitor) throws CoreException {
+				if (kind == FULL_BUILD) {
+					Logger.logInfo("full project build was triggered");
+					fullBuild(monitor);
+				} else {
+					Logger.logInfo("incremental project build was triggered for: ");
+					// only perform audit if the resource delta is not empty
+					IResourceDelta resDelta = getDelta(getProject());
 
-                    if (resDelta == null) {
-                        return;
-                    }
+					if (resDelta == null) {
+						Logger.logInfo(" (empty resource delta)");
+						return;
+					}
 
-                    if (resDelta.getAffectedChildren() == null) {
-                        return;
-                    }
+					if (resDelta.getAffectedChildren() == null) {
+						Logger.logInfo(" (empty resource delta)");
+						return;
+					}
 
-                    incrementalBuild(monitor, resDelta);
-                }
-            }
-        }, monitor);
+					incrementalBuild(monitor, resDelta);
+				}
+			}
+		}, monitor);
 
-        return null;
-    }
+		return null;
+	}
 
-    private void incrementalBuild(IProgressMonitor monitor,
-            IResourceDelta resDelta) throws CoreException {
-        try {
-            // inspect resource delta
-            ResourceFinder csrav = new ResourceFinder(
-                    ExtensionManager.getSupportedFileEndings());
-            resDelta.accept(csrav);
-            auditResources(csrav.getResources(), monitor, getProject());
-        } catch (CoreException e) {
-            Logger.logError(e);
-        }
-    }
+	private void incrementalBuild(IProgressMonitor monitor,
+			IResourceDelta resDelta) throws CoreException {
+		try {
+			for (final IResourceDelta changedResource : resDelta
+					.getAffectedChildren()) {
+				Logger.logInfo(String.format(" - %s",
+						changedResource.getResource()));
+			}
 
-    public void buildResource(IResource resource, IProgressMonitor monitor) {
-        if (isResourceAuditable(resource,
-                ExtensionManager.getSupportedFileEndings())) {
-            List<IResource> resources = new ArrayList<IResource>();
-            resources.add(resource);
-            // TODO: create instance of progressmonitor and hand it over to
-            // auditResources
-            try {
-                auditResources(resources, monitor, resource.getProject());
-            } catch (Exception e) {
-                Logger.logError(e);
-            }
-        }
-    }
+			// inspect resource delta
+			Logger.logInfo(String
+					.format("looking for resources with the following file endings: %s",
+							extensionManager.getSupportedFileEndings()));
+			ResourceFinder csrav = new ResourceFinder(
+					extensionManager.getSupportedFileEndings());
+			resDelta.accept(csrav);
 
-    public void buildProject(IProgressMonitor monitor, IProject proj) {
-        try {
-            ResourceFinder csrav = new ResourceFinder(
-                    ExtensionManager.getSupportedFileEndings());
-            proj.accept(csrav);
-            auditResources(csrav.getResources(), monitor, proj);
-        } catch (CoreException e) {
-            Logger.logError(e);
-        }
-    }
+			Logger.logInfo(String.format(
+					"Audit triggered for derived resources: %s",
+					csrav.getResources()));
+			auditResources(csrav.getResources(), monitor, getProject());
+		} catch (CoreException e) {
+			Logger.logError(e);
+		}
+	}
 
-    private void fullBuild(IProgressMonitor monitor) {
-        buildProject(monitor, getProject());
-    }
+	public void buildResource(IResource resource, IProgressMonitor monitor) {
+		if (isResourceAuditable(resource,
+				extensionManager.getSupportedFileEndings())) {
+			List<IResource> resources = new ArrayList<IResource>();
+			resources.add(resource);
+			// TODO: create instance of progressmonitor and hand it over to
+			// auditResources
+			try {
+				auditResources(resources, monitor, resource.getProject());
+			} catch (Exception e) {
+				Logger.logError(e);
+			}
+		}
+	}
 
-    private void auditResources(List<IResource> resources,
-            IProgressMonitor monitor, IProject project) {
-        IConfiguration configuration = ConfigurationManager.getInstance()
-                .getConfiguration();
+	public void buildProject(IProgressMonitor monitor, IProject proj) {
+		try {
+			ResourceFinder csrav = new ResourceFinder(
+					extensionManager.getSupportedFileEndings());
+			proj.accept(csrav);
+			auditResources(csrav.getResources(), monitor, proj);
+		} catch (CoreException e) {
+			Logger.logError(e);
+		}
+	}
 
-        int work = resources.size();
-        if (monitor == null) {
-            monitor = new NullProgressMonitor();
-        }
+	private void fullBuild(IProgressMonitor monitor) {
+		buildProject(monitor, getProject());
+	}
 
-        monitor.beginTask(
-                "Audit resource file for Internationalization problems", work);
-        
-        for (I18nAuditor ra : ExtensionManager.getRegisteredI18nAuditors()) {
-            if (ra instanceof I18nResourceAuditor) {
-                ((I18nResourceAuditor)ra).reset();
-            }
-        }
+	private void auditResources(List<IResource> resources,
+			IProgressMonitor monitor, IProject project) {
+		IConfiguration configuration = ConfigurationManager.getInstance()
+				.getConfiguration();
 
-        for (IResource resource : resources) {
-            monitor.subTask("'" + resource.getFullPath().toOSString() + "'");
-            if (monitor.isCanceled()) {
-                throw new OperationCanceledException();
-            }
+		int work = resources.size();
+		if (monitor == null) {
+			monitor = new NullProgressMonitor();
+		}
 
-            if (!EditorUtils.deleteAuditMarkersForResource(resource)) {
-                continue;
-            }
+		monitor.beginTask(
+				"Audit resource file for Internationalization problems", work);
 
-            if (ResourceBundleManager.isResourceExcluded(resource)) {
-                continue;
-            }
+		for (I18nAuditor ra : extensionManager.getRegisteredI18nAuditors()) {
+			if (ra instanceof I18nResourceAuditor) {
+				((I18nResourceAuditor) ra).reset();
+			}
+		}
 
-            if (!resource.exists()) {
-                continue;
-            }
+		for (IResource resource : resources) {
+			monitor.subTask("'" + resource.getFullPath().toOSString() + "'");
+			if (monitor.isCanceled()) {
+				throw new OperationCanceledException();
+			}
 
-            for (I18nAuditor ra : ExtensionManager.getRegisteredI18nAuditors()) {
-                if (ra instanceof I18nResourceAuditor
-                        && !(configuration.getAuditResource())) {
-                    continue;
-                }
-                if (ra instanceof I18nRBAuditor
-                        && !(configuration.getAuditRb())) {
-                    continue;
-                }
+			if (!EditorUtils.deleteAuditMarkersForResource(resource)) {
+				continue;
+			}
 
-                try {
-                    if (monitor.isCanceled()) {
-                        monitor.done();
-                        break;
-                    }
+			if (ResourceBundleManager.isResourceExcluded(resource)) {
+				continue;
+			}
 
-                    if (ra.isResourceOfType(resource)) {
-                        ra.audit(resource);
-                    }
-                } catch (Exception e) {
-                    Logger.logError(
-                            "Error during auditing '" + resource.getFullPath()
-                                    + "'", e);
-                }
-            }
+			if (!resource.exists()) {
+				continue;
+			}
 
-            if (monitor != null) {
-                monitor.worked(1);
-            }
-        }
+			for (I18nAuditor ra : extensionManager.getRegisteredI18nAuditors()) {
+				if (ra instanceof I18nResourceAuditor
+						&& !(configuration.getAuditResource())) {
+					continue;
+				}
+				if (ra instanceof I18nRBAuditor
+						&& !(configuration.getAuditRb())) {
+					continue;
+				}
 
-        for (I18nAuditor a : ExtensionManager.getRegisteredI18nAuditors()) {
-            if (a instanceof I18nResourceAuditor) {
-                handleI18NAuditorMarkers((I18nResourceAuditor) a);
-            }
-            if (a instanceof I18nRBAuditor) {
-                handleI18NAuditorMarkers((I18nRBAuditor) a);
-                ((I18nRBAuditor) a).resetProblems();
-            }
-        }
+				try {
+					if (monitor.isCanceled()) {
+						monitor.done();
+						break;
+					}
 
-        monitor.done();
-    }
+					if (ra.isResourceOfType(resource)) {
+						ra.audit(resource);
+					}
+				} catch (Exception e) {
+					Logger.logError(
+							"Error during auditing '" + resource.getFullPath()
+									+ "'", e);
+				}
+			}
 
-    private void handleI18NAuditorMarkers(I18nResourceAuditor ra) {
-        try {
-            for (ILocation problem : ra.getConstantStringLiterals()) {
-                EditorUtils
-                        .reportToMarker(
-                                org.eclipse.babel.tapiji.tools.core.util.EditorUtils
-                                        .getFormattedMessage(
-                                                org.eclipse.babel.tapiji.tools.core.util.EditorUtils.MESSAGE_NON_LOCALIZED_LITERAL,
-                                                new String[] { problem
-                                                        .getLiteral() }),
-                                problem,
-                                MarkerConstants.CAUSE_CONSTANT_LITERAL, "",
-                                (ILocation) problem.getData(), ra
-                                        .getContextId());
-            }
+			if (monitor != null) {
+				monitor.worked(1);
+			}
+		}
 
-            // Report all broken Resource-Bundle references
-            for (ILocation brokenLiteral : ra.getBrokenResourceReferences()) {
-                EditorUtils
-                        .reportToMarker(
-                                org.eclipse.babel.tapiji.tools.core.util.EditorUtils
-                                        .getFormattedMessage(
-                                                org.eclipse.babel.tapiji.tools.core.util.EditorUtils.MESSAGE_BROKEN_RESOURCE_REFERENCE,
-                                                new String[] {
-                                                        brokenLiteral
-                                                                .getLiteral(),
-                                                        ((ILocation) brokenLiteral
-                                                                .getData())
-                                                                .getLiteral() }),
-                                brokenLiteral,
-                                MarkerConstants.CAUSE_BROKEN_REFERENCE,
-                                brokenLiteral.getLiteral(),
-                                (ILocation) brokenLiteral.getData(), ra
-                                        .getContextId());
-            }
+		for (I18nAuditor a : extensionManager.getRegisteredI18nAuditors()) {
+			if (a instanceof I18nResourceAuditor) {
+				handleI18NAuditorMarkers((I18nResourceAuditor) a);
+			}
+			if (a instanceof I18nRBAuditor) {
+				handleI18NAuditorMarkers((I18nRBAuditor) a);
+				((I18nRBAuditor) a).resetProblems();
+			}
+		}
 
-            // Report all broken definitions to Resource-Bundle
-            // references
-            for (ILocation brokenLiteral : ra.getBrokenBundleReferences()) {
-                EditorUtils
-                        .reportToMarker(
-                                org.eclipse.babel.tapiji.tools.core.util.EditorUtils
-                                        .getFormattedMessage(
-                                                org.eclipse.babel.tapiji.tools.core.util.EditorUtils.MESSAGE_BROKEN_RESOURCE_BUNDLE_REFERENCE,
-                                                new String[] { brokenLiteral
-                                                        .getLiteral() }),
-                                brokenLiteral,
-                                MarkerConstants.CAUSE_BROKEN_RB_REFERENCE,
-                                brokenLiteral.getLiteral(),
-                                (ILocation) brokenLiteral.getData(), ra
-                                        .getContextId());
-            }
-        } catch (Exception e) {
-            Logger.logError(
-                    "Exception during reporting of Internationalization errors",
-                    e);
-        }
-    }
+		monitor.done();
+	}
 
-    private void handleI18NAuditorMarkers(I18nRBAuditor ra) {
-        IConfiguration configuration = ConfigurationManager.getInstance()
-                .getConfiguration();
-        try {
-            // Report all unspecified keys
-            if (configuration.getAuditMissingValue()) {
-                for (ILocation problem : ra.getUnspecifiedKeyReferences()) {
-                    EditorUtils
-                            .reportToRBMarker(
-                                    org.eclipse.babel.tapiji.tools.core.util.EditorUtils
-                                            .getFormattedMessage(
-                                                    org.eclipse.babel.tapiji.tools.core.util.EditorUtils.MESSAGE_UNSPECIFIED_KEYS,
-                                                    new String[] {
-                                                            problem.getLiteral(),
-                                                            problem.getFile()
-                                                                    .getName() }),
-                                    problem,
-                                    MarkerConstants.CAUSE_UNSPEZIFIED_KEY,
-                                    problem.getLiteral(), "",
-                                    (ILocation) problem.getData(), ra
-                                            .getContextId());
-                }
-            }
+	private void handleI18NAuditorMarkers(I18nResourceAuditor ra) {
+		try {
+			for (ILocation problem : ra.getConstantStringLiterals()) {
+				EditorUtils
+						.reportToMarker(
+								org.eclipse.babel.tapiji.tools.core.util.EditorUtils
+										.getFormattedMessage(
+												org.eclipse.babel.tapiji.tools.core.util.EditorUtils.MESSAGE_NON_LOCALIZED_LITERAL,
+												new String[] { problem
+														.getLiteral() }),
+								problem,
+								MarkerConstants.CAUSE_CONSTANT_LITERAL, "",
+								(ILocation) problem.getData(), ra
+										.getContextId());
+			}
 
-            // Report all same values
-            if (configuration.getAuditSameValue()) {
-                Map<ILocation, ILocation> sameValues = ra
-                        .getSameValuesReferences();
-                for (ILocation problem : sameValues.keySet()) {
-                    EditorUtils
-                            .reportToRBMarker(
-                                    org.eclipse.babel.tapiji.tools.core.util.EditorUtils
-                                            .getFormattedMessage(
-                                                    org.eclipse.babel.tapiji.tools.core.util.EditorUtils.MESSAGE_SAME_VALUE,
-                                                    new String[] {
-                                                            problem.getFile()
-                                                                    .getName(),
-                                                            sameValues
-                                                                    .get(problem)
-                                                                    .getFile()
-                                                                    .getName(),
-                                                            problem.getLiteral() }),
-                                    problem,
-                                    MarkerConstants.CAUSE_SAME_VALUE,
-                                    problem.getLiteral(),
-                                    sameValues.get(problem).getFile().getName(),
-                                    (ILocation) problem.getData(), ra
-                                            .getContextId());
-                }
-            }
-            // Report all missing languages
-            if (configuration.getAuditMissingLanguage()) {
-                for (ILocation problem : ra.getMissingLanguageReferences()) {
-                    EditorUtils
-                            .reportToRBMarker(
-                                    org.eclipse.babel.tapiji.tools.core.util.EditorUtils
-                                            .getFormattedMessage(
-                                                    org.eclipse.babel.tapiji.tools.core.util.EditorUtils.MESSAGE_MISSING_LANGUAGE,
-                                                    new String[] {
-                                                            RBFileUtils
-                                                                    .getCorrespondingResourceBundleId(problem
-                                                                            .getFile()),
-                                                            problem.getLiteral() }),
-                                    problem,
-                                    MarkerConstants.CAUSE_MISSING_LANGUAGE,
-                                    problem.getLiteral(), "",
-                                    (ILocation) problem.getData(), ra
-                                            .getContextId());
-                }
-            }
-        } catch (Exception e) {
-            Logger.logError(
-                    "Exception during reporting of Internationalization errors",
-                    e);
-        }
-    }
+			// Report all broken Resource-Bundle references
+			for (ILocation brokenLiteral : ra.getBrokenResourceReferences()) {
+				EditorUtils
+						.reportToMarker(
+								org.eclipse.babel.tapiji.tools.core.util.EditorUtils
+										.getFormattedMessage(
+												org.eclipse.babel.tapiji.tools.core.util.EditorUtils.MESSAGE_BROKEN_RESOURCE_REFERENCE,
+												new String[] {
+														brokenLiteral
+																.getLiteral(),
+														((ILocation) brokenLiteral
+																.getData())
+																.getLiteral() }),
+								brokenLiteral,
+								MarkerConstants.CAUSE_BROKEN_REFERENCE,
+								brokenLiteral.getLiteral(),
+								(ILocation) brokenLiteral.getData(), ra
+										.getContextId());
+			}
 
-    @SuppressWarnings("unused")
-    private void setProgress(IProgressMonitor monitor, int progress)
-            throws InterruptedException {
-        monitor.worked(progress);
+			// Report all broken definitions to Resource-Bundle
+			// references
+			for (ILocation brokenLiteral : ra.getBrokenBundleReferences()) {
+				EditorUtils
+						.reportToMarker(
+								org.eclipse.babel.tapiji.tools.core.util.EditorUtils
+										.getFormattedMessage(
+												org.eclipse.babel.tapiji.tools.core.util.EditorUtils.MESSAGE_BROKEN_RESOURCE_BUNDLE_REFERENCE,
+												new String[] { brokenLiteral
+														.getLiteral() }),
+								brokenLiteral,
+								MarkerConstants.CAUSE_BROKEN_RB_REFERENCE,
+								brokenLiteral.getLiteral(),
+								(ILocation) brokenLiteral.getData(), ra
+										.getContextId());
+			}
+		} catch (Exception e) {
+			Logger.logError(
+					"Exception during reporting of Internationalization errors",
+					e);
+		}
+	}
 
-        if (monitor.isCanceled()) {
-            throw new OperationCanceledException();
-        }
+	private void handleI18NAuditorMarkers(I18nRBAuditor ra) {
+		IConfiguration configuration = ConfigurationManager.getInstance()
+				.getConfiguration();
+		try {
+			// Report all unspecified keys
+			if (configuration.getAuditMissingValue()) {
+				for (ILocation problem : ra.getUnspecifiedKeyReferences()) {
+					EditorUtils
+							.reportToRBMarker(
+									org.eclipse.babel.tapiji.tools.core.util.EditorUtils
+											.getFormattedMessage(
+													org.eclipse.babel.tapiji.tools.core.util.EditorUtils.MESSAGE_UNSPECIFIED_KEYS,
+													new String[] {
+															problem.getLiteral(),
+															problem.getFile()
+																	.getName() }),
+									problem,
+									MarkerConstants.CAUSE_UNSPEZIFIED_KEY,
+									problem.getLiteral(), "",
+									(ILocation) problem.getData(), ra
+											.getContextId());
+				}
+			}
 
-        if (isInterrupted()) {
-            throw new InterruptedException();
-        }
-    }
+			// Report all same values
+			if (configuration.getAuditSameValue()) {
+				Map<ILocation, ILocation> sameValues = ra
+						.getSameValuesReferences();
+				for (ILocation problem : sameValues.keySet()) {
+					EditorUtils
+							.reportToRBMarker(
+									org.eclipse.babel.tapiji.tools.core.util.EditorUtils
+											.getFormattedMessage(
+													org.eclipse.babel.tapiji.tools.core.util.EditorUtils.MESSAGE_SAME_VALUE,
+													new String[] {
+															problem.getFile()
+																	.getName(),
+															sameValues
+																	.get(problem)
+																	.getFile()
+																	.getName(),
+															problem.getLiteral() }),
+									problem,
+									MarkerConstants.CAUSE_SAME_VALUE,
+									problem.getLiteral(),
+									sameValues.get(problem).getFile().getName(),
+									(ILocation) problem.getData(), ra
+											.getContextId());
+				}
+			}
+			// Report all missing languages
+			if (configuration.getAuditMissingLanguage()) {
+				for (ILocation problem : ra.getMissingLanguageReferences()) {
+					EditorUtils
+							.reportToRBMarker(
+									org.eclipse.babel.tapiji.tools.core.util.EditorUtils
+											.getFormattedMessage(
+													org.eclipse.babel.tapiji.tools.core.util.EditorUtils.MESSAGE_MISSING_LANGUAGE,
+													new String[] {
+															RBFileUtils
+																	.getCorrespondingResourceBundleId(problem
+																			.getFile()),
+															problem.getLiteral() }),
+									problem,
+									MarkerConstants.CAUSE_MISSING_LANGUAGE,
+									problem.getLiteral(), "",
+									(ILocation) problem.getData(), ra
+											.getContextId());
+				}
+			}
+		} catch (Exception e) {
+			Logger.logError(
+					"Exception during reporting of Internationalization errors",
+					e);
+		}
+	}
 
-    @Override
-    protected void clean(IProgressMonitor monitor) throws CoreException {
-        // TODO Auto-generated method stub
-        super.clean(monitor);
-    }
+	@SuppressWarnings("unused")
+	private void setProgress(IProgressMonitor monitor, int progress)
+			throws InterruptedException {
+		monitor.worked(progress);
 
-    public static void addBuilderToProject(IProject project) {
-        Logger.logInfo("Internationalization-Builder registered for '"
-                + project.getName() + "'");
+		if (monitor.isCanceled()) {
+			throw new OperationCanceledException();
+		}
 
-        // Only for open projects
-        if (!project.isOpen()) {
-            return;
-        }
+		if (isInterrupted()) {
+			throw new InterruptedException();
+		}
+	}
 
-        IProjectDescription description = null;
-        try {
-            description = project.getDescription();
-        } catch (CoreException e) {
-            Logger.logError(e);
-            return;
-        }
+	@Override
+	protected void clean(IProgressMonitor monitor) throws CoreException {
+		// TODO Auto-generated method stub
+		super.clean(monitor);
+	}
 
-        // Check if the builder is already associated to the specified project
-        ICommand[] commands = description.getBuildSpec();
-        for (ICommand command : commands) {
-            if (command.getBuilderName().equals(BUILDER_ID)) {
-                return;
-            }
-        }
+	public static void addBuilderToProject(IProject project) {
+		Logger.logInfo("Internationalization-Builder registered for '"
+				+ project.getName() + "'");
 
-        // Associate the builder with the project
-        ICommand builderCmd = description.newCommand();
-        builderCmd.setBuilderName(BUILDER_ID);
-        List<ICommand> newCommands = new ArrayList<ICommand>();
-        newCommands.addAll(Arrays.asList(commands));
-        newCommands.add(builderCmd);
-        description.setBuildSpec(newCommands.toArray(new ICommand[newCommands
-                .size()]));
+		// Only for open projects
+		if (!project.isOpen()) {
+			return;
+		}
 
-        try {
-            project.setDescription(description, null);
-        } catch (CoreException e) {
-            Logger.logError(e);
-        }
-    }
+		IProjectDescription description = null;
+		try {
+			description = project.getDescription();
+		} catch (CoreException e) {
+			Logger.logError(e);
+			return;
+		}
 
-    public static void removeBuilderFromProject(IProject project) {
-        // Only for open projects
-        if (!project.isOpen()) {
-            return;
-        }
+		// Check if the builder is already associated to the specified project
+		ICommand[] commands = description.getBuildSpec();
+		for (ICommand command : commands) {
+			if (command.getBuilderName().equals(BUILDER_ID)) {
+				return;
+			}
+		}
 
-        try {
-            project.deleteMarkers(EditorUtils.MARKER_ID, false,
-                    IResource.DEPTH_INFINITE);
-            project.deleteMarkers(EditorUtils.RB_MARKER_ID, false,
-                    IResource.DEPTH_INFINITE);
-        } catch (CoreException e1) {
-            Logger.logError(e1);
-        }
+		// Associate the builder with the project
+		ICommand builderCmd = description.newCommand();
+		builderCmd.setBuilderName(BUILDER_ID);
+		List<ICommand> newCommands = new ArrayList<ICommand>();
+		newCommands.addAll(Arrays.asList(commands));
+		newCommands.add(builderCmd);
+		description.setBuildSpec(newCommands.toArray(new ICommand[newCommands
+				.size()]));
 
-        IProjectDescription description = null;
-        try {
-            description = project.getDescription();
-        } catch (CoreException e) {
-            Logger.logError(e);
-            return;
-        }
+		try {
+			project.setDescription(description, null);
+		} catch (CoreException e) {
+			Logger.logError(e);
+		}
+	}
 
-        // remove builder from project
-        int idx = -1;
-        ICommand[] commands = description.getBuildSpec();
-        for (int i = 0; i < commands.length; i++) {
-            if (commands[i].getBuilderName().equals(BUILDER_ID)) {
-                idx = i;
-                break;
-            }
-        }
-        if (idx == -1) {
-            return;
-        }
+	public static void removeBuilderFromProject(IProject project) {
+		// Only for open projects
+		if (!project.isOpen()) {
+			return;
+		}
 
-        List<ICommand> newCommands = new ArrayList<ICommand>();
-        newCommands.addAll(Arrays.asList(commands));
-        newCommands.remove(idx);
-        description.setBuildSpec(newCommands.toArray(new ICommand[newCommands
-                .size()]));
+		try {
+			project.deleteMarkers(EditorUtils.MARKER_ID, false,
+					IResource.DEPTH_INFINITE);
+			project.deleteMarkers(EditorUtils.RB_MARKER_ID, false,
+					IResource.DEPTH_INFINITE);
+		} catch (CoreException e1) {
+			Logger.logError(e1);
+		}
 
-        try {
-            project.setDescription(description, null);
-        } catch (CoreException e) {
-            Logger.logError(e);
-        }
+		IProjectDescription description = null;
+		try {
+			description = project.getDescription();
+		} catch (CoreException e) {
+			Logger.logError(e);
+			return;
+		}
 
-    }
+		// remove builder from project
+		int idx = -1;
+		ICommand[] commands = description.getBuildSpec();
+		for (int i = 0; i < commands.length; i++) {
+			if (commands[i].getBuilderName().equals(BUILDER_ID)) {
+				idx = i;
+				break;
+			}
+		}
+		if (idx == -1) {
+			return;
+		}
+
+		List<ICommand> newCommands = new ArrayList<ICommand>();
+		newCommands.addAll(Arrays.asList(commands));
+		newCommands.remove(idx);
+		description.setBuildSpec(newCommands.toArray(new ICommand[newCommands
+				.size()]));
+
+		try {
+			project.setDescription(description, null);
+		} catch (CoreException e) {
+			Logger.logError(e);
+		}
+
+	}
 
 }
diff --git a/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/menus/InternationalizationMenu.java b/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/menus/InternationalizationMenu.java
index bc69e95..adb6336 100644
--- a/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/menus/InternationalizationMenu.java
+++ b/org.eclipse.babel.tapiji.tools.core.ui/src/org/eclipse/babel/tapiji/tools/core/ui/menus/InternationalizationMenu.java
@@ -295,8 +295,6 @@
             final Class<? extends IAdaptable> type,
             final ISelection selection) {
         if (selection instanceof IStructuredSelection) {
-            System.out.println(((IStructuredSelection) selection)
-                    .getFirstElement().getClass());
             return type.isAssignableFrom(((IStructuredSelection) selection)
                     .getFirstElement().getClass());
         }
