Index: META-INF/MANIFEST.MF
===================================================================
--- META-INF/MANIFEST.MF	(revision 250)
+++ META-INF/MANIFEST.MF	(working copy)
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: Maven 2.0 integration
 Bundle-SymbolicName: org.maven.ide.eclipse; singleton:=true
-Bundle-Version: 0.0.11.20070603-1200
+Bundle-Version: 0.0.12
 Bundle-Activator: org.maven.ide.eclipse.Maven2Plugin
 Bundle-Vendor: maven.org
 Bundle-Localization: plugin
@@ -34,91 +34,323 @@
 Bundle-RequiredExecutionEnvironment: J2SE-1.4,
  J2SE-1.5,
  JavaSE-1.6
-Export-Package: org.apache.maven,
- org.apache.maven.artifact,
- org.apache.maven.artifact.deployer,
- org.apache.maven.artifact.factory,
+Export-Package: org.apache.maven;
+  uses:="org.apache.maven.settings,
+   org.apache.maven.profiles,
+   org.apache.maven.artifact.repository,
+   org.apache.maven.lifecycle,
+   org.apache.maven.monitor.event,
+   org.apache.maven.model,
+   org.codehaus.plexus,
+   org.apache.maven.artifact.resolver.filter,
+   org.codehaus.plexus.logging,
+   org.apache.maven.execution,
+   org.apache.maven.project,
+   org.apache.maven.wagon.events,
+   org.codehaus.plexus.context,
+   org.apache.maven.context,
+   org.apache.maven.usability.diagnostics,
+   org.codehaus.plexus.personality.plexus.lifecycle.phase",
+ org.apache.maven.artifact;
+  uses:="org.apache.maven.artifact.repository,
+   org.apache.maven.artifact.metadata,
+   org.apache.maven.artifact.handler,
+   org.apache.maven.artifact.versioning,
+   org.apache.maven.artifact.resolver.filter",
+ org.apache.maven.artifact.deployer;uses:="org.codehaus.plexus.logging,org.apache.maven.artifact.repository,org.apache.maven.artifact",
+ org.apache.maven.artifact.factory;uses:="org.apache.maven.artifact.versioning,org.apache.maven.artifact",
  org.apache.maven.artifact.handler,
- org.apache.maven.artifact.handler.manager,
- org.apache.maven.artifact.installer,
- org.apache.maven.artifact.manager,
- org.apache.maven.artifact.metadata,
- org.apache.maven.artifact.repository,
- org.apache.maven.artifact.repository.layout,
- org.apache.maven.artifact.repository.metadata,
- org.apache.maven.artifact.repository.metadata.io.xpp3,
- org.apache.maven.artifact.resolver,
+ org.apache.maven.artifact.handler.manager;uses:="org.apache.maven.artifact.handler",
+ org.apache.maven.artifact.installer;uses:="org.codehaus.plexus.logging,org.apache.maven.artifact.repository,org.apache.maven.artifact",
+ org.apache.maven.artifact.manager;
+  uses:="org.apache.maven.artifact.repository,
+   org.apache.maven.artifact,
+   org.codehaus.plexus.util.xml,
+   org.codehaus.plexus,
+   org.apache.maven.wagon,
+   org.apache.maven.wagon.authentication,
+   org.codehaus.plexus.logging,
+   org.apache.maven.artifact.metadata,
+   org.apache.maven.wagon.events,
+   org.codehaus.plexus.context,
+   org.codehaus.plexus.personality.plexus.lifecycle.phase,
+   org.apache.maven.wagon.proxy,
+   org.apache.maven.wagon.repository",
+ org.apache.maven.artifact.metadata;uses:="org.apache.maven.artifact.repository,org.apache.maven.artifact",
+ org.apache.maven.artifact.repository;
+  uses:="org.apache.maven.artifact.metadata,
+   org.apache.maven.artifact.repository.layout,
+   org.apache.maven.artifact,
+   org.apache.maven.wagon.repository",
+ org.apache.maven.artifact.repository.layout;uses:="org.apache.maven.artifact.repository,org.apache.maven.artifact.metadata,org.apache.maven.artifact",
+ org.apache.maven.artifact.repository.metadata;
+  uses:="org.codehaus.plexus.logging,
+   org.apache.maven.artifact.repository,
+   org.apache.maven.artifact.metadata,
+   org.apache.maven.artifact",
+ org.apache.maven.artifact.repository.metadata.io.xpp3;uses:="org.codehaus.plexus.util.xml.pull,org.apache.maven.artifact.repository.metadata",
+ org.apache.maven.artifact.resolver;
+  uses:="org.codehaus.plexus.logging,
+   org.apache.maven.artifact.repository,
+   org.apache.maven.artifact.metadata,
+   org.apache.maven.artifact.versioning,
+   org.apache.maven.artifact,
+   org.apache.maven.artifact.factory,
+   org.apache.maven.artifact.resolver.filter",
  org.apache.maven.artifact.resolver.conflict,
- org.apache.maven.artifact.resolver.filter,
- org.apache.maven.artifact.transform,
- org.apache.maven.artifact.versioning,
- org.apache.maven.cli,
- org.apache.maven.context,
+ org.apache.maven.artifact.resolver.filter;uses:="org.apache.maven.artifact",
+ org.apache.maven.artifact.transform;
+  uses:="org.codehaus.plexus.logging,
+   org.apache.maven.artifact.manager,
+   org.apache.maven.artifact.repository,
+   org.apache.maven.artifact,
+   org.codehaus.plexus.personality.plexus.lifecycle.phase,
+   org.apache.maven.artifact.repository.metadata",
+ org.apache.maven.artifact.versioning;uses:="org.apache.maven.artifact.resolver,org.apache.maven.artifact",
+ org.apache.maven.cli;
+  uses:="org.codehaus.plexus.logging,
+   org.apache.maven.wagon.events,
+   org.apache.maven,
+   org.codehaus.plexus.classworlds,
+   org.apache.commons.cli",
+ org.apache.maven.context;uses:="org.apache.maven.project,org.codehaus.plexus.context",
  org.apache.maven.doxia.sink,
- org.apache.maven.embedder,
- org.apache.maven.embedder.execution,
- org.apache.maven.embedder.user,
- org.apache.maven.embedder.writer,
- org.apache.maven.execution,
- org.apache.maven.extension,
- org.apache.maven.lifecycle,
- org.apache.maven.lifecycle.binding,
+ org.apache.maven.embedder;
+  uses:="org.apache.maven.settings,
+   org.apache.maven.artifact.repository,
+   org.apache.maven.artifact.handler,
+   org.apache.maven.artifact,
+   org.apache.maven.model,
+   org.codehaus.plexus,
+   org.codehaus.plexus.logging,
+   org.apache.maven.execution,
+   org.apache.maven.project,
+   org.codehaus.plexus.personality.plexus.lifecycle.phase,
+   org.codehaus.plexus.classworlds",
+ org.apache.maven.embedder.execution;
+  uses:="org.codehaus.plexus.logging,
+   org.apache.maven.execution,
+   org.codehaus.plexus.context,
+   org.codehaus.plexus.personality.plexus.lifecycle.phase,
+   org.apache.maven.embedder",
+ org.apache.maven.embedder.user;uses:="org.apache.maven.settings,org.apache.maven.execution",
+ org.apache.maven.embedder.writer;uses:="org.apache.maven.model",
+ org.apache.maven.execution;
+  uses:="org.apache.maven.settings,
+   org.apache.maven.artifact.repository,
+   org.apache.maven.artifact.versioning,
+   org.apache.maven.monitor.event,
+   org.codehaus.plexus,
+   org.apache.maven.plugin.descriptor,
+   org.apache.maven.project,
+   org.apache.maven.wagon.events,
+   org.apache.maven.context,
+   org.codehaus.plexus.personality.plexus.lifecycle.phase",
+ org.apache.maven.extension;
+  uses:="org.apache.maven.profiles,
+   org.codehaus.plexus.logging,
+   org.apache.maven.artifact.repository,
+   org.apache.maven.project,
+   org.codehaus.plexus.context,
+   org.codehaus.plexus.personality.plexus.lifecycle.phase,
+   org.apache.maven.model",
+ org.apache.maven.lifecycle;
+  uses:="org.apache.maven.lifecycle.model,
+   org.codehaus.plexus.logging,
+   org.apache.maven.execution,
+   org.apache.maven.project,
+   org.apache.maven.reporting,
+   org.apache.maven.monitor.event,
+   org.apache.maven.context,
+   org.apache.maven.plugin.descriptor",
+ org.apache.maven.lifecycle.binding;
+  uses:="org.apache.maven.lifecycle.model,
+   org.codehaus.plexus.logging,
+   org.apache.maven.project,
+   org.apache.maven.lifecycle.mapping,
+   org.apache.maven.model,
+   org.apache.maven.plugin.loader,
+   org.apache.maven.plugin.descriptor",
  org.apache.maven.lifecycle.mapping,
  org.apache.maven.lifecycle.model,
- org.apache.maven.lifecycle.model.io.xpp3,
- org.apache.maven.lifecycle.plan,
- org.apache.maven.lifecycle.statemgmt,
+ org.apache.maven.lifecycle.model.io.xpp3;uses:="org.apache.maven.lifecycle.model,org.codehaus.plexus.util.xml.pull",
+ org.apache.maven.lifecycle.plan;
+  uses:="org.apache.maven.lifecycle.model,
+   org.codehaus.plexus.logging,
+   org.apache.maven.lifecycle,
+   org.apache.maven.project",
+ org.apache.maven.lifecycle.statemgmt;uses:="org.apache.maven.lifecycle.model,org.apache.maven.plugin",
  org.apache.maven.messages,
  org.apache.maven.model,
- org.apache.maven.model.io.jdom,
- org.apache.maven.model.io.xpp3,
- org.apache.maven.monitor.event,
- org.apache.maven.monitor.logging,
- org.apache.maven.plugin,
- org.apache.maven.plugin.descriptor,
+ org.apache.maven.model.io.jdom;
+  uses:="org.codehaus.plexus.util.xml,
+   org.apache.maven.model,
+   org.jdom,
+   org.jdom.output",
+ org.apache.maven.model.io.xpp3;uses:="org.apache.maven.model,org.codehaus.plexus.util.xml.pull",
+ org.apache.maven.monitor.event;uses:="org.codehaus.plexus.logging",
+ org.apache.maven.monitor.logging;uses:="org.codehaus.plexus.logging,org.apache.maven.plugin.logging",
+ org.apache.maven.plugin;
+  uses:="org.apache.maven.plugin.version,
+   org.codehaus.plexus.component.configurator.expression,
+   org.codehaus.plexus.component.configurator,
+   org.apache.maven.plugin.logging,
+   org.codehaus.plexus.component.repository,
+   org.apache.maven.artifact,
+   org.codehaus.plexus.util.xml,
+   org.apache.maven.model,
+   org.apache.maven.plugin.descriptor,
+   org.apache.maven.artifact.repository.metadata,
+   org.codehaus.plexus.component.discovery,
+   org.apache.maven.execution,
+   org.codehaus.plexus.logging,
+   org.apache.maven.artifact.metadata,
+   org.apache.maven,
+   org.codehaus.plexus.personality.plexus.lifecycle.phase,
+   org.apache.maven.settings,
+   org.apache.maven.artifact.repository,
+   org.apache.maven.lifecycle,
+   org.codehaus.plexus.configuration,
+   org.apache.maven.artifact.factory,
+   org.codehaus.plexus,
+   org.apache.maven.artifact.resolver,
+   org.apache.maven.project,
+   org.apache.maven.reporting,
+   org.codehaus.plexus.context,
+   org.apache.maven.project.path",
+ org.apache.maven.plugin.descriptor;
+  uses:="org.codehaus.plexus.classworlds.realm,
+   org.codehaus.plexus.component.repository,
+   org.codehaus.plexus.configuration,
+   org.apache.maven.artifact,
+   org.apache.maven.plugin.lifecycle",
  org.apache.maven.plugin.lifecycle,
- org.apache.maven.plugin.lifecycle.io.xpp3,
- org.apache.maven.plugin.loader,
+ org.apache.maven.plugin.lifecycle.io.xpp3;uses:="org.apache.maven.plugin.lifecycle,org.codehaus.plexus.util.xml.pull",
+ org.apache.maven.plugin.loader;
+  uses:="org.apache.maven.lifecycle.model,
+   org.codehaus.plexus.logging,
+   org.apache.maven.project,
+   org.apache.maven.model,
+   org.apache.maven.plugin.descriptor",
  org.apache.maven.plugin.logging,
- org.apache.maven.plugin.version,
- org.apache.maven.profiles,
- org.apache.maven.profiles.activation,
- org.apache.maven.profiles.io.jdom,
- org.apache.maven.profiles.io.xpp3,
- org.apache.maven.project,
- org.apache.maven.project.artifact,
- org.apache.maven.project.build,
- org.apache.maven.project.build.model,
- org.apache.maven.project.build.profile,
- org.apache.maven.project.inheritance,
- org.apache.maven.project.injection,
- org.apache.maven.project.interpolation,
- org.apache.maven.project.overlay,
- org.apache.maven.project.path,
- org.apache.maven.project.validation,
+ org.apache.maven.plugin.version;
+  uses:="org.codehaus.plexus.logging,
+   org.apache.maven.execution,
+   org.apache.maven.artifact.repository,
+   org.apache.maven.project",
+ org.apache.maven.profiles;
+  uses:="org.apache.maven.settings,
+   org.codehaus.plexus.logging,
+   org.apache.maven.model,
+   org.codehaus.plexus",
+ org.apache.maven.profiles.activation;
+  uses:="org.codehaus.plexus.logging,
+   org.codehaus.plexus.component.configurator.expression,
+   org.codehaus.plexus.context,
+   org.apache.maven.context,
+   org.codehaus.plexus.personality.plexus.lifecycle.phase,
+   org.apache.maven.model",
+ org.apache.maven.profiles.io.jdom;
+  uses:="org.apache.maven.profiles,
+   org.codehaus.plexus.util.xml,
+   org.jdom,
+   org.jdom.output",
+ org.apache.maven.profiles.io.xpp3;uses:="org.apache.maven.profiles,org.codehaus.plexus.util.xml.pull",
+ org.apache.maven.project;
+  uses:="org.apache.maven.profiles,
+   org.apache.maven.artifact.repository,
+   org.apache.maven.artifact,
+   org.codehaus.plexus.util.xml,
+   org.apache.maven.model,
+   org.apache.maven.artifact.factory,
+   org.codehaus.plexus,
+   org.apache.maven.artifact.resolver.filter,
+   org.codehaus.plexus.logging,
+   org.apache.maven.project.validation,
+   org.apache.maven.artifact.resolver,
+   org.apache.maven.artifact.metadata,
+   org.apache.maven.wagon.events,
+   org.codehaus.plexus.context,
+   org.codehaus.plexus.personality.plexus.lifecycle.phase",
+ org.apache.maven.project.artifact;
+  uses:="org.apache.maven.artifact.repository,
+   org.apache.maven.artifact.handler,
+   org.apache.maven.artifact.versioning,
+   org.apache.maven.artifact,
+   org.apache.maven.artifact.factory,
+   org.apache.maven.artifact.resolver.filter,
+   org.codehaus.plexus.logging,
+   org.apache.maven.artifact.metadata,
+   org.apache.maven.artifact.resolver,
+   org.apache.maven.project",
+ org.apache.maven.project.build;
+  uses:="org.apache.maven.project.build.model,
+   org.apache.maven.project,
+   org.apache.maven.context,
+   org.apache.maven.artifact,
+   org.apache.maven.model",
+ org.apache.maven.project.build.model;
+  uses:="org.apache.maven.profiles,
+   org.codehaus.plexus.logging,
+   org.apache.maven.artifact.repository,
+   org.apache.maven.artifact.resolver,
+   org.apache.maven.context,
+   org.apache.maven.model,
+   org.apache.maven.artifact.factory",
+ org.apache.maven.project.build.profile;
+  uses:="org.apache.maven.profiles,
+   org.codehaus.plexus.context,
+   org.codehaus.plexus.personality.plexus.lifecycle.phase,
+   org.apache.maven.model",
+ org.apache.maven.project.inheritance;uses:="org.apache.maven.model",
+ org.apache.maven.project.injection;uses:="org.apache.maven.model",
+ org.apache.maven.project.interpolation;uses:="org.codehaus.plexus.logging,org.apache.maven.model",
+ org.apache.maven.project.overlay;uses:="org.apache.maven.model",
+ org.apache.maven.project.path;uses:="org.apache.maven.model",
+ org.apache.maven.project.validation;uses:="org.apache.maven.model",
  org.apache.maven.reactor,
- org.apache.maven.reporting,
- org.apache.maven.settings,
- org.apache.maven.settings.io.jdom,
- org.apache.maven.settings.io.xpp3,
- org.apache.maven.settings.validation,
- org.apache.maven.usability,
- org.apache.maven.usability.diagnostics,
+ org.apache.maven.reporting;uses:="org.apache.maven.doxia.sink,org.codehaus.doxia.sink",
+ org.apache.maven.settings;uses:="org.codehaus.plexus.logging,org.apache.maven.model",
+ org.apache.maven.settings.io.jdom;
+  uses:="org.apache.maven.settings,
+   org.codehaus.plexus.util.xml,
+   org.jdom,
+   org.jdom.output",
+ org.apache.maven.settings.io.xpp3;uses:="org.apache.maven.settings,org.codehaus.plexus.util.xml.pull",
+ org.apache.maven.settings.validation;uses:="org.apache.maven.settings",
+ org.apache.maven.usability;uses:="org.apache.maven.usability.diagnostics",
+ org.apache.maven.usability.diagnostics;uses:="org.codehaus.plexus.logging,org.codehaus.plexus.context,org.codehaus.plexus.personality.plexus.lifecycle.phase",
  org.apache.maven.usability.plugin,
- org.apache.maven.usability.plugin.io.xpp3,
- org.apache.maven.wagon,
- org.apache.maven.wagon.authentication,
- org.apache.maven.wagon.authorization,
- org.apache.maven.wagon.events,
- org.apache.maven.wagon.observers,
- org.apache.maven.wagon.providers.file,
- org.apache.maven.wagon.providers.http,
- org.apache.maven.wagon.providers.ssh,
- org.apache.maven.wagon.providers.ssh.external,
- org.apache.maven.wagon.providers.ssh.interactive,
- org.apache.maven.wagon.providers.ssh.jsch,
- org.apache.maven.wagon.providers.ssh.jsch.interactive,
- org.apache.maven.wagon.providers.ssh.knownhost,
+ org.apache.maven.usability.plugin.io.xpp3;uses:="org.apache.maven.usability.plugin,org.codehaus.plexus.util.xml.pull",
+ org.apache.maven.wagon;
+  uses:="org.apache.maven.wagon.authentication,
+   org.apache.maven.wagon.resource,
+   org.apache.maven.wagon.events,
+   org.apache.maven.wagon.proxy,
+   org.apache.maven.wagon.repository",
+ org.apache.maven.wagon.authentication;uses:="org.apache.maven.wagon",
+ org.apache.maven.wagon.authorization;uses:="org.apache.maven.wagon",
+ org.apache.maven.wagon.events;uses:="org.apache.maven.wagon.resource,org.apache.maven.wagon,org.apache.maven.wagon.repository",
+ org.apache.maven.wagon.observers;uses:="org.apache.maven.wagon.events",
+ org.apache.maven.wagon.providers.file;uses:="org.apache.maven.wagon",
+ org.apache.maven.wagon.providers.http;uses:="org.apache.maven.wagon.authentication,org.apache.maven.wagon,org.apache.maven.wagon.proxy",
+ org.apache.maven.wagon.providers.ssh;
+  uses:="org.apache.maven.wagon.providers.ssh.interactive,
+   org.apache.maven.wagon.resource,
+   org.apache.maven.wagon.providers.ssh.knownhost,
+   org.apache.maven.wagon,
+   org.apache.maven.wagon.repository",
+ org.apache.maven.wagon.providers.ssh.external;uses:="org.apache.maven.wagon.providers.ssh,org.apache.maven.wagon",
+ org.apache.maven.wagon.providers.ssh.interactive;uses:="org.codehaus.plexus.components.interactivity",
+ org.apache.maven.wagon.providers.ssh.jsch;
+  uses:="org.apache.maven.wagon.providers.ssh.interactive,
+   org.apache.maven.wagon.authentication,
+   org.apache.maven.wagon.providers.ssh,
+   com.jcraft.jsch,
+   org.apache.maven.wagon.resource,
+   org.apache.maven.wagon",
+ org.apache.maven.wagon.providers.ssh.jsch.interactive;uses:="org.apache.maven.wagon.authentication,org.codehaus.plexus.components.interactivity,com.jcraft.jsch",
+ org.apache.maven.wagon.providers.ssh.knownhost;uses:="org.apache.maven.wagon.authentication",
  org.apache.maven.wagon.proxy,
  org.apache.maven.wagon.repository,
  org.apache.maven.wagon.resource,
@@ -123,48 +355,170 @@
  org.apache.maven.wagon.repository,
  org.apache.maven.wagon.resource,
  org.apache.maven.wagon.shared.http,
- org.codehaus.classworlds,
- org.codehaus.doxia.sink,
- org.codehaus.plexus,
- org.codehaus.plexus.classworlds,
- org.codehaus.plexus.classworlds.launcher,
- org.codehaus.plexus.classworlds.realm,
- org.codehaus.plexus.classworlds.strategy,
- org.codehaus.plexus.collections,
- org.codehaus.plexus.component,
+ org.codehaus.classworlds;uses:="org.codehaus.plexus.classworlds.realm,org.codehaus.plexus.classworlds,org.codehaus.plexus.classworlds.launcher",
+ org.codehaus.doxia.sink;uses:="org.apache.maven.doxia.sink",
+ org.codehaus.plexus;
+  uses:="org.codehaus.plexus.configuration,
+   org.codehaus.plexus.component.repository,
+   org.codehaus.plexus.lifecycle,
+   org.codehaus.plexus.component.discovery,
+   org.codehaus.plexus.component.factory,
+   org.codehaus.plexus.classworlds.realm,
+   org.codehaus.plexus.logging,
+   org.codehaus.plexus.component.composition,
+   org.codehaus.plexus.context,
+   org.codehaus.plexus.component.manager,
+   junit.framework,
+   org.codehaus.plexus.classworlds",
+ org.codehaus.plexus.classworlds;uses:="org.codehaus.plexus.classworlds.realm",
+ org.codehaus.plexus.classworlds.launcher;uses:="org.codehaus.plexus.classworlds.realm,org.codehaus.plexus.classworlds",
+ org.codehaus.plexus.classworlds.realm;uses:="org.codehaus.plexus.classworlds.strategy,org.codehaus.plexus.classworlds",
+ org.codehaus.plexus.classworlds.strategy;uses:="org.codehaus.plexus.classworlds.realm",
+ org.codehaus.plexus.collections;
+  uses:="org.codehaus.plexus.logging,
+   org.codehaus.plexus.context,
+   org.codehaus.plexus.personality.plexus.lifecycle.phase,
+   org.codehaus.plexus",
+ org.codehaus.plexus.component;uses:="org.codehaus.plexus.component.repository",
  org.codehaus.plexus.component.collections,
- org.codehaus.plexus.component.composition,
- org.codehaus.plexus.component.composition.setter,
- org.codehaus.plexus.component.configurator,
- org.codehaus.plexus.component.configurator.converters,
- org.codehaus.plexus.component.configurator.converters.basic,
- org.codehaus.plexus.component.configurator.converters.composite,
- org.codehaus.plexus.component.configurator.converters.lookup,
- org.codehaus.plexus.component.configurator.converters.special,
+ org.codehaus.plexus.component.composition;
+  uses:="org.codehaus.plexus.logging,
+   org.codehaus.plexus.classworlds.realm,
+   org.codehaus.plexus.component.repository,
+   org.codehaus.plexus",
+ org.codehaus.plexus.component.composition.setter;
+  uses:="org.codehaus.plexus.classworlds.realm,
+   org.codehaus.plexus.component.composition,
+   org.codehaus.plexus.component.repository,
+   org.codehaus.plexus",
+ org.codehaus.plexus.component.configurator;
+  uses:="org.codehaus.plexus.classworlds.realm,
+   org.codehaus.plexus.component.configurator.expression,
+   org.codehaus.plexus.configuration,
+   org.codehaus.plexus.component.configurator.converters.lookup",
+ org.codehaus.plexus.component.configurator.converters;
+  uses:="org.codehaus.plexus.component.configurator.expression,
+   org.codehaus.plexus.component.configurator,
+   org.codehaus.plexus.configuration,
+   org.codehaus.plexus.component.configurator.converters.lookup",
+ org.codehaus.plexus.component.configurator.converters.basic;
+  uses:="org.codehaus.plexus.component.configurator.expression,
+   org.codehaus.plexus.component.configurator,
+   org.codehaus.plexus.configuration,
+   org.codehaus.plexus.component.configurator.converters.lookup,
+   org.codehaus.plexus.component.configurator.converters",
+ org.codehaus.plexus.component.configurator.converters.composite;
+  uses:="org.codehaus.plexus.component.configurator.expression,
+   org.codehaus.plexus.component.configurator,
+   org.codehaus.plexus.configuration,
+   org.codehaus.plexus.component.configurator.converters.lookup,
+   org.codehaus.plexus.component.configurator.converters",
+ org.codehaus.plexus.component.configurator.converters.lookup;uses:="org.codehaus.plexus.component.configurator.converters",
+ org.codehaus.plexus.component.configurator.converters.special;
+  uses:="org.codehaus.plexus.classworlds.realm,
+   org.codehaus.plexus.component.configurator.expression,
+   org.codehaus.plexus.component.configurator,
+   org.codehaus.plexus.configuration,
+   org.codehaus.plexus.component.configurator.converters.lookup,
+   org.codehaus.plexus.component.configurator.converters",
  org.codehaus.plexus.component.configurator.expression,
- org.codehaus.plexus.component.discovery,
- org.codehaus.plexus.component.factory,
- org.codehaus.plexus.component.factory.java,
- org.codehaus.plexus.component.manager,
- org.codehaus.plexus.component.reloading,
- org.codehaus.plexus.component.repository,
+ org.codehaus.plexus.component.discovery;
+  uses:="org.codehaus.plexus.classworlds.realm,
+   org.codehaus.plexus.configuration,
+   org.codehaus.plexus.context,
+   org.codehaus.plexus.component.repository",
+ org.codehaus.plexus.component.factory;
+  uses:="org.codehaus.plexus.classworlds.realm,
+   org.codehaus.plexus.context,
+   org.codehaus.plexus.component.repository,
+   org.codehaus.plexus.personality.plexus.lifecycle.phase,
+   org.codehaus.plexus",
+ org.codehaus.plexus.component.factory.java;
+  uses:="org.codehaus.plexus.component.factory,
+   org.codehaus.plexus.classworlds.realm,
+   org.codehaus.plexus.component.repository,
+   org.codehaus.plexus",
+ org.codehaus.plexus.component.manager;
+  uses:="org.codehaus.plexus.logging,
+   org.codehaus.plexus.classworlds.realm,
+   org.codehaus.plexus.component.repository,
+   org.codehaus.plexus,
+   org.codehaus.plexus.lifecycle",
+ org.codehaus.plexus.component.reloading;uses:="org.codehaus.plexus",
+ org.codehaus.plexus.component.repository;
+  uses:="org.codehaus.plexus.component.factory,
+   org.codehaus.plexus.logging,
+   org.codehaus.plexus.classworlds.realm,
+   org.codehaus.plexus.component.composition,
+   org.codehaus.plexus.configuration,
+   org.codehaus.plexus.component.manager,
+   org.codehaus.plexus.lifecycle",
  org.codehaus.plexus.component.repository.exception,
- org.codehaus.plexus.component.repository.io,
- org.codehaus.plexus.components.interactivity,
- org.codehaus.plexus.configuration,
- org.codehaus.plexus.configuration.processor,
+ org.codehaus.plexus.component.repository.io;uses:="org.codehaus.plexus.component.repository,org.codehaus.plexus.configuration",
+ org.codehaus.plexus.components.interactivity;uses:="org.codehaus.plexus.logging,org.codehaus.plexus.personality.plexus.lifecycle.phase",
+ org.codehaus.plexus.configuration;uses:="org.codehaus.plexus.component.repository",
+ org.codehaus.plexus.configuration.processor;uses:="org.codehaus.plexus.configuration",
  org.codehaus.plexus.configuration.source,
- org.codehaus.plexus.configuration.xml,
- org.codehaus.plexus.container.initialization,
+ org.codehaus.plexus.configuration.xml;uses:="org.codehaus.plexus.configuration,org.codehaus.plexus.util.xml",
+ org.codehaus.plexus.container.initialization;
+  uses:="org.codehaus.plexus.classworlds.realm,
+   org.codehaus.plexus.component.configurator,
+   org.codehaus.plexus.component.repository,
+   org.codehaus.plexus.configuration,
+   org.codehaus.plexus.classworlds,
+   org.codehaus.plexus",
  org.codehaus.plexus.context,
- org.codehaus.plexus.embed,
- org.codehaus.plexus.lifecycle,
- org.codehaus.plexus.lifecycle.phase,
- org.codehaus.plexus.logging,
- org.codehaus.plexus.logging.console,
- org.codehaus.plexus.personality.plexus,
- org.codehaus.plexus.personality.plexus.lifecycle.phase,
- org.codehaus.plexus.util.xml,
+ org.codehaus.plexus.embed;uses:="org.codehaus.plexus.logging,org.codehaus.classworlds,org.codehaus.plexus",
+ org.codehaus.plexus.lifecycle;uses:="org.codehaus.plexus.classworlds.realm,org.codehaus.plexus.component.manager",
+ org.codehaus.plexus.lifecycle.phase;uses:="org.codehaus.plexus.classworlds.realm,org.codehaus.plexus.component.manager",
+ org.codehaus.plexus.logging;uses:="org.codehaus.plexus.personality.plexus.lifecycle.phase",
+ org.codehaus.plexus.logging.console;uses:="org.codehaus.plexus.logging,org.codehaus.plexus.personality.plexus.lifecycle.phase",
+ org.codehaus.plexus.personality.plexus;uses:="org.codehaus.plexus.lifecycle",
+ org.codehaus.plexus.personality.plexus.lifecycle.phase;
+  uses:="org.codehaus.plexus.classworlds.realm,
+   org.codehaus.plexus.context,
+   org.codehaus.plexus.configuration,
+   org.codehaus.plexus.component.manager,
+   org.codehaus.plexus.lifecycle.phase,
+   org.codehaus.plexus",
+ org.codehaus.plexus.util.xml;uses:="org.codehaus.plexus.util.xml.pull",
  org.codehaus.plexus.util.xml.pull,
- org.maven.ide.eclipse,
- org.maven.ide.eclipse.embedder
+ org.maven.ide.eclipse;
+  uses:="org.maven.ide.eclipse.launch.console,
+   org.maven.ide.eclipse.index,
+   org.eclipse.swt.graphics,
+   org.maven.ide.eclipse.embedder,
+   org.osgi.framework,
+   org.eclipse.ui.plugin,
+   org.eclipse.core.resources,
+   org.eclipse.jface.resource,
+   org.eclipse.core.runtime",
+ org.maven.ide.eclipse.container,
+ org.maven.ide.eclipse.container.extension,
+ org.maven.ide.eclipse.editors.pom,
+ org.maven.ide.eclipse.embedder;
+  uses:="org.maven.ide.eclipse.launch.console,
+   org.eclipse.jdt.core,
+   org.apache.maven.artifact.versioning,
+   org.apache.maven.monitor.event,
+   org.apache.maven.artifact,
+   org.apache.maven.model,
+   org.apache.maven.artifact.resolver.filter,
+   org.apache.maven.embedder,
+   org.apache.maven.execution,
+   org.codehaus.plexus.logging,
+   org.apache.maven.artifact.metadata,
+   org.eclipse.core.runtime,
+   org.apache.maven.artifact.repository,
+   org.apache.maven.artifact.manager,
+   org.apache.maven.lifecycle,
+   org.maven.ide.eclipse.launch,
+   org.eclipse.core.resources,
+   org.maven.ide.eclipse.index,
+   org.eclipse.jface.preference,
+   org.apache.maven.artifact.resolver,
+   org.apache.maven.wagon.events",
+ org.maven.ide.eclipse.index,
+ org.maven.ide.eclipse.launch,
+ org.maven.ide.eclipse.launch.console,
+ org.maven.ide.eclipse.util
Index: build.properties
===================================================================
--- build.properties	(revision 250)
+++ build.properties	(working copy)
@@ -8,7 +8,25 @@
                plugin.properties,\
                .options,\
                lib/maven-embedder-2.1.0.v20070601-0109-dep.jar,\
-               lib/lucene-core-2.1.0.jar
+               lib/lucene-core-2.1.0.jar,\
+               schema/,\
+               src/
 jars.compile.order = m2plugin.jar
 source.m2plugin.jar = src/
 output.m2plugin.jar = bin/
+src.includes = .classpath,\
+               .options,\
+               .project,\
+               .settings/,\
+               META-INF/,\
+               about.ini,\
+               about.properties,\
+               build.properties,\
+               central.zip,\
+               icons/,\
+               lib/,\
+               notes.txt,\
+               plugin.properties,\
+               plugin.xml,\
+               schema/,\
+               src/
Index: plugin.properties
===================================================================
--- plugin.properties	(revision 250)
+++ plugin.properties	(working copy)
@@ -6,11 +6,12 @@
 m2.decorator.description=Adds an icon decoration to \
   projects with Maven dependency management enabled.
 
-m2.popup.project.label=Maven
-m2.popup.project.enable.label=Enable Dependency Management
-m2.popup.project.disable.label=Disable Dependency Management
-m2.popup.project.add-dependency.label=Add Dependency
-m2.popup.project.update-sources.label=Update Source Folders
+m2.popup.project.label=&Maven
+m2.popup.project.enable.label=&Enable Dependency Management
+m2.popup.project.disable.label=D&isable Dependency Management
+m2.popup.project.add-dependency.label=&Add Dependency
+m2.popup.project.update-sources.label=&Update Source Folders
+m2.popup.container.download-sources.label=Download S&ources or JavaDoc
 
 m2.popup.pomFile.label=Maven build
 m2.popup.pomFileWithDialog.label=Maven build...
Index: plugin.xml
===================================================================
--- plugin.xml	(revision 250)
+++ plugin.xml	(working copy)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?eclipse version="3.0"?>
 <plugin>
-
+   <extension-point id="container" name="Container" schema="schema/container.exsd"/>
    <extension
          id="maven2Builder"
          name="%m2.builder.name"
@@ -105,6 +105,13 @@
             </objectState>
          </visibility>
          <action
+               enablesFor="1"
+               class="org.maven.ide.eclipse.actions.DownloadSourcesAction"
+               id="org.maven.ide.eclipse.downloadSourcesAction"
+               menubarPath="maven2/natureGroup" 
+               label="%m2.popup.container.download-sources.label"
+               />
+         <action
                class="org.maven.ide.eclipse.actions.UpdateSourcesAction"
                id="org.maven.ide.eclipse.updateSourcesAction"
                label="%m2.popup.project.update-sources.label"
@@ -142,7 +149,7 @@
                menubarPath="maven2/natureGroup"/>
       </objectContribution>
 
-      <!-- DownloadSourcesAction
+      <!-- DownloadSourcesAction -->
       <objectContribution
             objectClass="org.eclipse.jdt.core.IPackageFragmentRoot"
             id="org.maven.ide.eclipse.jarMenu"
@@ -158,9 +165,17 @@
                enablesFor="1"
                class="org.maven.ide.eclipse.actions.DownloadSourcesAction"
                id="org.maven.ide.eclipse.downloadSourcesAction"
-               label="Download Sources"
+               label="%m2.popup.container.download-sources.label"
+               menubarPath="maven2/natureGroup"/>
+         <action
+               class="org.maven.ide.eclipse.actions.AddDependencyAction"
+               enablesFor="1"
+               id="org.maven.ide.eclipse.addDependencyAction"
+               label="%m2.popup.project.add-dependency.label"
                menubarPath="maven2/natureGroup"/>
       </objectContribution>
+      
+      
 
       <objectContribution
             adaptable="true"
@@ -165,7 +180,7 @@
       <objectContribution
             adaptable="true"
             id="org.maven.ide.eclipse.containerMenu"
-            objectClass="org.eclipse.jdt.core.IClasspathContainer">
+            objectClass="org.eclipse.jdt.internal.ui.packageview.ClassPathContainer">
          <action
                enablesFor="1"
                class="org.maven.ide.eclipse.actions.DownloadSourcesAction"
@@ -170,10 +185,17 @@
                enablesFor="1"
                class="org.maven.ide.eclipse.actions.DownloadSourcesAction"
                id="org.maven.ide.eclipse.downloadSourcesAction"
-               label="Download Sources"
+               menubarPath="additions" 
+               label="%m2.popup.container.download-sources.label"
                />
+           <action
+               class="org.maven.ide.eclipse.actions.AddDependencyAction"
+               enablesFor="1"
+               id="org.maven.ide.eclipse.addDependencyAction"
+               label="%m2.popup.project.add-dependency.label"
+               menubarPath="additions"/>      
       </objectContribution>
-      -->
+    
 
    </extension>
    <extension
Index: src/org/maven/ide/eclipse/actions/AddDependencyAction.java
===================================================================
--- src/org/maven/ide/eclipse/actions/AddDependencyAction.java	(revision 250)
+++ src/org/maven/ide/eclipse/actions/AddDependencyAction.java	(working copy)
@@ -19,6 +19,7 @@
 
 package org.maven.ide.eclipse.actions;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Set;
 
@@ -27,10 +28,13 @@
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.jdt.core.IClasspathEntry;
 import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
 import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.internal.ui.packageview.ClassPathContainer;
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
@@ -44,7 +48,6 @@
 import org.maven.ide.eclipse.embedder.BuildPathManager;
 import org.maven.ide.eclipse.embedder.MavenModelManager;
 import org.maven.ide.eclipse.index.Indexer;
-import org.maven.ide.eclipse.index.Indexer.FileInfo;
 
 
 public class AddDependencyAction implements IObjectActionDelegate {
@@ -52,19 +55,8 @@
   private IWorkbenchPart targetPart;
 
   public void run(IAction action) {
-    Object o = selection.iterator().next();
-    IFile file;
-    IProject project;
-    if(o instanceof IProject) {
-      project = (IProject) o;
-      file = project.getFile(Maven2Plugin.POM_FILE_NAME);
-    } else if(o instanceof IFile) {
-      file = (IFile) o;
-      project = file.getProject();
-    } else {
-      return;
-    }
-
+    IProject project = getProject();
+    IFile  pomFile = project.getFile(Maven2Plugin.POM_FILE_NAME);
     
     MavenModelManager modelManager = Maven2Plugin.getDefault().getMavenModelManager();
     Set artifacts;
@@ -73,7 +65,7 @@
       IClasspathEntry entry = BuildPathManager.getMavenContainerEntry(javaProject);
       boolean resolveWorkspaceProjects = BuildPathManager.isResolvingWorkspaceProjects(entry);
 
-      MavenExecutionResult result = modelManager.readMavenProject(file, new NullProgressMonitor(), true, false, resolveWorkspaceProjects);
+      MavenExecutionResult result = modelManager.readMavenProject(pomFile, new NullProgressMonitor(), true, false, resolveWorkspaceProjects);
       MavenProject mavenProject = result.getMavenProject();
       artifacts = mavenProject == null ? Collections.EMPTY_SET : mavenProject.getArtifacts();
     } catch(Exception ex) {
@@ -85,15 +77,12 @@
     }
 
     Maven2RepositorySearchDialog dialog = new Maven2RepositorySearchDialog(getShell(), artifacts, Indexer.JAR_NAME);
-    if(dialog.open() == Window.OK) {
-      Indexer.FileInfo fileInfo = (FileInfo) dialog.getFirstResult();
-      if(fileInfo != null) {
+    if(dialog.open() == Window.OK && dialog.getResult() != null) {
         try {
-          modelManager.addDependency(file, fileInfo.getDependency());
+          modelManager.addDependencies(pomFile, Arrays.asList(dialog.getResult()));
         } catch(Exception ex) {
-          Maven2Plugin.log("Can't add dependency to " + file, ex);
-        }
-      }
+          Maven2Plugin.log("Can't add dependencies to " + pomFile, ex);
+        }      
     }
   }
 
@@ -101,9 +90,35 @@
     this.targetPart = targetPart;
   }
 
+  private IProject getProject() {
+    if(selection.getFirstElement() instanceof IPackageFragmentRoot) {
+      IPackageFragmentRoot root = (IPackageFragmentRoot) selection.getFirstElement();
+      return root.getJavaProject().getProject();
+    }
+
+    // TODO remove discourage access
+    if(selection.getFirstElement() instanceof ClassPathContainer) {
+      ClassPathContainer root = (ClassPathContainer) selection.getFirstElement();
+      if(BuildPathManager.isMaven2ClasspathContainer(root.getClasspathEntry().getPath())) {
+        return root.getJavaProject().getProject();
+      }
+      return null;
+    }
+
+    if(selection.getFirstElement() instanceof IResource) {
+      return ((IResource) selection.getFirstElement()).getProject();
+    }
+
+    return null;
+  }
+
   public void selectionChanged(IAction action, ISelection selection) {
     if(selection instanceof IStructuredSelection) {
       this.selection = (IStructuredSelection) selection;
+      action.setEnabled(getProject() != null);
+    } else {
+      this.selection = null;
+      action.setEnabled(false);
     }
   }
 
Index: src/org/maven/ide/eclipse/actions/DownloadSourcesAction.java
===================================================================
--- src/org/maven/ide/eclipse/actions/DownloadSourcesAction.java	(revision 250)
+++ src/org/maven/ide/eclipse/actions/DownloadSourcesAction.java	(working copy)
@@ -1,78 +1,97 @@
-
-package org.maven.ide.eclipse.actions;
-
-/*
- * Licensed to the Codehaus Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-
-public class DownloadSourcesAction implements IObjectActionDelegate {
-
-  private IStructuredSelection selection;
-
-  public void run(IAction action) {
-    IPackageFragmentRoot root = (IPackageFragmentRoot) this.selection.getFirstElement();
-
-    IJavaElement parent = root.getParent();
-    if(parent instanceof IJavaProject) {
-      IJavaProject project = (IJavaProject) parent;
-      try {
-        IClasspathEntry classpathEntry = root.getRawClasspathEntry();
-        IClasspathContainer classpathContainer = JavaCore.getClasspathContainer(classpathEntry.getPath(), project);
-        IClasspathEntry[] classpathEntries = classpathContainer.getClasspathEntries();
-        for(int i = 0; i < classpathEntries.length; i++ ) {
-          IClasspathEntry entry = classpathEntries[i];
-          if(entry.getPath().equals(root.getPath())) {
-            String actionDefinitionId = action.getActionDefinitionId();
-            String id = action.getId();
-            System.err.println("### DownloadSourcesAction.run()");
-            
-          }
-        }
-      } catch(JavaModelException ex) {
-        //
-      }
-    }
-  }
-
-  public void selectionChanged(IAction action, ISelection selection) {
-    if(selection instanceof IStructuredSelection) {
-      this.selection = (IStructuredSelection) selection;
-    } else {
-      this.selection = null;
-    }
-  }
-
-  public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-  }
-
-}
-
+
+package org.maven.ide.eclipse.actions;
+
+/*
+ * Licensed to the Codehaus Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.internal.ui.packageview.ClassPathContainer;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.maven.ide.eclipse.Maven2Plugin;
+import org.maven.ide.eclipse.embedder.BuildPathManager;
+
+
+public class DownloadSourcesAction implements IObjectActionDelegate {
+
+  private IStructuredSelection selection;
+
+  public void run(IAction action) {
+    final IProject project = getProject();
+    // TODO use IWorkbenchSiteProgressService to show progress
+    Job job = new Job("Download Sources") {
+
+      protected IStatus run(IProgressMonitor monitor) {
+        try {
+          Maven2Plugin.getDefault().getBuildpathManager().downloadSourcesOrJavaDoc(project, monitor);
+        } catch(final CoreException ex) {
+          Maven2Plugin.log(ex);
+        }
+        return Status.OK_STATUS;
+      }
+
+    };
+    job.schedule();
+  }
+
+  private IProject getProject() {
+    if(selection.getFirstElement() instanceof IPackageFragmentRoot) {
+      IPackageFragmentRoot root = (IPackageFragmentRoot) selection.getFirstElement();
+      return root.getJavaProject().getProject();
+    }
+
+    // TODO remove discourage access
+    if(selection.getFirstElement() instanceof ClassPathContainer) {
+      ClassPathContainer root = (ClassPathContainer) selection.getFirstElement();
+      if(BuildPathManager.isMaven2ClasspathContainer(root.getClasspathEntry().getPath())) {
+        return root.getJavaProject().getProject();
+      }
+      return null;
+    }
+
+    if(selection.getFirstElement() instanceof IProject) {
+      return (IProject) selection.getFirstElement();
+    }
+
+    return null;
+  }
+
+  public void selectionChanged(IAction action, ISelection selection) {
+    if(selection instanceof IStructuredSelection) {
+      this.selection = (IStructuredSelection) selection;
+      action.setEnabled(getProject() != null);
+    } else {
+      this.selection = null;
+      action.setEnabled(false);
+    }
+  }
+
+  public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+  }
+
+}
Index: src/org/maven/ide/eclipse/actions/Maven2DependencyResolver.java
===================================================================
--- src/org/maven/ide/eclipse/actions/Maven2DependencyResolver.java	(revision 250)
+++ src/org/maven/ide/eclipse/actions/Maven2DependencyResolver.java	(working copy)
@@ -1,189 +1,189 @@
-/*
- * Licensed to the Codehaus Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.maven.ide.eclipse.actions;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.maven.execution.MavenExecutionResult;
-import org.apache.maven.project.MavenProject;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.compiler.IProblem;
-import org.eclipse.jdt.internal.ui.text.correction.ChangeCorrectionProposal;
-import org.eclipse.jdt.ui.actions.OrganizeImportsAction;
-import org.eclipse.jdt.ui.text.java.IInvocationContext;
-import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
-import org.eclipse.jdt.ui.text.java.IProblemLocation;
-import org.eclipse.jdt.ui.text.java.IQuickAssistProcessor;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.maven.ide.eclipse.Maven2Plugin;
-import org.maven.ide.eclipse.embedder.BuildPathManager;
-import org.maven.ide.eclipse.embedder.MavenModelManager;
-import org.maven.ide.eclipse.index.Indexer;
-import org.maven.ide.eclipse.index.Indexer.FileInfo;
-
-
-public class Maven2DependencyResolver implements IQuickAssistProcessor {
-  
-  public boolean hasAssists(IInvocationContext context) {
-    return true;
-  }
-
-  public IJavaCompletionProposal[] getAssists(IInvocationContext context, IProblemLocation[] locations) {
-    List proposals = new ArrayList();
-    for( int i = 0; i < locations.length; i++ ) {
-      IProblemLocation location = locations[i];
-      String[] arguments = location.getProblemArguments();
-      int id = location.getProblemId();
-      switch(id) {
-        case IProblem.UndefinedType:
-        case IProblem.UndefinedName:
-          proposals.add(new OpenBuildPathCorrectionProposal(arguments[0], context, 0, true));
-          break;
-
-        case IProblem.IsClassPathCorrect:
-        case IProblem.ImportNotFound:
-          proposals.add(new OpenBuildPathCorrectionProposal(arguments[0], context, 0, false));
-          break;
-      }
-      
-    }
-    return (IJavaCompletionProposal[]) proposals.toArray( new IJavaCompletionProposal[proposals.size()] );
-
-    /*
-    if (coveringNode == null) {
-      return null; 
-    }
-    if(coveringNode.getNodeType()==ASTNode.SIMPLE_NAME) {
-      ASTNode parent = coveringNode.getParent();
-      if(parent!=null) {
-        switch(parent.getNodeType()) {
-          case ASTNode.ASSIGNMENT:
-          case ASTNode.SIMPLE_TYPE:
-          case ASTNode.QUALIFIED_NAME:
-          case ASTNode.MARKER_ANNOTATION:
-            return new IJavaCompletionProposal[] { 
-                new OpenBuildPathCorrectionProposal(coveringNode.toString(), context, 1, null) 
-              };
-        }
-      }
-    }
-    
-    return null;
-    */ 
-  }
-
-  
-  static public final class OpenBuildPathCorrectionProposal extends ChangeCorrectionProposal {
-    private final String query;
-
-    private final IInvocationContext context;
-
-    private final boolean organizeImports;
-
-    OpenBuildPathCorrectionProposal(String query, IInvocationContext context, int relevance, boolean organizeImports) {
-      super("Search dependency for " + query, null, relevance, Maven2Plugin.getImage("icons/mjar.gif"));
-      this.query = query;
-      this.context = context;
-      this.organizeImports = organizeImports;
-    }
-
-    public void apply(IDocument document) {
-      Maven2Plugin plugin = Maven2Plugin.getDefault();
-      MavenModelManager modelManager = plugin.getMavenModelManager();
-
-      ICompilationUnit cu = context.getCompilationUnit();
-      IJavaProject javaProject = cu.getJavaProject();
-      IFile pomFile = javaProject.getProject().getFile(new Path(Maven2Plugin.POM_FILE_NAME));
-
-      MavenProject mavenProject = null;
-      try {
-        IClasspathEntry entry = BuildPathManager.getMavenContainerEntry(javaProject);
-        boolean resolveWorkspaceProjects = BuildPathManager.isResolvingWorkspaceProjects(entry);
-        
-        MavenExecutionResult result = modelManager.readMavenProject(pomFile, new NullProgressMonitor(), true, false, resolveWorkspaceProjects);
-        mavenProject = result.getMavenProject();
-//      } catch(CoreException ex) {
-//        // TODO move into ReadProjectTask
-//        Maven2Plugin.log(ex);
-//        Maven2Plugin.getDefault().getConsole().logError(ex.getMessage());
-      } catch(Exception ex) {
-        // TODO move into ReadProjectTask
-        String msg = "Unable to read project";
-        Maven2Plugin.log(msg, ex);
-        Maven2Plugin.getDefault().getConsole().logError(msg + "; " + ex.toString());
-      }
-      
-      Set artifacts = mavenProject == null ? Collections.EMPTY_SET : mavenProject.getArtifacts();
-
-      IWorkbench workbench = plugin.getWorkbench();
-      Shell shell = workbench.getDisplay().getActiveShell();
-
-      Maven2RepositorySearchDialog dialog = new Maven2RepositorySearchDialog(shell, artifacts, Indexer.NAMES);
-      dialog.setQuery(query);
-
-      if(dialog.open() == Window.OK) {
-        FileInfo fileInfo = (FileInfo) dialog.getFirstResult();
-
-        modelManager.addDependency(pomFile, fileInfo.getDependency());
-
-        if(organizeImports) {
-          IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-          IWorkbenchPage page = window.getActivePage();
-
-          try {
-            // plugin.update(pomFile, null);
-
-            // organize imports
-            IEditorPart activeEditor = page.getActiveEditor();
-            OrganizeImportsAction organizeImportsAction = new OrganizeImportsAction(activeEditor.getEditorSite());
-            organizeImportsAction.run(cu);
-            activeEditor.doSave(null);
-
-          } catch(Exception e) {
-            Maven2Plugin.getDefault().getConsole().logError("Build error; " + e.getMessage());
-            return;
-
-          }
-        }
-      }
-    }
-
-    public String getAdditionalProposalInfo() {
-      return "Resolve dependencies from Maven2 repository";
-    }
-
-  }
-
-}
+/*
+ * Licensed to the Codehaus Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.maven.ide.eclipse.actions;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.maven.execution.MavenExecutionResult;
+import org.apache.maven.project.MavenProject;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.internal.ui.text.correction.ChangeCorrectionProposal;
+import org.eclipse.jdt.ui.actions.OrganizeImportsAction;
+import org.eclipse.jdt.ui.text.java.IInvocationContext;
+import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
+import org.eclipse.jdt.ui.text.java.IProblemLocation;
+import org.eclipse.jdt.ui.text.java.IQuickAssistProcessor;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.maven.ide.eclipse.Maven2Plugin;
+import org.maven.ide.eclipse.embedder.BuildPathManager;
+import org.maven.ide.eclipse.embedder.MavenModelManager;
+import org.maven.ide.eclipse.index.Indexer;
+
+
+public class Maven2DependencyResolver implements IQuickAssistProcessor {
+  
+  public boolean hasAssists(IInvocationContext context) {
+    return true;
+  }
+
+  public IJavaCompletionProposal[] getAssists(IInvocationContext context, IProblemLocation[] locations) {
+    List proposals = new ArrayList();
+    for( int i = 0; i < locations.length; i++ ) {
+      IProblemLocation location = locations[i];
+      String[] arguments = location.getProblemArguments();
+      int id = location.getProblemId();
+      switch(id) {
+        case IProblem.UndefinedType:
+        case IProblem.UndefinedName:
+          proposals.add(new OpenBuildPathCorrectionProposal(arguments[0], context, 0, true));
+          break;
+
+        case IProblem.IsClassPathCorrect:
+        case IProblem.ImportNotFound:
+          proposals.add(new OpenBuildPathCorrectionProposal(arguments[0], context, 0, false));
+          break;
+      }
+      
+    }
+    return (IJavaCompletionProposal[]) proposals.toArray( new IJavaCompletionProposal[proposals.size()] );
+
+    /*
+    if (coveringNode == null) {
+      return null; 
+    }
+    if(coveringNode.getNodeType()==ASTNode.SIMPLE_NAME) {
+      ASTNode parent = coveringNode.getParent();
+      if(parent!=null) {
+        switch(parent.getNodeType()) {
+          case ASTNode.ASSIGNMENT:
+          case ASTNode.SIMPLE_TYPE:
+          case ASTNode.QUALIFIED_NAME:
+          case ASTNode.MARKER_ANNOTATION:
+            return new IJavaCompletionProposal[] { 
+                new OpenBuildPathCorrectionProposal(coveringNode.toString(), context, 1, null) 
+              };
+        }
+      }
+    }
+    
+    return null;
+    */ 
+  }
+
+  
+  static public final class OpenBuildPathCorrectionProposal extends ChangeCorrectionProposal {
+    private final String query;
+
+    private final IInvocationContext context;
+
+    private final boolean organizeImports;
+
+    OpenBuildPathCorrectionProposal(String query, IInvocationContext context, int relevance, boolean organizeImports) {
+      super("Search dependency for " + query, null, relevance, Maven2Plugin.getImage("icons/mjar.gif"));
+      this.query = query;
+      this.context = context;
+      this.organizeImports = organizeImports;
+    }
+
+    public void apply(IDocument document) {
+      Maven2Plugin plugin = Maven2Plugin.getDefault();
+      MavenModelManager modelManager = plugin.getMavenModelManager();
+
+      ICompilationUnit cu = context.getCompilationUnit();
+      IJavaProject javaProject = cu.getJavaProject();
+      IFile pomFile = javaProject.getProject().getFile(new Path(Maven2Plugin.POM_FILE_NAME));
+
+      MavenProject mavenProject = null;
+      try {
+        IClasspathEntry entry = BuildPathManager.getMavenContainerEntry(javaProject);
+        boolean resolveWorkspaceProjects = BuildPathManager.isResolvingWorkspaceProjects(entry);
+        
+        MavenExecutionResult result = modelManager.readMavenProject(pomFile, new NullProgressMonitor(), true, false, resolveWorkspaceProjects);
+        mavenProject = result.getMavenProject();
+//      } catch(CoreException ex) {
+//        // TODO move into ReadProjectTask
+//        Maven2Plugin.log(ex);
+//        Maven2Plugin.getDefault().getConsole().logError(ex.getMessage());
+      } catch(Exception ex) {
+        // TODO move into ReadProjectTask
+        String msg = "Unable to read project";
+        Maven2Plugin.log(msg, ex);
+        Maven2Plugin.getDefault().getConsole().logError(msg + "; " + ex.toString());
+      }
+      
+      Set artifacts = mavenProject == null ? Collections.EMPTY_SET : mavenProject.getArtifacts();
+
+      IWorkbench workbench = plugin.getWorkbench();
+      Shell shell = workbench.getDisplay().getActiveShell();
+
+      Maven2RepositorySearchDialog dialog = new Maven2RepositorySearchDialog(shell, artifacts, Indexer.NAMES);
+      dialog.setQuery(query);
+
+      if(dialog.open() == Window.OK) {        
+        if (dialog.getResult()!=null){
+          modelManager.addDependencies(pomFile, Arrays.asList(dialog.getResult()));
+        }
+
+        if(organizeImports) {
+          IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
+          IWorkbenchPage page = window.getActivePage();
+
+          try {
+            // plugin.update(pomFile, null);
+
+            // organize imports
+            IEditorPart activeEditor = page.getActiveEditor();
+            OrganizeImportsAction organizeImportsAction = new OrganizeImportsAction(activeEditor.getEditorSite());
+            organizeImportsAction.run(cu);
+            activeEditor.doSave(null);
+
+          } catch(Exception e) {
+            Maven2Plugin.getDefault().getConsole().logError("Build error; " + e.getMessage());
+            return;
+
+          }
+        }
+      }
+    }
+
+    public String getAdditionalProposalInfo() {
+      return "Resolve dependencies from Maven2 repository";
+    }
+
+  }
+
+}
Index: src/org/maven/ide/eclipse/actions/Maven2RepositorySearchDialog.java
===================================================================
--- src/org/maven/ide/eclipse/actions/Maven2RepositorySearchDialog.java	(revision 250)
+++ src/org/maven/ide/eclipse/actions/Maven2RepositorySearchDialog.java	(working copy)
@@ -20,24 +20,41 @@
 package org.maven.ide.eclipse.actions;
 
 import java.io.File;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeMap;
 
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.model.Dependency;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.internal.ui.JavaPluginImages;
+import org.eclipse.jdt.ui.ISharedImages;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.dialogs.DialogSettings;
-import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
 import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IContentProvider;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITreeContentProvider;
@@ -43,7 +60,6 @@
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.KeyAdapter;
@@ -50,10 +66,14 @@
 import org.eclipse.swt.events.KeyEvent;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Display;
@@ -58,12 +78,17 @@
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Menu;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
 import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.dialogs.SelectionStatusDialog;
 import org.maven.ide.eclipse.Maven2Plugin;
 import org.maven.ide.eclipse.index.Indexer;
+import org.maven.ide.eclipse.index.Indexer.ArtifactInfo;
 import org.maven.ide.eclipse.index.Indexer.FileInfo;
 
 
@@ -69,33 +94,62 @@
 
 /**
  * Maven2RepositorySearchDialog
- *
+ * 
  * @author Eugene Kuleshov
+ * @author Andrej Zachar
  */
 public class Maven2RepositorySearchDialog extends SelectionStatusDialog {
   private static final String DIALOG_SETTINGS = Maven2RepositorySearchDialog.class.getName();
+
   private static final String KEY_WIDTH = "width"; //$NON-NLS-1$
+
   private static final String KEY_HEIGHT = "height"; //$NON-NLS-1$
+
   private static final String KEY_X = "x"; //$NON-NLS-1$
+
   private static final String KEY_Y = "y"; //$NON-NLS-1$
 
+  private static final String KEY_TREE_LAYOUT = "treeLayout";
+
   private IDialogSettings settings;
+
   private Point location;
+
   private Point size;
 
-  Text searchText = null;
-  TreeViewer searchResultViewer = null;
-  Set artifacts;
-  SearchJob searchJob;
+  private Text searchText = null;
 
-  private String queryText;
-  private String queryField;
+  private CheckboxTreeViewer searchResultViewer = null;
 
-  
-  public Maven2RepositorySearchDialog(Shell parent, Set artifacts, String queryField) {
+  private SearchJob searchJob;
+
+  private String initialQuery;
+
+  private final Set alreadyAddedArtifactKeys;
+
+  private MenuManager fMenuManager;
+
+  private ToolBar fToolBar;
+
+  private ToolItem fToolItem;
+
+  public Maven2RepositorySearchDialog(Shell parent, final Collection alreadyAddedArtifactsOrDependencies,
+      final String queryType) {
     super(parent);
-    this.artifacts = artifacts;
-    this.queryField = queryField;
+    alreadyAddedArtifactKeys = new HashSet();
+    for(Iterator it = alreadyAddedArtifactsOrDependencies.iterator(); it.hasNext();) {
+      Object alreadyAdded = it.next();
+      if(alreadyAdded instanceof Dependency) {
+        Dependency d = (Dependency) alreadyAdded;
+        alreadyAddedArtifactKeys.add(d.getGroupId() + ":" + d.getArtifactId());
+        alreadyAddedArtifactKeys.add(d.getGroupId() + ":" + d.getArtifactId() + ":" + d.getVersion());
+      } else {
+        Artifact a = (Artifact) alreadyAdded;
+        alreadyAddedArtifactKeys.add(a.getGroupId() + ":" + a.getArtifactId());
+        alreadyAddedArtifactKeys.add(a.getGroupId() + ":" + a.getArtifactId() + ":" + a.getVersion());
+      }
+
+    }
 
     setShellStyle(getShellStyle() | SWT.RESIZE);
     setStatusLineAboveButtons(true);
@@ -107,13 +161,38 @@
       settings = new DialogSettings(DIALOG_SETTINGS);
       settings.put(KEY_WIDTH, 480);
       settings.put(KEY_HEIGHT, 450);
+      settings.put(KEY_TREE_LAYOUT, true);
       pluginSettings.addSection(settings);
+    } else {
+      //update previous version of plugin to deafult values
+      if (settings.get(KEY_TREE_LAYOUT)==null){
+        settings.put(KEY_TREE_LAYOUT, true);
+      }
     }
     this.settings = settings;
+
+    new Job("Maven search initializing") {
+      protected IStatus run(IProgressMonitor monitor) {
+        File[] indexes = Maven2Plugin.getDefault().getMavenRepositoryIndexManager().getIndexes();
+        searchJob = new SearchJob(queryType, indexes);
+        Display.getDefault().syncExec(new Runnable() {
+          public void run() {
+            scheduleSearch();
+          }
+        });
+        return Status.OK_STATUS;
+      }
+
+    }.schedule();
   }
 
+  /**
+   * Set initial query, cannot be changed after dialog is created
+   * 
+   * @param query
+   */
   public void setQuery(String query) {
-    this.queryText = query;
+    this.initialQuery = query;
   }
 
   protected Point getInitialSize() {
@@ -190,15 +269,14 @@
     readSettings();
 
     Composite composite = (Composite) super.createDialogArea(parent);
-
-    Label searchTextlabel = new Label(composite, SWT.NONE);
-    searchTextlabel.setText("Query:");
-    searchTextlabel.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, false));
+    Control header = createHeader(composite);
+    header.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 
     searchText = new Text(composite, SWT.BORDER);
-    if(queryText != null) {
-      searchText.setText(queryText);
+    if(initialQuery != null) {
+      searchText.setText(initialQuery);
     }
+    searchText.setFocus();
     searchText.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, false));
     searchText.addKeyListener(new KeyAdapter() {
       public void keyPressed(KeyEvent e) {
@@ -209,7 +287,7 @@
     });
     searchText.addModifyListener(new ModifyListener() {
       public void modifyText(ModifyEvent e) {
-        scheduleSearch(((Text) e.widget).getText());
+        scheduleSearch();
       }
     });
 
@@ -215,21 +293,15 @@
 
     Label searchResultsLabel = new Label(composite, SWT.NONE);
     searchResultsLabel.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, false, false));
-    searchResultsLabel.setText("Search Results:");
+    searchResultsLabel.setText("&Matching dependencies:");
 
-    Tree tree = new Tree(composite, SWT.BORDER | SWT.MULTI);
+    Tree tree = new Tree(composite, SWT.BORDER | SWT.MULTI | SWT.CHECK);
     tree.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
 
-    final HashSet artifactKeys = new HashSet();
-    for(Iterator it = artifacts.iterator(); it.hasNext();) {
-      Artifact a = (Artifact) it.next();
-      artifactKeys.add(a.getGroupId() + ":" + a.getArtifactId());
-      artifactKeys.add(a.getGroupId() + ":" + a.getArtifactId() + ":" + a.getVersion());
-    }
-
-    searchResultViewer = new TreeViewer(tree);
-    searchResultViewer.setContentProvider(new SearchResultContentProvider());
-    searchResultViewer.setLabelProvider(new SearchResultLabelProvider(artifactKeys));
+    searchResultViewer = new CheckboxTreeViewer(tree);
+    searchResultViewer.setContentProvider(getContentProvider());
+    final SearchResultLabelProvider labelProvider = new SearchResultLabelProvider(alreadyAddedArtifactKeys);
+    searchResultViewer.setLabelProvider(labelProvider);
     searchResultViewer.addSelectionChangedListener(new ISelectionChangedListener() {
       public void selectionChanged(SelectionChangedEvent event) {
         IStructuredSelection selection = (IStructuredSelection) event.getSelection();
@@ -235,31 +307,104 @@
         IStructuredSelection selection = (IStructuredSelection) event.getSelection();
         if(!selection.isEmpty()) {
           Indexer.FileInfo f = getSelectedFileInfo(selection.getFirstElement());
-          int severity = artifactKeys.contains(f.group + ":" + f.artifact) ? IStatus.ERROR : IStatus.OK;
-          updateStatus(new Status(severity, Maven2Plugin.PLUGIN_ID, -1, f.name + " " + f.size + " " + f.date, null));
+          int severity = alreadyAddedArtifactKeys.contains(f.group + ":" + f.artifact) ? IStatus.WARNING : IStatus.OK;
+          updateStatus(createStatus(severity, "Dependency  -" + "  Version: " + f.version + "  ArtifactId: "
+              + f.artifact + "  GroupId: " + f.group));
         } else {
-          updateStatus(new Status(IStatus.ERROR, Maven2Plugin.PLUGIN_ID, -1, "No selection", null));
+          updateStatus(createStatus(IStatus.ERROR, "No selection"));
         }
       }
     });
-    
-    searchResultViewer.addDoubleClickListener(new IDoubleClickListener() {
-      public void doubleClick(DoubleClickEvent event) {
-        // System.err.println( event);
-        buttonPressed(IDialogConstants.OK_ID);
+
+    updateButtonsEnableState(createStatus(IStatus.ERROR, ""));
+
+    scheduleSearch();
+    return composite;
+  }
+
+  private Composite createHeader(Composite composite) {
+    Composite header = new Composite(composite, SWT.NONE);
+    GridLayout layout = new GridLayout();
+    layout.numColumns = 2;
+    layout.marginWidth = 0;
+    layout.marginHeight = 0;
+    header.setLayout(layout);
+
+    Label searchTextlabel = new Label(header, SWT.NONE);
+    searchTextlabel.setText("&Select a query (* = any String):");
+    searchTextlabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+    createViewMenu(header);
+    return header;
+  }
+
+  private void createViewMenu(Composite parent) {
+    fToolBar = new ToolBar(parent, SWT.FLAT);
+    fToolItem = new ToolItem(fToolBar, SWT.PUSH, 0);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.END;
+    fToolBar.setLayoutData(data);
+
+    fToolItem.setImage(JavaPluginImages.get(JavaPluginImages.IMG_ELCL_VIEW_MENU));
+    fToolItem.setDisabledImage(JavaPluginImages.get(JavaPluginImages.IMG_DLCL_VIEW_MENU));
+    fToolItem.setToolTipText("Settings");
+    fToolItem.addSelectionListener(new SelectionAdapter() {
+      public void widgetSelected(SelectionEvent e) {
+        showViewMenu();
       }
     });
 
-    updateStatus(new Status(IStatus.ERROR, Maven2Plugin.PLUGIN_ID, -1, "", null));
+    fMenuManager = new MenuManager();
+    fillViewMenu(fMenuManager);
+  }
 
-    scheduleSearch(queryText);
+  private void showViewMenu() {
+    Menu menu = fMenuManager.createContextMenu(getShell());
+    Rectangle bounds = fToolItem.getBounds();
+    Point topLeft = new Point(bounds.x, bounds.y + bounds.height);
+    topLeft = fToolBar.toDisplay(topLeft);
+    menu.setLocation(topLeft.x, topLeft.y);
+    menu.setVisible(true);
+  }
+
+  private void fillViewMenu(IMenuManager viewMenu) {
+    ToggleLayoutAction action = new ToggleLayoutAction();
+    action.setChecked(settings.getBoolean(KEY_TREE_LAYOUT));
+    viewMenu.add(action);
+  }
 
-    return composite;
+  private class ToggleLayoutAction extends Action {
+    public ToggleLayoutAction() {
+      super("&Group results by artifact's 'groupId'", IAction.AS_CHECK_BOX);
+    }
+
+    public void run() {
+      settings.put(KEY_TREE_LAYOUT, isChecked());
+
+      searchResultViewer.setContentProvider(getContentProvider());
+      searchResultViewer.refresh();
+    }
+  }
+
+  private IContentProvider getContentProvider() {
+    boolean checked = settings.getBoolean(KEY_TREE_LAYOUT);
+    // TODO return sigletons
+    if(checked) {
+      return new SearchResultGroupByContentProvider();
+    } else {
+      return new SearchResultContentProvider();
+    }
   }
 
   protected void computeResult() {
-    IStructuredSelection selection = (IStructuredSelection) searchResultViewer.getSelection();
-    setResult(Collections.singletonList(getSelectedFileInfo(selection.getFirstElement())));
+    List dependencies = new LinkedList();
+    Object[] checkedElements = searchResultViewer.getCheckedElements();
+    for(int i = 0; i < checkedElements.length; i++ ) {
+      Object element = checkedElements[i];
+      dependencies.add(getSelectedFileInfo(element).getDependency());
+    }
+    setResult(dependencies);
   }
 
   protected FileInfo getSelectedFileInfo(Object element) {
@@ -264,34 +409,30 @@
 
   protected FileInfo getSelectedFileInfo(Object element) {
     if(element instanceof Indexer.ArtifactInfo) {
+      // try first child, where should be most highest version
       return (FileInfo) ((Indexer.ArtifactInfo) element).files.iterator().next();
+    } else if(element instanceof NodeGroup) {
+      // try first child only
+      return getSelectedFileInfo(((NodeGroup) element).children.iterator().next());
     }
     return (FileInfo) element;
   }
-  
-  protected void scheduleSearch(String query) {
-    if(query != null && query.length() > 0) {
-      if(searchJob == null) {
-        File[] indexes = Maven2Plugin.getDefault().getMavenRepositoryIndexManager().getIndexes();
-        searchJob = new SearchJob(queryField, indexes, this);
-      }
 
-      searchJob.setQuery(query.toLowerCase());
-      if(!searchJob.isRunning()) {
+  protected void scheduleSearch() {
+    if(searchJob != null) {
+      if(!searchText.isDisposed() && searchText.getText() != null && searchText.getText().length() > 0) {
+        searchJob.setQuery(searchText.getText().toLowerCase());
+        searchJob.cancel();
         searchJob.schedule();
+      } else {
+        updateStatus(createStatus(IStatus.OK, ""));
       }
-    }
-  }
-
-  protected void setSearchResult(Map searchResult) {
-    if(this.searchResultViewer.getContentProvider() != null) {
-      this.searchResultViewer.setInput(searchResult);
+    } else {
+      updateStatus(createStatus(IStatus.WARNING, "Initializing search engine"));
     }
   }
 
-  private static class SearchJob extends Job {
-    final Maven2RepositorySearchDialog dialog;
-
+  private class SearchJob extends Job {
     final Indexer indexer;
 
     private File[] indexes;
@@ -298,72 +439,94 @@
 
     private String query;
 
-    private String field;
+    private boolean isQueryModified = false;
 
-    boolean isRunning = false;
+    private String type;
 
-    public SearchJob(String field, File[] indexes, Maven2RepositorySearchDialog dialog) {
+    public SearchJob(String field, File[] indexes) {
       super("Repository search");
-      this.field = field;
+      this.type = field;
       this.indexer = new Indexer();
       this.indexes = indexes;
-      this.dialog = dialog;
     }
 
-    public boolean isRunning() {
-      return isRunning;
-    }
+    public synchronized void setQuery(String newQuery) {
+      isQueryModified = !newQuery.equals(query);
+      this.query = newQuery;
 
-    public void setQuery(String query) {
-      this.query = query;
     }
 
     protected IStatus run(IProgressMonitor monitor) {
-      isRunning = true;
-      while(!monitor.isCanceled() && query != null) {
-        String activeQuery = query;
-        query = null;
+      if(isQueryModified) {
+        final String activeQuery = query;
         try {
-          Map res = indexer.search(indexes, activeQuery, field);
-          setResult(new Status(IStatus.OK, Maven2Plugin.PLUGIN_ID, -1, "Result for: " + activeQuery, null), res);
+          if(monitor.isCanceled())
+            throw new OperationCanceledException();
+
+          Display.getDefault().syncExec(new Runnable() {
+            public void run() {
+              updateStatus(createStatus(IStatus.WARNING, "Please wait, searching for: " + activeQuery + "..."));
+            }
+          });
+
+          Map res = indexer.search(indexes, activeQuery, type);
+
+          if(monitor.isCanceled())
+            throw new OperationCanceledException();
+          setResult(createStatus(IStatus.INFO, "Search finished for query: " + activeQuery), res);
 
         } catch(final RuntimeException ex) {
-          setResult(new Status(IStatus.ERROR, Maven2Plugin.PLUGIN_ID, -1, "Search error: " + ex.toString(), null),
-              Collections.EMPTY_MAP);
+          if(monitor.isCanceled())
+            throw new OperationCanceledException();
+          setResult(createStatus(IStatus.ERROR, "Search error: " + ex.getMessage()), Collections.EMPTY_MAP);
         } catch(final Exception ex) {
-          setResult(new Status(IStatus.ERROR, Maven2Plugin.PLUGIN_ID, -1, "Search error: " + ex.getMessage(), null),
-              Collections.EMPTY_MAP);
+          if(monitor.isCanceled())
+            throw new OperationCanceledException();
+          setResult(createStatus(IStatus.ERROR, "Search error: " + ex.getMessage()), Collections.EMPTY_MAP);
         }
       }
-      isRunning = false;
       return Status.OK_STATUS;
     }
 
-    private void setResult(final Status status, final Map result) {
+    private void setResult(final IStatus status, final Map result) {
       Display.getDefault().syncExec(new Runnable() {
         public void run() {
-          dialog.updateStatus(status);
-          dialog.setSearchResult(result);
+          updateStatus(status);
+          searchResultViewer.setInput(result);
         }
       });
     }
+  }
 
+  protected static IStatus createStatus(int status, String message) {
+    return new Status(status, Maven2Plugin.PLUGIN_ID, -1, message, null);
   }
 
   public static class SearchResultLabelProvider extends LabelProvider implements IColorProvider {
-    private final Set artifactKeys;
+    private final DateFormat dateFormater = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.MEDIUM,
+        SimpleDateFormat.SHORT, new Locale(Platform.getNL()));
+
+    private final Set alreadyAddedArtifactKeys;
 
     public SearchResultLabelProvider(Set artifactKeys) {
-      this.artifactKeys = artifactKeys;
+      this.alreadyAddedArtifactKeys = artifactKeys;
     }
 
     public String getText(Object element) {
+      if(element instanceof NodeGroup) {
+        NodeGroup node = (NodeGroup) element;
+        return node.key; // artifact group
+      }
+
       if(element instanceof Indexer.ArtifactInfo) {
         Indexer.ArtifactInfo a = (Indexer.ArtifactInfo) element;
         return (a.className == null ? "" : a.className + "   " + a.packageName + "   ") + a.group + "   " + a.artifact;
-      } else if(element instanceof Indexer.FileInfo) {
+      }
+
+      if(element instanceof Indexer.FileInfo) {
         Indexer.FileInfo f = (Indexer.FileInfo) element;
-        return f.version + " - " + f.name + " - " + f.size + " - " + f.date + " [" + f.repository + "]";
+        return f.version + " - " + f.name + " - " + f.size + "b - " + dateFormater.format(f.date) + " [" + f.repository
+            + "]";
       }
       return super.getText(element);
     }
@@ -368,20 +531,40 @@
       return super.getText(element);
     }
 
+    public Image getImage(Object element) {
+      if(element instanceof NodeGroup) {
+        return PlatformUI.getWorkbench().getSharedImages().getImage(org.eclipse.ui.ISharedImages.IMG_OBJ_FOLDER);
+      }
+      if(element instanceof Indexer.ArtifactInfo) {
+        return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_LIBRARY);
+      }
+      if(element instanceof Indexer.FileInfo) {
+        return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_EXTERNAL_ARCHIVE);
+      }
+      return null;
+    }
+
     public Color getForeground(Object element) {
       if(element instanceof Indexer.FileInfo) {
         Indexer.FileInfo f = (FileInfo) element;
-        if(artifactKeys.contains(f.group + ":" + f.artifact + ":" + f.version)) {
-          return Display.getDefault().getSystemColor(SWT.COLOR_RED);
+        if(alreadyAddedArtifactKeys.contains(f.group + ":" + f.artifact + ":" + f.version)) {
+          return Display.getDefault().getSystemColor(SWT.COLOR_DARK_GREEN);
         }
-        return Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY);
-      } else if(element instanceof Indexer.ArtifactInfo) {
+        return null; // default black color
+
+      }
+
+      if(element instanceof Indexer.ArtifactInfo) {
         Indexer.ArtifactInfo i = (Indexer.ArtifactInfo) element;
-        if(artifactKeys.contains(i.group + ":" + i.artifact)) {
-          return Display.getDefault().getSystemColor(SWT.COLOR_RED);
+        if(alreadyAddedArtifactKeys.contains(i.group + ":" + i.artifact)) {
+          return Display.getDefault().getSystemColor(SWT.COLOR_DARK_GREEN);
         }
+      } else if(element instanceof NodeGroup) {
+        NodeGroup node = (NodeGroup) element;
+        return getForeground(node.children.get(0));
       }
-      return null;
+
+      return Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY);
     }
 
     public Color getBackground(Object element) {
@@ -424,4 +607,94 @@
 
   }
 
+  private static class NodeGroup {
+    public final String key;
+
+    public final List children;
+
+    NodeGroup(String key, List childs) {
+      this.key = key;
+      this.children = childs;
+    }
+  }
+
+  public static class SearchResultGroupByContentProvider implements ITreeContentProvider {
+    private static Object[] EMPTY = new Object[0];
+
+    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+    }
+
+    public Object[] getElements(Object inputElement) {
+      if(inputElement instanceof Map) {
+        Collection flatRoots = ((Map) inputElement).values();
+        List result = groupBy(flatRoots);
+        return result.toArray();
+      }
+      return EMPTY;
+    }
+
+    /**
+     * group by artifact group
+     */
+    private List groupBy(Collection flatRoots) {
+      List result = new LinkedList();
+
+      Map map = new TreeMap();
+      for(Iterator iter = flatRoots.iterator(); iter.hasNext();) {
+        Indexer.ArtifactInfo artifactInfo = (ArtifactInfo) iter.next();
+        List group;
+        if(map.containsKey(artifactInfo.group)) {
+          group = (List) map.get(artifactInfo.group);
+        } else {
+          group = new ArrayList();
+          map.put(artifactInfo.group, group);
+        }
+        // remove artifact info node for one version
+        if(artifactInfo.files != null && artifactInfo.files.size() == 1) {
+          group.add(artifactInfo.files.iterator().next());
+        } else {
+          group.add(artifactInfo);
+        }
+      }
+
+      for(Iterator iter = map.keySet().iterator(); iter.hasNext();) {
+        String key = (String) iter.next();
+        List group = (List) map.get(key);
+        if(group.size() > 1) {
+          result.add(new NodeGroup(key, group));
+        } else {
+          Object alone = group.get(0);
+          result.add(alone);
+        }
+      }
+      return result;
+    }
+
+    public Object[] getChildren(Object parentElement) {
+      if(parentElement instanceof NodeGroup) {
+        NodeGroup group = (NodeGroup) parentElement;
+        return group.children.toArray();
+      }
+
+      if(parentElement instanceof Indexer.ArtifactInfo) {
+        Indexer.ArtifactInfo a = (Indexer.ArtifactInfo) parentElement;
+        return a.files.toArray();
+      }
+
+      return EMPTY;
+    }
+
+    public boolean hasChildren(Object element) {
+      return !(element instanceof Indexer.FileInfo);
+    }
+
+    public Object getParent(Object element) {
+      return null;
+    }
+
+    public void dispose() {
+    }
+
+  }
+
 }
Index: src/org/maven/ide/eclipse/container/Maven2ClasspathContainer.java
===================================================================
--- src/org/maven/ide/eclipse/container/Maven2ClasspathContainer.java	(revision 250)
+++ src/org/maven/ide/eclipse/container/Maven2ClasspathContainer.java	(working copy)
@@ -57,10 +57,24 @@
 
   private final IClasspathEntry[] entries;
   private final IPath path;
-
+  
+  public static IPath getNewPath(boolean includeModules, boolean resolveWorspaceProjects) {
+    IPath newPath = new Path(Maven2Plugin.CONTAINER_ID);
+    if(includeModules) {
+      newPath = newPath.append(Maven2ClasspathContainer.INCLUDE_MODULES);
+    }
+    if(resolveWorspaceProjects) {
+      newPath = newPath.append(Maven2ClasspathContainer.RESOLVE_WORKSPACE_PROJECTS);
+    }
+    return newPath;
+  }
+  
+  public static IPath getDefaultPath(){
+      return getNewPath(false,true);
+  }
   
   public Maven2ClasspathContainer() {
-    this.path = new Path(Maven2Plugin.CONTAINER_ID).append(RESOLVE_WORKSPACE_PROJECTS);
+    this.path = getDefaultPath();
     this.entries = new IClasspathEntry[0];
   }
   
Index: src/org/maven/ide/eclipse/container/Maven2ClasspathContainerInitializer.java
===================================================================
--- src/org/maven/ide/eclipse/container/Maven2ClasspathContainerInitializer.java	(revision 250)
+++ src/org/maven/ide/eclipse/container/Maven2ClasspathContainerInitializer.java	(working copy)
@@ -23,6 +23,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
@@ -51,6 +52,7 @@
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.swt.widgets.Display;
 import org.maven.ide.eclipse.Maven2Plugin;
+import org.maven.ide.eclipse.container.extension.ContainerManager;
 import org.maven.ide.eclipse.embedder.BuildPathManager;
 import org.maven.ide.eclipse.embedder.EmbedderFactory;
 import org.maven.ide.eclipse.launch.console.Maven2Console;
@@ -76,24 +78,13 @@
 
       plugin.getMavenModelManager().initModels(new NullProgressMonitor());
 
-      Maven2ClasspathContainer mavenContainer;
-      if(container == null) {
-        mavenContainer = new Maven2ClasspathContainer();
-      } else {
-        mavenContainer = new Maven2ClasspathContainer(containerPath, container.getClasspathEntries());
-      }
-
-      try {
-        JavaCore.setClasspathContainer(containerPath, new IJavaProject[] {project},
-            new IClasspathContainer[] {mavenContainer}, new NullProgressMonitor());
-      } catch(JavaModelException ex) {
-        Maven2Plugin.log("Unable to set container for " + containerPath.toString(), ex);
-        return;
-      }
-
       if(container != null) {
+        //update existing container
+        ContainerManager.getInstance().setupContainer(project, containerPath, new HashSet(Arrays.asList(container.getClasspathEntries())));
         return;
-      }
+      } 
+      //create a brand new container
+      ContainerManager.getInstance().setupContainer(project, Maven2ClasspathContainer.getDefaultPath(), new HashSet());
       
       new Job("Initializing " + project.getProject().getName()) {
         protected IStatus run(IProgressMonitor monitor) {
@@ -105,7 +96,7 @@
 
           return Status.OK_STATUS;
         }
-      }.schedule();
+      }.schedule(300);
     }
   }
 
@@ -127,12 +118,7 @@
     display.syncExec(bundleUpdater);
 
     if(bundleUpdater.containerUpdated) {
-      try {
-        JavaCore.setClasspathContainer(containerSuggestion.getPath(), new IJavaProject[] {project},
-            new IClasspathContainer[] {new Maven2ClasspathContainer(containerPath, bundleUpdater.newEntries)}, null);
-      } catch(JavaModelException ex) {
-        Maven2Plugin.getDefault().getConsole().logError(ex.getMessage());
-      }
+      ContainerManager.getInstance().setupContainer(project, containerSuggestion.getPath(), new HashSet(Arrays.asList(bundleUpdater.newEntries)));      
     }
   }
   
Index: src/org/maven/ide/eclipse/container/Maven2ClasspathContainerPage.java
===================================================================
--- src/org/maven/ide/eclipse/container/Maven2ClasspathContainerPage.java	(revision 250)
+++ src/org/maven/ide/eclipse/container/Maven2ClasspathContainerPage.java	(working copy)
@@ -55,7 +55,7 @@
 
   
   public Maven2ClasspathContainerPage() {
-    super("Maven2 Contener");
+    super("Maven2 Container");
   }
 
   public void initialize(IJavaProject javaProject, IClasspathEntry[] currentEntries) {
Index: src/org/maven/ide/eclipse/container/extension/IContainerProvider.java
===================================================================
--- src/org/maven/ide/eclipse/container/extension/IContainerProvider.java	
+++ src/org/maven/ide/eclipse/container/extension/IContainerProvider.java	
@@ -0,0 +1,15 @@
+
+package org.maven.ide.eclipse.container.extension;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.IJavaProject;
+
+
+public interface IContainerProvider {
+  boolean isApplycable(IJavaProject project);
+
+  void setupContainer(IJavaProject project, IPath path, Set entries);
+
+}
Index: src/org/maven/ide/eclipse/container/extension/ContainerManager.java
===================================================================
--- src/org/maven/ide/eclipse/container/extension/ContainerManager.java	
+++ src/org/maven/ide/eclipse/container/extension/ContainerManager.java	
@@ -0,0 +1,71 @@
+
+package org.maven.ide.eclipse.container.extension;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.IJavaProject;
+import org.maven.ide.eclipse.Maven2Plugin;
+
+
+public class ContainerManager {
+  private static ContainerManager instance;
+
+  private static final String ATTRIBUTE_CLASS = "class";
+
+  private static IContainerProvider DEFAULT_PROVIDER = new DefaultContainerProvider();
+
+  private Map providersMap = new HashMap();
+
+  public static ContainerManager getInstance() {
+    if(instance == null) {
+      instance = new ContainerManager();
+    }
+    return instance;
+
+  }
+
+  private ContainerManager() {
+    loadModulesFromExtensions();
+  }
+
+  private void loadModulesFromExtensions() {
+
+    IExtension[] extensions = Platform.getExtensionRegistry().getExtensionPoint(Maven2Plugin.PLUGIN_ID, "container")
+        .getExtensions();
+
+    for(int i = 0; i < extensions.length; i++ ) {
+      IConfigurationElement[] configElements = extensions[i].getConfigurationElements();
+      for(int j = 0; j < configElements.length; j++ ) {
+
+        IContainerProvider containerProvider = null;
+        try {
+          containerProvider = (IContainerProvider) configElements[j].createExecutableExtension(ATTRIBUTE_CLASS);
+          String id = configElements[j].getAttribute("id");
+          providersMap.put(id, containerProvider);
+        } catch(CoreException ex) {
+          Maven2Plugin.log(ex);
+        }
+
+      }
+    }
+  }
+
+  public void setupContainer(IJavaProject project, IPath path, Set entries) {
+    for(Iterator iterator = providersMap.values().iterator(); iterator.hasNext();) {
+      IContainerProvider provider = (IContainerProvider) iterator.next();
+      if(provider.isApplycable(project)) {
+        provider.setupContainer(project, path, entries);
+        return;
+      }
+    }
+    DEFAULT_PROVIDER.setupContainer(project, path, entries);
+  }
+}
Index: src/org/maven/ide/eclipse/container/extension/DefaultContainerProvider.java
===================================================================
--- src/org/maven/ide/eclipse/container/extension/DefaultContainerProvider.java	
+++ src/org/maven/ide/eclipse/container/extension/DefaultContainerProvider.java	
@@ -0,0 +1,22 @@
+
+package org.maven.ide.eclipse.container.extension;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IJavaProject;
+
+
+public class DefaultContainerProvider extends AbstractContainerProvider {
+
+  public boolean isApplycable(IJavaProject project) {
+    return true;
+  }
+
+  public void setupContainer(IJavaProject project, IPath containerPath, Set entries) {
+    final IClasspathContainer mavenContainer = createDefaultContainer(containerPath, entries);
+    setClasspathContainer(mavenContainer, project);
+  }
+
+}
Index: src/org/maven/ide/eclipse/container/extension/AbstractContainerProvider.java
===================================================================
--- src/org/maven/ide/eclipse/container/extension/AbstractContainerProvider.java	
+++ src/org/maven/ide/eclipse/container/extension/AbstractContainerProvider.java	
@@ -0,0 +1,31 @@
+
+package org.maven.ide.eclipse.container.extension;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.maven.ide.eclipse.Maven2Plugin;
+import org.maven.ide.eclipse.container.Maven2ClasspathContainer;
+
+
+abstract public class AbstractContainerProvider implements IContainerProvider {
+
+  public void setClasspathContainer(IClasspathContainer mavenContainer, IJavaProject project) {
+    try {
+      JavaCore.setClasspathContainer(mavenContainer.getPath(), new IJavaProject[] {project},
+          new IClasspathContainer[] {mavenContainer}, new NullProgressMonitor());
+    } catch(JavaModelException ex) {
+      Maven2Plugin.log("Unable to set container for " + mavenContainer, ex);
+    }
+  }
+
+  public IClasspathContainer createDefaultContainer(IPath containerPath, Set entries) {
+    return new Maven2ClasspathContainer(containerPath, entries);
+  }
+
+}
Index: src/org/maven/ide/eclipse/embedder/BuildPathManager.java
===================================================================
--- src/org/maven/ide/eclipse/embedder/BuildPathManager.java	(revision 250)
+++ src/org/maven/ide/eclipse/embedder/BuildPathManager.java	(working copy)
@@ -34,6 +34,7 @@
 import java.util.jar.Manifest;
 
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DefaultArtifact;
 import org.apache.maven.artifact.InvalidArtifactRTException;
 import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.resolver.AbstractArtifactResolutionException;
@@ -80,6 +81,7 @@
 import org.maven.ide.eclipse.Maven2Plugin;
 import org.maven.ide.eclipse.Messages;
 import org.maven.ide.eclipse.container.Maven2ClasspathContainer;
+import org.maven.ide.eclipse.container.extension.ContainerManager;
 import org.maven.ide.eclipse.index.MavenRepositoryIndexManager;
 import org.maven.ide.eclipse.launch.console.Maven2Console;
 import org.maven.ide.eclipse.preferences.Maven2PreferenceConstants;
@@ -108,6 +110,11 @@
         entry.getPath().toString().indexOf("/" + Maven2ClasspathContainer.INCLUDE_MODULES) > -1;
   }
   
+  public static boolean isIncludingModules(IClasspathContainer container) {
+    return container == null ? false : //
+        container.getPath().toString().indexOf("/" + Maven2ClasspathContainer.INCLUDE_MODULES) > -1;
+  }
+  
   public static boolean isResolvingWorkspaceProjects(IClasspathEntry entry) {
     return entry == null ? false : //
         entry.getPath().toString().indexOf("/" + Maven2ClasspathContainer.RESOLVE_WORKSPACE_PROJECTS) > -1;
@@ -113,6 +120,11 @@
         entry.getPath().toString().indexOf("/" + Maven2ClasspathContainer.RESOLVE_WORKSPACE_PROJECTS) > -1;
   }
   
+  public static boolean isResolvingWorkspaceProjects(IClasspathContainer container) {
+    return container == null ? false : //
+        container.getPath().toString().indexOf("/" + Maven2ClasspathContainer.RESOLVE_WORKSPACE_PROJECTS) > -1;
+  }
+  
   public static IClasspathEntry getMavenContainerEntry(IJavaProject javaProject) throws JavaModelException {
     IClasspathEntry[] classpath = javaProject.getRawClasspath();
     for(int i = 0; i < classpath.length; i++ ) {
@@ -124,9 +136,35 @@
     return null;
   }
   
+  public void downloadSourcesOrJavaDoc(final IProject project, final IProgressMonitor monitor) throws CoreException {
+    try {
+      monitor.beginTask("Downloading sources", IProgressMonitor.UNKNOWN);
+      boolean offline = false;
+      boolean downloadSources = true;
+      boolean downloadJavadoc = true;  
+
+      internalUpdateClasspathContainer(project, true /*recursive*/, monitor, offline, downloadSources, downloadJavadoc);
+
+    } finally {
+      monitor.done();
+    }
+  }  
   
   public void updateClasspathContainer(IProject project, boolean recursive, IProgressMonitor monitor) throws CoreException {
-    IClasspathEntry containerEntry = getMavenContainerEntry(JavaCore.create(project));
+    boolean offline = preferenceStore.getBoolean(Maven2PreferenceConstants.P_OFFLINE);
+    boolean downloadSources = !offline & preferenceStore.getBoolean(Maven2PreferenceConstants.P_DOWNLOAD_SOURCES);
+    boolean downloadJavadoc = !offline & preferenceStore.getBoolean(Maven2PreferenceConstants.P_DOWNLOAD_JAVADOC);  
+
+    internalUpdateClasspathContainer(project, recursive, monitor, offline, downloadSources, downloadJavadoc);
+  }
+
+  private void internalUpdateClasspathContainer(IProject project, boolean recursive, IProgressMonitor monitor, boolean offline, boolean downloadSources, boolean downloadJavadoc) throws JavaModelException, CoreException {
+    final IJavaProject javaProject = JavaCore.create(project);
+    IClasspathEntry containerEntry = getMavenContainerEntry(javaProject);
+    if (containerEntry==null){
+        Maven2Plugin.getDefault().getConsole().logError("Maven container is not found, please add it");
+        return;
+    }
     boolean resolveWorkspaceProjects = isResolvingWorkspaceProjects(containerEntry);
     boolean includeModules = isIncludingModules(containerEntry);
     
@@ -143,17 +181,14 @@
     } catch(CoreException ex) {
       addMarker(pomFile, ex.getMessage(), 1, IMarker.SEVERITY_ERROR);
     }
-    
-    resolveClasspathEntries(entries, moduleArtifacts, pomFile, pomFile, includeModules, resolveWorkspaceProjects, monitor);
+  
+    resolveClasspathEntries(entries, moduleArtifacts, pomFile, pomFile, includeModules, resolveWorkspaceProjects, monitor, offline, downloadSources, downloadJavadoc);
 
     dependentProjects.addAll(mavenModelManager.getDependentProjects(pomFile));
     dependentProjects.remove(project);
-
-    Maven2ClasspathContainer container = new Maven2ClasspathContainer(containerEntry.getPath(), entries);
-
-    JavaCore.setClasspathContainer(container.getPath(), new IJavaProject[] {JavaCore.create(project)},
-        new IClasspathContainer[] {container}, monitor);
     
+    ContainerManager.getInstance().setupContainer(javaProject,  containerEntry.getPath(), entries);
+ 
     for(Iterator it = dependentProjects.iterator(); it.hasNext();) {
       IProject p = (IProject) it.next();
       updateClasspathContainer(p, recursive, monitor);
@@ -160,9 +195,8 @@
     }
   }
   
-
   private void resolveClasspathEntries(Set libraryEntries, Map moduleArtifacts, IFile rootPomFile, IFile pomFile,
-      boolean recursive, boolean resolveWorkspaceProjects, IProgressMonitor monitor) {
+      boolean recursive, boolean resolveWorkspaceProjects, IProgressMonitor monitor, boolean offline, boolean downloadSources, boolean downloadJavadoc) {
     if(monitor.isCanceled()) {
       throw new OperationCanceledException();
     }
@@ -176,9 +210,6 @@
 
     IProject currentProject = pomFile.getProject();
     try {
-      boolean offline = preferenceStore.getBoolean(Maven2PreferenceConstants.P_OFFLINE);
-      boolean downloadSources = !offline & preferenceStore.getBoolean(Maven2PreferenceConstants.P_DOWNLOAD_SOURCES);
-      boolean downloadJavadoc = !offline & preferenceStore.getBoolean(Maven2PreferenceConstants.P_DOWNLOAD_JAVADOC);
       boolean debug = preferenceStore.getBoolean(Maven2PreferenceConstants.P_DEBUG_OUTPUT);
 
       MavenExecutionResult result = mavenModelManager.readMavenProject(pomFile, monitor, offline, debug, resolveWorkspaceProjects);
@@ -235,26 +266,13 @@
             continue;
           }
         }
-
-        Path srcPath = materializeArtifactPath(embedder, mavenProject, a, "java-source", "sources", downloadSources, monitor);
         
-        ArrayList attributes = new ArrayList();
+        List attributes = new ArrayList();
         attributes.add(JavaCore.newClasspathAttribute(Maven2ClasspathContainer.GROUP_ID_ATTRIBUTE, a.getGroupId()));
         attributes.add(JavaCore.newClasspathAttribute(Maven2ClasspathContainer.ARTIFACT_ID_ATTRIBUTE, a.getArtifactId()));
         attributes.add(JavaCore.newClasspathAttribute(Maven2ClasspathContainer.VERSION_ATTRIBUTE, a.getVersion()));
-        
-        if(srcPath == null) { // no need to search for javadoc if we have source code
-          Path javadocPath = materializeArtifactPath(embedder, mavenProject, a, "javadoc", "javadoc", downloadJavadoc, monitor);
-          String javaDocUrl = null;
-          if(javadocPath != null) {
-            javaDocUrl = Maven2ClasspathContainer.getJavaDocUrl(javadocPath.toString());
-          } else {
-            javaDocUrl = getJavaDocUrl(artifactLocation, monitor);
-          }
-          if(javaDocUrl != null) {
-            attributes.add(JavaCore.newClasspathAttribute(IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, javaDocUrl));
-          }
-        }
+
+        IPath srcPath = materializeSourcesAndJavaDoc(monitor, downloadSources, downloadJavadoc, mavenProject, embedder, a, artifactLocation, attributes);
 
         libraryEntries.add(JavaCore.newLibraryEntry(new Path(artifactLocation), srcPath, null, new IAccessRule[0],
             (IClasspathAttribute[]) attributes.toArray(new IClasspathAttribute[attributes.size()]), 
@@ -274,7 +292,7 @@
           IResource memberPom = basedir.findMember(module + "/" + Maven2Plugin.POM_FILE_NAME); //$NON-NLS-1$
           if(memberPom != null && memberPom.getType() == IResource.FILE) {
             resolveClasspathEntries(libraryEntries, moduleArtifacts, // 
-                rootPomFile, (IFile) memberPom, true, resolveWorkspaceProjects, monitor);
+                rootPomFile, (IFile) memberPom, true, resolveWorkspaceProjects, monitor, offline, downloadSources, downloadJavadoc);
           }
         }
       }
@@ -303,6 +321,37 @@
     }
   }
 
+  public IPath materializeSourcesAndJavaDoc(final IProgressMonitor monitor,boolean downloadSources, boolean downloadJavadoc, final MavenProject mavenProject, final MavenEmbedder embedder, final Artifact a, final String artifactLocation, final List attributes) throws Exception, CoreException {
+    IPath srcPath = materializeArtifactPath(embedder, mavenProject, a, "java-source", "sources", downloadSources, monitor);
+    if (srcPath ==null){
+      //try guest in parent (spring-aop to spring)
+      String guest = a.getArtifactId();
+      int lastIndexOf = guest.lastIndexOf("-");
+      if(lastIndexOf > 0) {
+        guest = guest.substring(0, lastIndexOf);
+        Artifact fake = new DefaultArtifact(a.getGroupId(), guest, a.getVersionRange(), a.getScope(), a.getType(), a
+            .getClassifier(), a.getArtifactHandler());
+        String fakeArtifactLocation = a.getFile().getAbsolutePath().replace(a.getArtifactId(), guest);
+        fake.setFile(new File(fakeArtifactLocation));
+        srcPath = materializeArtifactPath(embedder, mavenProject, fake, "java-source", "sources", downloadJavadoc, monitor);
+      }
+    }
+    if(srcPath == null) { // no need to search for javadoc if we have source code
+      IPath javadocPath = materializeArtifactPath(embedder, mavenProject, a, "javadoc", "javadoc", downloadJavadoc, monitor);
+      String javaDocUrl = null;
+      if(javadocPath != null) {
+        javaDocUrl = Maven2ClasspathContainer.getJavaDocUrl(javadocPath.toString());
+      } else {
+        javaDocUrl = getJavaDocUrl(artifactLocation, monitor);
+      }      
+      if(javaDocUrl != null) {
+        attributes.add(JavaCore.newClasspathAttribute(IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, javaDocUrl));
+      }     
+      
+    }
+    return srcPath;
+  }
+
   private MavenProject getMavenProject(IFile pomFile, MavenExecutionResult result) {
     deleteMarkers(pomFile);
 
@@ -375,7 +424,7 @@
   
 
   // type = "java-source"
-  private Path materializeArtifactPath(MavenEmbedder embedder, MavenProject mavenProject, Artifact a, String type,
+  private IPath materializeArtifactPath(MavenEmbedder embedder, MavenProject mavenProject, Artifact a, String type,
       String suffix, boolean download, IProgressMonitor monitor) throws Exception {
     String artifactLocation = a.getFile().getAbsolutePath();
 
@@ -512,10 +561,10 @@
   }
 
   private IClasspathEntry getJREContainer(String version) {
-    int n = VERSIONS.indexOf(version);
+    int n = JRE_VERSIONS.indexOf(version);
     if(n > -1) {
       Map jreContainers = getJREContainers();
-      for(int i = n; i < VERSIONS.size(); i++ ) {
+      for(int i = n; i < JRE_VERSIONS.size(); i++ ) {
         IClasspathEntry entry = (IClasspathEntry) jreContainers.get(version);
         if(entry != null) {
           console.logMessage("JRE compliant to " + version + ". " + entry);
@@ -611,10 +660,10 @@
 
     String source = getBuildOption(mavenProject, "maven-compiler-plugin", "source");
     if(source != null) {
-      if(VERSIONS.contains(source)) {
+      if(JRE_VERSIONS.contains(source)) {
         console.logMessage("Setting source compatibility: " + source);
-        setVersion(options, JavaCore.COMPILER_SOURCE, source);
-        setVersion(options, JavaCore.COMPILER_COMPLIANCE, source);
+        setJREVersion(options, JavaCore.COMPILER_SOURCE, source);
+        setJREVersion(options, JavaCore.COMPILER_COMPLIANCE, source);
       } else {
         console.logError("Invalid compiler source " + source + ". Using default");
       }
@@ -622,9 +671,9 @@
 
     String target = getBuildOption(mavenProject, "maven-compiler-plugin", "target");
     if(target != null) {
-      if(VERSIONS.contains(target)) {
+      if(JRE_VERSIONS.contains(target)) {
         console.logMessage("Setting target compatibility: " + source);
-        setVersion(options, JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, target);
+        setJREVersion(options, JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, target);
       } else {
         console.logError("Invalid compiler target " + target + ". Using default");
       }
@@ -810,7 +859,7 @@
     for(int i = 0; i < entries.length; i++ ) {
       IClasspathEntry entry = entries[i];
       if(entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER && isMaven2ClasspathContainer(entry.getPath())) {
-        return (IClasspathContainer) entry;
+        return JavaCore.getClasspathContainer(entry.getPath(), project);
       }
     }
     return null; 
@@ -830,9 +879,9 @@
   }
 
   
-  private static final List VERSIONS = Arrays.asList("1.1,1.2,1.3,1.4,1.5,1.6,1.7".split(","));
+  private static final List JRE_VERSIONS = Arrays.asList("1.1,1.2,1.3,1.4,1.5,1.6,1.7".split(","));
 
-  private static void setVersion(Map options, String name, String value) {
+  private static void setJREVersion(Map options, String name, String value) {
     if(value == null) {
       return;
     }
@@ -840,8 +889,8 @@
     if(current == null) {
       options.put(name, value);
     } else {
-      int oldIndex = VERSIONS.indexOf(current);
-      int newIndex = VERSIONS.indexOf(value.trim());
+      int oldIndex = JRE_VERSIONS.indexOf(current);
+      int newIndex = JRE_VERSIONS.indexOf(value.trim());
       if(newIndex > oldIndex) {
         options.put(name, value);
       }
Index: src/org/maven/ide/eclipse/embedder/EmbedderFactory.java
===================================================================
--- src/org/maven/ide/eclipse/embedder/EmbedderFactory.java	(revision 250)
+++ src/org/maven/ide/eclipse/embedder/EmbedderFactory.java	(working copy)
@@ -37,7 +37,15 @@
 
 
 public class EmbedderFactory {
-
+  public static final File REAL_GLOBAL_SETTINGS_FILE = new File(System.getenv( "MAVEN_HOME"), "conf/settings.xml" );
+  /**
+   * 
+   * @param customizer
+   * @param logger
+   * @param globalSettings (if null, default location will be used)
+   * @return
+   * @throws MavenEmbedderException
+   */
   public static MavenEmbedder createMavenEmbedder(ContainerCustomizer customizer, MavenEmbedderLogger logger, String globalSettings) throws MavenEmbedderException {
     Configuration configuration = new DefaultConfiguration();
     
@@ -46,7 +54,7 @@
     configuration.setMavenEmbedderLogger(logger);
     configuration.setClassLoader(loader);
     configuration.setConfigurationCustomizer(customizer);
-    
+    //TODO user settings file
     File userSettingsFile = MavenEmbedder.DEFAULT_USER_SETTINGS_FILE;
     if(validateConfiguration(userSettingsFile, logger)) {
       configuration.setUserSettingsFile(userSettingsFile);
@@ -52,11 +60,9 @@
       configuration.setUserSettingsFile(userSettingsFile);
     }
     
-    if(globalSettings!=null && globalSettings.length()>0) {
-      File globalSettingsFile = new File(globalSettings);
-      if(validateConfiguration(globalSettingsFile, logger)) {
-        configuration.setGlobalSettingsFile(globalSettingsFile);
-      }
+    File globalSettingsFile = globalSettings!=null && globalSettings.length()>0 ? new File(globalSettings): REAL_GLOBAL_SETTINGS_FILE;    
+    if(validateConfiguration(globalSettingsFile, logger)) {
+      configuration.setGlobalSettingsFile(globalSettingsFile);
     }
       
     return new MavenEmbedder(configuration);
Index: src/org/maven/ide/eclipse/wizards/Maven2DependenciesWizardPage.java
===================================================================
--- src/org/maven/ide/eclipse/wizards/Maven2DependenciesWizardPage.java	(revision 250)
+++ src/org/maven/ide/eclipse/wizards/Maven2DependenciesWizardPage.java	(working copy)
@@ -1,340 +1,330 @@
-package org.maven.ide.eclipse.wizards;
-
-/*
- * Licensed to the Codehaus Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.maven.model.Dependency;
-
-import org.eclipse.jdt.ui.ISharedImages;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.maven.ide.eclipse.Messages;
-import org.maven.ide.eclipse.actions.Maven2RepositorySearchDialog;
-import org.maven.ide.eclipse.index.Indexer;
-
-
-/**
- * Wizard page responsible for gathering information about the Maven2
- * dependencies to use.
- *
- * This wizard page allows the user to choose the Maven2 dependencies for the
- * project by browsing the Maven2 repositories.
- */
-public class Maven2DependenciesWizardPage extends WizardPage {
-
-  /** Label specifying the content nature of the dependency viewer. */
-  private Label dependencyViewerLabel;
-
-  /** The actual viewer containing the Maven2 dependencies. */
-  private TableViewer dependencyViewer;
-
-  /** Button which triggers the action of adding a new dependency to the viewer. */
-  private Button addDependencyButton;
-
-  /** Button which triggers the action of removing a dependency from the viewer. */
-  private Button removeDependencyButton;
-
-  /**
-   * Default constructor.
-   *
-   * Sets the title and description of this wizard page and marks it as being
-   * complete as no user input is required for continuing.
-   */
-  public Maven2DependenciesWizardPage() {
-    super( "Maven2DependenciesWizardPage" );
-    setTitle( Messages.getString( "wizard.project.page.dependencies.title" ) );
-    setDescription( Messages.getString( "wizard.project.page.dependencies.description" ) );
-    setPageComplete( true );
-  }
-
-  /**
-   * {@inheritDoc}
-   *
-   * This wizard page contains a <code>TableViewer</code> to display the
-   * currently included Maven2 directories and a button area with buttons to
-   * add further dependencies or remove existing ones.
-   */
-  public void createControl( Composite parent ) {
-    Composite composite = new Composite( parent, SWT.NULL );
-    GridLayout layout = new GridLayout();
-    layout.marginHeight = 0;
-    layout.marginWidth = 0;
-    layout.numColumns = 2;
-    composite.setLayout( layout );
-
-    createDependencyViewerLabel( composite );
-    createDependencyViewer( composite );
-    createButtonAreaComposite( composite );
-
-    initialize();
-
-    setControl( composite );
-  }
-
-  /**
-   * Creates the label describing the content nature of the dependency viewer.
-   *
-   * @param parent  The parent of the label component to create.
-   */
-  private void createDependencyViewerLabel( Composite parent ) {
-    GridData gridData = new GridData( SWT.FILL, SWT.FILL, true, false, 2, 1 );
-
-    dependencyViewerLabel = new Label( parent, SWT.NONE );
-    dependencyViewerLabel.setText( Messages.getString( "wizard.project.page.dependencies.dependencies" ) );
-    dependencyViewerLabel.setLayoutData( gridData );
-  }
-
-  /**
-   * Creates the dependency viewer which will hold the chosen Maven2 dependencies.
-   *
-   * @param parent  The parent of the dependency viewer component to create.
-   */
-  private void createDependencyViewer( Composite parent ) {
-    GridData gridData = new GridData( SWT.FILL, SWT.FILL, true, true );
-
-    dependencyViewer = new TableViewer( parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL );
-    dependencyViewer.getControl().setLayoutData( gridData );
-    dependencyViewer.setUseHashlookup( true );
-    dependencyViewer.setLabelProvider( new DependencyLabelProvider() );
-    dependencyViewer.setSorter( new DependencySorter() );
-
-    dependencyViewer.addSelectionChangedListener( new ISelectionChangedListener() {
-      public void selectionChanged( SelectionChangedEvent event ) {
-        IStructuredSelection selection = ( IStructuredSelection ) event.getSelection();
-        removeDependencyButton.setEnabled( selection.size() > 0 );
-      }
-    } );
-  }
-
-  /**
-   * Creates the button area containg buttons to add further dependencies or
-   * remove existing ones.
-   *
-   * @param parent  The parent of the button area composite to create.
-   */
-  private void createButtonAreaComposite( Composite parent ) {
-    Composite buttonAreaComposite = new Composite( parent, SWT.NONE );
-    GridLayout envButtonLayout = new GridLayout();
-    envButtonLayout.marginHeight = 0;
-    envButtonLayout.marginWidth = 5;
-    buttonAreaComposite.setLayout( envButtonLayout );
-
-    GridData gridData = new GridData( SWT.FILL, SWT.BEGINNING, false, true );
-    buttonAreaComposite.setLayoutData( gridData );
-
-    createAddDependencyButton( buttonAreaComposite );
-    createRemoveDependencyButton( buttonAreaComposite );
-  }
-
-  /**
-   * Creates the button for adding dependencies to the project.
-   *
-   * An appropriate listener is attached to the button in order to trigger the
-   * action of adding a Maven2 dependency to the project.
-   *
-   * @param parent  The parent of the button control to create.
-   *
-   * @see #handleAddDependency()
-   */
-  private void createAddDependencyButton( Composite parent ) {
-    addDependencyButton = new Button( parent, SWT.PUSH );
-    addDependencyButton.setText( Messages.getString( "wizard.project.page.dependencies.add" ) );
-
-    GridData gridData = new GridData( SWT.FILL, SWT.DEFAULT, true, false );
-    addDependencyButton.setLayoutData( gridData );
-
-    addDependencyButton.addSelectionListener( new SelectionAdapter() {
-      public void widgetSelected( SelectionEvent e ) {
-        Maven2RepositorySearchDialog dialog = new Maven2RepositorySearchDialog(getShell(), Collections.EMPTY_SET, Indexer.JAR_NAME);
-        if ( dialog.open() == Window.OK ) {
-          Object result = dialog.getFirstResult();
-          if ( result instanceof Indexer.FileInfo ) {
-            dependencyViewer.add( ( ( Indexer.FileInfo ) result ).getDependency() );
-          } else if ( result instanceof Indexer.ArtifactInfo ) {
-            // If we have an ArtifactInfo, we add the first FileInfo it contains
-            // which corresponds to the latest version of the artifact.
-            Set files = ( ( Indexer.ArtifactInfo ) result ).files;
-            if ( ( files != null ) && ( files.size() > 0 ) ) {
-              Object file = files.iterator().next();
-              if ( file instanceof Indexer.FileInfo ) {
-                dependencyViewer.add( ( ( Indexer.FileInfo ) file ).getDependency() );
-              }
-            }
-          }
-        }
-      }
-    } );
-  }
-
-  /**
-   * Creates the button for removing dependencies from the project.
-   *
-   * An appropriate listener is attached to the button in order to trigger the
-   * action of removing the dependencies currently selected in the dependency
-   * viewer.
-   *
-   * @param parent  The parent of the button control to create.
-   *
-   * @see #handleRemoveDependency()
-   */
-  private void createRemoveDependencyButton( Composite parent ) {
-    removeDependencyButton = new Button( parent, SWT.PUSH );
-    removeDependencyButton.setText( Messages.getString( "wizard.project.page.dependencies.remove" ) );
-
-    GridData gridData = new GridData( SWT.FILL, SWT.DEFAULT, true, false );
-    removeDependencyButton.setLayoutData( gridData );
-
-    removeDependencyButton.addSelectionListener( new SelectionAdapter() {
-      public void widgetSelected( SelectionEvent e ) {
-        IStructuredSelection selection = ( IStructuredSelection ) dependencyViewer.getSelection();
-        if ( selection != null ) {
-          dependencyViewer.remove( selection.toArray() );
-        }
-      }
-    } );
-  }
-
-  /**
-   * Initializes the GUI components.
-   */
-  private void initialize() {
-    removeDependencyButton.setEnabled( false );
-  }
-
-  /**
-   * Returns the Maven2 dependencies currently chosen by the user as displayed
-   * in the dependency viewer.
-   *
-   * @return  The Maven2 dependencies currently chosen by the user.
-   *          Neither the array nor any of its elements is <code>null</code>.
-   */
-  public Dependency[] getDependencies() {
-    List dependencies = new ArrayList();
-    for ( int i = 0; i < dependencyViewer.getTable().getItemCount(); i++ ) {
-      Object element = dependencyViewer.getElementAt( i );
-      if ( element instanceof Dependency ) {
-        dependencies.add( element );
-      }
-    }
-    return ( Dependency[] ) dependencies.toArray( new Dependency[dependencies.size()] );
-  }
-
-  /**
-   * Simple <code>LabelProvider</code> attached to the dependency viewer.
-   *
-   * <p>
-   * The information displayed for objects of type <code>Dependency</code>
-   * inside the dependency viewer is the following:
-   * </p>
-   * <p>
-   * {groupId} - {artifactId} - {version} - {type}
-   * </p>
-   */
-  public static class DependencyLabelProvider extends LabelProvider {
-
-    /** The image to show for all objects of type <code>Dependency</code>. */
-    private static final Image DEPENDENCY_IMAGE = JavaUI.getSharedImages()
-        .getImage( ISharedImages.IMG_OBJS_EXTERNAL_ARCHIVE );
-
-    /**
-     * {@inheritDoc}
-     *
-     * <p>
-     * The text returned for objects of type <code>Dependency</code> contains
-     * the following information about the dependency:
-     * </p>
-     * <p>
-     * {groupId} - {artifactId} - {version} - {type}
-     * </p>
-     */
-    public String getText( Object element ) {
-      if ( element instanceof Dependency ) {
-        Dependency dependency = ( Dependency ) element;
-        return dependency.getGroupId()
-               + " - " + dependency.getArtifactId()
-               + " - " + dependency.getVersion()
-               + " - " + dependency.getType();
-      }
-      return super.getText( element );
-    }
-
-    public Image getImage( Object element ) {
-      if ( element instanceof Dependency ) {
-        return DEPENDENCY_IMAGE;
-      }
-      return super.getImage( element );
-    }
-  }
-
-  /**
-   * Simple <code>ViewerSorter</code> attached to the dependency viewer.
-   *
-   * Objects of type <code>Dependency</code> are sorted by (1) their groupId
-   * and (2) their artifactId.
-   */
-  public static class DependencySorter extends ViewerSorter {
-
-    /**
-     * Two objects of type <code>Dependency</code> are sorted by
-     * (1) their groupId and (2) their artifactId.
-     */
-    public int compare( Viewer viewer, Object e1, Object e2 ) {
-      if ( !( e1 instanceof Dependency ) || !( e2 instanceof Dependency ) ) {
-        return super.compare( viewer, e1, e2 );
-      }
-
-      // First of all, compare the group IDs of the two dependencies.
-      String group1 = ( ( Dependency ) e1 ).getGroupId();
-      String group2 = ( ( Dependency ) e2 ).getGroupId();
-
-      int result = ( group1 == null ) ? -1 : group1.compareToIgnoreCase( group2 );
-
-      // If the group IDs match, we sort by the artifact IDs.
-      if ( result == 0 ) {
-        String artifact1 = ( ( Dependency ) e1 ).getArtifactId();
-        String artifact2 = ( ( Dependency ) e2 ).getArtifactId();
-        result = artifact1 == null ? -1 : artifact1.compareToIgnoreCase( artifact2 );
-      }
-
-      return result;
-    }
-  }
-}
+package org.maven.ide.eclipse.wizards;
+
+/*
+ * Licensed to the Codehaus Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.maven.model.Dependency;
+
+import org.eclipse.jdt.ui.ISharedImages;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.maven.ide.eclipse.Messages;
+import org.maven.ide.eclipse.actions.Maven2RepositorySearchDialog;
+import org.maven.ide.eclipse.index.Indexer;
+
+
+/**
+ * Wizard page responsible for gathering information about the Maven2
+ * dependencies to use.
+ *
+ * This wizard page allows the user to choose the Maven2 dependencies for the
+ * project by browsing the Maven2 repositories.
+ */
+public class Maven2DependenciesWizardPage extends WizardPage {
+
+  /** Label specifying the content nature of the dependency viewer. */
+  private Label dependencyViewerLabel;
+
+  /** The actual viewer containing the Maven2 dependencies. */
+  private TableViewer dependencyViewer;
+  
+  /**
+   * List of dependencies in viewer
+   */
+  protected List dependencies = new LinkedList();
+
+  /** Button which triggers the action of adding a new dependency to the viewer. */
+  private Button addDependencyButton;
+
+  /** Button which triggers the action of removing a dependency from the viewer. */
+  private Button removeDependencyButton;
+
+  /**
+   * Default constructor.
+   *
+   * Sets the title and description of this wizard page and marks it as being
+   * complete as no user input is required for continuing.
+   */
+  public Maven2DependenciesWizardPage() {
+    super( "Maven2DependenciesWizardPage" );
+    setTitle( Messages.getString( "wizard.project.page.dependencies.title" ) );
+    setDescription( Messages.getString( "wizard.project.page.dependencies.description" ) );
+    setPageComplete( true );
+  }
+
+  /**
+   * {@inheritDoc}
+   *
+   * This wizard page contains a <code>TableViewer</code> to display the
+   * currently included Maven2 directories and a button area with buttons to
+   * add further dependencies or remove existing ones.
+   */
+  public void createControl( Composite parent ) {
+    Composite composite = new Composite( parent, SWT.NULL );
+    GridLayout layout = new GridLayout();
+    layout.marginHeight = 0;
+    layout.marginWidth = 0;
+    layout.numColumns = 2;
+    composite.setLayout( layout );
+
+    createDependencyViewerLabel( composite );
+    createDependencyViewer( composite );
+    createButtonAreaComposite( composite );
+
+    initialize();
+
+    setControl( composite );
+  }
+
+  /**
+   * Creates the label describing the content nature of the dependency viewer.
+   *
+   * @param parent  The parent of the label component to create.
+   */
+  private void createDependencyViewerLabel( Composite parent ) {
+    GridData gridData = new GridData( SWT.FILL, SWT.FILL, true, false, 2, 1 );
+
+    dependencyViewerLabel = new Label( parent, SWT.NONE );
+    dependencyViewerLabel.setText( Messages.getString( "wizard.project.page.dependencies.dependencies" ) );
+    dependencyViewerLabel.setLayoutData( gridData );
+  }
+
+  /**
+   * Creates the dependency viewer which will hold the chosen Maven2 dependencies.
+   *
+   * @param parent  The parent of the dependency viewer component to create.
+   */
+  private void createDependencyViewer( Composite parent ) {
+    GridData gridData = new GridData( SWT.FILL, SWT.FILL, true, true );
+
+    dependencyViewer = new TableViewer( parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL );
+    dependencyViewer.getControl().setLayoutData( gridData );
+    dependencyViewer.setUseHashlookup( true );
+    dependencyViewer.setLabelProvider( new DependencyLabelProvider() );
+    dependencyViewer.setContentProvider( new ArrayContentProvider() );
+    dependencyViewer.setSorter( new DependencySorter() );
+
+    dependencyViewer.addSelectionChangedListener( new ISelectionChangedListener() {
+      public void selectionChanged( SelectionChangedEvent event ) {
+        IStructuredSelection selection = ( IStructuredSelection ) event.getSelection();
+        removeDependencyButton.setEnabled( selection.size() > 0 );
+      }
+    } );
+    dependencyViewer.setInput(dependencies);
+  }
+
+  /**
+   * Creates the button area containg buttons to add further dependencies or
+   * remove existing ones.
+   *
+   * @param parent  The parent of the button area composite to create.
+   */
+  private void createButtonAreaComposite( Composite parent ) {
+    Composite buttonAreaComposite = new Composite( parent, SWT.NONE );
+    GridLayout envButtonLayout = new GridLayout();
+    envButtonLayout.marginHeight = 0;
+    envButtonLayout.marginWidth = 5;
+    buttonAreaComposite.setLayout( envButtonLayout );
+
+    GridData gridData = new GridData( SWT.FILL, SWT.BEGINNING, false, true );
+    buttonAreaComposite.setLayoutData( gridData );
+
+    createAddDependencyButton( buttonAreaComposite );
+    createRemoveDependencyButton( buttonAreaComposite );
+  }
+
+  /**
+   * Creates the button for adding dependencies to the project.
+   *
+   * An appropriate listener is attached to the button in order to trigger the
+   * action of adding a Maven2 dependency to the project.
+   *
+   * @param parent  The parent of the button control to create.
+   *
+   * @see #handleAddDependency()
+   */
+  private void createAddDependencyButton( Composite parent ) {
+    addDependencyButton = new Button( parent, SWT.PUSH );
+    addDependencyButton.setText( Messages.getString( "wizard.project.page.dependencies.add" ) );
+
+    GridData gridData = new GridData( SWT.FILL, SWT.DEFAULT, true, false );
+    addDependencyButton.setLayoutData( gridData );
+
+    addDependencyButton.addSelectionListener( new SelectionAdapter() {
+      public void widgetSelected( SelectionEvent e ) { 
+        Maven2RepositorySearchDialog dialog = new Maven2RepositorySearchDialog(getShell(), dependencies, Indexer.JAR_NAME);
+        if ( dialog.open() == Window.OK  && dialog.getResult()!=null){
+          dependencies.addAll(Arrays.asList(dialog.getResult()));
+          dependencyViewer.refresh();
+        }
+      }
+    } );
+  }
+
+  /**
+   * Creates the button for removing dependencies from the project.
+   *
+   * An appropriate listener is attached to the button in order to trigger the
+   * action of removing the dependencies currently selected in the dependency
+   * viewer.
+   *
+   * @param parent  The parent of the button control to create.
+   *
+   * @see #handleRemoveDependency()
+   */
+  private void createRemoveDependencyButton( Composite parent ) {
+    removeDependencyButton = new Button( parent, SWT.PUSH );
+    removeDependencyButton.setText( Messages.getString( "wizard.project.page.dependencies.remove" ) );
+
+    GridData gridData = new GridData( SWT.FILL, SWT.DEFAULT, true, false );
+    removeDependencyButton.setLayoutData( gridData );
+
+    removeDependencyButton.addSelectionListener( new SelectionAdapter() {
+      public void widgetSelected( SelectionEvent e ) {
+        IStructuredSelection selection = ( IStructuredSelection ) dependencyViewer.getSelection();
+        if ( selection != null ) {
+          dependencies.removeAll(Arrays.asList(selection.toArray()));
+          dependencyViewer.refresh();
+        }
+      }
+    } );
+  }
+
+  /**
+   * Initializes the GUI components.
+   */
+  private void initialize() {
+    removeDependencyButton.setEnabled( false );
+  }
+
+  /**
+   * Returns the Maven2 dependencies currently chosen by the user as displayed
+   * in the dependency viewer.
+   *
+   * @return  The Maven2 dependencies currently chosen by the user.
+   *          Neither the array nor any of its elements is <code>null</code>.
+   */
+  public List getDependencies() {
+    return new ArrayList(dependencies);
+  }
+
+  /**
+   * Simple <code>LabelProvider</code> attached to the dependency viewer.
+   *
+   * <p>
+   * The information displayed for objects of type <code>Dependency</code>
+   * inside the dependency viewer is the following:
+   * </p>
+   * <p>
+   * {groupId} - {artifactId} - {version} - {type}
+   * </p>
+   */
+  public static class DependencyLabelProvider extends LabelProvider {
+
+    /** The image to show for all objects of type <code>Dependency</code>. */
+    private static final Image DEPENDENCY_IMAGE = JavaUI.getSharedImages()
+        .getImage( ISharedImages.IMG_OBJS_EXTERNAL_ARCHIVE );
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p>
+     * The text returned for objects of type <code>Dependency</code> contains
+     * the following information about the dependency:
+     * </p>
+     * <p>
+     * {groupId} - {artifactId} - {version} - {type}
+     * </p>
+     */
+    public String getText( Object element ) {
+      if ( element instanceof Dependency ) {
+        Dependency dependency = ( Dependency ) element;
+        return dependency.getGroupId()
+               + " - " + dependency.getArtifactId()
+               + " - " + dependency.getVersion()
+               + " - " + dependency.getType();
+      }
+      return super.getText( element );
+    }
+
+    public Image getImage( Object element ) {
+      if ( element instanceof Dependency ) {
+        return DEPENDENCY_IMAGE;
+      }
+      return super.getImage( element );
+    }
+  }
+
+  /**
+   * Simple <code>ViewerSorter</code> attached to the dependency viewer.
+   *
+   * Objects of type <code>Dependency</code> are sorted by (1) their groupId
+   * and (2) their artifactId.
+   */
+  public static class DependencySorter extends ViewerSorter {
+
+    /**
+     * Two objects of type <code>Dependency</code> are sorted by
+     * (1) their groupId and (2) their artifactId.
+     */
+    public int compare( Viewer viewer, Object e1, Object e2 ) {
+      if ( !( e1 instanceof Dependency ) || !( e2 instanceof Dependency ) ) {
+        return super.compare( viewer, e1, e2 );
+      }
+
+      // First of all, compare the group IDs of the two dependencies.
+      String group1 = ( ( Dependency ) e1 ).getGroupId();
+      String group2 = ( ( Dependency ) e2 ).getGroupId();
+
+      int result = ( group1 == null ) ? -1 : group1.compareToIgnoreCase( group2 );
+
+      // If the group IDs match, we sort by the artifact IDs.
+      if ( result == 0 ) {
+        String artifact1 = ( ( Dependency ) e1 ).getArtifactId();
+        String artifact2 = ( ( Dependency ) e2 ).getArtifactId();
+        result = artifact1 == null ? -1 : artifact1.compareToIgnoreCase( artifact2 );
+      }
+
+      return result;
+    }
+  }
+}
Index: src/org/maven/ide/eclipse/wizards/Maven2PomWizard.java
===================================================================
--- src/org/maven/ide/eclipse/wizards/Maven2PomWizard.java	(revision 250)
+++ src/org/maven/ide/eclipse/wizards/Maven2PomWizard.java	(working copy)
@@ -24,7 +24,6 @@
 import java.io.File;
 import java.io.StringWriter;
 import java.lang.reflect.InvocationTargetException;
-import java.util.Arrays;
 
 import org.apache.maven.embedder.MavenEmbedder;
 import org.apache.maven.model.Model;
@@ -91,7 +90,7 @@
   public boolean performFinish() {
     final String projectName = artifactPage.getProject();
     final Model model = artifactPage.getModel();
-    model.getDependencies().addAll( Arrays.asList( dependenciesPage.getDependencies() ) );
+    model.getDependencies().addAll( dependenciesPage.getDependencies() );
 
     IRunnableWithProgress op = new IRunnableWithProgress() {
       public void run( IProgressMonitor monitor ) throws InvocationTargetException {
Index: src/org/maven/ide/eclipse/wizards/Maven2ProjectWizard.java
===================================================================
--- src/org/maven/ide/eclipse/wizards/Maven2ProjectWizard.java	(revision 250)
+++ src/org/maven/ide/eclipse/wizards/Maven2ProjectWizard.java	(working copy)
@@ -23,7 +23,6 @@
 import java.io.File;
 import java.io.StringWriter;
 import java.lang.reflect.InvocationTargetException;
-import java.util.Arrays;
 
 import org.apache.maven.embedder.MavenEmbedder;
 import org.apache.maven.model.Model;
@@ -252,7 +251,7 @@
     final String[] directories = artifactPage.getDirectories();
 
     final Model model = artifactPage.getModel();
-    model.getDependencies().addAll(Arrays.asList(wizardPage.getDependencies()));
+    model.getDependencies().addAll(wizardPage.getDependencies());
 
     final IClasspathEntry[] classpathEntries = artifactPage.getClasspathEntries(project.getFullPath());
 
Index: schema/container.exsd
===================================================================
--- schema/container.exsd	
+++ schema/container.exsd	
@@ -0,0 +1,112 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.maven.ide.eclipse">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.maven.ide.eclipse" id="container" name="Container"/>
+      </appInfo>
+      <documentation>
+         Allow create a container for list of maven mependencies for given project
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence minOccurs="1" maxOccurs="unbounded">
+            <element ref="container"/>
+         </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="container">
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn=":org.maven.ide.eclipse.container.extension.IContainerProvider"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  id
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         This extension is used by wtp support.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+</schema>

