Define a stand-alone logging mechanism
diff --git a/plugins/org.eclipse.mylyn.docs.intent.client.ui/plugin.xml b/plugins/org.eclipse.mylyn.docs.intent.client.ui/plugin.xml
index aed063d..8be0859 100644
--- a/plugins/org.eclipse.mylyn.docs.intent.client.ui/plugin.xml
+++ b/plugins/org.eclipse.mylyn.docs.intent.client.ui/plugin.xml
@@ -288,4 +288,10 @@
                 id="org.eclipse.mylyn.docs.intent.client.ui.editor.IntentEditorInputFactory">
           </factory>
        </extension>
+       <extension
+             point="org.eclipse.mylyn.docs.intent.collab.common.intentlogger">
+          <logger
+                class="org.eclipse.mylyn.docs.intent.client.ui.internal.logger.EclipseBasedIntentLogger">
+          </logger>
+       </extension>
 </plugin>
diff --git a/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/internal/logger/EclipseBasedIntentLogger.java b/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/internal/logger/EclipseBasedIntentLogger.java
new file mode 100644
index 0000000..957b05b
--- /dev/null
+++ b/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/internal/logger/EclipseBasedIntentLogger.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.docs.intent.client.ui.internal.logger;
+
+import org.eclipse.core.runtime.ILog;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.docs.intent.client.ui.IntentEditorActivator;
+import org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * An {@link IIntentLogger} that logs issues in the Eclipse Error log.
+ * 
+ * @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
+ */
+public class EclipseBasedIntentLogger implements IIntentLogger {
+
+	/**
+	 * The {@link ILog} to delegate logging to.
+	 */
+	private ILog delegateLogger;
+
+	/**
+	 * Indicates whether lifecycle informations (like the fact that the compiler has done compiling resources,
+	 * that the indexer indexed content...) should be displayed or not.
+	 */
+	private boolean shouldDisplayLifecycleInformations;
+
+	/**
+	 * Default constructor.
+	 * 
+	 * @param delegateLogger
+	 *            the logger to delegate to
+	 */
+	public EclipseBasedIntentLogger() {
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger#log(org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger.LogType,
+	 *      java.lang.String)
+	 */
+	public void log(LogType logType, String message) {
+		log(logType, message, null);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger#log(org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger.LogType,
+	 *      java.lang.String, java.lang.Throwable)
+	 */
+	public void log(LogType logType, String message, Throwable exception) {
+		boolean shouldLog = true;
+		int severity = 0;
+		switch (logType) {
+			case CRITICAL_ERROR:
+				severity = IStatus.ERROR;
+				MessageDialog.openError(Display.getCurrent().getActiveShell(), "Intent - An error occured",
+						message);
+			case ERROR:
+				severity = IStatus.ERROR;
+				break;
+			case WARNING:
+				severity = IStatus.WARNING;
+				break;
+			case INFO:
+				severity = IStatus.INFO;
+				break;
+			case LIFECYCLE:
+				shouldLog = !shouldDisplayLifecycleInformations;
+				severity = IStatus.INFO;
+				break;
+			default:
+				break;
+		}
+		if (shouldLog) {
+			IStatus status = null;
+			if (exception != null) {
+				status = new Status(severity, IntentEditorActivator.EDITOR_ID, message, exception);
+			} else {
+				status = new Status(severity, IntentEditorActivator.EDITOR_ID, message);
+			}
+			getLogger().log(status);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger#setDisplayLifecycleInformations(boolean)
+	 */
+	public void setDisplayLifecycleInformations(boolean shouldDisplayLifecycleInformations) {
+		this.shouldDisplayLifecycleInformations = shouldDisplayLifecycleInformations;
+	}
+
+	private ILog getLogger() {
+		if (this.delegateLogger == null) {
+			this.delegateLogger = IntentEditorActivator.getDefault().getLog();
+		}
+		return this.delegateLogger;
+	}
+
+}
diff --git a/plugins/org.eclipse.mylyn.docs.intent.collab.common/META-INF/MANIFEST.MF b/plugins/org.eclipse.mylyn.docs.intent.collab.common/META-INF/MANIFEST.MF
index 8424557..5467019 100644
--- a/plugins/org.eclipse.mylyn.docs.intent.collab.common/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.mylyn.docs.intent.collab.common/META-INF/MANIFEST.MF
@@ -2,11 +2,15 @@
 Bundle-ManifestVersion: 2
 Bundle-Localization: plugin
 Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.mylyn.docs.intent.collab.common
+Bundle-SymbolicName: org.eclipse.mylyn.docs.intent.collab.common;singleton:=true
 Bundle-Version: 0.7.0.qualifier
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Export-Package: org.eclipse.mylyn.docs.intent.collab.common,
- org.eclipse.mylyn.docs.intent.collab.common.location
+ org.eclipse.mylyn.docs.intent.collab.common.location,
+ org.eclipse.mylyn.docs.intent.collab.common.logger
 Bundle-Vendor: %providerName
 Require-Bundle: org.eclipse.core.resources,
- org.eclipse.mylyn.docs.intent.collab
+ org.eclipse.mylyn.docs.intent.collab,
+ com.google.guava;bundle-version="10.0.1"
+Bundle-Activator: IntentRepositoryActivator
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.mylyn.docs.intent.collab.common/build.properties b/plugins/org.eclipse.mylyn.docs.intent.collab.common/build.properties
index 0418c6f..0f63778 100644
--- a/plugins/org.eclipse.mylyn.docs.intent.collab.common/build.properties
+++ b/plugins/org.eclipse.mylyn.docs.intent.collab.common/build.properties
@@ -13,5 +13,6 @@
 bin.includes = META-INF/,\
                .,\
                about.html,\
-               plugin.properties
+               plugin.properties,\
+               plugin.xml
 src.includes = about.html
diff --git a/plugins/org.eclipse.mylyn.docs.intent.collab.common/plugin.xml b/plugins/org.eclipse.mylyn.docs.intent.collab.common/plugin.xml
new file mode 100644
index 0000000..42ec0ec
--- /dev/null
+++ b/plugins/org.eclipse.mylyn.docs.intent.collab.common/plugin.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension-point id="intentlogger" name="org.eclipse.mylyn.docs.intent.collab.common.intentlogger" schema="schema/intentlogger.exsd"/>
+
+</plugin>
diff --git a/plugins/org.eclipse.mylyn.docs.intent.collab.common/schema/intentlogger.exsd b/plugins/org.eclipse.mylyn.docs.intent.collab.common/schema/intentlogger.exsd
new file mode 100644
index 0000000..591d5bd
--- /dev/null
+++ b/plugins/org.eclipse.mylyn.docs.intent.collab.common/schema/intentlogger.exsd
@@ -0,0 +1,93 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.docs.intent.collab.common" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appinfo>
+         <meta.schema plugin="org.eclipse.mylyn.docs.intent.collab.common" id="intentlogger" name="org.eclipse.mylyn.docs.intent.collab.common.intentlogger"/>
+      </appinfo>
+      <documentation>
+         This extension point allows to provide custom loggers allowing to display Intent informations
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appinfo>
+            <meta.element />
+         </appinfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="logger"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute translatable="true"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="logger">
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="since"/>
+      </appinfo>
+      <documentation>
+         0.7
+      </documentation>
+   </annotation>
+
+
+
+
+   <annotation>
+      <appinfo>
+         <meta.section type="copyright"/>
+      </appinfo>
+      <documentation>
+         Copyright (c) 2010, 2011 Obeo, France.
+All rights reserved. This program and the accompanying materials 
+are made available under the terms of the Eclipse Public License v1.0 
+which accompanies this distribution, and is available at 
+http://www.eclipse.org/legal/epl-v10.html 
+
+Contributors: 
+   Obeo - initial API and implementation
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/IntentRepositoryActivator.java b/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/IntentRepositoryActivator.java
new file mode 100644
index 0000000..b818b5b
--- /dev/null
+++ b/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/IntentRepositoryActivator.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Obeo - initial API and implementation
+ *******************************************************************************/
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.mylyn.docs.intent.collab.common.internal.logger.IntentLoggerRegistryListener;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Activator of the collab.common plugin.
+ * 
+ * @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
+ */
+public class IntentRepositoryActivator extends Plugin {
+
+	private IntentLoggerRegistryListener loggerRegistryListener = new IntentLoggerRegistryListener();
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+
+		// Initializing registry listener for the logger extension point
+		loggerRegistryListener.init();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		// Initializing registry listener for the logger extension point
+		loggerRegistryListener.dispose();
+
+		super.stop(context);
+	}
+}
diff --git a/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/internal/logger/IntentLoggerDescriptor.java b/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/internal/logger/IntentLoggerDescriptor.java
new file mode 100644
index 0000000..1ec3c01
--- /dev/null
+++ b/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/internal/logger/IntentLoggerDescriptor.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.docs.intent.collab.common.internal.logger;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger;
+import org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger.LogType;
+import org.eclipse.mylyn.docs.intent.collab.common.logger.IntentLogger;
+
+/**
+ * Describes an extension as contibuted to the
+ * {@link IntentLoggerRegistryListener#INTENT_LOGGER_EXTENSION_POINT} extension point.
+ * 
+ * @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
+ */
+public class IntentLoggerDescriptor {
+
+	/**
+	 * Name of the attribute corresponding to the contributed class's path.
+	 */
+	public static final String LOGGER_CLASS_NAME = "class";
+
+	/**
+	 * Configuration element of this descriptor .
+	 */
+	private final IConfigurationElement element;
+
+	/**
+	 * The path of the contributed class.
+	 */
+	private String extensionClassName;
+
+	/**
+	 * The {@link IIntentLogger} described by this descriptor.
+	 */
+	private IIntentLogger extension;
+
+	/**
+	 * Instantiates a descriptor with all information.
+	 * 
+	 * @param configuration
+	 *            Configuration element from which to create this descriptor.
+	 */
+	public IntentLoggerDescriptor(IConfigurationElement configuration) {
+		element = configuration;
+		extensionClassName = configuration.getAttribute(LOGGER_CLASS_NAME);
+	}
+
+	/**
+	 * Creates an instance of this descriptor's {@link IIntentLogger} .
+	 * 
+	 * @return A new instance of this descriptor's {@link IIntentLogger}.
+	 */
+	public IIntentLogger createLogger() {
+		try {
+			extension = (IIntentLogger)element.createExecutableExtension(LOGGER_CLASS_NAME);
+		} catch (CoreException e) {
+			IntentLogger.getInstance().log(LogType.ERROR, "Could not create logger " + extensionClassName, e);
+		}
+		return extension;
+	}
+
+	/**
+	 * Returns the fully qualified name of the contributed class.
+	 * 
+	 * @return the fully qualified name of the contributed class
+	 */
+	public String getExtensionClassName() {
+		return extensionClassName;
+	}
+}
diff --git a/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/internal/logger/IntentLoggerRegistry.java b/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/internal/logger/IntentLoggerRegistry.java
new file mode 100644
index 0000000..e1e3c2c
--- /dev/null
+++ b/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/internal/logger/IntentLoggerRegistry.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.docs.intent.collab.common.internal.logger;
+
+import com.google.common.collect.Maps;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger;
+
+/**
+ * @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
+ */
+public class IntentLoggerRegistry {
+
+	/**
+	 * All the registered loggers.
+	 */
+	private static final Map<IntentLoggerDescriptor, IIntentLogger> declaredLoggers = Maps.newLinkedHashMap();
+
+	/**
+	 * Utility classes don't need a default constructor.
+	 */
+	private IntentLoggerRegistry() {
+
+	}
+
+	/**
+	 * Returns all declared loggers (instanciate the logger if needed).
+	 */
+	public static Collection<IIntentLogger> getDeclaredLoggers() {
+		for (Entry<IntentLoggerDescriptor, IIntentLogger> descriptorToLogger : declaredLoggers.entrySet()) {
+			if (descriptorToLogger.getValue() == null) {
+				descriptorToLogger.setValue(descriptorToLogger.getKey().createLogger());
+			}
+		}
+		return declaredLoggers.values();
+	}
+
+	/**
+	 * Registers the given logger descriptor.
+	 * 
+	 * @param intentLoggerDescriptor
+	 *            the logger descriptor to registor
+	 */
+	public static void addLogger(IntentLoggerDescriptor intentLoggerDescriptor) {
+		declaredLoggers.put(intentLoggerDescriptor, null);
+	}
+
+	/**
+	 * Removes a phantom from the registry.
+	 * 
+	 * @param extensionClassName
+	 *            Qualified class name of the sync element which corresponding phantom is to be removed from
+	 *            the registry.
+	 */
+	public static void removeExtension(String extensionClassName) {
+		for (IntentLoggerDescriptor extension : declaredLoggers.keySet()) {
+			if (extension.getExtensionClassName().equals(extensionClassName)) {
+				declaredLoggers.remove(extension);
+			}
+		}
+	}
+
+	/**
+	 * Clears all registered loggers.
+	 */
+	public static void clearContributedLoggers() {
+		declaredLoggers.clear();
+
+	}
+}
diff --git a/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/internal/logger/IntentLoggerRegistryListener.java b/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/internal/logger/IntentLoggerRegistryListener.java
new file mode 100644
index 0000000..e55ce1f
--- /dev/null
+++ b/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/internal/logger/IntentLoggerRegistryListener.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.docs.intent.collab.common.internal.logger;
+
+import com.google.common.collect.Sets;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionDelta;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IRegistryChangeEvent;
+import org.eclipse.core.runtime.IRegistryChangeListener;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger.LogType;
+import org.eclipse.mylyn.docs.intent.collab.common.logger.IntentLogger;
+
+/**
+ * This listener allows to be aware of contribution changes against the
+ * {@link IntentLoggerRegistryListener#INTENT_LOGGER_EXTENSION_POINT} extension point.
+ * 
+ * @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
+ */
+public class IntentLoggerRegistryListener implements IRegistryChangeListener {
+
+	/** Name of the extension point to parse for extensions. */
+	public static final String INTENT_LOGGER_EXTENSION_POINT = "org.eclipse.mylyn.docs.intent.collab.common.intentlogger"; //$NON-NLS-1$
+
+	/** Name of the extension point's tag. */
+	private static final String LOGGER_TAG = "logger"; //$NON-NLS-1$
+
+	/**
+	 * Register this listener and parse initial contributions.
+	 */
+	public void init() {
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		registry.addRegistryChangeListener(this, INTENT_LOGGER_EXTENSION_POINT);
+		parseInitialContributions();
+	}
+
+	/**
+	 * Parses a single extension contribution.
+	 * 
+	 * @param extension
+	 *            Parses the given extension and adds its contribution to the registry.
+	 */
+	private void parseExtension(IExtension extension) {
+		final IConfigurationElement[] configElements = extension.getConfigurationElements();
+		for (IConfigurationElement elem : configElements) {
+			if (LOGGER_TAG.equals(elem.getName())) {
+				try {
+					IntentLoggerRegistry.addLogger(new IntentLoggerDescriptor(elem));
+				} catch (IllegalArgumentException e) {
+					IntentLogger.getInstance().log(LogType.ERROR,
+							"Could not create logger " + elem.getValue(), e);
+				}
+			}
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.runtime.IRegistryEventListener#added(org.eclipse.core.runtime.IExtensionPoint[])
+	 */
+	public void added(IExtensionPoint[] extensionPoints) {
+		for (IExtensionPoint extensionPoint : extensionPoints) {
+			for (IExtension extension : extensionPoint.getExtensions()) {
+				parseExtension(extension);
+			}
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.runtime.IRegistryChangeListener#registryChanged(org.eclipse.core.runtime.IRegistryChangeEvent)
+	 */
+	public void registryChanged(IRegistryChangeEvent event) {
+		Set<IExtension> addedExtensions = Sets.newLinkedHashSet();
+		for (IExtensionDelta extensionDelta : event.getExtensionDeltas()) {
+			addedExtensions.add(extensionDelta.getExtension());
+		}
+		added(addedExtensions.toArray(new IExtension[addedExtensions.size()]));
+	}
+
+	/**
+	 * Behavior when the given extensions are added.
+	 * 
+	 * @param extensions
+	 *            the added extensions
+	 */
+	public void added(IExtension[] extensions) {
+		for (IExtension extension : extensions) {
+			parseExtension(extension);
+		}
+	}
+
+	/**
+	 * Though this listener reacts to the extension point changes, there could have been contributions before
+	 * it's been registered. This will parse these initial contributions.
+	 */
+	public void parseInitialContributions() {
+		final IExtensionRegistry registry = Platform.getExtensionRegistry();
+
+		for (IExtension extension : registry.getExtensionPoint(INTENT_LOGGER_EXTENSION_POINT).getExtensions()) {
+			parseExtension(extension);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.runtime.IRegistryEventListener#removed(org.eclipse.core.runtime.IExtension[])
+	 */
+	public void removed(IExtension[] extensions) {
+		for (IExtension extension : extensions) {
+			final IConfigurationElement[] configElements = extension.getConfigurationElements();
+			for (IConfigurationElement elem : configElements) {
+				if (LOGGER_TAG.equals(elem.getName())) {
+					final String extensionClassName = elem
+							.getAttribute(IntentLoggerDescriptor.LOGGER_CLASS_NAME);
+					IntentLoggerRegistry.removeExtension(extensionClassName);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Remove this listener and flush the contributions registry.
+	 */
+	public void dispose() {
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		registry.removeRegistryChangeListener(this);
+		IntentLoggerRegistry.clearContributedLoggers();
+	}
+}
diff --git a/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/logger/IIntentLogger.java b/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/logger/IIntentLogger.java
new file mode 100644
index 0000000..957dc5b
--- /dev/null
+++ b/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/logger/IIntentLogger.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.docs.intent.collab.common.logger;
+
+/**
+ * A standalone interface for a logger used in Intent to display informations to end-user (errors, but also
+ * client behavior if options allow it).
+ * 
+ * @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
+ */
+public interface IIntentLogger {
+
+	/**
+	 * Logs the given message, displaying it differently according to the given {@link LogType}.
+	 * 
+	 * @param logType
+	 *            the type of the message to display (critical error, warning, lifecycle information...)
+	 * @param message
+	 *            the message to log
+	 */
+	void log(LogType logType, String message);
+
+	/**
+	 * Logs the given message, displaying it differently according to the given {@link LogType}.
+	 * 
+	 * @param logType
+	 *            the type of the message to display (critical error, warning, lifecycle information...)
+	 * @param exception
+	 *            the exception that caused the error to log
+	 * @param message
+	 *            the message to log
+	 */
+	void log(LogType logType, String message, Throwable exception);
+
+	/**
+	 * Indicates whether lifecycle informations (like the fact that the compiler has done compiling resources,
+	 * that the indexer indexed content...) should be displayed or not.
+	 * 
+	 * @param shouldDisplayLifecycleInformations
+	 *            if true, these informations will be displayed by the logger. If not, they will not.
+	 */
+	void setDisplayLifecycleInformations(boolean shouldDisplayLifecycleInformations);
+
+	public enum LogType {
+		/**
+		 * Indicates that a critical error occurred (should be displayed in both error log and pop-up).
+		 */
+		CRITICAL_ERROR,
+		/**
+		 * Indicates that a standard error occured (should be displayed in error log).
+		 */
+		ERROR,
+		/**
+		 * Indicates that a warning should be displayed.
+		 */
+		WARNING,
+		/**
+		 * Indicates that an information should be displayed.
+		 */
+		INFO,
+		/**
+		 * Information relative to Intent clients lifecycle (only displayed in debug mode).
+		 */
+		LIFECYCLE
+	}
+}
diff --git a/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/logger/IntentLogger.java b/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/logger/IntentLogger.java
new file mode 100644
index 0000000..0aa24ce
--- /dev/null
+++ b/plugins/org.eclipse.mylyn.docs.intent.collab.common/src/org/eclipse/mylyn/docs/intent/collab/common/logger/IntentLogger.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.docs.intent.collab.common.logger;
+
+import org.eclipse.mylyn.docs.intent.collab.common.internal.logger.IntentLoggerRegistry;
+import org.eclipse.mylyn.docs.intent.collab.common.internal.logger.IntentLoggerRegistryListener;
+
+/**
+ * The Intent logger, that delegates log to all loggers contributed through the
+ * {@link IntentLoggerRegistryListener#INTENT_LOGGER_EXTENSION_POINT} extension point.
+ * 
+ * @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
+ */
+public final class IntentLogger implements IIntentLogger {
+
+	private static IntentLogger INSTANCE;
+
+	/**
+	 * Private constructor.
+	 */
+	private IntentLogger() {
+
+	}
+
+	/**
+	 * Returns the instance of the current logger.
+	 * 
+	 * @return the instance of the current logger
+	 */
+	public static IntentLogger getInstance() {
+		if (INSTANCE == null) {
+			INSTANCE = new IntentLogger();
+		}
+		return INSTANCE;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger#log(org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger.LogType,
+	 *      java.lang.String)
+	 */
+	public void log(LogType logType, String message) {
+		for (IIntentLogger logger : IntentLoggerRegistry.getDeclaredLoggers()) {
+			logger.log(logType, message);
+		}
+
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger#log(org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger.LogType,
+	 *      java.lang.String, java.lang.Throwable)
+	 */
+	public void log(LogType logType, String message, Throwable exception) {
+		for (IIntentLogger logger : IntentLoggerRegistry.getDeclaredLoggers()) {
+			logger.log(logType, message, exception);
+		}
+
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger#setDisplayLifecycleInformations(boolean)
+	 */
+	public void setDisplayLifecycleInformations(boolean shouldDisplayLifecycleInformations) {
+		for (IIntentLogger logger : IntentLoggerRegistry.getDeclaredLoggers()) {
+			logger.setDisplayLifecycleInformations(false);
+		}
+	}
+
+}