diff --git a/plugins/org.eclipse.xtext.ide/META-INF/MANIFEST.MF b/plugins/org.eclipse.xtext.ide/META-INF/MANIFEST.MF
index 54789e86d..4271d775b 100644
--- a/plugins/org.eclipse.xtext.ide/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.xtext.ide/META-INF/MANIFEST.MF
@@ -1,28 +1,28 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.xtext.ide;singleton:=true
-Bundle-Version: 2.9.0.qualifier
-Bundle-Localization: plugin
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: %providerName
-Require-Bundle: org.eclipse.xtext;visibility:=reexport,
- org.eclipse.xtend.lib
-Import-Package: org.apache.log4j;version="1.2.15"
-Export-Package: org.eclipse.xtext.ide;x-friends:="org.eclipse.xtend.ide",
- org.eclipse.xtext.ide.editor.bracketmatching;x-friends:="org.eclipse.xtend.ide.common,org.eclipse.xtend.ide",
- org.eclipse.xtext.ide.editor.contentassist;x-friends:="org.eclipse.xtend.ide,org.eclipse.xtext.xbase.ide",
- org.eclipse.xtext.ide.editor.contentassist.antlr;x-friends:="org.eclipse.xtend.ide.common,org.eclipse.xtend.ide",
- org.eclipse.xtext.ide.editor.contentassist.antlr.internal;x-friends:="org.eclipse.xtend.ide.common,org.eclipse.xtend.ide",
- org.eclipse.xtext.ide.editor.model;x-internal:=true,
- org.eclipse.xtext.ide.editor.partialEditing;x-friends:="org.eclipse.xtend.ide",
- org.eclipse.xtext.ide.editor.syntaxcoloring;
-  x-friends:="org.eclipse.xtext.xbase.ide,
-   org.eclipse.xtext.ui,
-   org.eclipse.xtext.xbase.ui,
-   org.eclipse.xtend.ide,
-   org.eclipse.xtext.xtext.ui,
-   org.eclipse.xtext.xtext.ui.tests,
-   org.eclipse.xtend.ide.common",
- org.eclipse.xtext.ide.labels;x-friends:="org.eclipse.xtext.web"
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.xtext.ide;singleton:=true
+Bundle-Version: 2.9.0.qualifier
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: %providerName
+Require-Bundle: org.eclipse.xtext;visibility:=reexport,
+ org.eclipse.xtend.lib
+Import-Package: org.apache.log4j;version="1.2.15"
+Export-Package: org.eclipse.xtext.ide;x-friends:="org.eclipse.xtend.ide",
+ org.eclipse.xtext.ide.editor.bracketmatching;x-friends:="org.eclipse.xtend.ide.common,org.eclipse.xtend.ide",
+ org.eclipse.xtext.ide.editor.contentassist,
+ org.eclipse.xtext.ide.editor.contentassist.antlr,
+ org.eclipse.xtext.ide.editor.contentassist.antlr.internal,
+ org.eclipse.xtext.ide.editor.model;x-internal:=true,
+ org.eclipse.xtext.ide.editor.partialEditing;x-friends:="org.eclipse.xtend.ide",
+ org.eclipse.xtext.ide.editor.syntaxcoloring;
+  x-friends:="org.eclipse.xtext.xbase.ide,
+   org.eclipse.xtext.ui,
+   org.eclipse.xtext.xbase.ui,
+   org.eclipse.xtend.ide,
+   org.eclipse.xtext.xtext.ui,
+   org.eclipse.xtext.xtext.ui.tests,
+   org.eclipse.xtend.ide.common",
+ org.eclipse.xtext.ide.labels;x-friends:="org.eclipse.xtext.web"
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/ContentAssistContext.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/ContentAssistContext.java
index 2fb1f3611..57dfe0d2d 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/ContentAssistContext.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/ContentAssistContext.java
@@ -23,6 +23,7 @@ import com.google.inject.Provider;
 
 /**
  * Abstraction of a commonly used set of attributes related to the current content assist request.
+ * @since 2.9
  */
 public class ContentAssistContext {
 	
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/ContentAssistEntry.xtend b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/ContentAssistEntry.xtend
index 12c6b6825..a59ffcb9c 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/ContentAssistEntry.xtend
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/ContentAssistEntry.xtend
@@ -14,6 +14,9 @@ import org.eclipse.xtend.lib.annotations.ToString
 import org.eclipse.xtext.util.ReplaceRegion
 import org.eclipse.xtext.util.TextRegion
 
+/**
+ * @noreference
+ */
 @Accessors
 @ToString(skipNulls = true)
 @EqualsHashCode
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IFollowElementAcceptor.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IFollowElementAcceptor.java
index 794b9492e..1ff811623 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IFollowElementAcceptor.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IFollowElementAcceptor.java
@@ -8,7 +8,9 @@
 package org.eclipse.xtext.ide.editor.contentassist;
 
 import org.eclipse.xtext.AbstractElement;
-
+/**
+ * @since 2.9
+ */
 public interface IFollowElementAcceptor {
 	
 	void accept(AbstractElement element);
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IIdeContentProposalAcceptor.xtend b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IIdeContentProposalAcceptor.xtend
index c40274534..ee621076f 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IIdeContentProposalAcceptor.xtend
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IIdeContentProposalAcceptor.xtend
@@ -9,6 +9,9 @@ package org.eclipse.xtext.ide.editor.contentassist
 
 import org.eclipse.xtext.ide.editor.contentassist.ContentAssistEntry
 
+/**
+ * @noreference
+ */
 interface IIdeContentProposalAcceptor {
 	
 	def void accept(ContentAssistEntry entry, int priority)
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalPriorities.xtend b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalPriorities.xtend
index e09a1c511..f2a96990e 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalPriorities.xtend
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalPriorities.xtend
@@ -15,6 +15,7 @@ import org.eclipse.xtext.resource.IEObjectDescription
 /**
  * Determines priorities for content assist proposal entries. The priorities can be used
  * to sort the list of proposals.
+ * @noreference
  */
 @Singleton
 @Accessors(PROTECTED_GETTER, PROTECTED_SETTER)
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalProvider.xtend b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalProvider.xtend
index 589c02ddf..3f8cf4bef 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalProvider.xtend
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalProvider.xtend
@@ -30,6 +30,7 @@ import org.eclipse.xtext.xtext.CurrentTypeFinder
  * Generic content proposal provider for use in different IDE contexts. This provider is
  * <em>not</em> used by the Eclipse integration, which has its own abstraction for
  * content assist proposals.
+ * @noreference
  */
 class IdeContentProposalProvider {
 	
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeCrossrefProposalProvider.xtend b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeCrossrefProposalProvider.xtend
index 0cbbf00e6..d24444432 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeCrossrefProposalProvider.xtend
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeCrossrefProposalProvider.xtend
@@ -21,6 +21,7 @@ import org.eclipse.xtext.scoping.IScope
 
 /**
  * Special content assist proposal provider for cross-references.
+ * @noreference
  */
 class IdeCrossrefProposalProvider {
 	
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/AbstractContentAssistParser.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/AbstractContentAssistParser.java
index af62538e8..4f4c96f52 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/AbstractContentAssistParser.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/AbstractContentAssistParser.java
@@ -38,6 +38,9 @@ import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.name.Named;
 
+/**
+ * @since 2.9
+ */
 public abstract class AbstractContentAssistParser implements IContentAssistParser {
 
 	@Inject
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/AbstractPartialContentAssistParser.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/AbstractPartialContentAssistParser.java
index 6eb8e5eb2..391ee1df4 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/AbstractPartialContentAssistParser.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/AbstractPartialContentAssistParser.java
@@ -36,6 +36,7 @@ import com.google.inject.Inject;
 /**
  * Base class for content assist parsers that can reduce the input preceding the cursor
  * position without any impact on the follow set.
+ * @since 2.9
  */
 public abstract class AbstractPartialContentAssistParser extends AbstractContentAssistParser implements IPartialContentAssistParser {
 	
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/CallHierarchyHelper.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/CallHierarchyHelper.java
index 8becfc105..5e2cf26e7 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/CallHierarchyHelper.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/CallHierarchyHelper.java
@@ -30,6 +30,9 @@ import org.eclipse.xtext.util.XtextSwitch;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
+/**
+ * @since 2.9
+ */
 public class CallHierarchyHelper extends XtextSwitch<Boolean> {
 	private final EObject nextGrammarElement;
 	private Set<AbstractRule> visiting = new HashSet<AbstractRule>();
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/ContentAssistContextFactory.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/ContentAssistContextFactory.java
index a8c76bbf8..fa876878d 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/ContentAssistContextFactory.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/ContentAssistContextFactory.java
@@ -55,6 +55,9 @@ import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.name.Named;
 
+/**
+ * @since 2.9
+ */
 public class ContentAssistContextFactory implements Function<ContentAssistContext.Builder, ContentAssistContext> {
 	
 	private static final Logger log = Logger.getLogger(ContentAssistContextFactory.class);
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/EntryPointFinder.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/EntryPointFinder.java
index 083eb7b66..371530e49 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/EntryPointFinder.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/EntryPointFinder.java
@@ -21,6 +21,7 @@ import org.eclipse.xtext.parser.IParseResult;
 
 /**
  * Used by the {@link AbstractPartialContentAssistParser} to find the node at which to start parsing.
+ * @since 2.9
  */
 public class EntryPointFinder {
 	public ICompositeNode findEntryPoint(IParseResult parseResult, int offset) {
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/FollowElement.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/FollowElement.java
index 4f478c60c..34abea217 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/FollowElement.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/FollowElement.java
@@ -14,6 +14,7 @@ import org.eclipse.xtext.AbstractElement;
 /**
  * Simple bean that reflects the current state, when the content assist parser
  * hit EOF.
+ * @since 2.9
  */
 public class FollowElement {
 
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/FollowElementCalculator.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/FollowElementCalculator.java
index 9ad3cc2ec..b12f9989b 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/FollowElementCalculator.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/FollowElementCalculator.java
@@ -34,6 +34,9 @@ import org.eclipse.xtext.xtext.ParameterConfigHelper;
 
 import com.google.common.collect.Sets;
 
+/**
+ * @since 2.9
+ */
 public class FollowElementCalculator extends XtextSwitch<Boolean> {
 	
 	protected IFollowElementAcceptor acceptor;
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/FollowElementComputer.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/FollowElementComputer.java
index 8713c76c7..ed0611b07 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/FollowElementComputer.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/FollowElementComputer.java
@@ -34,7 +34,7 @@ import com.google.common.collect.Multimap;
 import com.google.inject.Inject;
 
 /**
- * 
+ * @since 2.9
  */
 public class FollowElementComputer {
 	
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/IContentAssistParser.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/IContentAssistParser.java
index 78648e79a..a3483802c 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/IContentAssistParser.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/IContentAssistParser.java
@@ -11,6 +11,7 @@ import java.util.Collection;
 
 /**
  * Parser that returns the expected elements when EOF is reached.
+ * @since 2.9
  */
 public interface IContentAssistParser {
 
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/IPartialContentAssistParser.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/IPartialContentAssistParser.java
index d0f6b2c78..3b6e7b23d 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/IPartialContentAssistParser.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/IPartialContentAssistParser.java
@@ -13,6 +13,7 @@ import org.eclipse.xtext.parser.IParseResult;
 
 /**
  * A content assist parser that can skip parts of the document for faster parsing
+ * @since 2.9
  */
 public interface IPartialContentAssistParser extends IContentAssistParser {
 
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LeafNodeFinder.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LeafNodeFinder.java
index 0a2832615..495f2d3b0 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LeafNodeFinder.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LeafNodeFinder.java
@@ -11,6 +11,9 @@ import org.eclipse.xtext.nodemodel.ICompositeNode;
 import org.eclipse.xtext.nodemodel.ILeafNode;
 import org.eclipse.xtext.nodemodel.INode;
 
+/**
+ * @since 2.9
+ */
 public class LeafNodeFinder {
 	private final int offset;
 	private final boolean leading;
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LookAheadTerminal.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LookAheadTerminal.java
index fa29b0c37..4d7680b4b 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LookAheadTerminal.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LookAheadTerminal.java
@@ -10,6 +10,9 @@ package org.eclipse.xtext.ide.editor.contentassist.antlr;
 import org.antlr.runtime.Token;
 import org.eclipse.xtext.AbstractElement;
 
+/**
+ * @since 2.9
+ */
 public abstract class LookAheadTerminal {
 
 	private Token token;
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LookAheadTerminalRuleCall.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LookAheadTerminalRuleCall.java
index 6035409e5..36c9eae44 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LookAheadTerminalRuleCall.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LookAheadTerminalRuleCall.java
@@ -11,6 +11,9 @@ import org.eclipse.xtext.AbstractElement;
 import org.eclipse.xtext.RuleCall;
 import org.eclipse.xtext.TerminalRule;
 
+/**
+ * @since 2.9
+ */
 public class LookAheadTerminalRuleCall extends LookAheadTerminal {
 
 	private TerminalRule rule;
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LookaheadKeyword.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LookaheadKeyword.java
index 91fba15cb..a067fe4a2 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LookaheadKeyword.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/LookaheadKeyword.java
@@ -10,6 +10,9 @@ package org.eclipse.xtext.ide.editor.contentassist.antlr;
 import org.eclipse.xtext.AbstractElement;
 import org.eclipse.xtext.Keyword;
 
+/**
+ * @since 2.9
+ */
 public class LookaheadKeyword extends LookAheadTerminal {
 
 	private String keyword;
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/ObservableXtextTokenStream.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/ObservableXtextTokenStream.java
index fa77ce7a5..1612d5055 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/ObservableXtextTokenStream.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/ObservableXtextTokenStream.java
@@ -12,6 +12,9 @@ import org.antlr.runtime.TokenSource;
 import org.eclipse.xtext.parser.antlr.ITokenDefProvider;
 import org.eclipse.xtext.parser.antlr.XtextTokenStream;
 
+/**
+ * @since 2.9
+ */
 public class ObservableXtextTokenStream extends XtextTokenStream {
 
 	public interface StreamListener {
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/PartialContentAssistContextFactory.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/PartialContentAssistContextFactory.java
index ef46fbeb1..23b303175 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/PartialContentAssistContextFactory.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/PartialContentAssistContextFactory.java
@@ -16,6 +16,9 @@ import org.eclipse.xtext.nodemodel.ILeafNode;
 import org.eclipse.xtext.nodemodel.INode;
 import org.eclipse.xtext.util.Strings;
 
+/**
+ * @since 2.9
+ */
 public class PartialContentAssistContextFactory extends ContentAssistContextFactory {
 	@Override
 	protected void createContextsForLastCompleteNode(EObject previousModel, boolean strict) {
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/RequiredRuleNameComputer.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/RequiredRuleNameComputer.java
index 79a9da092..db8b09feb 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/RequiredRuleNameComputer.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/RequiredRuleNameComputer.java
@@ -25,6 +25,7 @@ import com.google.inject.Singleton;
 
 /**
  * @author Sebastian Zarnekow - Initial contribution and API
+ * @since 2.9
  */
 @Singleton
 public class RequiredRuleNameComputer {
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/AbstractInternalContentAssistParser.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/AbstractInternalContentAssistParser.java
index 60518d479..edb3067f9 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/AbstractInternalContentAssistParser.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/AbstractInternalContentAssistParser.java
@@ -45,6 +45,9 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 
+/**
+ * @since 2.9
+ */
 public abstract class AbstractInternalContentAssistParser extends Parser implements
 		ObservableXtextTokenStream.StreamListener, ITokenDefProvider {
 
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/DFA.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/DFA.java
index 933acae6b..e549d24a8 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/DFA.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/DFA.java
@@ -14,6 +14,9 @@ import org.antlr.runtime.Token;
 import org.eclipse.xtext.parser.antlr.IUnorderedGroupHelper;
 import org.eclipse.xtext.parser.antlr.XtextTokenStream;
 
+/**
+ * @since 2.9
+ */
 public class DFA extends org.antlr.runtime.DFA {
 	
 	@Override
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/InfiniteRecursion.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/InfiniteRecursion.java
index 69ee2ab14..d8faf93c9 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/InfiniteRecursion.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/InfiniteRecursion.java
@@ -7,5 +7,8 @@
  *******************************************************************************/
 package org.eclipse.xtext.ide.editor.contentassist.antlr.internal;
 
+/**
+ * @since 2.9
+ */
 @SuppressWarnings("serial") 
 public class InfiniteRecursion extends RuntimeException {}
\ No newline at end of file
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/Lexer.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/Lexer.java
index 4d897159c..1a07920d3 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/Lexer.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/Lexer.java
@@ -11,6 +11,9 @@ import org.antlr.runtime.CharStream;
 import org.antlr.runtime.RecognizerSharedState;
 import org.apache.log4j.Logger;
 
+/**
+ * @since 2.9
+ */
 public abstract class Lexer extends org.antlr.runtime.Lexer {
 
 	private static final Logger logger = Logger.getLogger(Lexer.class);
diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/LinkedHashSetWithoutNull.java b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/LinkedHashSetWithoutNull.java
index c5deb6d3f..44b01dab1 100644
--- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/LinkedHashSetWithoutNull.java
+++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/antlr/internal/LinkedHashSetWithoutNull.java
@@ -16,6 +16,7 @@ import java.util.LinkedHashSet;
  * with caution.
  * 
  * @author Sebastian Zarnekow - Initial contribution and API
+ * @since 2.9
  */
 public class LinkedHashSetWithoutNull<T> extends LinkedHashSet<T> {
 	private static final long serialVersionUID = 1L;
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/AbstractGeneratorFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/AbstractGeneratorFragment2.xtend
index cfee33634..2e3e79a42 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/AbstractGeneratorFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/AbstractGeneratorFragment2.xtend
@@ -15,7 +15,7 @@ import org.eclipse.xtext.Grammar
 abstract class AbstractGeneratorFragment2 implements IGeneratorFragment2 {
 	
 	@Accessors(PROTECTED_GETTER)
-	@Inject IXtextProjectConfig projectConfig
+	@Inject XtextProjectConfig projectConfig
 	
 	@Accessors(PROTECTED_GETTER)
 	@Inject ILanguageConfig language
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/DefaultGeneratorModule.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/DefaultGeneratorModule.xtend
index 3e937be13..313b145bf 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/DefaultGeneratorModule.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/DefaultGeneratorModule.xtend
@@ -27,7 +27,7 @@ class DefaultGeneratorModule extends AbstractGenericModule {
 	}
 	
 	def void configureXtextProjectConfig(Binder binder) {
-		binder.bind(IXtextProjectConfig).toInstance(project)
+		binder.bind(XtextProjectConfig).toInstance(project)
 	}
 	
 	def void configureCodeConfig(Binder binder) {
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/IXtextProjectConfig.java b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/IXtextProjectConfig.java
deleted file mode 100644
index 424ff7031..000000000
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/IXtextProjectConfig.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.xtext.xtext.generator;
-
-import org.eclipse.xtext.xtext.generator.model.IXtextGeneratorFileSystemAccess;
-import org.eclipse.xtext.xtext.generator.IGuiceAwareGeneratorComponent;
-import org.eclipse.xtext.xtext.generator.model.ManifestAccess;
-import org.eclipse.xtext.xtext.generator.model.PluginXmlAccess;
-
-/**
- * Inject an instance of this interface in order to generate code in a generator fragment.
- *
- * <p>This file has been generated with {@link org.eclipse.xtext.xtext.generator.internal.ProjectConfigGenerator}.</p>
- */
-public interface IXtextProjectConfig extends IGuiceAwareGeneratorComponent {
-	
-	IXtextGeneratorFileSystemAccess getRuntimeModelGen();
-	
-	String getRuntimeProjectName();
-	IXtextGeneratorFileSystemAccess getRuntimeRoot();
-	IXtextGeneratorFileSystemAccess getRuntimeMetaInf();
-	IXtextGeneratorFileSystemAccess getRuntimeSrc();
-	IXtextGeneratorFileSystemAccess getRuntimeSrcGen();
-	ManifestAccess getRuntimeManifest();
-	PluginXmlAccess getRuntimePluginXml();
-	
-	String getRuntimeTestProjectName();
-	IXtextGeneratorFileSystemAccess getRuntimeTestRoot();
-	IXtextGeneratorFileSystemAccess getRuntimeTestMetaInf();
-	IXtextGeneratorFileSystemAccess getRuntimeTestSrc();
-	IXtextGeneratorFileSystemAccess getRuntimeTestSrcGen();
-	ManifestAccess getRuntimeTestManifest();
-	PluginXmlAccess getRuntimeTestPluginXml();
-	
-	String getGenericIdeProjectName();
-	IXtextGeneratorFileSystemAccess getGenericIdeRoot();
-	IXtextGeneratorFileSystemAccess getGenericIdeMetaInf();
-	IXtextGeneratorFileSystemAccess getGenericIdeSrc();
-	IXtextGeneratorFileSystemAccess getGenericIdeSrcGen();
-	ManifestAccess getGenericIdeManifest();
-	PluginXmlAccess getGenericIdePluginXml();
-	
-	String getGenericIdeTestProjectName();
-	IXtextGeneratorFileSystemAccess getGenericIdeTestRoot();
-	IXtextGeneratorFileSystemAccess getGenericIdeTestMetaInf();
-	IXtextGeneratorFileSystemAccess getGenericIdeTestSrc();
-	IXtextGeneratorFileSystemAccess getGenericIdeTestSrcGen();
-	ManifestAccess getGenericIdeTestManifest();
-	PluginXmlAccess getGenericIdeTestPluginXml();
-	
-	String getEclipsePluginProjectName();
-	IXtextGeneratorFileSystemAccess getEclipsePluginRoot();
-	IXtextGeneratorFileSystemAccess getEclipsePluginMetaInf();
-	IXtextGeneratorFileSystemAccess getEclipsePluginSrc();
-	IXtextGeneratorFileSystemAccess getEclipsePluginSrcGen();
-	ManifestAccess getEclipsePluginManifest();
-	PluginXmlAccess getEclipsePluginPluginXml();
-	
-	String getEclipsePluginTestProjectName();
-	IXtextGeneratorFileSystemAccess getEclipsePluginTestRoot();
-	IXtextGeneratorFileSystemAccess getEclipsePluginTestMetaInf();
-	IXtextGeneratorFileSystemAccess getEclipsePluginTestSrc();
-	IXtextGeneratorFileSystemAccess getEclipsePluginTestSrcGen();
-	ManifestAccess getEclipsePluginTestManifest();
-	PluginXmlAccess getEclipsePluginTestPluginXml();
-	
-	String getIdeaPluginProjectName();
-	IXtextGeneratorFileSystemAccess getIdeaPluginRoot();
-	IXtextGeneratorFileSystemAccess getIdeaPluginMetaInf();
-	IXtextGeneratorFileSystemAccess getIdeaPluginSrc();
-	IXtextGeneratorFileSystemAccess getIdeaPluginSrcGen();
-	ManifestAccess getIdeaPluginManifest();
-	
-	String getIdeaPluginTestProjectName();
-	IXtextGeneratorFileSystemAccess getIdeaPluginTestRoot();
-	IXtextGeneratorFileSystemAccess getIdeaPluginTestMetaInf();
-	IXtextGeneratorFileSystemAccess getIdeaPluginTestSrc();
-	IXtextGeneratorFileSystemAccess getIdeaPluginTestSrcGen();
-	ManifestAccess getIdeaPluginTestManifest();
-	
-	String getWebProjectName();
-	IXtextGeneratorFileSystemAccess getWebRoot();
-	IXtextGeneratorFileSystemAccess getWebMetaInf();
-	IXtextGeneratorFileSystemAccess getWebSrc();
-	IXtextGeneratorFileSystemAccess getWebSrcGen();
-	ManifestAccess getWebManifest();
-	
-	String getWebTestProjectName();
-	IXtextGeneratorFileSystemAccess getWebTestRoot();
-	IXtextGeneratorFileSystemAccess getWebTestMetaInf();
-	IXtextGeneratorFileSystemAccess getWebTestSrc();
-	IXtextGeneratorFileSystemAccess getWebTestSrcGen();
-	ManifestAccess getWebTestManifest();
-	
-	IXtextGeneratorFileSystemAccess getWebApp();
-	
-}
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ImplicitFragment.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ImplicitFragment.xtend
index 6365709bf..0ab2ef56b 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ImplicitFragment.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ImplicitFragment.xtend
@@ -19,26 +19,24 @@ import static extension org.eclipse.xtext.xtext.generator.model.TypeReference.*
 
 package class ImplicitFragment extends AbstractGeneratorFragment2 {
 	
-	@Inject IXtextProjectConfig projectConfig
-	
 	@Inject extension XbaseUsageDetector
 	
 	@Inject extension XtextGeneratorNaming naming
 	
 	override generate() {
-		if (projectConfig.runtimeManifest !== null) {
-			projectConfig.runtimeManifest.requiredBundles.addAll(#[
+		if (projectConfig.runtime.manifest !== null) {
+			projectConfig.runtime.manifest.requiredBundles.addAll(#[
 				'org.eclipse.xtext', 'org.eclipse.xtext.util', 'org.eclipse.xtend.lib'
 			])
-			projectConfig.runtimeManifest.importedPackages.add('org.apache.log4j')
+			projectConfig.runtime.manifest.importedPackages.add('org.apache.log4j')
 		}
-		if (projectConfig.eclipsePluginManifest !== null) {
-			projectConfig.eclipsePluginManifest.requiredBundles.addAll(#[
+		if (projectConfig.eclipsePlugin.manifest !== null) {
+			projectConfig.eclipsePlugin.manifest.requiredBundles.addAll(#[
 				'org.eclipse.xtext.ui', 'org.eclipse.xtext.ui.shared', 'org.eclipse.ui.editors', 'org.eclipse.ui', 'org.eclipse.xtend.lib'
 			])
 		}
-		if (projectConfig.eclipsePluginPluginXml !== null) {
-			projectConfig.eclipsePluginPluginXml.entries += grammar.implicitPluginXmlEnties
+		if (projectConfig.eclipsePlugin.pluginXml !== null) {
+			projectConfig.eclipsePlugin.pluginXml.entries += grammar.implicitPluginXmlEnties
 		}
 		
 		val StringConcatenationClient expression = '''�'org.eclipse.xtext.ui.shared.Access'.typeRef�.getJavaProjectsState()'''
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/SubProjectConfig.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/SubProjectConfig.xtend
new file mode 100644
index 000000000..9677daacb
--- /dev/null
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/SubProjectConfig.xtend
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+package org.eclipse.xtext.xtext.generator
+
+import com.google.common.base.CharMatcher
+import com.google.inject.Injector
+import org.eclipse.xtend.lib.annotations.Accessors
+import org.eclipse.xtext.xtext.generator.model.IXtextGeneratorFileSystemAccess
+import org.eclipse.xtext.xtext.generator.model.ManifestAccess
+import org.eclipse.xtext.xtext.generator.model.PluginXmlAccess
+
+class SubProjectConfig implements IGuiceAwareGeneratorComponent {
+	@Accessors(PUBLIC_GETTER, PACKAGE_SETTER)
+	XtextProjectConfig owner
+	@Accessors
+	boolean enabled
+	@Accessors
+	String name
+	@Accessors(PUBLIC_GETTER)
+	IXtextGeneratorFileSystemAccess root
+	@Accessors(PUBLIC_GETTER)
+	IXtextGeneratorFileSystemAccess metaInf
+	@Accessors(PUBLIC_GETTER)
+	IXtextGeneratorFileSystemAccess src
+	@Accessors(PUBLIC_GETTER)
+	IXtextGeneratorFileSystemAccess srcGen
+	
+	def void setRoot(String path) {
+		root = owner.newFileSystemAccess(path, true)
+	}
+
+	def void setMetaInf(String path) {
+		metaInf = owner.newFileSystemAccess(path, true)
+	}
+
+	def void setSrc(String path) {
+		src = owner.newFileSystemAccess(path, false)
+	}
+
+	def void setSrcGen(String path) {
+		srcGen = owner.newFileSystemAccess(path, true)
+	}
+	
+	def void checkConfiguration(Issues issues) {
+	}
+	
+	override initialize(Injector injector) {
+		injector.injectMembers(this)
+		root?.initialize(injector)
+		metaInf?.initialize(injector)
+		src?.initialize(injector)
+		srcGen?.initialize(injector)
+	}
+	
+}
+
+
+
+@Accessors
+class BundleProjectConfig extends SubProjectConfig {
+	ManifestAccess manifest
+	PluginXmlAccess pluginXml
+	
+	override initialize(Injector injector) {
+		super.initialize(injector)
+		manifest?.initialize(injector)
+		pluginXml?.initialize(injector)
+	}
+	
+	override checkConfiguration(Issues issues) {
+		super.checkConfiguration(issues)
+		if (manifest !== null && metaInf === null) {
+			issues.addError("The 'metaInf' outlet must be configured for projects with a manifest", this)
+		}
+		if (pluginXml !== null && root === null) {
+			issues.addError("The 'root' outlet must be configured for projects with a plugin.xml", this)
+		}
+	}
+	
+}
+
+
+class RuntimeProjectConfig extends BundleProjectConfig {
+	@Accessors(PUBLIC_GETTER)
+	IXtextGeneratorFileSystemAccess ecoreModel
+	
+	def void setEcoreModel(String path) {
+		ecoreModel = owner.newFileSystemAccess(path, true)
+	}
+	
+	/**
+	 * Returns the root-relative path of the folder where the generated .ecore and .genmodel can be found.
+	 * The path is delimited by and ends with '/'
+	 */
+	def String getEcoreModelFolder() {
+		val ecoreModelFolder = ecoreModel.path.replace(root.path, "").replace('\\', '/')
+		val slashes = CharMatcher.is('/')
+		slashes.trimFrom(ecoreModelFolder) + "/"
+	}
+	
+	override initialize(Injector injector) {
+		super.initialize(injector)
+		ecoreModel?.initialize(injector)
+	}
+
+}
+
+class WebProjectConfig extends SubProjectConfig {
+	@Accessors(PUBLIC_GETTER)
+	IXtextGeneratorFileSystemAccess assets
+	
+	def void setAssets(String path) {
+		assets = owner.newFileSystemAccess(path, true)
+	}
+	
+	override initialize(Injector injector) {
+		super.initialize(injector)
+		assets?.initialize(injector)
+	}
+	
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/WizardConfig.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/WizardConfig.xtend
index 5503be42e..0bed425d6 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/WizardConfig.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/WizardConfig.xtend
@@ -7,36 +7,22 @@
  *******************************************************************************/
 package org.eclipse.xtext.xtext.generator
 
-import com.google.inject.Injector
 import org.eclipse.emf.mwe2.runtime.Mandatory
 import org.eclipse.xtend.lib.annotations.Accessors
-import org.eclipse.xtext.xtext.generator.model.ManifestAccess
-import org.eclipse.xtext.xtext.generator.model.PluginXmlAccess
 
 @Accessors
 class WizardConfig extends XtextProjectConfig {
-	
-	boolean eclipseEditor = true
-	
-	boolean ideaEditor = false
-	
-	boolean webSupport = false
-	
-	boolean genericIdeSupport = false
-	
-	boolean testingSupport = false
-	
-	boolean mavenLayout = false
-	
+
+	boolean mavenLayout
+	boolean createEclipseMetaData
 	String rootPath
-	
 	String baseName
-	
+
 	@Mandatory
 	def setBaseName(String baseName) {
 		this.baseName = baseName
 	}
-	
+
 	@Mandatory
 	def setRootPath(String rootPath) {
 		this.rootPath = rootPath
@@ -44,151 +30,82 @@ class WizardConfig extends XtextProjectConfig {
 	
 	override checkConfiguration(Issues issues) {
 		super.checkConfiguration(issues)
-		if (rootPath == null) {
-			issues.addError('The property \'rootPath\' must be set.', this)
-			return
-		}
-		if (baseName == null) {
-			issues.addError('The property \'baseName\' must be set.', this)
-			return
-		}
-		val runtimeBase = runtimeRoot?.path
-		if (!Character.isJavaIdentifierPart(runtimeBase.charAt(runtimeBase.length - 1)))
-			issues.addError('The runtime root path must end with a valid package name.', this)
-		if ((ideaEditor || webSupport) && !genericIdeSupport)
-			issues.addError('Generic IDE support must be enabled when the IDEA or web editors are enabled.', this)
+		if (rootPath === null)
+			issues.addError("The property 'rootPath' must be set", this)
+		if (baseName === null)
+			issues.addError("The property 'baseName' must be set", this)
 	}
-	
-	override initialize(Injector injector) {
-		var src = 'src'
-		var testSrc = src
-		var srcGen = 'src-gen'
-		var testSrcGen = srcGen
-		var metaInf = 'META-INF'
-		var modelGen = 'model/generated'
-		var srcWeb = 'WebRoot'
-		if (mavenLayout) {
-			src = 'src/main/java'
-			testSrc = 'src/test/java'
-			srcGen = 'src/main/xtext-gen'
-			testSrcGen = 'src/test/xtext-gen'
-			metaInf = 'src/main/resources/META-INF'
-			modelGen = 'src/main/model-gen'
-			srcWeb = 'src/main/webapp'
-		}
-		
-		if (runtimeProjectName=== null)
-			runtimeProjectName = baseName
-		if (runtimeRoot === null)
-			runtimeRoot = rootPath + '/' + runtimeProjectName
-		if (runtimeMetaInf === null)
-			runtimeMetaInf = runtimeRoot.path + '/' + metaInf
-		if (runtimeSrc === null)
-			runtimeSrc = runtimeRoot.path  + '/' + src
-		if (runtimeSrcGen === null)
-			runtimeSrcGen = runtimeRoot.path  + '/' + srcGen
-		if (runtimeManifest === null)
-			runtimeManifest = injector.getInstance(ManifestAccess)
-		if (runtimePluginXml === null)
-			runtimePluginXml = injector.getInstance(PluginXmlAccess)
-		if (runtimeModelGen === null)
-			runtimeModelGen = runtimeRoot.path + '/' + modelGen
-			
-		if (testingSupport) {
-			if (runtimeTestProjectName=== null)
-				if(mavenLayout) {
-					runtimeTestProjectName = runtimeProjectName
-				} else {
-					runtimeTestProjectName = runtimeProjectName + ".tests"
+
+	override setDefaults() {
+		super.setDefaults
+		enabledProjects.forEach [
+			if (name === null)
+				name = computeName
+			if (root === null)
+				root = computeRoot
+			if (metaInf === null)
+				metaInf = computeMetaInf
+			if (src === null)
+				src = computeSrc
+			if (srcGen === null)
+				srcGen = computeSrcGen
+			if (it instanceof BundleProjectConfig) {
+				if (createEclipseMetaData) {
+					if (manifest === null)
+						manifest = newManifestAccess
+					if (pluginXml === null)
+						pluginXml = newPluginXmlAccess
 				}
-			if (runtimeTestRoot === null)
-				runtimeTestRoot = rootPath + '/' + runtimeTestProjectName
-			if (runtimeTestMetaInf=== null)
-				runtimeTestMetaInf = runtimeTestRoot.path + '/' + metaInf
-			if (runtimeTestSrc === null)
-				runtimeTestSrc = runtimeTestRoot.path + '/' + testSrc
-			if (runtimeTestSrcGen === null)
-				runtimeTestSrcGen = runtimeTestRoot.path + '/' + testSrcGen
-			if (runtimeTestManifest === null)
-				runtimeTestManifest = injector.getInstance(ManifestAccess)
-		}
-		
-		if (eclipseEditor) {
-			if (eclipsePluginProjectName=== null)
-				eclipsePluginProjectName = baseName + '.ui'
-			if (eclipsePluginRoot === null)
-				eclipsePluginRoot = rootPath + '/' + eclipsePluginProjectName
-			if (eclipsePluginMetaInf === null)
-				eclipsePluginMetaInf = eclipsePluginRoot.path + '/' + metaInf
-			if (eclipsePluginSrc === null)
-				eclipsePluginSrc = eclipsePluginRoot.path + '/' + src
-			if (eclipsePluginSrcGen === null)
-				eclipsePluginSrcGen = eclipsePluginRoot.path + '/' + srcGen
-			if (eclipsePluginManifest === null)
-				eclipsePluginManifest = injector.getInstance(ManifestAccess)
-			if (eclipsePluginPluginXml === null)
-				eclipsePluginPluginXml = injector.getInstance(PluginXmlAccess)
-				
-			if (testingSupport) {
-				if (eclipsePluginTestProjectName=== null)
-					eclipsePluginTestProjectName = eclipsePluginProjectName + '.tests'
-				if (eclipsePluginTestRoot === null)
-					eclipsePluginTestRoot = rootPath + '/' + eclipsePluginTestProjectName
-				if (eclipsePluginTestRoot === null)
-					eclipsePluginTestRoot = eclipsePluginRoot.path + '.tests'
-				if (eclipsePluginTestMetaInf === null)
-					eclipsePluginTestMetaInf = eclipsePluginTestRoot.path + '/' + metaInf
-				if (eclipsePluginTestSrc === null)
-					eclipsePluginTestSrc = eclipsePluginTestRoot.path + '/' + testSrc
-				if (eclipsePluginTestSrcGen === null)
-					eclipsePluginTestSrcGen = eclipsePluginTestRoot.path + '/' + testSrcGen
-				if (eclipsePluginTestManifest === null)
-					eclipsePluginTestManifest = injector.getInstance(ManifestAccess)
 			}
-		}
-		
-		if (ideaEditor) {
-			if (ideaPluginProjectName=== null)
-				ideaPluginProjectName = baseName + '.idea'
-			if (ideaPluginRoot === null)
-				ideaPluginRoot = rootPath + '/' + ideaPluginProjectName
-			if (ideaPluginSrc === null)
-				ideaPluginSrc = ideaPluginRoot.path + '/' + src
-			if (ideaPluginSrcGen === null)
-				ideaPluginSrcGen = ideaPluginRoot.path  + '/' + srcGen
-			if (ideaPluginMetaInf === null)
-				ideaPluginMetaInf = ideaPluginRoot.path  + '/' + metaInf
-		}
-		
-		if (webSupport) {
-			if (webProjectName=== null)
-				webProjectName = baseName + '.web'
-			if (webRoot === null)
-				webRoot = rootPath + '/' + webProjectName
-			if (webSrc === null)
-				webSrc = webRoot.path + '/' + src
-			if (webSrcGen === null)
-				webSrcGen = webRoot.path + '/' + srcGen
-			if (webApp === null)
-				webApp = webRoot.path + '/' + srcWeb
-		}
-		
-		if (genericIdeSupport) {
-			if (genericIdeProjectName=== null)
-				genericIdeProjectName = baseName + '.ide'
-			if (genericIdeRoot === null)
-				genericIdeRoot = rootPath + '/' + genericIdeProjectName
-			if (genericIdeMetaInf === null)
-				genericIdeMetaInf = genericIdeRoot.path + '/' + metaInf
-			if (genericIdeSrc === null)
-				genericIdeSrc = genericIdeRoot.path + '/' + src
-			if (genericIdeSrcGen === null)
-				genericIdeSrcGen = genericIdeRoot.path + '/' + srcGen
-			if (genericIdeManifest === null)
-				genericIdeManifest = injector.getInstance(ManifestAccess)
-		}
-		
-		super.initialize(injector)
+			if (it instanceof RuntimeProjectConfig) {
+				if (ecoreModel === null)
+					ecoreModel = computeEcoreModel
+			}
+			if (it instanceof WebProjectConfig) {
+				if (assets === null)
+					assets = computeAssets
+			}
+		]
 	}
-	
+
+	protected def computeName(SubProjectConfig project) {
+		switch project {
+			case runtime: baseName
+			case runtimeTest: baseName + '.tests'
+			case genericIde: baseName + '.ide'
+			case eclipsePlugin: baseName + '.ui'
+			case eclipsePluginTest: baseName + '.ui.tests'
+			case ideaPlugin: baseName + '.idea'
+			case web: baseName + '.web'
+		}
+	}
+
+	protected def computeRoot(SubProjectConfig project) {
+		rootPath + '/' + project.name
+	}
+
+	protected def computeSrc(SubProjectConfig project) {
+		project.root.path + '/' + if(mavenLayout) 'src/' + project.computeSourceSet + '/java' else 'src'
+	}
+
+	protected def computeSrcGen(SubProjectConfig project) {
+		project.root.path + '/' + if(mavenLayout) 'src/' + project.computeSourceSet + '/xtext-gen' else 'src-gen'
+	}
+
+	protected def computeMetaInf(SubProjectConfig project) {
+		project.root.path + '/' + if(mavenLayout) 'src/' + project.computeSourceSet + '/resources/META-INF' else 'META-INF'
+	}
+
+	protected def computeEcoreModel(RuntimeProjectConfig project) {
+		project.root.path + '/' + if(mavenLayout) 'src/' + project.computeSourceSet + '/ecore/generated' else 'model/generated'
+	}
+
+	protected def computeAssets(WebProjectConfig project) {
+		project.root.path + '/' + if(mavenLayout) 'src/' + project.computeSourceSet + '/webapp' else 'WebRoot'
+	}
+
+	protected def computeSourceSet(SubProjectConfig project) {
+		if(testProjects.contains(project)) 'test' else 'main'
+	}
+
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextDirectoryCleaner.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextDirectoryCleaner.xtend
index ae6ea810d..41ce5119d 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextDirectoryCleaner.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextDirectoryCleaner.xtend
@@ -15,7 +15,7 @@ import org.eclipse.xtend.lib.annotations.Accessors
 import java.io.File
 
 class XtextDirectoryCleaner implements IGuiceAwareGeneratorComponent {
-	@Inject IXtextProjectConfig config
+	@Inject XtextProjectConfig config
 
 	@Accessors(PUBLIC_SETTER)
 	boolean enabled = true
@@ -38,19 +38,7 @@ class XtextDirectoryCleaner implements IGuiceAwareGeneratorComponent {
 			return;
 			
 		val directories = newArrayList
-		directories += #[
-			config.runtimeModelGen,
-			config.runtimeSrcGen,
-			config.runtimeTestSrcGen,
-			config.genericIdeSrcGen,
-			config.genericIdeTestSrcGen,
-			config.eclipsePluginSrcGen,
-			config.eclipsePluginTestSrcGen,
-			config.ideaPluginSrcGen,
-			config.ideaPluginTestSrcGen,
-			config.webSrcGen,
-			config.webTestSrcGen
-		].filterNull.map[path].filter[new File(it).isDirectory]
+		directories += (config.enabledProjects.map[srcGen] + #[config.runtime.ecoreModel]).filterNull.map[path].filter[new File(it).isDirectory]
 		directories += extraDirectories
 		
 		val delegate = new DirectoryCleaner
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGenerator.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGenerator.xtend
index 4e0eac2af..4de0aa260 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGenerator.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGenerator.xtend
@@ -58,7 +58,7 @@ class XtextGenerator extends AbstractWorkflowComponent2 {
 	
 	Injector injector
 	
-	@Inject IXtextProjectConfig projectConfig
+	@Inject XtextProjectConfig projectConfig
 	
 	@Inject XtextGeneratorTemplates templates
 	
@@ -136,40 +136,30 @@ class XtextGenerator extends AbstractWorkflowComponent2 {
 	}
 	
 	protected def generateSetups(ILanguageConfig language) {
-		templates.createRuntimeGenSetup(language).writeTo(projectConfig.runtimeSrcGen)
-		templates.createRuntimeSetup(language).writeTo(projectConfig.runtimeSrc)
-		templates.createWebSetup(language).writeTo(projectConfig.webSrc)
+		templates.createRuntimeGenSetup(language).writeTo(projectConfig.runtime.srcGen)
+		templates.createRuntimeSetup(language).writeTo(projectConfig.runtime.src)
+		templates.createWebSetup(language).writeTo(projectConfig.web.src)
 	}
 	
 	protected def generateModules(ILanguageConfig language) {
-		templates.createRuntimeGenModule(language).writeTo(projectConfig.runtimeSrcGen)
-		templates.createRuntimeModule(language).writeTo(projectConfig.runtimeSrc)
-		templates.createEclipsePluginGenModule(language).writeTo(projectConfig.eclipsePluginSrcGen)
-		templates.createEclipsePluginModule(language).writeTo(projectConfig.eclipsePluginSrc)
-		templates.createIdeaGenModule(language).writeTo(projectConfig.ideaPluginSrcGen)
-		templates.createIdeaModule(language).writeTo(projectConfig.ideaPluginSrc)
-		templates.createWebGenModule(language).writeTo(projectConfig.webSrcGen)
-		templates.createWebModule(language).writeTo(projectConfig.webSrc)
+		templates.createRuntimeGenModule(language).writeTo(projectConfig.runtime.srcGen)
+		templates.createRuntimeModule(language).writeTo(projectConfig.runtime.src)
+		templates.createEclipsePluginGenModule(language).writeTo(projectConfig.eclipsePlugin.srcGen)
+		templates.createEclipsePluginModule(language).writeTo(projectConfig.eclipsePlugin.src)
+		templates.createIdeaGenModule(language).writeTo(projectConfig.ideaPlugin.srcGen)
+		templates.createIdeaModule(language).writeTo(projectConfig.ideaPlugin.src)
+		templates.createWebGenModule(language).writeTo(projectConfig.web.srcGen)
+		templates.createWebModule(language).writeTo(projectConfig.web.src)
 	}
 	
 	protected def generateExecutableExtensionFactory(ILanguageConfig language) {
-		if (projectConfig.eclipsePluginSrcGen !== null)
-			templates.createEclipsePluginExecutableExtensionFactory(language, languageConfigs.head).writeTo(projectConfig.eclipsePluginSrcGen)
+		if (projectConfig.eclipsePlugin.srcGen !== null)
+			templates.createEclipsePluginExecutableExtensionFactory(language, languageConfigs.head).writeTo(projectConfig.eclipsePlugin.srcGen)
 	}
 	
 	protected def generateManifests() {
-		val manifests = newLinkedList(
-			Tuples.create(projectConfig.runtimeManifest, projectConfig.runtimeMetaInf, projectConfig.runtimeProjectName),
-			Tuples.create(projectConfig.runtimeTestManifest, projectConfig.runtimeTestMetaInf, projectConfig.runtimeTestProjectName),
-			Tuples.create(projectConfig.genericIdeManifest, projectConfig.genericIdeMetaInf, projectConfig.genericIdeProjectName),
-			Tuples.create(projectConfig.genericIdeTestManifest, projectConfig.genericIdeTestMetaInf, projectConfig.genericIdeTestProjectName),
-			Tuples.create(projectConfig.eclipsePluginManifest, projectConfig.eclipsePluginMetaInf, projectConfig.eclipsePluginProjectName),
-			Tuples.create(projectConfig.eclipsePluginTestManifest, projectConfig.eclipsePluginTestMetaInf, projectConfig.eclipsePluginTestProjectName),
-			Tuples.create(projectConfig.ideaPluginManifest, projectConfig.ideaPluginMetaInf, projectConfig.ideaPluginProjectName),
-			Tuples.create(projectConfig.ideaPluginTestManifest, projectConfig.ideaPluginTestMetaInf, projectConfig.ideaPluginTestProjectName),
-			Tuples.create(projectConfig.webManifest, projectConfig.webMetaInf, projectConfig.webProjectName),
-			Tuples.create(projectConfig.webTestManifest, projectConfig.webTestMetaInf, projectConfig.webTestProjectName)
-		)
+		val manifests = projectConfig.enabledProjects.filter(BundleProjectConfig)
+			.map[Tuples.create(manifest, metaInf, name)].toList
 		// Filter null values and merge duplicate entries
 		val uri2Manifest = Maps.<URI, ManifestAccess>newHashMapWithExpectedSize(manifests.size)
 		val manifestIter = manifests.listIterator
@@ -196,7 +186,7 @@ class XtextGenerator extends AbstractWorkflowComponent2 {
 			if (manifest.bundleName === null) {
 				manifest.bundleName = entry.third
 			}
-			if (manifest === projectConfig.eclipsePluginManifest) {
+			if (manifest === projectConfig.eclipsePlugin.manifest) {
 				val firstLanguage = languageConfigs.head
 				manifest.activator = naming?.getEclipsePluginActivator(firstLanguage.grammar)
 			}
@@ -236,19 +226,12 @@ class XtextGenerator extends AbstractWorkflowComponent2 {
 	}
 	
 	protected def generateActivator() {
-		if (projectConfig.eclipsePluginSrcGen !== null && !languageConfigs.empty)
-			templates.createEclipsePluginActivator(languageConfigs).writeTo(projectConfig.eclipsePluginSrcGen)
+		if (projectConfig.eclipsePlugin.srcGen !== null && !languageConfigs.empty)
+			templates.createEclipsePluginActivator(languageConfigs).writeTo(projectConfig.eclipsePlugin.srcGen)
 	}
 	
 	protected def generatePluginXmls() {
-		val pluginXmls = newLinkedList(
-			projectConfig.runtimePluginXml -> projectConfig.runtimeRoot,
-			projectConfig.runtimeTestPluginXml -> projectConfig.runtimeTestRoot,
-			projectConfig.genericIdePluginXml -> projectConfig.genericIdeRoot,
-			projectConfig.genericIdeTestPluginXml -> projectConfig.genericIdeTestRoot,
-			projectConfig.eclipsePluginPluginXml -> projectConfig.eclipsePluginRoot,
-			projectConfig.eclipsePluginTestPluginXml -> projectConfig.eclipsePluginTestRoot
-		)
+		val pluginXmls = projectConfig.enabledProjects.filter(BundleProjectConfig).map[pluginXml -> root].toList
 		// Filter null values and merge duplicate entries
 		val uri2PluginXml = Maps.<URI, PluginXmlAccess>newHashMapWithExpectedSize(pluginXmls.size)
 		val pluginXmlIter = pluginXmls.listIterator
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGeneratorStandaloneSetup.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGeneratorStandaloneSetup.xtend
index 1e615ac76..ab4c255ec 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGeneratorStandaloneSetup.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGeneratorStandaloneSetup.xtend
@@ -16,7 +16,7 @@ import org.eclipse.xtext.util.internal.Log
 
 @Log
 class XtextGeneratorStandaloneSetup implements IGuiceAwareGeneratorComponent {
-	@Inject IXtextProjectConfig projectConfig
+	@Inject XtextProjectConfig projectConfig
 
 	@Accessors boolean scanClasspath = true
 
@@ -31,23 +31,12 @@ class XtextGeneratorStandaloneSetup implements IGuiceAwareGeneratorComponent {
 		projectMappings.forEach [ mapping |
 			delegate.addProjectMapping(new ProjectMapping => [
 				projectName = mapping.key
-				path = mapping.value.path
+				path = mapping.value
 			])
 		]
 	}
 
 	private def getProjectMappings() {
-		#[
-			projectConfig.runtimeProjectName -> projectConfig.runtimeRoot,
-			projectConfig.runtimeTestProjectName -> projectConfig.runtimeTestRoot,
-			projectConfig.genericIdeProjectName -> projectConfig.genericIdeRoot,
-			projectConfig.genericIdeTestProjectName -> projectConfig.genericIdeTestRoot,
-			projectConfig.eclipsePluginProjectName -> projectConfig.eclipsePluginRoot,
-			projectConfig.eclipsePluginTestProjectName -> projectConfig.eclipsePluginTestRoot,
-			projectConfig.ideaPluginProjectName -> projectConfig.ideaPluginRoot,
-			projectConfig.ideaPluginTestProjectName -> projectConfig.ideaPluginTestRoot,
-			projectConfig.webProjectName -> projectConfig.webRoot,
-			projectConfig.webTestProjectName -> projectConfig.webTestRoot
-		].filter[key != null && value != null]
+		projectConfig.enabledProjects.filter[name != null && root != null].map[name -> root.path]
 	}
 }	
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextProjectConfig.java b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextProjectConfig.java
deleted file mode 100644
index a5c2ef0e9..000000000
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextProjectConfig.java
+++ /dev/null
@@ -1,912 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.xtext.xtext.generator;
-
-import com.google.inject.Injector;
-import org.eclipse.xtext.xtext.generator.model.IXtextGeneratorFileSystemAccess;
-import org.eclipse.xtext.xtext.generator.model.XtextGeneratorFileSystemAccess;
-import org.eclipse.xtext.xtext.generator.model.ManifestAccess;
-import org.eclipse.xtext.xtext.generator.model.PluginXmlAccess;
-
-/**
- * Use this class to configure output paths in the XtextGenerator.
- *
- * <p>This file has been generated with {@link org.eclipse.xtext.xtext.generator.internal.ProjectConfigGenerator}.</p>
- */
-public class XtextProjectConfig implements IXtextProjectConfig {
-	
-	private IXtextGeneratorFileSystemAccess runtimeModelGen;
-	private String runtimeProjectName;
-	private IXtextGeneratorFileSystemAccess runtimeRoot;
-	private IXtextGeneratorFileSystemAccess runtimeMetaInf;
-	private IXtextGeneratorFileSystemAccess runtimeSrc;
-	private IXtextGeneratorFileSystemAccess runtimeSrcGen;
-	private ManifestAccess runtimeManifest;
-	private PluginXmlAccess runtimePluginXml;
-	private String runtimeTestProjectName;
-	private IXtextGeneratorFileSystemAccess runtimeTestRoot;
-	private IXtextGeneratorFileSystemAccess runtimeTestMetaInf;
-	private IXtextGeneratorFileSystemAccess runtimeTestSrc;
-	private IXtextGeneratorFileSystemAccess runtimeTestSrcGen;
-	private ManifestAccess runtimeTestManifest;
-	private PluginXmlAccess runtimeTestPluginXml;
-	private String genericIdeProjectName;
-	private IXtextGeneratorFileSystemAccess genericIdeRoot;
-	private IXtextGeneratorFileSystemAccess genericIdeMetaInf;
-	private IXtextGeneratorFileSystemAccess genericIdeSrc;
-	private IXtextGeneratorFileSystemAccess genericIdeSrcGen;
-	private ManifestAccess genericIdeManifest;
-	private PluginXmlAccess genericIdePluginXml;
-	private String genericIdeTestProjectName;
-	private IXtextGeneratorFileSystemAccess genericIdeTestRoot;
-	private IXtextGeneratorFileSystemAccess genericIdeTestMetaInf;
-	private IXtextGeneratorFileSystemAccess genericIdeTestSrc;
-	private IXtextGeneratorFileSystemAccess genericIdeTestSrcGen;
-	private ManifestAccess genericIdeTestManifest;
-	private PluginXmlAccess genericIdeTestPluginXml;
-	private String eclipsePluginProjectName;
-	private IXtextGeneratorFileSystemAccess eclipsePluginRoot;
-	private IXtextGeneratorFileSystemAccess eclipsePluginMetaInf;
-	private IXtextGeneratorFileSystemAccess eclipsePluginSrc;
-	private IXtextGeneratorFileSystemAccess eclipsePluginSrcGen;
-	private ManifestAccess eclipsePluginManifest;
-	private PluginXmlAccess eclipsePluginPluginXml;
-	private String eclipsePluginTestProjectName;
-	private IXtextGeneratorFileSystemAccess eclipsePluginTestRoot;
-	private IXtextGeneratorFileSystemAccess eclipsePluginTestMetaInf;
-	private IXtextGeneratorFileSystemAccess eclipsePluginTestSrc;
-	private IXtextGeneratorFileSystemAccess eclipsePluginTestSrcGen;
-	private ManifestAccess eclipsePluginTestManifest;
-	private PluginXmlAccess eclipsePluginTestPluginXml;
-	private String ideaPluginProjectName;
-	private IXtextGeneratorFileSystemAccess ideaPluginRoot;
-	private IXtextGeneratorFileSystemAccess ideaPluginMetaInf;
-	private IXtextGeneratorFileSystemAccess ideaPluginSrc;
-	private IXtextGeneratorFileSystemAccess ideaPluginSrcGen;
-	private ManifestAccess ideaPluginManifest;
-	private String ideaPluginTestProjectName;
-	private IXtextGeneratorFileSystemAccess ideaPluginTestRoot;
-	private IXtextGeneratorFileSystemAccess ideaPluginTestMetaInf;
-	private IXtextGeneratorFileSystemAccess ideaPluginTestSrc;
-	private IXtextGeneratorFileSystemAccess ideaPluginTestSrcGen;
-	private ManifestAccess ideaPluginTestManifest;
-	private String webProjectName;
-	private IXtextGeneratorFileSystemAccess webRoot;
-	private IXtextGeneratorFileSystemAccess webMetaInf;
-	private IXtextGeneratorFileSystemAccess webSrc;
-	private IXtextGeneratorFileSystemAccess webSrcGen;
-	private ManifestAccess webManifest;
-	private String webTestProjectName;
-	private IXtextGeneratorFileSystemAccess webTestRoot;
-	private IXtextGeneratorFileSystemAccess webTestMetaInf;
-	private IXtextGeneratorFileSystemAccess webTestSrc;
-	private IXtextGeneratorFileSystemAccess webTestSrcGen;
-	private ManifestAccess webTestManifest;
-	private IXtextGeneratorFileSystemAccess webApp;
-	
-	public void checkConfiguration(Issues issues) {
-		if (runtimeSrc == null) {
-			issues.addError("The property 'runtimeSrc' must be set.", this);
-		}
-		if (runtimeSrcGen == null) {
-			issues.addError("The property 'runtimeSrcGen' must be set.", this);
-		}
-		if (runtimeManifest != null && runtimeMetaInf == null) {
-			issues.addError("The property 'runtimeMetaInf' must be set when 'runtimeManifest' is set.");
-		}
-		if (runtimePluginXml != null && runtimeRoot == null) {
-			issues.addError("The property 'runtimeRoot' must be set when 'runtimePluginXml' is set.");
-		}
-		if (runtimeTestManifest != null && runtimeTestMetaInf == null) {
-			issues.addError("The property 'runtimeTestMetaInf' must be set when 'runtimeTestManifest' is set.");
-		}
-		if (runtimeTestPluginXml != null && runtimeTestRoot == null) {
-			issues.addError("The property 'runtimeTestRoot' must be set when 'runtimeTestPluginXml' is set.");
-		}
-		if (genericIdeManifest != null && genericIdeMetaInf == null) {
-			issues.addError("The property 'genericIdeMetaInf' must be set when 'genericIdeManifest' is set.");
-		}
-		if (genericIdePluginXml != null && genericIdeRoot == null) {
-			issues.addError("The property 'genericIdeRoot' must be set when 'genericIdePluginXml' is set.");
-		}
-		if (genericIdeTestManifest != null && genericIdeTestMetaInf == null) {
-			issues.addError("The property 'genericIdeTestMetaInf' must be set when 'genericIdeTestManifest' is set.");
-		}
-		if (genericIdeTestPluginXml != null && genericIdeTestRoot == null) {
-			issues.addError("The property 'genericIdeTestRoot' must be set when 'genericIdeTestPluginXml' is set.");
-		}
-		if (eclipsePluginManifest != null && eclipsePluginMetaInf == null) {
-			issues.addError("The property 'eclipsePluginMetaInf' must be set when 'eclipsePluginManifest' is set.");
-		}
-		if (eclipsePluginPluginXml != null && eclipsePluginRoot == null) {
-			issues.addError("The property 'eclipsePluginRoot' must be set when 'eclipsePluginPluginXml' is set.");
-		}
-		if (eclipsePluginTestManifest != null && eclipsePluginTestMetaInf == null) {
-			issues.addError("The property 'eclipsePluginTestMetaInf' must be set when 'eclipsePluginTestManifest' is set.");
-		}
-		if (eclipsePluginTestPluginXml != null && eclipsePluginTestRoot == null) {
-			issues.addError("The property 'eclipsePluginTestRoot' must be set when 'eclipsePluginTestPluginXml' is set.");
-		}
-		if (ideaPluginManifest != null && ideaPluginMetaInf == null) {
-			issues.addError("The property 'ideaPluginMetaInf' must be set when 'ideaPluginManifest' is set.");
-		}
-		if (ideaPluginTestManifest != null && ideaPluginTestMetaInf == null) {
-			issues.addError("The property 'ideaPluginTestMetaInf' must be set when 'ideaPluginTestManifest' is set.");
-		}
-		if (webManifest != null && webMetaInf == null) {
-			issues.addError("The property 'webMetaInf' must be set when 'webManifest' is set.");
-		}
-		if (webTestManifest != null && webTestMetaInf == null) {
-			issues.addError("The property 'webTestMetaInf' must be set when 'webTestManifest' is set.");
-		}
-	}
-	
-	@Override
-	public void initialize(Injector injector) {
-		injector.injectMembers(this);
-		if (runtimeModelGen != null) {
-			runtimeModelGen.initialize(injector);
-		}
-		
-		// Initialize runtime configuration
-		if (runtimeRoot != null) {
-			runtimeRoot.initialize(injector);
-		}
-		if (runtimeMetaInf != null) {
-			runtimeMetaInf.initialize(injector);
-		}
-		if (runtimeSrc != null) {
-			runtimeSrc.initialize(injector);
-		}
-		if (runtimeSrcGen != null) {
-			runtimeSrcGen.initialize(injector);
-		}
-		
-		// Initialize runtimeTest configuration
-		if (runtimeTestRoot != null) {
-			runtimeTestRoot.initialize(injector);
-		}
-		if (runtimeTestMetaInf != null) {
-			runtimeTestMetaInf.initialize(injector);
-		}
-		if (runtimeTestSrc != null) {
-			runtimeTestSrc.initialize(injector);
-		}
-		if (runtimeTestSrcGen != null) {
-			runtimeTestSrcGen.initialize(injector);
-		}
-		
-		// Initialize genericIde configuration
-		if (genericIdeRoot != null) {
-			genericIdeRoot.initialize(injector);
-		}
-		if (genericIdeMetaInf != null) {
-			genericIdeMetaInf.initialize(injector);
-		}
-		if (genericIdeSrc != null) {
-			genericIdeSrc.initialize(injector);
-		}
-		if (genericIdeSrcGen != null) {
-			genericIdeSrcGen.initialize(injector);
-		}
-		
-		// Initialize genericIdeTest configuration
-		if (genericIdeTestRoot != null) {
-			genericIdeTestRoot.initialize(injector);
-		}
-		if (genericIdeTestMetaInf != null) {
-			genericIdeTestMetaInf.initialize(injector);
-		}
-		if (genericIdeTestSrc != null) {
-			genericIdeTestSrc.initialize(injector);
-		}
-		if (genericIdeTestSrcGen != null) {
-			genericIdeTestSrcGen.initialize(injector);
-		}
-		
-		// Initialize eclipsePlugin configuration
-		if (eclipsePluginRoot != null) {
-			eclipsePluginRoot.initialize(injector);
-		}
-		if (eclipsePluginMetaInf != null) {
-			eclipsePluginMetaInf.initialize(injector);
-		}
-		if (eclipsePluginSrc != null) {
-			eclipsePluginSrc.initialize(injector);
-		}
-		if (eclipsePluginSrcGen != null) {
-			eclipsePluginSrcGen.initialize(injector);
-		}
-		
-		// Initialize eclipsePluginTest configuration
-		if (eclipsePluginTestRoot != null) {
-			eclipsePluginTestRoot.initialize(injector);
-		}
-		if (eclipsePluginTestMetaInf != null) {
-			eclipsePluginTestMetaInf.initialize(injector);
-		}
-		if (eclipsePluginTestSrc != null) {
-			eclipsePluginTestSrc.initialize(injector);
-		}
-		if (eclipsePluginTestSrcGen != null) {
-			eclipsePluginTestSrcGen.initialize(injector);
-		}
-		
-		// Initialize ideaPlugin configuration
-		if (ideaPluginRoot != null) {
-			ideaPluginRoot.initialize(injector);
-		}
-		if (ideaPluginMetaInf != null) {
-			ideaPluginMetaInf.initialize(injector);
-		}
-		if (ideaPluginSrc != null) {
-			ideaPluginSrc.initialize(injector);
-		}
-		if (ideaPluginSrcGen != null) {
-			ideaPluginSrcGen.initialize(injector);
-		}
-		
-		// Initialize ideaPluginTest configuration
-		if (ideaPluginTestRoot != null) {
-			ideaPluginTestRoot.initialize(injector);
-		}
-		if (ideaPluginTestMetaInf != null) {
-			ideaPluginTestMetaInf.initialize(injector);
-		}
-		if (ideaPluginTestSrc != null) {
-			ideaPluginTestSrc.initialize(injector);
-		}
-		if (ideaPluginTestSrcGen != null) {
-			ideaPluginTestSrcGen.initialize(injector);
-		}
-		
-		// Initialize web configuration
-		if (webRoot != null) {
-			webRoot.initialize(injector);
-		}
-		if (webMetaInf != null) {
-			webMetaInf.initialize(injector);
-		}
-		if (webSrc != null) {
-			webSrc.initialize(injector);
-		}
-		if (webSrcGen != null) {
-			webSrcGen.initialize(injector);
-		}
-		
-		// Initialize webTest configuration
-		if (webTestRoot != null) {
-			webTestRoot.initialize(injector);
-		}
-		if (webTestMetaInf != null) {
-			webTestMetaInf.initialize(injector);
-		}
-		if (webTestSrc != null) {
-			webTestSrc.initialize(injector);
-		}
-		if (webTestSrcGen != null) {
-			webTestSrcGen.initialize(injector);
-		}
-		
-		if (webApp != null) {
-			webApp.initialize(injector);
-		}
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getRuntimeModelGen() {
-		return runtimeModelGen;
-	}
-	
-	public void setRuntimeModelGen(String path) {
-		this.runtimeModelGen = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public String getRuntimeProjectName() {
-		return runtimeProjectName;
-	}
-	
-	public void setRuntimeProjectName(String projectName) {
-		this.runtimeProjectName = projectName;
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getRuntimeRoot() {
-		return runtimeRoot;
-	}
-	
-	public void setRuntimeRoot(String path) {
-		this.runtimeRoot = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getRuntimeMetaInf() {
-		return runtimeMetaInf;
-	}
-	
-	public void setRuntimeMetaInf(String path) {
-		this.runtimeMetaInf = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getRuntimeSrc() {
-		return runtimeSrc;
-	}
-	
-	public void setRuntimeSrc(String path) {
-		this.runtimeSrc = new XtextGeneratorFileSystemAccess(path, false);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getRuntimeSrcGen() {
-		return runtimeSrcGen;
-	}
-	
-	public void setRuntimeSrcGen(String path) {
-		this.runtimeSrcGen = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public ManifestAccess getRuntimeManifest() {
-		return runtimeManifest;
-	}
-	
-	public void setRuntimeManifest(ManifestAccess manifest) {
-		this.runtimeManifest = manifest;
-	}
-	
-	@Override
-	public PluginXmlAccess getRuntimePluginXml() {
-		return runtimePluginXml;
-	}
-	
-	public void setRuntimePluginXml(PluginXmlAccess pluginXml) {
-		this.runtimePluginXml = pluginXml;
-	}
-	
-	@Override
-	public String getRuntimeTestProjectName() {
-		return runtimeTestProjectName;
-	}
-	
-	public void setRuntimeTestProjectName(String projectName) {
-		this.runtimeTestProjectName = projectName;
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getRuntimeTestRoot() {
-		return runtimeTestRoot;
-	}
-	
-	public void setRuntimeTestRoot(String path) {
-		this.runtimeTestRoot = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getRuntimeTestMetaInf() {
-		return runtimeTestMetaInf;
-	}
-	
-	public void setRuntimeTestMetaInf(String path) {
-		this.runtimeTestMetaInf = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getRuntimeTestSrc() {
-		return runtimeTestSrc;
-	}
-	
-	public void setRuntimeTestSrc(String path) {
-		this.runtimeTestSrc = new XtextGeneratorFileSystemAccess(path, false);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getRuntimeTestSrcGen() {
-		return runtimeTestSrcGen;
-	}
-	
-	public void setRuntimeTestSrcGen(String path) {
-		this.runtimeTestSrcGen = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public ManifestAccess getRuntimeTestManifest() {
-		return runtimeTestManifest;
-	}
-	
-	public void setRuntimeTestManifest(ManifestAccess manifest) {
-		this.runtimeTestManifest = manifest;
-	}
-	
-	@Override
-	public PluginXmlAccess getRuntimeTestPluginXml() {
-		return runtimeTestPluginXml;
-	}
-	
-	public void setRuntimeTestPluginXml(PluginXmlAccess pluginXml) {
-		this.runtimeTestPluginXml = pluginXml;
-	}
-	
-	@Override
-	public String getGenericIdeProjectName() {
-		return genericIdeProjectName;
-	}
-	
-	public void setGenericIdeProjectName(String projectName) {
-		this.genericIdeProjectName = projectName;
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getGenericIdeRoot() {
-		return genericIdeRoot;
-	}
-	
-	public void setGenericIdeRoot(String path) {
-		this.genericIdeRoot = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getGenericIdeMetaInf() {
-		return genericIdeMetaInf;
-	}
-	
-	public void setGenericIdeMetaInf(String path) {
-		this.genericIdeMetaInf = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getGenericIdeSrc() {
-		return genericIdeSrc;
-	}
-	
-	public void setGenericIdeSrc(String path) {
-		this.genericIdeSrc = new XtextGeneratorFileSystemAccess(path, false);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getGenericIdeSrcGen() {
-		return genericIdeSrcGen;
-	}
-	
-	public void setGenericIdeSrcGen(String path) {
-		this.genericIdeSrcGen = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public ManifestAccess getGenericIdeManifest() {
-		return genericIdeManifest;
-	}
-	
-	public void setGenericIdeManifest(ManifestAccess manifest) {
-		this.genericIdeManifest = manifest;
-	}
-	
-	@Override
-	public PluginXmlAccess getGenericIdePluginXml() {
-		return genericIdePluginXml;
-	}
-	
-	public void setGenericIdePluginXml(PluginXmlAccess pluginXml) {
-		this.genericIdePluginXml = pluginXml;
-	}
-	
-	@Override
-	public String getGenericIdeTestProjectName() {
-		return genericIdeTestProjectName;
-	}
-	
-	public void setGenericIdeTestProjectName(String projectName) {
-		this.genericIdeTestProjectName = projectName;
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getGenericIdeTestRoot() {
-		return genericIdeTestRoot;
-	}
-	
-	public void setGenericIdeTestRoot(String path) {
-		this.genericIdeTestRoot = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getGenericIdeTestMetaInf() {
-		return genericIdeTestMetaInf;
-	}
-	
-	public void setGenericIdeTestMetaInf(String path) {
-		this.genericIdeTestMetaInf = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getGenericIdeTestSrc() {
-		return genericIdeTestSrc;
-	}
-	
-	public void setGenericIdeTestSrc(String path) {
-		this.genericIdeTestSrc = new XtextGeneratorFileSystemAccess(path, false);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getGenericIdeTestSrcGen() {
-		return genericIdeTestSrcGen;
-	}
-	
-	public void setGenericIdeTestSrcGen(String path) {
-		this.genericIdeTestSrcGen = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public ManifestAccess getGenericIdeTestManifest() {
-		return genericIdeTestManifest;
-	}
-	
-	public void setGenericIdeTestManifest(ManifestAccess manifest) {
-		this.genericIdeTestManifest = manifest;
-	}
-	
-	@Override
-	public PluginXmlAccess getGenericIdeTestPluginXml() {
-		return genericIdeTestPluginXml;
-	}
-	
-	public void setGenericIdeTestPluginXml(PluginXmlAccess pluginXml) {
-		this.genericIdeTestPluginXml = pluginXml;
-	}
-	
-	@Override
-	public String getEclipsePluginProjectName() {
-		return eclipsePluginProjectName;
-	}
-	
-	public void setEclipsePluginProjectName(String projectName) {
-		this.eclipsePluginProjectName = projectName;
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getEclipsePluginRoot() {
-		return eclipsePluginRoot;
-	}
-	
-	public void setEclipsePluginRoot(String path) {
-		this.eclipsePluginRoot = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getEclipsePluginMetaInf() {
-		return eclipsePluginMetaInf;
-	}
-	
-	public void setEclipsePluginMetaInf(String path) {
-		this.eclipsePluginMetaInf = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getEclipsePluginSrc() {
-		return eclipsePluginSrc;
-	}
-	
-	public void setEclipsePluginSrc(String path) {
-		this.eclipsePluginSrc = new XtextGeneratorFileSystemAccess(path, false);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getEclipsePluginSrcGen() {
-		return eclipsePluginSrcGen;
-	}
-	
-	public void setEclipsePluginSrcGen(String path) {
-		this.eclipsePluginSrcGen = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public ManifestAccess getEclipsePluginManifest() {
-		return eclipsePluginManifest;
-	}
-	
-	public void setEclipsePluginManifest(ManifestAccess manifest) {
-		this.eclipsePluginManifest = manifest;
-	}
-	
-	@Override
-	public PluginXmlAccess getEclipsePluginPluginXml() {
-		return eclipsePluginPluginXml;
-	}
-	
-	public void setEclipsePluginPluginXml(PluginXmlAccess pluginXml) {
-		this.eclipsePluginPluginXml = pluginXml;
-	}
-	
-	@Override
-	public String getEclipsePluginTestProjectName() {
-		return eclipsePluginTestProjectName;
-	}
-	
-	public void setEclipsePluginTestProjectName(String projectName) {
-		this.eclipsePluginTestProjectName = projectName;
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getEclipsePluginTestRoot() {
-		return eclipsePluginTestRoot;
-	}
-	
-	public void setEclipsePluginTestRoot(String path) {
-		this.eclipsePluginTestRoot = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getEclipsePluginTestMetaInf() {
-		return eclipsePluginTestMetaInf;
-	}
-	
-	public void setEclipsePluginTestMetaInf(String path) {
-		this.eclipsePluginTestMetaInf = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getEclipsePluginTestSrc() {
-		return eclipsePluginTestSrc;
-	}
-	
-	public void setEclipsePluginTestSrc(String path) {
-		this.eclipsePluginTestSrc = new XtextGeneratorFileSystemAccess(path, false);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getEclipsePluginTestSrcGen() {
-		return eclipsePluginTestSrcGen;
-	}
-	
-	public void setEclipsePluginTestSrcGen(String path) {
-		this.eclipsePluginTestSrcGen = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public ManifestAccess getEclipsePluginTestManifest() {
-		return eclipsePluginTestManifest;
-	}
-	
-	public void setEclipsePluginTestManifest(ManifestAccess manifest) {
-		this.eclipsePluginTestManifest = manifest;
-	}
-	
-	@Override
-	public PluginXmlAccess getEclipsePluginTestPluginXml() {
-		return eclipsePluginTestPluginXml;
-	}
-	
-	public void setEclipsePluginTestPluginXml(PluginXmlAccess pluginXml) {
-		this.eclipsePluginTestPluginXml = pluginXml;
-	}
-	
-	@Override
-	public String getIdeaPluginProjectName() {
-		return ideaPluginProjectName;
-	}
-	
-	public void setIdeaPluginProjectName(String projectName) {
-		this.ideaPluginProjectName = projectName;
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getIdeaPluginRoot() {
-		return ideaPluginRoot;
-	}
-	
-	public void setIdeaPluginRoot(String path) {
-		this.ideaPluginRoot = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getIdeaPluginMetaInf() {
-		return ideaPluginMetaInf;
-	}
-	
-	public void setIdeaPluginMetaInf(String path) {
-		this.ideaPluginMetaInf = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getIdeaPluginSrc() {
-		return ideaPluginSrc;
-	}
-	
-	public void setIdeaPluginSrc(String path) {
-		this.ideaPluginSrc = new XtextGeneratorFileSystemAccess(path, false);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getIdeaPluginSrcGen() {
-		return ideaPluginSrcGen;
-	}
-	
-	public void setIdeaPluginSrcGen(String path) {
-		this.ideaPluginSrcGen = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public ManifestAccess getIdeaPluginManifest() {
-		return ideaPluginManifest;
-	}
-	
-	public void setIdeaPluginManifest(ManifestAccess manifest) {
-		this.ideaPluginManifest = manifest;
-	}
-	
-	@Override
-	public String getIdeaPluginTestProjectName() {
-		return ideaPluginTestProjectName;
-	}
-	
-	public void setIdeaPluginTestProjectName(String projectName) {
-		this.ideaPluginTestProjectName = projectName;
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getIdeaPluginTestRoot() {
-		return ideaPluginTestRoot;
-	}
-	
-	public void setIdeaPluginTestRoot(String path) {
-		this.ideaPluginTestRoot = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getIdeaPluginTestMetaInf() {
-		return ideaPluginTestMetaInf;
-	}
-	
-	public void setIdeaPluginTestMetaInf(String path) {
-		this.ideaPluginTestMetaInf = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getIdeaPluginTestSrc() {
-		return ideaPluginTestSrc;
-	}
-	
-	public void setIdeaPluginTestSrc(String path) {
-		this.ideaPluginTestSrc = new XtextGeneratorFileSystemAccess(path, false);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getIdeaPluginTestSrcGen() {
-		return ideaPluginTestSrcGen;
-	}
-	
-	public void setIdeaPluginTestSrcGen(String path) {
-		this.ideaPluginTestSrcGen = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public ManifestAccess getIdeaPluginTestManifest() {
-		return ideaPluginTestManifest;
-	}
-	
-	public void setIdeaPluginTestManifest(ManifestAccess manifest) {
-		this.ideaPluginTestManifest = manifest;
-	}
-	
-	@Override
-	public String getWebProjectName() {
-		return webProjectName;
-	}
-	
-	public void setWebProjectName(String projectName) {
-		this.webProjectName = projectName;
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getWebRoot() {
-		return webRoot;
-	}
-	
-	public void setWebRoot(String path) {
-		this.webRoot = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getWebMetaInf() {
-		return webMetaInf;
-	}
-	
-	public void setWebMetaInf(String path) {
-		this.webMetaInf = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getWebSrc() {
-		return webSrc;
-	}
-	
-	public void setWebSrc(String path) {
-		this.webSrc = new XtextGeneratorFileSystemAccess(path, false);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getWebSrcGen() {
-		return webSrcGen;
-	}
-	
-	public void setWebSrcGen(String path) {
-		this.webSrcGen = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public ManifestAccess getWebManifest() {
-		return webManifest;
-	}
-	
-	public void setWebManifest(ManifestAccess manifest) {
-		this.webManifest = manifest;
-	}
-	
-	@Override
-	public String getWebTestProjectName() {
-		return webTestProjectName;
-	}
-	
-	public void setWebTestProjectName(String projectName) {
-		this.webTestProjectName = projectName;
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getWebTestRoot() {
-		return webTestRoot;
-	}
-	
-	public void setWebTestRoot(String path) {
-		this.webTestRoot = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getWebTestMetaInf() {
-		return webTestMetaInf;
-	}
-	
-	public void setWebTestMetaInf(String path) {
-		this.webTestMetaInf = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getWebTestSrc() {
-		return webTestSrc;
-	}
-	
-	public void setWebTestSrc(String path) {
-		this.webTestSrc = new XtextGeneratorFileSystemAccess(path, false);
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getWebTestSrcGen() {
-		return webTestSrcGen;
-	}
-	
-	public void setWebTestSrcGen(String path) {
-		this.webTestSrcGen = new XtextGeneratorFileSystemAccess(path, true);
-	}
-	
-	@Override
-	public ManifestAccess getWebTestManifest() {
-		return webTestManifest;
-	}
-	
-	public void setWebTestManifest(ManifestAccess manifest) {
-		this.webTestManifest = manifest;
-	}
-	
-	@Override
-	public IXtextGeneratorFileSystemAccess getWebApp() {
-		return webApp;
-	}
-	
-	public void setWebApp(String path) {
-		this.webApp = new XtextGeneratorFileSystemAccess(path, true);
-	}
-}
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextProjectConfig.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextProjectConfig.xtend
new file mode 100644
index 000000000..c5cb66d4c
--- /dev/null
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextProjectConfig.xtend
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+package org.eclipse.xtext.xtext.generator
+
+import com.google.inject.Injector
+import java.util.List
+import org.eclipse.xtend.lib.annotations.Accessors
+import org.eclipse.xtext.xtext.generator.model.ManifestAccess
+import org.eclipse.xtext.xtext.generator.model.PluginXmlAccess
+import org.eclipse.xtext.xtext.generator.model.XtextGeneratorFileSystemAccess
+
+@Accessors(PUBLIC_GETTER)
+class XtextProjectConfig implements IGuiceAwareGeneratorComponent {
+	RuntimeProjectConfig runtime
+	BundleProjectConfig runtimeTest
+	BundleProjectConfig genericIde
+	BundleProjectConfig eclipsePlugin
+	BundleProjectConfig eclipsePluginTest
+	SubProjectConfig ideaPlugin
+	WebProjectConfig web
+	
+	new() {
+		setRuntime(new RuntimeProjectConfig)
+		setRuntimeTest(new BundleProjectConfig)
+		setGenericIde(new BundleProjectConfig)
+		setEclipsePlugin(new BundleProjectConfig)
+		setEclipsePluginTest(new BundleProjectConfig)
+		setIdeaPlugin(new SubProjectConfig)
+		setWeb(new WebProjectConfig)
+	}
+	
+	def void setRuntime(RuntimeProjectConfig config) {
+		this.runtime = config
+		config.owner = this
+	}
+	
+	def void setRuntimeTest(BundleProjectConfig config) {
+		this.runtimeTest = config
+		config.owner = this
+	}
+	
+	def void setGenericIde(BundleProjectConfig config) {
+		this.genericIde = config
+		config.owner = this
+	}
+	
+	def void setEclipsePlugin(BundleProjectConfig config) {
+		this.eclipsePlugin = config
+		config.owner = this
+	}
+	
+	def void setEclipsePluginTest(BundleProjectConfig config) {
+		this.eclipsePluginTest = config
+		config.owner = this
+	}
+	
+	def void setIdeaPlugin(SubProjectConfig config) {
+		this.ideaPlugin = config
+		config.owner = this
+	}
+	
+	def void setWeb(WebProjectConfig config) {
+		this.web = config
+		config.owner = this
+	}
+	
+	def void checkConfiguration(Issues issues) {
+		enabledProjects.forEach[checkConfiguration(issues)]
+	}
+
+	def List<? extends SubProjectConfig> getAllProjects() {
+		val allProjects = newArrayList
+		allProjects += #[
+			runtime,
+			runtimeTest,
+			genericIde,
+			eclipsePlugin,
+			eclipsePluginTest,
+			ideaPlugin,
+			web
+		]
+		allProjects
+	}
+
+	def List<? extends SubProjectConfig> getTestProjects() {
+		val testProjects = newArrayList
+		testProjects += #[
+			runtimeTest,
+			eclipsePluginTest
+		]
+		testProjects
+	}
+
+	def List<? extends SubProjectConfig> getEnabledProjects() {
+		val enabledProjects = newArrayList
+		enabledProjects += allProjects.filter[enabled]
+		enabledProjects
+	}
+
+	override initialize(Injector injector) {
+		setDefaults
+		injector.injectMembers(this)
+		enabledProjects.forEach[initialize(injector)]
+	}
+	
+	def setDefaults() {
+		runtime.enabled = true
+		if (#[eclipsePlugin, ideaPlugin, web].exists[enabled])
+			genericIde.enabled = true
+	}
+	
+	protected def newManifestAccess() {
+		new ManifestAccess
+	}
+	
+	protected def newPluginXmlAccess() {
+		new PluginXmlAccess
+	}
+	
+	protected def newFileSystemAccess(String path, boolean overWrite) {
+		new XtextGeneratorFileSystemAccess(path, overWrite)
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/builder/BuilderIntegrationFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/builder/BuilderIntegrationFragment2.xtend
index 99a723247..02547cc2a 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/builder/BuilderIntegrationFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/builder/BuilderIntegrationFragment2.xtend
@@ -27,8 +27,8 @@ class BuilderIntegrationFragment2 extends AbstractGeneratorFragment2 {
 		addRuntimeGuiceBindings
 		addEclipsePluginGuiceBindings
 		
-		if (projectConfig.eclipsePluginManifest !== null) {
-			projectConfig.eclipsePluginManifest.requiredBundles.addAll(#[
+		if (projectConfig.eclipsePlugin.manifest !== null) {
+			projectConfig.eclipsePlugin.manifest.requiredBundles.addAll(#[
 				'org.eclipse.xtext.builder', 'org.eclipse.xtext.ui'
 			])
 		}
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ecore/EMFGeneratorFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ecore/EMFGeneratorFragment2.xtend
index db2fdeb3e..3cf64e08d 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ecore/EMFGeneratorFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ecore/EMFGeneratorFragment2.xtend
@@ -200,7 +200,7 @@ class EMFGeneratorFragment2 extends AbstractGeneratorFragment2 {
 	}
 	
 	protected def String getJavaModelDirectory() {
-		javaModelDirectory ?: projectConfig.runtimeSrcGen.path
+		javaModelDirectory ?: projectConfig.runtime.srcGen.path
 	}
 
 	protected def String getModelName(Grammar grammar) {
@@ -215,7 +215,7 @@ class EMFGeneratorFragment2 extends AbstractGeneratorFragment2 {
 	}
 	
 	protected def String getEcoreFilePath(Grammar grammar) {
-		projectConfig.runtimeModelGen.path + '/' + grammar.modelName + '.ecore'
+		projectConfig.runtime.ecoreModel.path + '/' + grammar.modelName + '.ecore'
 	}
 	
 	protected def URI getEcoreFileUri(Grammar grammar) {
@@ -223,7 +223,7 @@ class EMFGeneratorFragment2 extends AbstractGeneratorFragment2 {
 	}
 	
 	protected def String getGenModelPath(Grammar grammar) {
-		genModel ?: projectConfig.runtimeModelGen.path + '/' + grammar.modelName + '.genmodel'
+		genModel ?: projectConfig.runtime.ecoreModel.path + '/' + grammar.modelName + '.genmodel'
 	}
 
 	protected def URI getGenModelUri(Grammar grammar) {
@@ -231,7 +231,7 @@ class EMFGeneratorFragment2 extends AbstractGeneratorFragment2 {
 	}
 	
 	protected def String getRelativePath(String pathInRoot) {
-		val projectRoot = projectConfig.runtimeRoot.path
+		val projectRoot = projectConfig.runtime.root.path
 		if (pathInRoot.startsWith(projectRoot))
 			pathInRoot.substring(projectRoot.length + 1)
 		else
@@ -258,17 +258,17 @@ class EMFGeneratorFragment2 extends AbstractGeneratorFragment2 {
 
 	protected def String getModelPluginID() {
 		modelPluginID ?: {
-			val path = projectConfig.runtimeRoot.path
+			val path = projectConfig.runtime.root.path
 			path.substring(path.lastIndexOf('/') + 1)
 		}
 	}
 	
 	protected def String getEditDirectory() {
-		editDirectory ?: projectConfig.runtimeRoot.path + '.edit/src'
+		editDirectory ?: projectConfig.runtime.root.path + '.edit/src'
 	}
 
 	protected def String getEditorDirectory() {
-		editorDirectory ?: projectConfig.runtimeRoot.path + '.editor/src'
+		editorDirectory ?: projectConfig.runtime.root.path + '.editor/src'
 	}
 
 	protected def String getEditPluginID() {
@@ -346,8 +346,8 @@ class EMFGeneratorFragment2 extends AbstractGeneratorFragment2 {
 	}
 	
 	protected def void addProjectContributions(Grammar grammar, List<EPackage> generatedPackages, ResourceSet rs) {
-		if (projectConfig.runtimePluginXml !== null) {
-			projectConfig.runtimePluginXml.entries += '''
+		if (projectConfig.runtime.pluginXml !== null) {
+			projectConfig.runtime.pluginXml.entries += '''
 				<extension point="org.eclipse.emf.ecore.generated_package">
 					�FOR pack : generatedPackages�
 						<package 
@@ -358,13 +358,13 @@ class EMFGeneratorFragment2 extends AbstractGeneratorFragment2 {
 				</extension>
 			'''
 		}
-		if (projectConfig.runtimeManifest !== null) {
-			projectConfig.runtimeManifest.requiredBundles.addAll('org.eclipse.emf.ecore', 'org.eclipse.emf.common')
+		if (projectConfig.runtime.manifest !== null) {
+			projectConfig.runtime.manifest.requiredBundles.addAll('org.eclipse.emf.ecore', 'org.eclipse.emf.common')
 		}
 		for (pack : generatedPackages) {
 			val genPackage = pack.getGenPackage(rs)
-			if (projectConfig.runtimeManifest !== null && modelPluginID == null) {
-				projectConfig.runtimeManifest.exportedPackages.addAll(
+			if (projectConfig.runtime.manifest !== null && modelPluginID == null) {
+				projectConfig.runtime.manifest.exportedPackages.addAll(
 					genPackage.interfacePackageName,
 					genPackage.classPackageName,
 					genPackage.utilitiesPackageName
@@ -694,12 +694,9 @@ class EMFGeneratorFragment2 extends AbstractGeneratorFragment2 {
 	private def void updateBuildProperties() {
 		if (!updateBuildProperties || modelPluginID !== null)
 			return;
-		val rootOutlet = projectConfig.runtimeRoot
-		val modelOutlet = projectConfig.runtimeModelGen
+		val rootOutlet = projectConfig.runtime.root
 		val buildPropertiesPath = rootOutlet.path + '/build.properties'
-		val modelPath = modelOutlet.path.substring(rootOutlet.path.length + 1)
-		val modelContainerEnd = modelPath.indexOf('/')
-		val modelContainer = if (modelContainerEnd > 0) modelPath.substring(0, modelContainerEnd) else modelPath
+		val modelContainer = projectConfig.runtime.ecoreModelFolder
 		val buildProperties = new Properties
 		val reader = new InputStreamReader(new FileInputStream(new File(buildPropertiesPath)), Charset.forName(codeConfig.encoding))
 		try {
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/formatting/Formatter2Fragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/formatting/Formatter2Fragment2.xtend
index 30856f023..97140d8d0 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/formatting/Formatter2Fragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/formatting/Formatter2Fragment2.xtend
@@ -81,7 +81,7 @@ class Formatter2Fragment2 extends AbstractGeneratorFragment2 {
 				�ENDFOR�	
 			}
 		'''
-		xtendFile.writeTo(projectConfig.runtimeSrc)
+		xtendFile.writeTo(projectConfig.runtime.src)
 	}
 	
 	protected def StringConcatenationClient generateFormatMethod(EClass clazz, Collection<EReference> containmentRefs, boolean isOverriding) '''
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/generator/GeneratorFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/generator/GeneratorFragment2.xtend
index f2f5a00be..cf8fa3a70 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/generator/GeneratorFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/generator/GeneratorFragment2.xtend
@@ -95,12 +95,13 @@ class GeneratorFragment2 extends AbstractGeneratorFragment2 {
 			new GuiceModuleAccess.BindingFactory()
 				.addTypeToType(IGenerator.typeRef, language.grammar.generatorStub)
 				.contributeTo(language.runtimeGenModule)
-			if (projectConfig.runtimeManifest !== null)
-				projectConfig.runtimeManifest.requiredBundles += 'org.eclipse.xtext.xbase.lib'
+			if (projectConfig.runtime.manifest !== null)
+				projectConfig.runtime.manifest.requiredBundles += 'org.eclipse.xtext.xbase.lib'
 			doGenerateStubFile
 		}
 		if (isGenerateStub || isGenerateJavaMain) {
-			projectConfig.runtimeManifest.exportedPackages += language.grammar.generatorStub.packageName
+			if (projectConfig.runtime.manifest !== null)
+				projectConfig.runtime.manifest.exportedPackages += language.grammar.generatorStub.packageName
 		}
 		
 		if (isGenerateJavaMain)
@@ -111,9 +112,9 @@ class GeneratorFragment2 extends AbstractGeneratorFragment2 {
 			doGenerateMweFile
 		
 		contributeEclipsePluginGuiceBindings
-		if (projectConfig.eclipsePluginManifest !== null)
-			projectConfig.eclipsePluginManifest.requiredBundles += 'org.eclipse.xtext.builder'
-		if (projectConfig.eclipsePluginPluginXml !== null)
+		if (projectConfig.eclipsePlugin.manifest !== null)
+			projectConfig.eclipsePlugin.manifest.requiredBundles += 'org.eclipse.xtext.builder'
+		if (projectConfig.eclipsePlugin.pluginXml !== null)
 			contributeEclipsePluginExtensions
 	}
 	
@@ -147,7 +148,7 @@ class GeneratorFragment2 extends AbstractGeneratorFragment2 {
 				}
 			
 			}
-		''').writeTo(projectConfig.runtimeSrc)
+		''').writeTo(projectConfig.runtime.src)
 	}
 
 	protected def void doGenerateJavaMain() {
@@ -197,7 +198,7 @@ class GeneratorFragment2 extends AbstractGeneratorFragment2 {
 					System.out.println("Code generation finished.");
 				}
 			}
-		''').writeTo(projectConfig.runtimeSrc)
+		''').writeTo(projectConfig.runtime.src)
 	}
 
 	protected def void doGenerateXtendMain() {
@@ -240,7 +241,7 @@ class GeneratorFragment2 extends AbstractGeneratorFragment2 {
 					System.out.println('Code generation finished.')
 				}
 			}
-		''').writeTo(projectConfig.runtimeSrc)
+		''').writeTo(projectConfig.runtime.src)
 	}
 	
 	protected def void doGenerateMweFile() {
@@ -278,12 +279,12 @@ class GeneratorFragment2 extends AbstractGeneratorFragment2 {
 					}
 				}
 			}
-		''').writeTo(projectConfig.runtimeSrc)
+		''').writeTo(projectConfig.runtime.src)
 	}
 	
 	protected def contributeEclipsePluginExtensions() {
 		val name = language.grammar.name
-		projectConfig.eclipsePluginPluginXml.entries += '''
+		projectConfig.eclipsePlugin.pluginXml.entries += '''
 			<extension point="org.eclipse.xtext.builder.participant">
 				<participant
 					class="�grammar.eclipsePluginExecutableExtensionFactory�:org.eclipse.xtext.builder.IXtextBuilderParticipant"
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/grammarAccess/GrammarAccessFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/grammarAccess/GrammarAccessFragment2.xtend
index 77511712c..c8a461ebe 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/grammarAccess/GrammarAccessFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/grammarAccess/GrammarAccessFragment2.xtend
@@ -65,8 +65,8 @@ class GrammarAccessFragment2 extends AbstractGeneratorFragment2 {
 		}
 		bindingFactory.addTypeToType(IGrammarAccess.typeRef, language.grammar.grammarAccess)
 			.contributeTo(language.runtimeGenModule)
-		if (projectConfig.runtimeManifest !== null) {
-			projectConfig.runtimeManifest.exportedPackages.addAll(#[
+		if (projectConfig.runtime.manifest !== null) {
+			projectConfig.runtime.manifest.exportedPackages.addAll(#[
 				grammar.runtimeBasePackage, grammar.runtimeBasePackage + ".services"
 			])
 		}
@@ -98,7 +98,7 @@ class GrammarAccessFragment2 extends AbstractGeneratorFragment2 {
 						+ ". Therefore, the grammar is persisted as XMI and not as binary. This can be a performance drawback.")
 				copy.classpathRelativePathToXmi
 			}
-		val uri = projectConfig.runtimeSrcGen.getURI(path)
+		val uri = projectConfig.runtime.srcGen.getURI(path)
 		val resource = resourceSet.createResource(uri, ContentHandler.UNSPECIFIED_CONTENT_TYPE)
 		addAllGrammarsToResource(resource, copy, new HashSet<Grammar>())
 		isSaving.set(true)
@@ -243,7 +243,7 @@ class GrammarAccessFragment2 extends AbstractGeneratorFragment2 {
 				�ENDFOR�
 			}
 		'''
-		javaFile.writeTo(projectConfig.runtimeSrcGen)
+		javaFile.writeTo(projectConfig.runtime.srcGen)
 	}
 	
 	protected def StringConcatenationClient parserRuleClasses(ParserRule it) '''
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/idea/IdeaPluginGenerator.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/idea/IdeaPluginGenerator.xtend
index 25e4ccde5..de6d22b8b 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/idea/IdeaPluginGenerator.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/idea/IdeaPluginGenerator.xtend
@@ -122,7 +122,7 @@ class IdeaPluginGenerator extends AbstractGeneratorFragment2 {
 			grammar.compileFacetConfiguration,
 			grammar.compileColorSettingsPage
 		].forEach[
-			writeTo(projectConfig.ideaPluginSrc)
+			writeTo(projectConfig.ideaPlugin.src)
 		]
 
 		#[
@@ -145,15 +145,15 @@ class IdeaPluginGenerator extends AbstractGeneratorFragment2 {
 			grammar.compileFacetType,
 			grammar.compileBaseColorSettingsPage
 		].forEach[
-			writeTo(projectConfig.ideaPluginSrcGen)
+			writeTo(projectConfig.ideaPlugin.srcGen)
 		]
 
 		if (deployable) {
 			val pluginXml = grammar.compilePluginXml
-			if (!projectConfig.ideaPluginMetaInf.isFile(pluginXml.path)) {
-				pluginXml.writeTo(projectConfig.ideaPluginMetaInf)
+			if (!projectConfig.ideaPlugin.metaInf.isFile(pluginXml.path)) {
+				pluginXml.writeTo(projectConfig.ideaPlugin.metaInf)
 			}
-			grammar.compilePluginGenXml.writeTo(projectConfig.ideaPluginMetaInf)
+			grammar.compilePluginGenXml.writeTo(projectConfig.ideaPlugin.metaInf)
 		}
 	}
 	
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/idea/parser/antlr/XtextAntlrIDEAGeneratorFragment.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/idea/parser/antlr/XtextAntlrIDEAGeneratorFragment.xtend
index c5acd1d14..0334e568d 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/idea/parser/antlr/XtextAntlrIDEAGeneratorFragment.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/idea/parser/antlr/XtextAntlrIDEAGeneratorFragment.xtend
@@ -9,7 +9,6 @@ package org.eclipse.xtext.xtext.generator.idea.parser.antlr
 
 import com.google.inject.Inject
 import org.eclipse.xtext.xtext.generator.CodeConfig
-import org.eclipse.xtext.xtext.generator.IXtextProjectConfig
 import org.eclipse.xtext.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment2
 
 class XtextAntlrIDEAGeneratorFragment extends AbstractAntlrGeneratorFragment2 {
@@ -19,12 +18,10 @@ class XtextAntlrIDEAGeneratorFragment extends AbstractAntlrGeneratorFragment2 {
 
 	@Inject CodeConfig codeConfig
 
-	@Inject IXtextProjectConfig projectConfig
-	
 	@Inject extension PsiGrammarNaming
 
 	override protected doGenerate() {
-		val fsa = projectConfig.ideaPluginSrcGen
+		val fsa = projectConfig.ideaPlugin.srcGen
 		generator.generate(grammar, options, fsa)
 
 		val encoding = codeConfig.encoding
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/internal/ProjectConfigGenerator.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/internal/ProjectConfigGenerator.xtend
deleted file mode 100644
index a053fbd87..000000000
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/internal/ProjectConfigGenerator.xtend
+++ /dev/null
@@ -1,263 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.xtext.xtext.generator.internal
-
-import java.io.Closeable
-import java.util.ArrayList
-import java.io.FileWriter
-import java.io.File
-
-/**
- * A utility class for generating XtextProjectConfig. Not intended to be used outside of this project.
- */
-class ProjectConfigGenerator {
-	
-	static val INTERFACE_NAME = 'org.eclipse.xtext.xtext.generator.IXtextProjectConfig'
-	static val IMPL_NAME = 'org.eclipse.xtext.xtext.generator.XtextProjectConfig'
-	
-	static val PROJECTS = #[
-		'runtime', 'runtimeTest', 'genericIde', 'genericIdeTest', 'eclipsePlugin', 'eclipsePluginTest',
-		'ideaPlugin', 'ideaPluginTest', 'web', 'webTest'
-	]
-	
-	static def void main(String[] args) {
-		val closeables = new ArrayList<Closeable>
-		try {
-			val interfaceWriter = new FileWriter('src' + File.separator + INTERFACE_NAME.replace('.', File.separator) + '.java')
-			closeables += interfaceWriter
-			val implWriter = new FileWriter('src' + File.separator + IMPL_NAME.replace('.', File.separator) + '.java')
-			closeables += implWriter
-			
-			val generator = new ProjectConfigGenerator
-			interfaceWriter.write(generator.generateInterface().toString)
-			implWriter.write(generator.generateImpl().toString)
-			
-		} catch (Throwable t) {
-			t.printStackTrace()
-		} finally {
-			closeables.forEach[close()]
-		}
-	}
-	
-	private def hasPluginXml(String project) {
-		!project.startsWith('ideaPlugin') && !project.startsWith('web')
-	}
-	
-	def generateInterface() '''
-		/*******************************************************************************
-		 * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others.
-		 * All rights reserved. This program and the accompanying materials
-		 * are made available under the terms of the Eclipse Public License v1.0
-		 * which accompanies this distribution, and is available at
-		 * http://www.eclipse.org/legal/epl-v10.html
-		 *******************************************************************************/
-		package �INTERFACE_NAME.substring(0, INTERFACE_NAME.lastIndexOf('.'))�;
-		
-		import org.eclipse.xtext.xtext.generator.model.IXtextGeneratorFileSystemAccess;
-		import org.eclipse.xtext.xtext.generator.IGuiceAwareGeneratorComponent;
-		import org.eclipse.xtext.xtext.generator.model.ManifestAccess;
-		import org.eclipse.xtext.xtext.generator.model.PluginXmlAccess;
-		
-		/**
-		 * Inject an instance of this interface in order to generate code in a generator fragment.
-		 *
-		 * <p>This file has been generated with {@link �ProjectConfigGenerator.name�}.</p>
-		 */
-		public interface �INTERFACE_NAME.substring(INTERFACE_NAME.lastIndexOf('.') + 1)� extends IGuiceAwareGeneratorComponent {
-			
-			IXtextGeneratorFileSystemAccess getRuntimeModelGen();
-			
-			�FOR p : PROJECTS�
-				String get�p.toFirstUpper�ProjectName();
-				IXtextGeneratorFileSystemAccess get�p.toFirstUpper�Root();
-				IXtextGeneratorFileSystemAccess get�p.toFirstUpper�MetaInf();
-				IXtextGeneratorFileSystemAccess get�p.toFirstUpper�Src();
-				IXtextGeneratorFileSystemAccess get�p.toFirstUpper�SrcGen();
-				ManifestAccess get�p.toFirstUpper�Manifest();
-				�IF p.hasPluginXml�
-					PluginXmlAccess get�p.toFirstUpper�PluginXml();
-				�ENDIF�
-				
-			�ENDFOR�
-			IXtextGeneratorFileSystemAccess getWebApp();
-			
-		}
-	'''
-	
-	def generateImpl() '''
-		/*******************************************************************************
-		 * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others.
-		 * All rights reserved. This program and the accompanying materials
-		 * are made available under the terms of the Eclipse Public License v1.0
-		 * which accompanies this distribution, and is available at
-		 * http://www.eclipse.org/legal/epl-v10.html
-		 *******************************************************************************/
-		package �IMPL_NAME.substring(0, IMPL_NAME.lastIndexOf('.'))�;
-		
-		import com.google.inject.Injector;
-		import org.eclipse.xtext.xtext.generator.model.IXtextGeneratorFileSystemAccess;
-		import org.eclipse.xtext.xtext.generator.model.XtextGeneratorFileSystemAccess;
-		import org.eclipse.xtext.xtext.generator.model.ManifestAccess;
-		import org.eclipse.xtext.xtext.generator.model.PluginXmlAccess;
-		
-		/**
-		 * Use this class to configure output paths in the XtextGenerator.
-		 *
-		 * <p>This file has been generated with {@link �ProjectConfigGenerator.name�}.</p>
-		 */
-		public class �IMPL_NAME.substring(IMPL_NAME.lastIndexOf('.') + 1)� implements �INTERFACE_NAME.substring(INTERFACE_NAME.lastIndexOf('.') + 1)� {
-			
-			private IXtextGeneratorFileSystemAccess runtimeModelGen;
-			�FOR p : PROJECTS�
-				private String �p�ProjectName;
-				private IXtextGeneratorFileSystemAccess �p�Root;
-				private IXtextGeneratorFileSystemAccess �p�MetaInf;
-				private IXtextGeneratorFileSystemAccess �p�Src;
-				private IXtextGeneratorFileSystemAccess �p�SrcGen;
-				private ManifestAccess �p�Manifest;
-				�IF p.hasPluginXml�
-					private PluginXmlAccess �p�PluginXml;
-				�ENDIF�
-			�ENDFOR�
-			private IXtextGeneratorFileSystemAccess webApp;
-			
-			public void checkConfiguration(Issues issues) {
-				if (�PROJECTS.head�Src == null) {
-					issues.addError("The property '�PROJECTS.head�Src' must be set.", this);
-				}
-				if (�PROJECTS.head�SrcGen == null) {
-					issues.addError("The property '�PROJECTS.head�SrcGen' must be set.", this);
-				}
-				�FOR p : PROJECTS�
-					if (�p�Manifest != null && �p�MetaInf == null) {
-						issues.addError("The property '�p�MetaInf' must be set when '�p�Manifest' is set.");
-					}
-					�IF p.hasPluginXml�
-						if (�p�PluginXml != null && �p�Root == null) {
-							issues.addError("The property '�p�Root' must be set when '�p�PluginXml' is set.");
-						}
-					�ENDIF�
-				�ENDFOR�
-			}
-			
-			@Override
-			public void initialize(Injector injector) {
-				injector.injectMembers(this);
-				if (runtimeModelGen != null) {
-					runtimeModelGen.initialize(injector);
-				}
-				�FOR p : PROJECTS�
-					
-					// Initialize �p� configuration
-					if (�p�Root != null) {
-						�p�Root.initialize(injector);
-					}
-					if (�p�MetaInf != null) {
-						�p�MetaInf.initialize(injector);
-					}
-					if (�p�Src != null) {
-						�p�Src.initialize(injector);
-					}
-					if (�p�SrcGen != null) {
-						�p�SrcGen.initialize(injector);
-					}
-				�ENDFOR�
-				
-				if (webApp != null) {
-					webApp.initialize(injector);
-				}
-			}
-			
-			@Override
-			public IXtextGeneratorFileSystemAccess getRuntimeModelGen() {
-				return runtimeModelGen;
-			}
-			
-			public void setRuntimeModelGen(String path) {
-				this.runtimeModelGen = new XtextGeneratorFileSystemAccess(path, true);
-			}
-			
-			�FOR p : PROJECTS�
-				@Override
-				public String get�p.toFirstUpper�ProjectName() {
-					return �p�ProjectName;
-				}
-				
-				public void set�p.toFirstUpper�ProjectName(String projectName) {
-					this.�p�ProjectName = projectName;
-				}
-				
-				@Override
-				public IXtextGeneratorFileSystemAccess get�p.toFirstUpper�Root() {
-					return �p�Root;
-				}
-				
-				public void set�p.toFirstUpper�Root(String path) {
-					this.�p�Root = new XtextGeneratorFileSystemAccess(path, true);
-				}
-				
-				@Override
-				public IXtextGeneratorFileSystemAccess get�p.toFirstUpper�MetaInf() {
-					return �p�MetaInf;
-				}
-				
-				public void set�p.toFirstUpper�MetaInf(String path) {
-					this.�p�MetaInf = new XtextGeneratorFileSystemAccess(path, true);
-				}
-				
-				@Override
-				public IXtextGeneratorFileSystemAccess get�p.toFirstUpper�Src() {
-					return �p�Src;
-				}
-				
-				public void set�p.toFirstUpper�Src(String path) {
-					this.�p�Src = new XtextGeneratorFileSystemAccess(path, false);
-				}
-				
-				@Override
-				public IXtextGeneratorFileSystemAccess get�p.toFirstUpper�SrcGen() {
-					return �p�SrcGen;
-				}
-				
-				public void set�p.toFirstUpper�SrcGen(String path) {
-					this.�p�SrcGen = new XtextGeneratorFileSystemAccess(path, true);
-				}
-				
-				@Override
-				public ManifestAccess get�p.toFirstUpper�Manifest() {
-					return �p�Manifest;
-				}
-				
-				public void set�p.toFirstUpper�Manifest(ManifestAccess manifest) {
-					this.�p�Manifest = manifest;
-				}
-				
-				�IF p.hasPluginXml�
-					@Override
-					public PluginXmlAccess get�p.toFirstUpper�PluginXml() {
-						return �p�PluginXml;
-					}
-					
-					public void set�p.toFirstUpper�PluginXml(PluginXmlAccess pluginXml) {
-						this.�p�PluginXml = pluginXml;
-					}
-					
-				�ENDIF�
-			�ENDFOR�
-			@Override
-			public IXtextGeneratorFileSystemAccess getWebApp() {
-				return webApp;
-			}
-			
-			public void setWebApp(String path) {
-				this.webApp = new XtextGeneratorFileSystemAccess(path, true);
-			}
-		}
-	'''
-	
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/junit/Junit4Fragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/junit/Junit4Fragment2.xtend
index 800093d10..177a5c50a 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/junit/Junit4Fragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/junit/Junit4Fragment2.xtend
@@ -2,7 +2,6 @@ package org.eclipse.xtext.xtext.generator.junit
 
 import org.eclipse.xtext.xtext.generator.AbstractGeneratorFragment2
 import com.google.inject.Inject
-import org.eclipse.xtext.xtext.generator.IXtextProjectConfig
 import org.eclipse.xtext.xtext.generator.XtextGeneratorNaming
 import org.eclipse.xtext.xtext.generator.model.JavaFileAccess
 import org.eclipse.xtext.xtext.generator.model.FileAccessFactory
@@ -12,13 +11,12 @@ import static extension org.eclipse.xtext.GrammarUtil.*
 import org.eclipse.xtext.xtext.generator.util.GenModelUtil2
 
 class Junit4Fragment2 extends AbstractGeneratorFragment2 {
-	@Inject IXtextProjectConfig projectConfig
 	@Inject extension XtextGeneratorNaming
 	@Inject FileAccessFactory fileAccessFactory
 
 	override generate() {
-		if (projectConfig.runtimeTestManifest != null) {
-			projectConfig.runtimeTestManifest => [
+		if (projectConfig.runtimeTest.manifest != null) {
+			projectConfig.runtimeTest.manifest => [
 				requiredBundles.addAll(
 					"org.eclipse.xtext.junit4",
 					"org.eclipse.xtext.xbase.lib"
@@ -26,8 +24,8 @@ class Junit4Fragment2 extends AbstractGeneratorFragment2 {
 				exportedPackages.add(grammar.runtimeTestBasePackage)
 			]
 		}
-		if (projectConfig.eclipsePluginTestManifest != null) {
-			projectConfig.eclipsePluginTestManifest => [
+		if (projectConfig.eclipsePluginTest.manifest != null) {
+			projectConfig.eclipsePluginTest.manifest => [
 				requiredBundles.addAll(
 					"org.eclipse.core.runtime",
 					"org.eclipse.ui.workbench;resolution:=optional"
@@ -35,13 +33,13 @@ class Junit4Fragment2 extends AbstractGeneratorFragment2 {
 				exportedPackages.add(grammar.eclipsePluginTestBasePackage)
 			]
 		}
-		if (projectConfig.eclipsePluginManifest != null) {
-			projectConfig.eclipsePluginManifest.exportedPackages.add(grammar.eclipsePluginActivator.packageName)
+		if (projectConfig.eclipsePlugin.manifest != null) {
+			projectConfig.eclipsePlugin.manifest.exportedPackages.add(grammar.eclipsePluginActivator.packageName)
 		}
 		
 		#[
-			projectConfig.runtimeTestManifest,
-			projectConfig.eclipsePluginTestManifest
+			projectConfig.runtimeTest.manifest,
+			projectConfig.eclipsePluginTest.manifest
 		].filterNull.forEach [
 			importedPackages.addAll(
 				"org.junit;version=\"4.5.0\"",
@@ -53,9 +51,9 @@ class Junit4Fragment2 extends AbstractGeneratorFragment2 {
 				"org.hamcrest.core"
 			)
 		]
-		generateInjectorProvider.writeTo(projectConfig.runtimeTestSrcGen)
-		generateExampleRuntimeTest.writeTo(projectConfig.runtimeTestSrc)
-		generateUiInjectorProvider.writeTo(projectConfig.eclipsePluginTestSrcGen)
+		generateInjectorProvider.writeTo(projectConfig.runtimeTest.srcGen)
+		generateExampleRuntimeTest.writeTo(projectConfig.runtimeTest.src)
+		generateUiInjectorProvider.writeTo(projectConfig.eclipsePluginTest.srcGen)
 	}
 	
 	def JavaFileAccess generateExampleRuntimeTest() {
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/ManifestAccess.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/ManifestAccess.xtend
index b20da15a3..70a9dd0c0 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/ManifestAccess.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/ManifestAccess.xtend
@@ -15,10 +15,12 @@ import org.eclipse.xtend2.lib.StringConcatenationClient
 import org.eclipse.xtext.generator.IFileSystemAccess2
 import org.eclipse.xtext.util.MergeableManifest
 import org.eclipse.xtext.util.internal.Log
+import org.eclipse.xtext.xtext.generator.IGuiceAwareGeneratorComponent
+import com.google.inject.Injector
 
 @Log
 @Accessors
-class ManifestAccess extends TextFileAccess {
+class ManifestAccess extends TextFileAccess implements IGuiceAwareGeneratorComponent {
 	
 	String bundleName
 	
@@ -129,4 +131,8 @@ class ManifestAccess extends TextFileAccess {
 		}
 	}
 	
+	override initialize(Injector injector) {
+		injector.injectMembers(this)
+	}
+	
 }
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/PluginXmlAccess.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/PluginXmlAccess.xtend
index e45a48487..eeb20a46a 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/PluginXmlAccess.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/PluginXmlAccess.xtend
@@ -14,10 +14,12 @@ import org.eclipse.xtext.generator.IFileSystemAccess2
 import org.eclipse.xtext.util.internal.Log
 import org.eclipse.xtext.xtext.generator.CodeConfig
 import com.google.inject.Inject
+import org.eclipse.xtext.xtext.generator.IGuiceAwareGeneratorComponent
+import com.google.inject.Injector
 
 @Log
 @Accessors
-class PluginXmlAccess extends TextFileAccess {
+class PluginXmlAccess extends TextFileAccess implements IGuiceAwareGeneratorComponent {
 	
 	@Inject CodeConfig codeConfig
 	
@@ -57,4 +59,8 @@ class PluginXmlAccess extends TextFileAccess {
 		}
 	}
 	
+	override initialize(Injector injector) {
+		injector.injectMembers(this)
+	}
+	
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/scoping/ImportNamespacesScopingFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/scoping/ImportNamespacesScopingFragment2.xtend
index 6d6f56426..7b657ea57 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/scoping/ImportNamespacesScopingFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/scoping/ImportNamespacesScopingFragment2.xtend
@@ -72,10 +72,10 @@ class ImportNamespacesScopingFragment2 extends AbstractGeneratorFragment2 {
 			else
 				generateJavaScopeProvider()
 			
-			if (projectConfig.runtimeManifest !== null) {
-				projectConfig.runtimeManifest.exportedPackages += grammar.scopeProviderClass.packageName
+			if (projectConfig.runtime.manifest !== null) {
+				projectConfig.runtime.manifest.exportedPackages += grammar.scopeProviderClass.packageName
 				if (codeConfig.preferXtendStubs)
-					projectConfig.runtimeManifest.requiredBundles += 'org.eclipse.xtext.xbase.lib'
+					projectConfig.runtime.manifest.requiredBundles += 'org.eclipse.xtext.xbase.lib'
 			}
 		}
 	}
@@ -109,7 +109,7 @@ class ImportNamespacesScopingFragment2 extends AbstractGeneratorFragment2 {
 			public class �grammar.scopeProviderClass.simpleName� extends �grammar.scopeProviderSuperClass� {
 			
 			}
-		''').writeTo(projectConfig.runtimeSrc)
+		''').writeTo(projectConfig.runtime.src)
 	}
 	
 	protected def generateXtendScopeProvider() {
@@ -123,7 +123,7 @@ class ImportNamespacesScopingFragment2 extends AbstractGeneratorFragment2 {
 			class �grammar.scopeProviderClass.simpleName� extends �grammar.scopeProviderSuperClass� {
 			
 			}
-		''').writeTo(projectConfig.runtimeSrc)
+		''').writeTo(projectConfig.runtime.src)
 	}
 	
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/types/TypesGeneratorFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/types/TypesGeneratorFragment2.xtend
index d35eabc53..fb45be132 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/types/TypesGeneratorFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/types/TypesGeneratorFragment2.xtend
@@ -29,21 +29,21 @@ class TypesGeneratorFragment2 extends AbstractGeneratorFragment2 {
 			.contributeTo(language.eclipsePluginGenModule)
 		language.eclipsePluginGenModule.superClass = 'org.eclipse.xtext.common.types.ui.DefaultCommonTypesUiModule'.typeRef
 		
-		if (projectConfig.runtimeManifest !== null) {
-			projectConfig.runtimeManifest.requiredBundles.addAll(
+		if (projectConfig.runtime.manifest !== null) {
+			projectConfig.runtime.manifest.requiredBundles.addAll(
 				'org.eclipse.xtext.common.types',
 				'org.objectweb.asm;bundle-version="[5.0.1,6.0.0)";resolution:=optional'
 			)
 		}
 		
-		if (projectConfig.runtimeTestManifest !== null) {
-			projectConfig.runtimeTestManifest.requiredBundles.add(
+		if (projectConfig.runtimeTest.manifest !== null) {
+			projectConfig.runtimeTest.manifest.requiredBundles.add(
 				'org.objectweb.asm;bundle-version="[5.0.1,6.0.0)";resolution:=optional'
 			)
 		}
 		
-		if (projectConfig.eclipsePluginManifest !== null) {
-			projectConfig.eclipsePluginManifest.requiredBundles.add(
+		if (projectConfig.eclipsePlugin.manifest !== null) {
+			projectConfig.eclipsePlugin.manifest.requiredBundles.add(
 				'org.eclipse.xtext.common.types.ui'
 			)
 		}
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/compare/CompareFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/compare/CompareFragment2.xtend
index f76e3d571..fdece8d20 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/compare/CompareFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/compare/CompareFragment2.xtend
@@ -33,8 +33,8 @@ class CompareFragment2 extends AbstractGeneratorFragment2 {
 			log.info("generating Compare Framework infrastructure");
 		}
 
-		if (projectConfig.eclipsePluginManifest != null) {
-			projectConfig.eclipsePluginManifest.requiredBundles += "org.eclipse.xtext.ui"
+		if (projectConfig.eclipsePlugin.manifest != null) {
+			projectConfig.eclipsePlugin.manifest.requiredBundles += "org.eclipse.xtext.ui"
 		}
 
 		new GuiceModuleAccess.BindingFactory()
@@ -43,8 +43,8 @@ class CompareFragment2 extends AbstractGeneratorFragment2 {
 					new TypeReference("org.eclipse.xtext.ui.compare.DefaultViewerCreator")
 				).contributeTo(language.eclipsePluginGenModule);
 
-		if (projectConfig.eclipsePluginPluginXml != null) {
-			projectConfig.eclipsePluginPluginXml.entries += '''
+		if (projectConfig.eclipsePlugin.pluginXml != null) {
+			projectConfig.eclipsePlugin.pluginXml.entries += '''
 			<extension point="org.eclipse.compare.contentViewers">
 				<viewer id="�grammar.name�.compare.contentViewers"
 					class="�grammar.eclipsePluginExecutableExtensionFactory�:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/contentAssist/ContentAssistFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/contentAssist/ContentAssistFragment2.xtend
index 7762b6860..61eca126c 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/contentAssist/ContentAssistFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/contentAssist/ContentAssistFragment2.xtend
@@ -83,8 +83,8 @@ class ContentAssistFragment2 extends AbstractGeneratorFragment2 {
 		val chosenClass = 
 			if (generateStub) grammar.getProposalProviderClass else grammar.getGenProposalProviderClass;
 		
-		if (projectConfig.eclipsePluginManifest != null) {
-			projectConfig.eclipsePluginManifest.requiredBundles += "org.eclipse.xtext.ui"
+		if (projectConfig.eclipsePlugin.manifest != null) {
+			projectConfig.eclipsePlugin.manifest.requiredBundles += "org.eclipse.xtext.ui"
 		}
 
 		new GuiceModuleAccess.BindingFactory()
@@ -93,26 +93,26 @@ class ContentAssistFragment2 extends AbstractGeneratorFragment2 {
 					chosenClass
 				).contributeTo(language.eclipsePluginGenModule);
 
-		if (projectConfig.eclipsePluginSrcGen !== null) {
+		if (projectConfig.eclipsePlugin.srcGen !== null) {
 			// generate the 'Abstract...ProposalProvider'
 			generateGenJavaProposalProvider
 		}
 
-		if (generateStub && projectConfig.eclipsePluginSrc != null) {
+		if (generateStub && projectConfig.eclipsePlugin.src != null) {
 			if (preferXtendStubs) {
 				generateXtendProposalProviderStub
 
-				if (projectConfig.eclipsePluginManifest != null) {
-					projectConfig.eclipsePluginManifest.requiredBundles += "org.eclipse.xtext.xbase.lib"
-					projectConfig.eclipsePluginManifest.requiredBundles += "org.eclipse.xtend.lib;resolution:=optional"
+				if (projectConfig.eclipsePlugin.manifest != null) {
+					projectConfig.eclipsePlugin.manifest.requiredBundles += "org.eclipse.xtext.xbase.lib"
+					projectConfig.eclipsePlugin.manifest.requiredBundles += "org.eclipse.xtend.lib;resolution:=optional"
 				}
 			} else {
 				generateJavaProposalProviderStub
 			}
 		}
 
-		if (projectConfig.eclipsePluginManifest != null) {
-			projectConfig.eclipsePluginManifest.exportedPackages += grammar.proposalProviderClass.packageName
+		if (projectConfig.eclipsePlugin.manifest != null) {
+			projectConfig.eclipsePlugin.manifest.exportedPackages += grammar.proposalProviderClass.packageName
 		}
 	}
 
@@ -126,7 +126,7 @@ class ContentAssistFragment2 extends AbstractGeneratorFragment2 {
 			 */
 			class �grammar.proposalProviderClass.simpleName� extends �grammar.genProposalProviderClass� {
 			}
-		''').writeTo(projectConfig.eclipsePluginSrc)
+		''').writeTo(projectConfig.eclipsePlugin.src)
 	}
 
 	def generateJavaProposalProviderStub() {
@@ -137,7 +137,7 @@ class ContentAssistFragment2 extends AbstractGeneratorFragment2 {
 			 */
 			public class �grammar.proposalProviderClass.simpleName� extends �grammar.genProposalProviderClass� {
 			}
-		''').writeTo(projectConfig.eclipsePluginSrc)
+		''').writeTo(projectConfig.eclipsePlugin.src)
 	}
 
 
@@ -191,7 +191,7 @@ class ContentAssistFragment2 extends AbstractGeneratorFragment2 {
 					}
 		    	�ENDFOR�
 			}
-		''').writeTo(projectConfig.eclipsePluginSrcGen)	
+		''').writeTo(projectConfig.eclipsePlugin.srcGen)	
 
 	}
 
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend
index 4859ab7b6..f072cf345 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend
@@ -91,8 +91,8 @@ class LabelProviderFragment2 extends AbstractGeneratorFragment2 {
 	override generate() {
 		if (generateStub || grammar.inheritsXbase) {
 
-			if (projectConfig.eclipsePluginManifest != null) {
-				projectConfig.eclipsePluginManifest.requiredBundles += "org.eclipse.xtext.ui"
+			if (projectConfig.eclipsePlugin.manifest != null) {
+				projectConfig.eclipsePlugin.manifest.requiredBundles += "org.eclipse.xtext.ui"
 			}
 	
 			val labelProviderClass =
@@ -115,7 +115,7 @@ class LabelProviderFragment2 extends AbstractGeneratorFragment2 {
 					''').contributeTo(language.eclipsePluginGenModule)			
 		}
 
-		if (generateStub && projectConfig.eclipsePluginSrc !== null) {
+		if (generateStub && projectConfig.eclipsePlugin.src !== null) {
 			if (preferXtendStubs) {
 				generateXtendEObjectLabelProvider
 				generateXtendDescriptionLabelProvider
@@ -150,7 +150,7 @@ class LabelProviderFragment2 extends AbstractGeneratorFragment2 {
 			//		'Greeting.gif'
 			//	}
 			}
-		''').writeTo(projectConfig.eclipsePluginSrc)
+		''').writeTo(projectConfig.eclipsePlugin.src)
 	}
 
 	def protected generateXtendDescriptionLabelProvider() {
@@ -172,7 +172,7 @@ class LabelProviderFragment2 extends AbstractGeneratorFragment2 {
 			//		ele.EClass.name + '.gif'
 			//	}
 			}
-		''').writeTo(projectConfig.eclipsePluginSrc)
+		''').writeTo(projectConfig.eclipsePlugin.src)
 	}
 
 	def protected generateJavaEObjectLabelProvider() {
@@ -201,7 +201,7 @@ class LabelProviderFragment2 extends AbstractGeneratorFragment2 {
 			//		return "Greeting.gif";
 			//	}
 			}
-		''').writeTo(projectConfig.eclipsePluginSrc)
+		''').writeTo(projectConfig.eclipsePlugin.src)
 	}
 
 	def protected generateJavaDescriptionLabelProvider() {
@@ -223,6 +223,6 @@ class LabelProviderFragment2 extends AbstractGeneratorFragment2 {
 			//     return ele.getEClass().getName() + ".gif";
 			//  }	 
 			}
-		''').writeTo(projectConfig.eclipsePluginSrc)
+		''').writeTo(projectConfig.eclipsePlugin.src)
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/outline/OutlineTreeProviderFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/outline/OutlineTreeProviderFragment2.xtend
index 8cb24ed8f..3fa7f3fc0 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/outline/OutlineTreeProviderFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/outline/OutlineTreeProviderFragment2.xtend
@@ -38,15 +38,15 @@ class OutlineTreeProviderFragment2 extends AbstractGeneratorFragment2 {
 	}
 
 	override generate() {
-		if (projectConfig.eclipsePluginManifest != null) {
-			projectConfig.eclipsePluginManifest.requiredBundles += "org.eclipse.xtext.ui"
+		if (projectConfig.eclipsePlugin.manifest != null) {
+			projectConfig.eclipsePlugin.manifest.requiredBundles += "org.eclipse.xtext.ui"
 		}
 		
 		if (!generateStub) {
 			return;
 		}
 
-		if (projectConfig.eclipsePluginSrc !== null) {
+		if (projectConfig.eclipsePlugin.src !== null) {
 			if (codeConfig.preferXtendStubs) {
 				generateXtendOutlineTreeProvider
 			} else {
@@ -73,7 +73,7 @@ class OutlineTreeProviderFragment2 extends AbstractGeneratorFragment2 {
 				"org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider".typeRef� {
 			
 			}
-		''').writeTo(projectConfig.eclipsePluginSrc)
+		''').writeTo(projectConfig.eclipsePlugin.src)
 	}
 	
 	def protected generateXtendOutlineTreeProvider() {
@@ -87,5 +87,5 @@ class OutlineTreeProviderFragment2 extends AbstractGeneratorFragment2 {
 				"org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider".typeRef� {
 			
 			}
-		''').writeTo(projectConfig.eclipsePluginSrc)
+		''').writeTo(projectConfig.eclipsePlugin.src)
 	}}
\ No newline at end of file
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/outline/QuickOutlineFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/outline/QuickOutlineFragment2.xtend
index ffb1bdef5..6065b6000 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/outline/QuickOutlineFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/outline/QuickOutlineFragment2.xtend
@@ -22,12 +22,12 @@ class QuickOutlineFragment2 extends AbstractGeneratorFragment2 {
 	extension XtextGeneratorNaming
 	
 	override generate() {
-		if (projectConfig.eclipsePluginManifest != null) {
-			projectConfig.eclipsePluginManifest.requiredBundles += "org.eclipse.xtext.ui"
+		if (projectConfig.eclipsePlugin.manifest != null) {
+			projectConfig.eclipsePlugin.manifest.requiredBundles += "org.eclipse.xtext.ui"
 		}
 		
-		if (projectConfig.eclipsePluginPluginXml != null) {
-			projectConfig.eclipsePluginPluginXml.entries += '''
+		if (projectConfig.eclipsePlugin.pluginXml != null) {
+			projectConfig.eclipsePlugin.pluginXml.entries += '''
 				<!-- Quick Outline -->
 				<extension
 					point="org.eclipse.ui.handlers">
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/quickfix/QuickfixProviderFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/quickfix/QuickfixProviderFragment2.xtend
index 92e7e9f74..57861ea28 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/quickfix/QuickfixProviderFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/quickfix/QuickfixProviderFragment2.xtend
@@ -76,18 +76,18 @@ class QuickfixProviderFragment2 extends AbstractGeneratorFragment2 {
 					instanceClass
 				).contributeTo(language.eclipsePluginGenModule);
 
-		if (generateStub && projectConfig.eclipsePluginSrc !== null) {
+		if (generateStub && projectConfig.eclipsePlugin.src !== null) {
 			if (preferXtendStubs) {
 				generateXtendQuickfixProvider
 			} else {
 				generateJavaQuickfixProvider
 			}
 
-			if (projectConfig.eclipsePluginManifest != null) {
-				projectConfig.eclipsePluginManifest.exportedPackages += grammar.quickfixProviderClass.packageName
+			if (projectConfig.eclipsePlugin.manifest != null) {
+				projectConfig.eclipsePlugin.manifest.exportedPackages += grammar.quickfixProviderClass.packageName
 			}
 
-			if (projectConfig.eclipsePluginPluginXml != null) {
+			if (projectConfig.eclipsePlugin.pluginXml != null) {
 				addRegistrationToPluginXml
 			}
 		}
@@ -112,7 +112,7 @@ class QuickfixProviderFragment2 extends AbstractGeneratorFragment2 {
 			//		]
 			//	}
 			}
-		''').writeTo(projectConfig.eclipsePluginSrc)
+		''').writeTo(projectConfig.eclipsePlugin.src)
 	}
 	
 	protected def generateJavaQuickfixProvider() {
@@ -136,14 +136,14 @@ class QuickfixProviderFragment2 extends AbstractGeneratorFragment2 {
 			//	}
 			
 			}
-		''').writeTo(projectConfig.eclipsePluginSrc)		
+		''').writeTo(projectConfig.eclipsePlugin.src)
 	}
 	
 	protected def addRegistrationToPluginXml() {
 		val markerTypePrefix = grammar.eclipsePluginBasePackage + "." + grammar.simpleName.toLowerCase
 		val executableExtensionFactory = grammar.eclipsePluginExecutableExtensionFactory
 
-		projectConfig.eclipsePluginPluginXml.entries += '''
+		projectConfig.eclipsePlugin.pluginXml.entries += '''
 		    <!-- quickfix marker resolution generator for �grammar.name� -->
 		    <extension
 		            point="org.eclipse.ui.ide.markerResolution">
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/validation/ValidatorFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/validation/ValidatorFragment2.xtend
index e39608c6c..e5c2f0eb4 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/validation/ValidatorFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/validation/ValidatorFragment2.xtend
@@ -92,10 +92,10 @@ class ValidatorFragment2 extends AbstractGeneratorFragment2 {
 		}
 		generateAbstractValidator()
 		
-		if (projectConfig.runtimeManifest !== null)
-			projectConfig.runtimeManifest.exportedPackages += grammar.validatorClass.packageName
+		if (projectConfig.runtime.manifest !== null)
+			projectConfig.runtime.manifest.exportedPackages += grammar.validatorClass.packageName
 		
-		if (projectConfig.eclipsePluginPluginXml !== null)
+		if (projectConfig.eclipsePlugin.pluginXml !== null)
 			contributeEclipsePluginExtensions()
 	}
 	
@@ -122,7 +122,7 @@ class ValidatorFragment2 extends AbstractGeneratorFragment2 {
 			//	}
 				
 			}
-		''').writeTo(projectConfig.runtimeSrc)
+		''').writeTo(projectConfig.runtime.src)
 	}
 	
 	protected def generateJavaValidatorStub() {
@@ -144,7 +144,7 @@ class ValidatorFragment2 extends AbstractGeneratorFragment2 {
 			//	}
 				
 			}
-		''').writeTo(projectConfig.runtimeSrc)
+		''').writeTo(projectConfig.runtime.src)
 	}
 	
 	protected def generateAbstractValidator() {
@@ -169,7 +169,7 @@ class ValidatorFragment2 extends AbstractGeneratorFragment2 {
 				
 			}
 		'''
-		javaFile.writeTo(projectConfig.runtimeSrcGen)
+		javaFile.writeTo(projectConfig.runtime.srcGen)
 	}
 	
 	protected def getGeneratedPackagesToValidate() {
@@ -188,7 +188,7 @@ class ValidatorFragment2 extends AbstractGeneratorFragment2 {
 	
 	protected def contributeEclipsePluginExtensions() {
 		val simpleName = getSimpleName(grammar)
-		projectConfig.eclipsePluginPluginXml.entries += '''
+		projectConfig.eclipsePlugin.pluginXml.entries += '''
 			<!-- marker definitions for �grammar.name� -->
 			<extension
 					id="�simpleName.toLowerCase�.check.fast"
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/web/WebIntegrationFragment.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/web/WebIntegrationFragment.xtend
index 706557175..42ae3a928 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/web/WebIntegrationFragment.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/web/WebIntegrationFragment.xtend
@@ -179,13 +179,13 @@ class WebIntegrationFragment extends AbstractGeneratorFragment2 {
 		super.checkConfiguration(issues)
 		if (framework === null)
 			issues.addError('The property \'framework\' is required.')
-		if (generateJsHighlighting && projectConfig.webApp === null)
+		if (generateJsHighlighting && projectConfig.web.assets === null)
 			issues.addWarning('The \'webApp\' outlet is not defined in the project configuration; JS syntax highlighting is disabled.')
-		if (generateServlet && projectConfig.webSrc === null)
-			issues.addWarning('The \'webSrc\' outlet is not defined in the project configuration; the generated servlet is disabled.')
-		if (generateJettyLauncher && projectConfig.webSrc === null)
-			issues.addWarning('The \'webSrc\' outlet is not defined in the project configuration; the Jetty launcher is disabled.')
-		if (generateHtmlExample && projectConfig.webApp === null)
+		if (generateServlet && projectConfig.web.src === null)
+			issues.addWarning('The \'web.src\' outlet is not defined in the project configuration; the generated servlet is disabled.')
+		if (generateJettyLauncher && projectConfig.web.src === null)
+			issues.addWarning('The \'web.src\' outlet is not defined in the project configuration; the Jetty launcher is disabled.')
+		if (generateHtmlExample && projectConfig.web.assets === null)
 			issues.addWarning('The \'webApp\' outlet is not defined in the project configuration; the example HTML page is disabled.')
 		for (pattern : enabledPatterns.filter[suppressedPatterns.contains(it)]) {
 			issues.addError('The pattern \'' + pattern + '\' cannot be enabled and suppressed.')
@@ -193,7 +193,7 @@ class WebIntegrationFragment extends AbstractGeneratorFragment2 {
 	}
 	
 	override generate() {
-		if (generateJsHighlighting && projectConfig.webApp !== null) {
+		if (generateJsHighlighting && projectConfig.web.assets !== null) {
 			val langId = language.fileExtensions.head
 			if (highlightingModuleName.nullOrEmpty) {
 				highlightingModuleName = switch framework {
@@ -208,17 +208,17 @@ class WebIntegrationFragment extends AbstractGeneratorFragment2 {
 			generateJsHighlighting(langId)
 		}
 		
-		if (generateServlet && projectConfig.webSrc !== null) {
+		if (generateServlet && projectConfig.web.src !== null) {
 			generateServlet()
 		}
-		if (generateJettyLauncher && projectConfig.webSrc !== null) {
+		if (generateJettyLauncher && projectConfig.web.src !== null) {
 			generateServerLauncher()
 		}
-		if (generateHtmlExample && projectConfig.webApp !== null) {
+		if (generateHtmlExample && projectConfig.web.assets !== null) {
 			generateIndexDoc()
 			generateStyleSheet()
 		}
-		if (generateWebXml && projectConfig.webApp !== null) {
+		if (generateWebXml && projectConfig.web.assets !== null) {
 			generateWebXml()
 		}
 		
@@ -344,7 +344,7 @@ class WebIntegrationFragment extends AbstractGeneratorFragment2 {
 			}
 			
 		}
-		jsFile.writeTo(projectConfig.webApp)
+		jsFile.writeTo(projectConfig.web.assets)
 	}
 	
 	protected def Collection<String> createOrionPatterns(String langId, Set<String> keywords) {
@@ -460,7 +460,7 @@ class WebIntegrationFragment extends AbstractGeneratorFragment2 {
 	}
 	
 	protected def void generateIndexDoc() {
-		if (projectConfig.webApp.isFile('index.html')) {
+		if (projectConfig.web.assets.isFile('index.html')) {
 			// Don't overwrite an existing index document
 			return
 		}
@@ -561,11 +561,11 @@ class WebIntegrationFragment extends AbstractGeneratorFragment2 {
 			</body>
 			</html>
 		'''
-		indexFile.writeTo(projectConfig.webApp)
+		indexFile.writeTo(projectConfig.web.assets)
 	}
 	
 	protected def void generateStyleSheet() {
-		if (projectConfig.webApp.isFile('style.css')) {
+		if (projectConfig.web.assets.isFile('style.css')) {
 			// Don't overwrite an existing style sheet
 			return
 		}
@@ -648,7 +648,7 @@ class WebIntegrationFragment extends AbstractGeneratorFragment2 {
 				 */
 			�ENDIF�
 		'''
-		styleFile.writeTo(projectConfig.webApp)
+		styleFile.writeTo(projectConfig.web.assets)
 	}
 	
 	protected def void generateServerLauncher() {
@@ -661,7 +661,7 @@ class WebIntegrationFragment extends AbstractGeneratorFragment2 {
 				def static void main(String[] args) {
 					val server = new �'org.eclipse.jetty.server.Server'.typeRef�(new �'java.net.InetSocketAddress'.typeRef�('localhost', 8080))
 					server.handler = new �'org.eclipse.jetty.webapp.WebAppContext'.typeRef� => [
-						resourceBase = '�projectConfig.webApp.path.replace(projectConfig.webRoot.path + "/", "")�'
+						resourceBase = '�projectConfig.web.assets.path.replace(projectConfig.web.root.path + "/", "")�'
 						welcomeFiles = #["index.html"]
 						contextPath = "/"
 						configurations = #[
@@ -670,7 +670,7 @@ class WebIntegrationFragment extends AbstractGeneratorFragment2 {
 							new �'org.eclipse.jetty.webapp.WebInfConfiguration'.typeRef�,
 							new �'org.eclipse.jetty.webapp.MetaInfConfiguration'.typeRef�
 						]
-						setAttribute(�'org.eclipse.jetty.webapp.WebInfConfiguration'.typeRef�.CONTAINER_JAR_PATTERN, '.*/�projectConfig.webProjectName.replace('.', '\\\\.')�/.*,.*/org\\.eclipse\\.xtext\\.web.*,.*/org\\.webjars.*')
+						setAttribute(�'org.eclipse.jetty.webapp.WebInfConfiguration'.typeRef�.CONTAINER_JAR_PATTERN, '.*/�projectConfig.web.name.replace('.', '\\\\.')�/.*,.*/org\\.eclipse\\.xtext\\.web.*,.*/org\\.webjars.*')
 					]
 					val log = new �'org.eclipse.jetty.util.log.Slf4jLog'.typeRef�(�grammar.serverLauncherClass.simpleName�.name)
 					try {
@@ -692,7 +692,7 @@ class WebIntegrationFragment extends AbstractGeneratorFragment2 {
 					}
 				}
 			}
-		''').writeTo(projectConfig.webSrc)
+		''').writeTo(projectConfig.web.src)
 	}
 	
 	protected def void generateServlet() {
@@ -720,11 +720,11 @@ class WebIntegrationFragment extends AbstractGeneratorFragment2 {
 				}
 				
 			}
-		''').writeTo(projectConfig.webSrc)
+		''').writeTo(projectConfig.web.src)
 	}
 	
 	protected def void generateWebXml() {
-		if (projectConfig.webApp.isFile('WEB-INF/web.xml')) {
+		if (projectConfig.web.assets.isFile('WEB-INF/web.xml')) {
 			// Don't overwrite an existing web.xml
 			return
 		}
@@ -787,7 +787,7 @@ class WebIntegrationFragment extends AbstractGeneratorFragment2 {
 				</session-config>
 			</web-app>
 		'''
-		xmlFile.writeTo(projectConfig.webApp)
+		xmlFile.writeTo(projectConfig.web.assets)
 	}
 	
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/xbase/XbaseGeneratorFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/xbase/XbaseGeneratorFragment2.xtend
index 5c6fe99f0..deffe15ac 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/xbase/XbaseGeneratorFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/xbase/XbaseGeneratorFragment2.xtend
@@ -68,21 +68,21 @@ class XbaseGeneratorFragment2 extends AbstractGeneratorFragment2 {
 		
 		contributeRuntimeGuiceBindings()
 		contributeEclipsePluginGuiceBindings()
-		if (projectConfig.eclipsePluginPluginXml !== null)
+		if (projectConfig.eclipsePlugin.pluginXml !== null)
 			contributeEclipsePluginExtensions()
 		if (generateXtendInferrer)
 			doGenerateXtendInferrer()
 		
-		if (projectConfig.runtimeManifest !== null) {
-			projectConfig.runtimeManifest.requiredBundles.addAll(#[
+		if (projectConfig.runtime.manifest !== null) {
+			projectConfig.runtime.manifest.requiredBundles.addAll(#[
 				'org.eclipse.xtext.xbase', 'org.eclipse.xtext.xbase.lib'
 			])
 			if ((generateXtendInferrer || useInferredJvmModel) && !skipExportedPackage) {
-				projectConfig.runtimeManifest.exportedPackages += jvmModelInferrer.packageName
+				projectConfig.runtime.manifest.exportedPackages += jvmModelInferrer.packageName
 			}
 		}
-		if (projectConfig.eclipsePluginManifest !== null) {
-			projectConfig.eclipsePluginManifest.requiredBundles.addAll(#[
+		if (projectConfig.eclipsePlugin.manifest !== null) {
+			projectConfig.eclipsePlugin.manifest.requiredBundles.addAll(#[
 				'org.eclipse.xtext.xbase.ui', 'org.eclipse.jdt.debug.ui'
 			])
 		}
@@ -259,13 +259,13 @@ class XbaseGeneratorFragment2 extends AbstractGeneratorFragment2 {
 			//   		]
 				}
 			}
-		''').writeTo(projectConfig.runtimeSrc)
+		''').writeTo(projectConfig.runtime.src)
 	}
 	
 	protected def contributeEclipsePluginExtensions() {
 		val name = language.grammar.name
 		if (jdtTypeHierarchy) {
-			projectConfig.eclipsePluginPluginXml.entries += '''
+			projectConfig.eclipsePlugin.pluginXml.entries += '''
 				<!-- Type Hierarchy  -->
 				<extension point="org.eclipse.ui.handlers">
 					<handler 
@@ -338,7 +338,7 @@ class XbaseGeneratorFragment2 extends AbstractGeneratorFragment2 {
 			'''
 		}
 		if (jdtCallHierarchy) {
-			projectConfig.eclipsePluginPluginXml.entries += '''
+			projectConfig.eclipsePlugin.pluginXml.entries += '''
 				<!-- Call Hierachy -->
 				<extension point="org.eclipse.ui.handlers">
 					<handler 
@@ -365,7 +365,7 @@ class XbaseGeneratorFragment2 extends AbstractGeneratorFragment2 {
 				</extension>
 			'''
 		}
-		projectConfig.eclipsePluginPluginXml.entries += '''
+		projectConfig.eclipsePlugin.pluginXml.entries += '''
 			<extension point="org.eclipse.core.runtime.adapters">
 				<factory class="�grammar.eclipsePluginExecutableExtensionFactory�:org.eclipse.xtext.builder.smap.StratumBreakpointAdapterFactory"
 					adaptableType="org.eclipse.xtext.ui.editor.XtextEditor">
diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/xbase/XtypeGeneratorFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/xbase/XtypeGeneratorFragment2.xtend
index 97825a9a2..ccd0a887d 100644
--- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/xbase/XtypeGeneratorFragment2.xtend
+++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/xbase/XtypeGeneratorFragment2.xtend
@@ -15,8 +15,8 @@ class XtypeGeneratorFragment2 extends AbstractGeneratorFragment2 {
 	@Inject extension XbaseUsageDetector
 	
 	override generate() {
-		if (language.grammar.inheritsXtype && projectConfig.eclipsePluginManifest !== null)
-			projectConfig.eclipsePluginManifest.requiredBundles += 'org.eclipse.xtext.xbase.ui'
+		if (language.grammar.inheritsXtype && projectConfig.eclipsePlugin.manifest !== null)
+			projectConfig.eclipsePlugin.manifest.requiredBundles += 'org.eclipse.xtext.xbase.ui'
 	}
 	
 }
diff --git a/plugins/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend b/plugins/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend
index 6169b4e82..69c0aaf19 100644
--- a/plugins/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend
+++ b/plugins/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend
@@ -166,24 +166,43 @@ class RuntimeProjectDescriptor extends TestedProjectDescriptor {
 				component = XtextGenerator auto-inject {
 					configuration = {
 						project = WizardConfig auto-inject {
-							�IF !config.uiProject.enabled�
-								eclipseEditor = false
+							�IF testProject.enabled�
+								runtimeTest = {
+									enabled = true
+								}
+							�ENDIF�
+							�IF config.ideProject.enabled 
+								&& !#[config.webProject, config.intellijProject, config.uiProject].exists[enabled]�
+								genericIde = {
+									enabled = true
+								}
+							�ENDIF�
+							�IF config.uiProject.enabled�
+								eclipsePlugin = {
+									enabled = true
+								}
+							�ENDIF�
+							�IF config.uiProject.testProject.enabled�
+								eclipsePluginTest = {
+									enabled = true
+								}
 							�ENDIF�
 							�IF config.intellijProject.enabled�
-								ideaEditor = true
+								ideaPlugin = {
+									enabled = true
+								}
 							�ENDIF�
 							�IF config.webProject.enabled�
-								webSupport = true
-							�ENDIF�
-							�IF config.ideProject.enabled�
-								genericIdeSupport = true
-							�ENDIF�
-							�IF testProject.enabled�
-								testingSupport = true
+								web = {
+									enabled = true
+								}
 							�ENDIF�
 							�IF config.sourceLayout == SourceLayout.MAVEN�
 								mavenLayout = true
 							�ENDIF�
+							�IF isEclipsePluginProject�
+								createEclipseMetaData = true
+							�ENDIF�
 						}
 						code = auto-inject {
 							encoding = "�config.encoding�"
diff --git a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.eclipsePlugin/org.xtext.example.eclipsePlugin/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.eclipsePlugin/org.xtext.example.eclipsePlugin/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2
index 5021710e7..c13a5a5ca 100644
--- a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.eclipsePlugin/org.xtext.example.eclipsePlugin/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2
+++ b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.eclipsePlugin/org.xtext.example.eclipsePlugin/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2
@@ -15,8 +15,16 @@ Workflow {
 	component = XtextGenerator auto-inject {
 		configuration = {
 			project = WizardConfig auto-inject {
-				genericIdeSupport = true
-				testingSupport = true
+				runtimeTest = {
+					enabled = true
+				}
+				eclipsePlugin = {
+					enabled = true
+				}
+				eclipsePluginTest = {
+					enabled = true
+				}
+				createEclipseMetaData = true
 			}
 			code = auto-inject {
 				encoding = "UTF-8"
diff --git a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2
index bbff7ae20..9b4ba9419 100644
--- a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2
+++ b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2
@@ -15,10 +15,22 @@ Workflow {
 	component = XtextGenerator auto-inject {
 		configuration = {
 			project = WizardConfig auto-inject {
-				ideaEditor = true
-				webSupport = true
-				genericIdeSupport = true
-				testingSupport = true
+				runtimeTest = {
+					enabled = true
+				}
+				eclipsePlugin = {
+					enabled = true
+				}
+				eclipsePluginTest = {
+					enabled = true
+				}
+				ideaPlugin = {
+					enabled = true
+				}
+				web = {
+					enabled = true
+				}
+				createEclipseMetaData = true
 			}
 			code = auto-inject {
 				encoding = "UTF-8"
diff --git a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.gradle/org.xtext.example.gradle.parent/org.xtext.example.gradle/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2 b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.gradle/org.xtext.example.gradle.parent/org.xtext.example.gradle/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2
index 11c81bb38..6fdaec92b 100644
--- a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.gradle/org.xtext.example.gradle.parent/org.xtext.example.gradle/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2
+++ b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.gradle/org.xtext.example.gradle.parent/org.xtext.example.gradle/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2
@@ -15,11 +15,15 @@ Workflow {
 	component = XtextGenerator auto-inject {
 		configuration = {
 			project = WizardConfig auto-inject {
-				eclipseEditor = false
-				ideaEditor = true
-				webSupport = true
-				genericIdeSupport = true
-				testingSupport = true
+				runtimeTest = {
+					enabled = true
+				}
+				ideaPlugin = {
+					enabled = true
+				}
+				web = {
+					enabled = true
+				}
 				mavenLayout = true
 			}
 			code = auto-inject {
diff --git a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2
index b36ca53f7..f99d158f9 100644
--- a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2
+++ b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2
@@ -15,9 +15,19 @@ Workflow {
 	component = XtextGenerator auto-inject {
 		configuration = {
 			project = WizardConfig auto-inject {
-				webSupport = true
-				genericIdeSupport = true
-				testingSupport = true
+				runtimeTest = {
+					enabled = true
+				}
+				eclipsePlugin = {
+					enabled = true
+				}
+				eclipsePluginTest = {
+					enabled = true
+				}
+				web = {
+					enabled = true
+				}
+				createEclipseMetaData = true
 			}
 			code = auto-inject {
 				encoding = "UTF-8"
diff --git a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.plainMaven/org.xtext.example.plainMaven.parent/org.xtext.example.plainMaven/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2 b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.plainMaven/org.xtext.example.plainMaven.parent/org.xtext.example.plainMaven/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2
index 389f49edf..0c8d34db5 100644
--- a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.plainMaven/org.xtext.example.plainMaven.parent/org.xtext.example.plainMaven/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2
+++ b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.plainMaven/org.xtext.example.plainMaven.parent/org.xtext.example.plainMaven/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2
@@ -15,10 +15,12 @@ Workflow {
 	component = XtextGenerator auto-inject {
 		configuration = {
 			project = WizardConfig auto-inject {
-				eclipseEditor = false
-				webSupport = true
-				genericIdeSupport = true
-				testingSupport = true
+				runtimeTest = {
+					enabled = true
+				}
+				web = {
+					enabled = true
+				}
 				mavenLayout = true
 			}
 			code = auto-inject {