[Model, Buildpaths] Revise LTK model and buildpaths
  - Correct namings
  - Add more nullable annotations

  - Fix missing synchronization in
    AbstractSourceModelInfo.removeAttachment
  - Rename SourceModelStamp.getSourceStamp to .getContentStamp to be in
    line with method in SourceUnit
  - Fix BuildpathUtils.isExcluded
diff --git a/ltk/_assemblies/org.eclipse.statet.ltk-feature/feature.xml b/ltk/_assemblies/org.eclipse.statet.ltk-feature/feature.xml
index 59bd7da..6177e03 100644
--- a/ltk/_assemblies/org.eclipse.statet.ltk-feature/feature.xml
+++ b/ltk/_assemblies/org.eclipse.statet.ltk-feature/feature.xml
@@ -41,14 +41,14 @@
          unpack="false"/>
 
    <plugin
-         id="org.eclipse.statet.ltk.buildpaths.core"
+         id="org.eclipse.statet.ltk.buildpath.core"
          download-size="0"
          install-size="0"
          version="0.0.0"
          unpack="false"/>
 
    <plugin
-         id="org.eclipse.statet.ltk.buildpaths.ui"
+         id="org.eclipse.statet.ltk.buildpath.ui"
          download-size="0"
          install-size="0"
          version="0.0.0"
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/.classpath b/ltk/org.eclipse.statet.ltk.buildpath.core/.classpath
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/.classpath
rename to ltk/org.eclipse.statet.ltk.buildpath.core/.classpath
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/.gitignore b/ltk/org.eclipse.statet.ltk.buildpath.core/.gitignore
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/.gitignore
rename to ltk/org.eclipse.statet.ltk.buildpath.core/.gitignore
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/.project b/ltk/org.eclipse.statet.ltk.buildpath.core/.project
similarity index 92%
copy from ltk/org.eclipse.statet.ltk.buildpaths.ui/.project
copy to ltk/org.eclipse.statet.ltk.buildpath.core/.project
index 7bb934b..da4bd38 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/.project
+++ b/ltk/org.eclipse.statet.ltk.buildpath.core/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.statet.ltk.buildpaths.ui</name>
+	<name>org.eclipse.statet.ltk.buildpath.core</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/.settings/org.eclipse.core.resources.prefs b/ltk/org.eclipse.statet.ltk.buildpath.core/.settings/org.eclipse.core.resources.prefs
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/.settings/org.eclipse.core.resources.prefs
rename to ltk/org.eclipse.statet.ltk.buildpath.core/.settings/org.eclipse.core.resources.prefs
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/.settings/org.eclipse.core.runtime.prefs b/ltk/org.eclipse.statet.ltk.buildpath.core/.settings/org.eclipse.core.runtime.prefs
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/.settings/org.eclipse.core.runtime.prefs
rename to ltk/org.eclipse.statet.ltk.buildpath.core/.settings/org.eclipse.core.runtime.prefs
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/.settings/org.eclipse.jdt.core.prefs b/ltk/org.eclipse.statet.ltk.buildpath.core/.settings/org.eclipse.jdt.core.prefs
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/.settings/org.eclipse.jdt.core.prefs
rename to ltk/org.eclipse.statet.ltk.buildpath.core/.settings/org.eclipse.jdt.core.prefs
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/.settings/org.eclipse.jdt.ui.prefs b/ltk/org.eclipse.statet.ltk.buildpath.core/.settings/org.eclipse.jdt.ui.prefs
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/.settings/org.eclipse.jdt.ui.prefs
rename to ltk/org.eclipse.statet.ltk.buildpath.core/.settings/org.eclipse.jdt.ui.prefs
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/META-INF/MANIFEST.MF b/ltk/org.eclipse.statet.ltk.buildpath.core/META-INF/MANIFEST.MF
similarity index 79%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/META-INF/MANIFEST.MF
rename to ltk/org.eclipse.statet.ltk.buildpath.core/META-INF/MANIFEST.MF
index b395bca..13d520a 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.core/META-INF/MANIFEST.MF
+++ b/ltk/org.eclipse.statet.ltk.buildpath.core/META-INF/MANIFEST.MF
@@ -1,6 +1,6 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
-Bundle-SymbolicName: org.eclipse.statet.ltk.buildpaths.core;singleton:=true
+Bundle-SymbolicName: org.eclipse.statet.ltk.buildpath.core;singleton:=true
 Bundle-Version: 4.2.0.qualifier
 Bundle-Vendor: Eclipse StatET
 Bundle-Name: StatET LTK - Buildpath - Core  (Incubation)
@@ -10,4 +10,4 @@
  org.eclipse.core.resources;visibility:=reexport
 Import-Package: org.eclipse.statet.jcommons.collections;version="4.2.0",
  org.eclipse.statet.jcommons.lang;version="4.2.0"
-Export-Package: org.eclipse.statet.ltk.buildpaths.core
+Export-Package: org.eclipse.statet.ltk.buildpath.core
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/about.html b/ltk/org.eclipse.statet.ltk.buildpath.core/about.html
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/about.html
rename to ltk/org.eclipse.statet.ltk.buildpath.core/about.html
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/build.properties b/ltk/org.eclipse.statet.ltk.buildpath.core/build.properties
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/build.properties
rename to ltk/org.eclipse.statet.ltk.buildpath.core/build.properties
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/plugin.xml b/ltk/org.eclipse.statet.ltk.buildpath.core/plugin.xml
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/plugin.xml
rename to ltk/org.eclipse.statet.ltk.buildpath.core/plugin.xml
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/internal/ltk/buildpaths/core/Messages.java b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/internal/ltk/buildpath/core/Messages.java
similarity index 86%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/internal/ltk/buildpaths/core/Messages.java
rename to ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/internal/ltk/buildpath/core/Messages.java
index 3b925cd..c3fc218 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/internal/ltk/buildpaths/core/Messages.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/internal/ltk/buildpath/core/Messages.java
@@ -12,11 +12,15 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.internal.ltk.buildpaths.core;
+package org.eclipse.statet.internal.ltk.buildpath.core;
 
 import org.eclipse.osgi.util.NLS;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
+
+@NonNullByDefault
+@SuppressWarnings("null")
 public class Messages {
 	
 	
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/internal/ltk/buildpaths/core/Messages.properties b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/internal/ltk/buildpath/core/Messages.properties
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/internal/ltk/buildpaths/core/Messages.properties
rename to ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/internal/ltk/buildpath/core/Messages.properties
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathAttribute.java b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BasicBuildpathAttribute.java
similarity index 68%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathAttribute.java
rename to ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BasicBuildpathAttribute.java
index 44bf248..b81771a 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathAttribute.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BasicBuildpathAttribute.java
@@ -12,20 +12,24 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.core;
+package org.eclipse.statet.ltk.buildpath.core;
 
 import java.util.Objects;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
-public class BuildpathAttribute implements IBuildpathAttribute {
+
+@NonNullByDefault
+public class BasicBuildpathAttribute implements BuildpathAttribute {
 	
 	
 	private final String name;
 	
-	private final String value;
+	private final @Nullable String value;
 	
 	
-	public BuildpathAttribute(final String name, final String value) {
+	public BasicBuildpathAttribute(final String name, final @Nullable String value) {
 		this.name= name;
 		this.value= value;
 	}
@@ -37,23 +41,23 @@
 	}
 	
 	@Override
-	public String getValue() {
+	public @Nullable String getValue() {
 		return this.value;
 	}
 	
 	
 	@Override
 	public int hashCode() {
-		return this.name.hashCode() * 17 + Objects.hashCode(this.value.hashCode());
+		return this.name.hashCode() * 17 + Objects.hashCode(this.value);
 	}
 	
 	@Override
-	public boolean equals(final Object obj) {
+	public boolean equals(final @Nullable Object obj) {
 		if (this == obj) {
 			return true;
 		}
-		if (obj instanceof BuildpathAttribute) {
-			final BuildpathAttribute other= (BuildpathAttribute) obj;
+		if (obj instanceof BasicBuildpathAttribute) {
+			final BasicBuildpathAttribute other= (BasicBuildpathAttribute)obj;
 			return (this.name.equals(other.name)
 					&& Objects.equals(this.value, other.value) );
 		}
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathElement.java b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BasicBuildpathElement.java
similarity index 67%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathElement.java
rename to ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BasicBuildpathElement.java
index 790d5fa..4d4c29d 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathElement.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BasicBuildpathElement.java
@@ -12,7 +12,9 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.core;
+package org.eclipse.statet.ltk.buildpath.core;
+
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
 
 import java.util.Objects;
 
@@ -20,10 +22,14 @@
 
 import org.eclipse.statet.jcommons.collections.ImCollections;
 import org.eclipse.statet.jcommons.collections.ImList;
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.lang.ObjectUtils;
 
 
-public class BuildpathElement implements IBuildpathElement {
+@NonNullByDefault
+public class BasicBuildpathElement implements BuildpathElement {
 	
 	
 	private static final ImList<String> UNINITIALIZED_PATTERNS= ImCollections.newList("UNINITIALIZED_PATTERNS"); //$NON-NLS-1$
@@ -56,10 +62,10 @@
 	/**
 	 * Patterns allowing to include/exclude portions of the resource tree denoted by this entry path.
 	 */
-	private final ImList<IPath> inclusionPatterns;
-	private volatile ImList<String> fullInclusionPatterns;
-	private final ImList<IPath> exclusionPatterns;
-	private volatile ImList<String> fullExclusionPatterns;
+	private final @Nullable ImList<IPath> inclusionPatterns;
+	private volatile @Nullable ImList<String> fullInclusionPatterns;
+	private final @Nullable ImList<IPath> exclusionPatterns;
+	private volatile @Nullable ImList<String> fullExclusionPatterns;
 	
 	
 	/**
@@ -73,7 +79,7 @@
 	 * an analogous form and meaning as the variable path, namely the first segment
 	 * is the name of a classpath variable.
 	 */
-	private final IPath sourceAttachmentPath;
+	private final @Nullable IPath sourceAttachmentPath;
 	
 	/**
 	 * Describes the path within the source archive where package fragments
@@ -82,17 +88,17 @@
 	 * if and only if <code>getSourceAttachmentPath</code> returns
 	 * a non-<code>null</code> value.
 	 */
-	private final IPath sourceAttachmentRootPath;
+	private final @Nullable IPath sourceAttachmentRootPath;
 	
 	/**
-	 * See {@link IBuildpathElement#getReferencingEntry()}
+	 * See {@link BuildpathElement#getReferencingEntry()}
 	 */
-	private final IBuildpathElement referencingElement;
+	private final @Nullable BuildpathElement referencingElement;
 	
 	/**
 	 * Specific output location (for this source entry)
 	 */
-	private final IPath specificOutputPath;
+	private final @Nullable IPath specificOutputPath;
 	
 	/**
 	 * The export flag
@@ -102,46 +108,34 @@
 	/**
 	 * The extra attributes
 	 */
-	private final ImList<IBuildpathAttribute> extraAttributes;
+	private final ImList<BuildpathAttribute> extraAttributes;
 	
 	
 	/**
 	 * Creates a class path entry of the specified kind with the given path.
 	 */
-	public BuildpathElement(final BuildpathElementType type,
-			final IPath path, final ImList<IPath> inclusionPatterns, final ImList<IPath> exclusionPatterns,
-			final IPath sourceAttachmentPath, final IPath sourceAttachmentRootPath,
-			final IPath specificOutputLocation,
-			final IBuildpathElement referencingEntry,
+	public BasicBuildpathElement(final BuildpathElementType type,
+			final IPath path, final @Nullable ImList<IPath> inclusionPatterns, final @Nullable ImList<IPath> exclusionPatterns,
+			final @Nullable IPath sourceAttachmentPath, final @Nullable IPath sourceAttachmentRootPath,
+			final @Nullable IPath specificOutputLocation,
+			final @Nullable BuildpathElement referencingEntry,
 			final boolean isExported,
-			final ImList<IBuildpathAttribute> extraAttributes) {
-		if (type == null) {
-			throw new NullPointerException("type"); //$NON-NLS-1$
-		}
-		if (path == null) {
-			throw new NullPointerException("path"); //$NON-NLS-1$
-		}
-		
-		this.type= type;
-		this.path= path;
+			final @Nullable ImList<BuildpathAttribute> extraAttributes) {
+		this.type= nonNullAssert(type);
+		this.path= nonNullAssert(path);
 		this.inclusionPatterns= inclusionPatterns;
+		this.fullInclusionPatterns= UNINITIALIZED_PATTERNS;
 		this.exclusionPatterns= exclusionPatterns;
+		this.fullExclusionPatterns= UNINITIALIZED_PATTERNS;
 		this.referencingElement= referencingEntry;
 		
-		if (this.inclusionPatterns != null && !this.inclusionPatterns.isEmpty()) {
-			this.fullInclusionPatterns= UNINITIALIZED_PATTERNS;
-		}
-		if (this.exclusionPatterns != null && !this.exclusionPatterns.isEmpty()) {
-			this.fullExclusionPatterns= UNINITIALIZED_PATTERNS;
-		}
-		
 		this.sourceAttachmentPath= sourceAttachmentPath;
 		this.sourceAttachmentRootPath= sourceAttachmentRootPath;
 		this.specificOutputPath= specificOutputLocation;
 		
 		this.isExported= isExported;
 		
-		this.extraAttributes= (extraAttributes != null) ? extraAttributes : ImCollections.<IBuildpathAttribute>emptyList();
+		this.extraAttributes= (extraAttributes != null) ? extraAttributes : ImCollections.<BuildpathAttribute>emptyList();
 	}
 	
 	
@@ -161,18 +155,21 @@
 	}
 	
 	@Override
-	public final ImList<IPath> getInclusionPatterns() {
+	public final @Nullable ImList<IPath> getInclusionPatterns() {
 		return this.inclusionPatterns;
 	}
 	
 	@Override
-	public final ImList<IPath> getExclusionPatterns() {
+	public final @Nullable ImList<IPath> getExclusionPatterns() {
 		return this.exclusionPatterns;
 	}
 	
-	private ImList<String> createFullPatterns(final ImList<IPath> patterns) {
+	private @Nullable ImList<String> createFullPatterns(final @Nullable ImList<IPath> patterns) {
+		if (patterns == null || patterns.isEmpty()) {
+			return null;
+		}
 		final int length= patterns.size();
-		final String[] fullPatterns= new String[length];
+		final String[] fullPatterns= new @NonNull String[length];
 		final IPath prefixPath= this.path.removeTrailingSeparator();
 		for (int i= 0; i < length; i++) {
 			fullPatterns[i]= prefixPath.append(patterns.get(i)).toString();
@@ -180,7 +177,7 @@
 		return ImCollections.newList(fullPatterns);
 	}
 	
-	public ImList<String> getFullInclusionPatterns() {
+	public @Nullable ImList<String> getFullInclusionPatterns() {
 		ImList<String> patterns= this.fullInclusionPatterns;
 		if (patterns == UNINITIALIZED_PATTERNS) {
 			patterns= this.fullInclusionPatterns= createFullPatterns(this.inclusionPatterns);
@@ -188,7 +185,7 @@
 		return patterns;
 	}
 	
-	public ImList<String> getFullExclusionPatterns() {
+	public @Nullable ImList<String> getFullExclusionPatterns() {
 		ImList<String> patterns= this.fullExclusionPatterns;
 		if (patterns == UNINITIALIZED_PATTERNS) {
 			patterns= this.fullExclusionPatterns= createFullPatterns(this.exclusionPatterns);
@@ -197,18 +194,18 @@
 	}
 	
 	@Override
-	public IPath getOutputPath() {
+	public @Nullable IPath getOutputPath() {
 		return this.specificOutputPath;
 	}
 	
 	
 	@Override
-	public ImList<IBuildpathAttribute> getExtraAttributes() {
+	public ImList<BuildpathAttribute> getExtraAttributes() {
 		return this.extraAttributes;
 	}
 	
-	public IBuildpathAttribute getAttribute(final String name) {
-		for (final IBuildpathAttribute attribute : this.extraAttributes) {
+	public @Nullable BuildpathAttribute getAttribute(final String name) {
+		for (final BuildpathAttribute attribute : this.extraAttributes) {
 			if (attribute.getName().equals(name)) {
 				return attribute;
 			}
@@ -218,15 +215,15 @@
 	
 	
 	@Override
-	public IPath getSourceAttachmentPath() {
+	public @Nullable IPath getSourceAttachmentPath() {
 		return this.sourceAttachmentPath;
 	}
 	
-	public IPath getSourceAttachmentRootPath() {
+	public @Nullable IPath getSourceAttachmentRootPath() {
 		return this.sourceAttachmentRootPath;
 	}
 	
-	public IBuildpathElement getReferencingEntry() {
+	public @Nullable BuildpathElement getReferencingEntry() {
 		return this.referencingElement;
 	}
 	
@@ -242,19 +239,19 @@
 	}
 	
 	@Override
-	public boolean equals(final Object obj) {
+	public boolean equals(final @Nullable Object obj) {
 		if (this == obj) {
 			return true;
 		}
-		if (obj instanceof BuildpathElement) {
-			final BuildpathElement other= (BuildpathElement) obj;
+		if (obj instanceof BasicBuildpathElement) {
+			final BasicBuildpathElement other= (BasicBuildpathElement)obj;
 			return (this.type == other.type
 					&& this.isExported == other.isExported()
 					&& this.path.equals(other.getPath())
 					&& Objects.equals(this.sourceAttachmentPath, other.sourceAttachmentPath)
 					&& Objects.equals(getSourceAttachmentRootPath(), other.sourceAttachmentRootPath)
-					&& BuildpathsUtils.equalPatterns(this.inclusionPatterns, other.getInclusionPatterns())
-					&& BuildpathsUtils.equalPatterns(this.exclusionPatterns, other.getExclusionPatterns())
+					&& BuildpathUtils.equalPatterns(this.inclusionPatterns, other.getInclusionPatterns())
+					&& BuildpathUtils.equalPatterns(this.exclusionPatterns, other.getExclusionPatterns())
 					&& Objects.equals(this.specificOutputPath, other.specificOutputPath)
 					&& this.extraAttributes.equals(other.extraAttributes) );
 		}
@@ -263,25 +260,23 @@
 	
 	@Override
 	public String toString() {
-		final ObjectUtils.ToStringBuilder sb= new ObjectUtils.ToStringBuilder("BuildpathElement"); //$NON-NLS-1$
+		final ObjectUtils.ToStringBuilder sb= new ObjectUtils.ToStringBuilder("BasicBuildpathElement"); //$NON-NLS-1$
 		sb.append(" ["); //$NON-NLS-1$
 		sb.append(this.type.getName());
 		sb.append("]:"); //$NON-NLS-1$
 		sb.append(getPath().toString());
 		sb.addProp("including", getInclusionPatterns()); //$NON-NLS-1$
 		sb.addProp("excluding", getExclusionPatterns()); //$NON-NLS-1$
-		if (getSourceAttachmentPath() != null) {
-			sb.addProp("sourcePath", getSourceAttachmentPath().toString()); //$NON-NLS-1$
-			if (getSourceAttachmentRootPath() != null) {
+		sb.addProp("sourcePath", getSourceAttachmentPath()); //$NON-NLS-1$
+		{	final IPath rootPath= getSourceAttachmentRootPath();
+			if (rootPath != null) {
 				sb.append(':');
-				sb.append(getSourceAttachmentRootPath().toString());
+				sb.append(rootPath.toString());
 			}
 		}
-		if (getOutputPath() != null) {
-			sb.addProp("outputPath", getOutputPath()); //$NON-NLS-1$
-		}
+		sb.addProp("outputPath", getOutputPath()); //$NON-NLS-1$
 		sb.addProp("isExported", this.isExported);
-		final ImList<IBuildpathAttribute> attributes= getExtraAttributes();
+		final ImList<BuildpathAttribute> attributes= getExtraAttributes();
 		if (!attributes.isEmpty()) {
 			sb.addProp("extraAttributes", attributes); //$NON-NLS-1$
 		}
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/IBuildpathAttribute.java b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathAttribute.java
similarity index 80%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/IBuildpathAttribute.java
rename to ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathAttribute.java
index 0b82c48..a63b030 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/IBuildpathAttribute.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathAttribute.java
@@ -12,10 +12,14 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.core;
+package org.eclipse.statet.ltk.buildpath.core;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 
-public interface IBuildpathAttribute {
+@NonNullByDefault
+public interface BuildpathAttribute {
 	
 	
 	String SOURCE_ATTACHMENT= "Source.path"; //$NON-NLS-1$
@@ -32,6 +36,6 @@
 	
 	String getName();
 	
-	String getValue();
+	@Nullable String getValue();
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/IBuildpathElement.java b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathElement.java
similarity index 70%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/IBuildpathElement.java
rename to ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathElement.java
index bb76041..c8fffb4 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/IBuildpathElement.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathElement.java
@@ -12,14 +12,17 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.core;
+package org.eclipse.statet.ltk.buildpath.core;
 
 import org.eclipse.core.runtime.IPath;
 
 import org.eclipse.statet.jcommons.collections.ImList;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 
-public interface IBuildpathElement {
+@NonNullByDefault
+public interface BuildpathElement {
 	
 	
 	String SOURCE= "Source"; //$NON-NLS-1$
@@ -33,16 +36,16 @@
 	
 	IPath getPath();
 	
-	ImList<IPath> getInclusionPatterns();
-	ImList<IPath> getExclusionPatterns();
+	@Nullable ImList<IPath> getInclusionPatterns();
+	@Nullable ImList<IPath> getExclusionPatterns();
 	
-	Object getSourceAttachmentPath();
+	@Nullable Object getSourceAttachmentPath();
 	
-	IPath getOutputPath();
+	@Nullable IPath getOutputPath();
 	
 	boolean isExported();
 	
-	ImList<IBuildpathAttribute> getExtraAttributes();
+	ImList<BuildpathAttribute> getExtraAttributes();
 	
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathElementType.java b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathElementType.java
similarity index 84%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathElementType.java
rename to ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathElementType.java
index aef5800..a0a66ac 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathElementType.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathElementType.java
@@ -12,11 +12,14 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.core;
+package org.eclipse.statet.ltk.buildpath.core;
 
 import org.eclipse.statet.jcommons.collections.ImList;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 
+@NonNullByDefault
 public class BuildpathElementType {
 	
 	
@@ -58,12 +61,12 @@
 	}
 	
 	@Override
-	public boolean equals(final Object obj) {
+	public boolean equals(final @Nullable Object obj) {
 		if (this == obj) {
 			return true;
 		}
 		if (obj instanceof BuildpathElementType) {
-			final BuildpathElementType other= (BuildpathElementType) obj;
+			final BuildpathElementType other= (BuildpathElementType)obj;
 			return (this.name == other.name);
 		}
 		return false;
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathInitializer.java b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathInitializer.java
similarity index 91%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathInitializer.java
rename to ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathInitializer.java
index 3a4f213..1a656f5 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathInitializer.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathInitializer.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.core;
+package org.eclipse.statet.ltk.buildpath.core;
 
 import java.util.HashSet;
 import java.util.List;
@@ -29,7 +29,7 @@
 
 import org.eclipse.statet.jcommons.collections.ImList;
 
-import org.eclipse.statet.internal.ltk.buildpaths.core.Messages;
+import org.eclipse.statet.internal.ltk.buildpath.core.Messages;
 
 
 public abstract class BuildpathInitializer {
@@ -58,7 +58,7 @@
 	public static final int NAME_COLLISION= 977;
 	
 	
-	private static final IStatus VERIFIED_OK= new Status(IStatus.OK, LTKBuildpathsCore.BUNDLE_ID, 0, "OK", null); //$NON-NLS-1$
+	private static final IStatus VERIFIED_OK= new Status(IStatus.OK, LtkBuildpaths.BUNDLE_ID, 0, "OK", null); //$NON-NLS-1$
 	
 	
 	public boolean canUpdateContainer(final IPath path, final IProject project) {
@@ -119,7 +119,7 @@
 	 *     the given buildpath and output location are compatible, otherwise a status
 	 *     object indicating what is wrong with the buildpath or output location
 	 */
-	public IStatus validateBuildpath(final IProject project, final List<IBuildpathElement> rawBuildpath) {
+	public IStatus validateBuildpath(final IProject project, final List<BuildpathElement> rawBuildpath) {
 		// tolerate null path, it will be reset to default
 		if (rawBuildpath == null) {
 			return VERIFIED_OK;
@@ -127,7 +127,7 @@
 		
 		// check duplicate entries on raw buildpath only
 		{	final Set<IPath> pathes= new HashSet<>(rawBuildpath.size());
-			for (final IBuildpathElement element : rawBuildpath) {
+			for (final BuildpathElement element : rawBuildpath) {
 				final IPath path= element.getPath();
 				if (!pathes.add(path)){
 					return createErrorStatus(NAME_COLLISION, NLS.bind(
@@ -137,7 +137,7 @@
 			}
 		}
 		
-		for (final IBuildpathElement element : rawBuildpath) {
+		for (final BuildpathElement element : rawBuildpath) {
 			final IStatus status= validateBuildpathEntry(project, element);
 			if (status.getSeverity() == IStatus.ERROR) {
 				return status;
@@ -147,14 +147,14 @@
 		return VERIFIED_OK;
 	}
 	
-	protected IStatus validateBuildpathEntry(final IProject project, final IBuildpathElement entry) {
+	protected IStatus validateBuildpathEntry(final IProject project, final BuildpathElement entry) {
 		final IPath path= entry.getPath();
 		
 		// Build some common strings for status message
 		final String projectName= project.getName();
 		
 		switch (entry.getTypeName()) {
-		case IBuildpathElement.SOURCE:
+		case BuildpathElement.SOURCE:
 			if (!path.isAbsolute() || path.isEmpty()) {
 				return createErrorStatus(INVALID_BUILDPATH, NLS.bind(
 								Messages.BuildpathStatus_Entry_IllegalSourceFolderPath_message,
@@ -171,11 +171,11 @@
 		}
 		
 		// Validate extra attributes
-		final ImList<IBuildpathAttribute> extraAttributes= entry.getExtraAttributes();
+		final ImList<BuildpathAttribute> extraAttributes= entry.getExtraAttributes();
 		if (extraAttributes != null) {
 			final int length= extraAttributes.size();
 			final Set<String> set= new HashSet<>(length);
-			for (final IBuildpathAttribute attribute : extraAttributes) {
+			for (final BuildpathAttribute attribute : extraAttributes) {
 				if (!set.add(attribute.getName())) {
 					return createErrorStatus(NAME_COLLISION, NLS.bind(
 							Messages.BuildpathStatus_Entry_DuplicateExtraAttribute_message, new String[] {
@@ -191,7 +191,7 @@
 	}
 	
 	protected IStatus createErrorStatus(final int code, final String message) {
-		return new Status(IStatus.ERROR, LTKBuildpathsCore.BUNDLE_ID, code, message, null);
+		return new Status(IStatus.ERROR, LtkBuildpaths.BUNDLE_ID, code, message, null);
 	}
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathsUtils.java b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathUtils.java
similarity index 90%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathsUtils.java
rename to ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathUtils.java
index 8a9656e..b3a19a3 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/BuildpathsUtils.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/BuildpathUtils.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.core;
+package org.eclipse.statet.ltk.buildpath.core;
 
 import java.util.Iterator;
 import java.util.List;
@@ -23,18 +23,23 @@
 
 import org.eclipse.statet.jcommons.collections.ImCollections;
 import org.eclipse.statet.jcommons.collections.ImList;
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 
-public class BuildpathsUtils {
+@NonNullByDefault
+public class BuildpathUtils {
 	
 	
-	public static final boolean equalPattern(final IPath pattern1, final IPath pattern2) {
+	@SuppressWarnings("null")
+	public static final boolean equalPattern(final @Nullable IPath pattern1, final @Nullable IPath pattern2) {
 		return (pattern1 == pattern2)
 				|| (pattern1 != null && pattern1.equals(pattern2)
 						&& pattern1.hasTrailingSeparator() == pattern2.hasTrailingSeparator() );
 	}
 	
-	public static boolean equalPatterns(final List<IPath> patterns1, final List<IPath> patterns2) {
+	public static boolean equalPatterns(final @Nullable List<IPath> patterns1, final @Nullable List<IPath> patterns2) {
 		if (patterns1 == patterns2) {
 			return true;
 		}
@@ -53,13 +58,13 @@
 	}
 	
 	
-	public static ImList<IPath> decodePatterns(final String sequence) {
+	public static @Nullable ImList<IPath> decodePatterns(final @Nullable String sequence) {
 		if (sequence != null) {
 			if (sequence.isEmpty()) {
 				return ImCollections.emptyList();
 			}
 			final String[] patterns= sequence.split("\\|");
-			final IPath[] paths= new IPath[patterns.length];
+			final IPath[] paths= new @NonNull IPath[patterns.length];
 			int index= 0;
 			for (int j= 0; j < patterns.length; j++) {
 				final String pattern= patterns[j];
@@ -73,7 +78,7 @@
 		return null;
 	}
 	
-	public static String encodePatterns(final ImList<IPath> patterns) {
+	public static @Nullable String encodePatterns(final @Nullable ImList<IPath> patterns) {
 		if (patterns != null) {
 			if (patterns.isEmpty()) {
 				return ""; //$NON-NLS-1$
@@ -95,23 +100,23 @@
 	
 	
 	public final static boolean isExcluded(final IResource resource,
-			final IBuildpathElement element) {
+			final BuildpathElement element) {
 		final IPath path= resource.getFullPath();
 		final int resourceType= resource.getType();
-		final ImList<String> inclusionPatterns= ((BuildpathElement) element).getFullInclusionPatterns();
-		final ImList<String> exclusionPatterns= ((BuildpathElement) element).getFullExclusionPatterns();
+		final ImList<String> inclusionPatterns= ((BasicBuildpathElement)element).getFullInclusionPatterns();
+		final ImList<String> exclusionPatterns= ((BasicBuildpathElement)element).getFullExclusionPatterns();
 		return isExcluded(path.toString(), (resourceType == IResource.FOLDER || resourceType == IResource.PROJECT),
 				inclusionPatterns, exclusionPatterns );
 	}
 	
 	public final static boolean isExcluded(String path, final boolean isFolderPath,
-			final ImList<String> inclusionPatterns, final ImList<String> exclusionPatterns) {
+			final @Nullable ImList<String> inclusionPatterns, final @Nullable ImList<String> exclusionPatterns) {
 		if (inclusionPatterns == null && exclusionPatterns == null) {
 			return false;
 		}
 		
 		CHECK_INCLUSION: if (inclusionPatterns != null) {
-			for (final String pattern : exclusionPatterns) {
+			for (final String pattern : inclusionPatterns) {
 				String folderPattern= pattern;
 				if (isFolderPath) {
 					final int lastSlash= pattern.lastIndexOf('/');
@@ -161,7 +166,7 @@
 	 * @param pathSeparator the given path separator
 	 * @return true if the pattern matches the filepath using the pathSepatator, false otherwise
 	 */
-	public static final boolean matchPath(final String pattern, final String filepath,
+	public static final boolean matchPath(final @Nullable String pattern, final @Nullable String filepath,
 		final boolean isCaseSensitive, final char pathSeparator) {
 		if (filepath == null) {
 			return false; // null name cannot match
@@ -381,9 +386,9 @@
 	 * @return true if a sub-pattern matches the subpart of the given name, false otherwise
 	 */
 	public static final boolean match(
-			final String pattern,
+			final @Nullable String pattern,
 			final int patternStart, int patternEnd,
-			final String name, final int nameStart, int nameEnd,
+			final @Nullable String name, final int nameStart, int nameEnd,
 			final boolean isCaseSensitive) {
 		if (name == null) {
 			return false; // null name cannot match
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/LTKBuildpathsCore.java b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/LtkBuildpaths.java
similarity index 79%
rename from ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/LTKBuildpathsCore.java
rename to ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/LtkBuildpaths.java
index d4748e4..d5f53c4 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.core/src/org/eclipse/statet/ltk/buildpaths/core/LTKBuildpathsCore.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.core/src/org/eclipse/statet/ltk/buildpath/core/LtkBuildpaths.java
@@ -12,13 +12,16 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.core;
+package org.eclipse.statet.ltk.buildpath.core;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
 
-public class LTKBuildpathsCore {
+@NonNullByDefault
+public class LtkBuildpaths {
 	
 	
-	public static final String BUNDLE_ID= "org.eclipse.statet.ltk.buildpaths.core"; //$NON-NLS-1$
+	public static final String BUNDLE_ID= "org.eclipse.statet.ltk.buildpath.core"; //$NON-NLS-1$
 	
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/.classpath b/ltk/org.eclipse.statet.ltk.buildpath.ui/.classpath
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/.classpath
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/.classpath
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/.gitignore b/ltk/org.eclipse.statet.ltk.buildpath.ui/.gitignore
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/.gitignore
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/.gitignore
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/.project b/ltk/org.eclipse.statet.ltk.buildpath.ui/.project
similarity index 92%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/.project
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/.project
index 7bb934b..fdfa196 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/.project
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.statet.ltk.buildpaths.ui</name>
+	<name>org.eclipse.statet.ltk.buildpath.ui</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/.settings/org.eclipse.core.resources.prefs b/ltk/org.eclipse.statet.ltk.buildpath.ui/.settings/org.eclipse.core.resources.prefs
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/.settings/org.eclipse.core.resources.prefs
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/.settings/org.eclipse.core.resources.prefs
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/.settings/org.eclipse.core.runtime.prefs b/ltk/org.eclipse.statet.ltk.buildpath.ui/.settings/org.eclipse.core.runtime.prefs
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/.settings/org.eclipse.core.runtime.prefs
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/.settings/org.eclipse.core.runtime.prefs
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/.settings/org.eclipse.jdt.core.prefs b/ltk/org.eclipse.statet.ltk.buildpath.ui/.settings/org.eclipse.jdt.core.prefs
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/.settings/org.eclipse.jdt.core.prefs
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/.settings/org.eclipse.jdt.core.prefs
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/.settings/org.eclipse.jdt.ui.prefs b/ltk/org.eclipse.statet.ltk.buildpath.ui/.settings/org.eclipse.jdt.ui.prefs
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/.settings/org.eclipse.jdt.ui.prefs
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/.settings/org.eclipse.jdt.ui.prefs
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/META-INF/MANIFEST.MF b/ltk/org.eclipse.statet.ltk.buildpath.ui/META-INF/MANIFEST.MF
similarity index 65%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/META-INF/MANIFEST.MF
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/META-INF/MANIFEST.MF
index 392dfac..bf2c7a3 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/META-INF/MANIFEST.MF
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/META-INF/MANIFEST.MF
@@ -1,11 +1,11 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
-Bundle-SymbolicName: org.eclipse.statet.ltk.buildpaths.ui;singleton:=true
+Bundle-SymbolicName: org.eclipse.statet.ltk.buildpath.ui;singleton:=true
 Bundle-Version: 4.2.0.qualifier
 Bundle-Vendor: Eclipse StatET
 Bundle-Name: StatET LTK - Buildpath - UI  (Incubation)
 Bundle-ActivationPolicy: lazy
-Bundle-Activator: org.eclipse.statet.internal.ltk.buildpaths.ui.BuildpathsUIPlugin
+Bundle-Activator: org.eclipse.statet.internal.ltk.buildpath.ui.BuildpathsUIPlugin
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Require-Bundle: org.eclipse.statet.ecommons.runtime.core;bundle-version="[4.2.0,4.3.0)",
  org.eclipse.statet.ecommons.databinding.core;bundle-version="[4.2.0,4.3.0)",
@@ -13,8 +13,8 @@
  org.eclipse.ui,
  org.eclipse.jface.databinding,
  org.eclipse.ui.ide,
- org.eclipse.statet.ltk.buildpaths.core;bundle-version="[4.2.0,4.3.0)";visibility:=reexport,
+ org.eclipse.statet.ltk.buildpath.core;bundle-version="[4.2.0,4.3.0)";visibility:=reexport,
  org.eclipse.statet.ecommons.uimisc;bundle-version="[4.2.0,4.3.0)"
 Import-Package: org.eclipse.statet.jcommons.collections;version="4.2.0"
-Export-Package: org.eclipse.statet.ltk.buildpaths.ui,
- org.eclipse.statet.ltk.buildpaths.ui.wizards
+Export-Package: org.eclipse.statet.ltk.buildpath.ui,
+ org.eclipse.statet.ltk.buildpath.ui.wizards
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/about.html b/ltk/org.eclipse.statet.ltk.buildpath.ui/about.html
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/about.html
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/about.html
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/build.properties b/ltk/org.eclipse.statet.ltk.buildpath.ui/build.properties
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/build.properties
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/build.properties
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/icons/obj_16/exclusion_filter.png b/ltk/org.eclipse.statet.ltk.buildpath.ui/icons/obj_16/exclusion_filter.png
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/icons/obj_16/exclusion_filter.png
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/icons/obj_16/exclusion_filter.png
Binary files differ
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/icons/obj_16/inclusion_filter.png b/ltk/org.eclipse.statet.ltk.buildpath.ui/icons/obj_16/inclusion_filter.png
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/icons/obj_16/inclusion_filter.png
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/icons/obj_16/inclusion_filter.png
Binary files differ
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/icons/obj_16/output_folder.png b/ltk/org.eclipse.statet.ltk.buildpath.ui/icons/obj_16/output_folder.png
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/icons/obj_16/output_folder.png
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/icons/obj_16/output_folder.png
Binary files differ
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/icons/obj_16/source_attachment.png b/ltk/org.eclipse.statet.ltk.buildpath.ui/icons/obj_16/source_attachment.png
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/icons/obj_16/source_attachment.png
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/icons/obj_16/source_attachment.png
Binary files differ
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/icons/ovr_16/ignore_optional_problems.png b/ltk/org.eclipse.statet.ltk.buildpath.ui/icons/ovr_16/ignore_optional_problems.png
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/icons/ovr_16/ignore_optional_problems.png
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/icons/ovr_16/ignore_optional_problems.png
Binary files differ
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/plugin.xml b/ltk/org.eclipse.statet.ltk.buildpath.ui/plugin.xml
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/plugin.xml
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/plugin.xml
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/BuildpathElementImageDescriptor.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathElementImageDescriptor.java
similarity index 97%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/BuildpathElementImageDescriptor.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathElementImageDescriptor.java
index f095c7e..4bac4e5 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/BuildpathElementImageDescriptor.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathElementImageDescriptor.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.internal.ltk.buildpaths.ui;
+package org.eclipse.statet.internal.ltk.buildpath.ui;
 
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
@@ -24,7 +24,7 @@
 
 import org.eclipse.statet.ecommons.ui.SharedUIResources;
 
-import org.eclipse.statet.ltk.buildpaths.ui.BuildpathsUIResources;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathsUIResources;
 
 
 public class BuildpathElementImageDescriptor extends CompositeImageDescriptor {
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/BuildpathsUIPlugin.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathsUIPlugin.java
similarity index 95%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/BuildpathsUIPlugin.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathsUIPlugin.java
index da55823..d4eeae5 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/BuildpathsUIPlugin.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathsUIPlugin.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.internal.ltk.buildpaths.ui;
+package org.eclipse.statet.internal.ltk.buildpath.ui;
 
 import org.osgi.framework.BundleContext;
 
@@ -24,13 +24,13 @@
 import org.eclipse.statet.ecommons.ui.util.ImageDescriptorRegistry;
 import org.eclipse.statet.ecommons.ui.util.ImageRegistryUtil;
 
-import org.eclipse.statet.ltk.buildpaths.ui.BuildpathsUIResources;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathsUIResources;
 
 
 public class BuildpathsUIPlugin extends AbstractUIPlugin {
 	
 	
-	public static final String BUNDLE_ID= "org.eclipse.statet.ltk.buildpaths.ui"; //$NON-NLS-1$
+	public static final String BUNDLE_ID= "org.eclipse.statet.ltk.buildpath.ui"; //$NON-NLS-1$
 	
 	
 	public static final String OVR_IGNORE_OPTIONAL_PROBLEMS_IMAGE_ID= BUNDLE_ID + "/image/ovr/ignore_optional_problems"; //$NON-NLS-1$
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/BuildpathsUIUtils.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathsUIUtils.java
similarity index 77%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/BuildpathsUIUtils.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathsUIUtils.java
index 92f19e6..aac6de5 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/BuildpathsUIUtils.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathsUIUtils.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.internal.ltk.buildpaths.ui;
+package org.eclipse.statet.internal.ltk.buildpath.ui;
 
 import java.util.Iterator;
 import java.util.List;
@@ -20,8 +20,8 @@
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IPath;
 
-import org.eclipse.statet.ltk.buildpaths.core.IBuildpathElement;
-import org.eclipse.statet.ltk.buildpaths.ui.BuildpathListElement;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathElement;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathListElement;
 
 
 public class BuildpathsUIUtils {
@@ -31,8 +31,8 @@
 			final IProject project) {
 		final IPath projectPath= project.getProject().getFullPath();
 		for (final BuildpathListElement listElement : listElements) {
-			final IBuildpathElement element= listElement.getCoreElement();
-			if (element.getTypeName() == IBuildpathElement.SOURCE) {
+			final BuildpathElement element= listElement.getCoreElement();
+			if (element.getTypeName() == BuildpathElement.SOURCE) {
 				if (projectPath.equals(element.getPath())) {
 					return true;
 				}
@@ -57,10 +57,10 @@
 		}
 		
 		switch (element.getType().getName()) {
-		case IBuildpathElement.SOURCE:
+		case BuildpathElement.SOURCE:
 			list.add(0, element);
 			break;
-		case IBuildpathElement.PROJECT:
+		case BuildpathElement.PROJECT:
 		default:
 			list.add(element);
 			break;
@@ -68,8 +68,8 @@
 	}
 	
 	
-	public static IBuildpathElement[] convertToCoreElements(final List<BuildpathListElement> listElements) {
-		final IBuildpathElement[] result= new IBuildpathElement[listElements.size()];
+	public static BuildpathElement[] convertToCoreElements(final List<BuildpathListElement> listElements) {
+		final BuildpathElement[] result= new BuildpathElement[listElements.size()];
 		int i= 0;
 		for (final Iterator<BuildpathListElement> iter= listElements.iterator(); iter.hasNext();) {
 			final BuildpathListElement cur= iter.next();
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/ExclusionInclusionComponent.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/ExclusionInclusionComponent.java
similarity index 92%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/ExclusionInclusionComponent.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/ExclusionInclusionComponent.java
index 842444f..62b0f19 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/ExclusionInclusionComponent.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/ExclusionInclusionComponent.java
@@ -13,7 +13,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.internal.ltk.buildpaths.ui;
+package org.eclipse.statet.internal.ltk.buildpath.ui;
 
 import java.util.List;
 
@@ -53,10 +53,10 @@
 import org.eclipse.statet.ecommons.ui.util.MessageUtils;
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
-import org.eclipse.statet.ltk.buildpaths.core.IBuildpathAttribute;
-import org.eclipse.statet.ltk.buildpaths.ui.BuildpathListElement;
-import org.eclipse.statet.ltk.buildpaths.ui.BuildpathsUIDescription;
-import org.eclipse.statet.ltk.buildpaths.ui.BuildpathsUIResources;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathAttribute;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathListElement;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathsUIDescription;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathsUIResources;
 
 
 public class ExclusionInclusionComponent implements ButtonGroup.IActions<IPath> {
@@ -106,8 +106,8 @@
 	private final IProject project;
 	private IContainer sourceFolder;
 	
-	private final Type inclusionPatterns= new Type(IBuildpathAttribute.FILTER_INCLUSIONS);
-	private final Type exclusionPatterns= new Type(IBuildpathAttribute.FILTER_EXCLUSIONS);
+	private final Type inclusionPatterns= new Type(BuildpathAttribute.FILTER_INCLUSIONS);
+	private final Type exclusionPatterns= new Type(BuildpathAttribute.FILTER_EXCLUSIONS);
 	
 	private final BuildpathsUIDescription uiDescription;
 	
@@ -131,9 +131,9 @@
 	
 	private Type getType(final String key) {
 		switch (key) {
-		case IBuildpathAttribute.FILTER_INCLUSIONS:
+		case BuildpathAttribute.FILTER_INCLUSIONS:
 			return this.inclusionPatterns;
-		case IBuildpathAttribute.FILTER_EXCLUSIONS:
+		case BuildpathAttribute.FILTER_EXCLUSIONS:
 			return this.exclusionPatterns;
 		default:
 			throw new IllegalArgumentException(key);
@@ -260,11 +260,11 @@
 		final String title;
 		final String message;
 		switch (type.attributeName) {
-		case IBuildpathAttribute.FILTER_INCLUSIONS:
+		case BuildpathAttribute.FILTER_INCLUSIONS:
 			title= Messages.ExclusionInclusion_Choose_Include_title;
 			message= Messages.ExclusionInclusion_Choose_Include_Multi_description;
 			break;
-		case IBuildpathAttribute.FILTER_EXCLUSIONS:
+		case BuildpathAttribute.FILTER_EXCLUSIONS:
 			title= Messages.ExclusionInclusion_Choose_Exclude_title;
 			message= Messages.ExclusionInclusion_Choose_Exclude_Multi_description;
 			break;
@@ -295,7 +295,7 @@
 	
 	public void setFocus(String attributeName) {
 		if (attributeName == null) {
-			attributeName= IBuildpathAttribute.FILTER_INCLUSIONS;
+			attributeName= BuildpathAttribute.FILTER_INCLUSIONS;
 		}
 		final Type entry= getType(attributeName);
 		if (UIAccess.isOkToUse(entry.listControl)) {
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/ExclusionInclusionEntryDialog.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/ExclusionInclusionEntryDialog.java
similarity index 94%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/ExclusionInclusionEntryDialog.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/ExclusionInclusionEntryDialog.java
index 63cc697..9d63bc9 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/ExclusionInclusionEntryDialog.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/ExclusionInclusionEntryDialog.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.internal.ltk.buildpaths.ui;
+package org.eclipse.statet.internal.ltk.buildpath.ui;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -52,9 +52,9 @@
 import org.eclipse.statet.ecommons.ui.viewers.TypedViewerFilter;
 import org.eclipse.statet.ecommons.ui.workbench.workspace.AbstractResourceSelectionDialog;
 
-import org.eclipse.statet.ltk.buildpaths.core.IBuildpathAttribute;
-import org.eclipse.statet.ltk.buildpaths.ui.BuildpathListElement;
-import org.eclipse.statet.ltk.buildpaths.ui.BuildpathsUIDescription;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathAttribute;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathListElement;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathsUIDescription;
 
 
 public class ExclusionInclusionEntryDialog extends ExtStatusDialog {
@@ -140,12 +140,12 @@
 		
 		final String title;
 		switch (attributeKey) {
-		case IBuildpathAttribute.FILTER_INCLUSIONS:
+		case BuildpathAttribute.FILTER_INCLUSIONS:
 			title= (patternToEdit == null) ?
 					Messages.ExclusionInclusion_EntryDialog_Include_Add_title :
 					Messages.ExclusionInclusion_EntryDialog_Include_Edit_title;
 			break;
-		case IBuildpathAttribute.FILTER_EXCLUSIONS:
+		case BuildpathAttribute.FILTER_EXCLUSIONS:
 			title= (patternToEdit == null) ?
 					Messages.ExclusionInclusion_EntryDialog_Exclude_Add_title :
 					Messages.ExclusionInclusion_EntryDialog_Exclude_Edit_title;
@@ -174,13 +174,13 @@
 		
 		final String descriptionText, labelText;
 		switch (this.attributeKey) {
-		case IBuildpathAttribute.FILTER_INCLUSIONS:
+		case BuildpathAttribute.FILTER_INCLUSIONS:
 			descriptionText= NLS.bind(Messages.ExclusionInclusion_EntryDialog_Exclude_description,
 					this.uiDescription.getDefaultExt(this.element) );
 			labelText= NLS.bind(Messages.ExclusionInclusion_EntryDialog_Exclude_Pattern_label,
 					MessageUtils.processPath(this.element.getPath().toString()) );
 			break;
-		case IBuildpathAttribute.FILTER_EXCLUSIONS:
+		case BuildpathAttribute.FILTER_EXCLUSIONS:
 			descriptionText= NLS.bind(Messages.ExclusionInclusion_EntryDialog_Include_description,
 					this.uiDescription.getDefaultExt(this.element) );
 			labelText= NLS.bind(Messages.ExclusionInclusion_EntryDialog_Include_Pattern_label,
@@ -237,11 +237,11 @@
 	private IPath doBrowsePattern() {
 		final String title, message;
 		switch (this.attributeKey) {
-		case IBuildpathAttribute.FILTER_INCLUSIONS:
+		case BuildpathAttribute.FILTER_INCLUSIONS:
 			title= Messages.ExclusionInclusion_Choose_Include_title;
 			message= Messages.ExclusionInclusion_Choose_Include_Single_description;
 			break;
-		case IBuildpathAttribute.FILTER_EXCLUSIONS:
+		case BuildpathAttribute.FILTER_EXCLUSIONS:
 			title= Messages.ExclusionInclusion_Choose_Exclude_title;
 			message= Messages.ExclusionInclusion_Choose_Exclude_Single_description;
 			break;
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/Messages.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/Messages.java
similarity index 98%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/Messages.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/Messages.java
index 8f449a8..6af83ce 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/Messages.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/Messages.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.internal.ltk.buildpaths.ui;
+package org.eclipse.statet.internal.ltk.buildpath.ui;
 
 import org.eclipse.osgi.util.NLS;
 
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/Messages.properties b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/Messages.properties
similarity index 100%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/internal/ltk/buildpaths/ui/Messages.properties
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/Messages.properties
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathListElement.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListElement.java
similarity index 82%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathListElement.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListElement.java
index 558967c..bf711cd 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathListElement.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListElement.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.ui;
+package org.eclipse.statet.ltk.buildpath.ui;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -31,11 +31,11 @@
 import org.eclipse.statet.jcommons.collections.ImCollections;
 import org.eclipse.statet.jcommons.collections.ImList;
 
-import org.eclipse.statet.ltk.buildpaths.core.BuildpathElement;
-import org.eclipse.statet.ltk.buildpaths.core.BuildpathElementType;
-import org.eclipse.statet.ltk.buildpaths.core.BuildpathInitializer;
-import org.eclipse.statet.ltk.buildpaths.core.IBuildpathAttribute;
-import org.eclipse.statet.ltk.buildpaths.core.IBuildpathElement;
+import org.eclipse.statet.ltk.buildpath.core.BasicBuildpathElement;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathAttribute;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathElement;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathElementType;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathInitializer;
 
 
 public class BuildpathListElement {
@@ -57,7 +57,7 @@
 	private IPath linkTarget;
 	private final IPath orginalLinkTarget;
 	
-	private IBuildpathElement cachedElement;
+	private BuildpathElement cachedElement;
 	
 	
 	public BuildpathListElement(final Object parent, final IProject project, final BuildpathElementType type,
@@ -81,7 +81,7 @@
 	}
 	
 	public BuildpathListElement(final IProject project, final Object parent,
-			final IBuildpathElement element, final boolean newElement) {
+			final BuildpathElement element, final boolean newElement) {
 		this.type= element.getType();
 		
 		this.parent= parent;
@@ -100,7 +100,7 @@
 			
 			
 			switch (element.getType().getName()) {
-			case IBuildpathElement.SOURCE:
+			case BuildpathElement.SOURCE:
 				path= path.removeTrailingSeparator();
 				resource= root.findMember(path);
 				if (resource == null) {
@@ -113,7 +113,7 @@
 					linkTarget= resource.getLocation();
 				}
 				break;
-			case IBuildpathElement.PROJECT:
+			case BuildpathElement.PROJECT:
 				resource= root.findMember(path);
 				this.isMissing= (resource == null);
 				break;
@@ -130,13 +130,13 @@
 		}
 		
 		initBuiltinAttributes();
-		setAttribute(IBuildpathAttribute.FILTER_INCLUSIONS, element.getInclusionPatterns());
-		setAttribute(IBuildpathAttribute.FILTER_EXCLUSIONS, element.getExclusionPatterns());
-		setAttribute(IBuildpathAttribute.SOURCE_ATTACHMENT, element.getSourceAttachmentPath());
-		setAttribute(IBuildpathAttribute.OUTPUT, element.getOutputPath());
+		setAttribute(BuildpathAttribute.FILTER_INCLUSIONS, element.getInclusionPatterns());
+		setAttribute(BuildpathAttribute.FILTER_EXCLUSIONS, element.getExclusionPatterns());
+		setAttribute(BuildpathAttribute.SOURCE_ATTACHMENT, element.getSourceAttachmentPath());
+		setAttribute(BuildpathAttribute.OUTPUT, element.getOutputPath());
 		
-		final ImList<IBuildpathAttribute> extraAttributes= element.getExtraAttributes();
-		for (final IBuildpathAttribute attribute : extraAttributes) {
+		final ImList<BuildpathAttribute> extraAttributes= element.getExtraAttributes();
+		for (final BuildpathAttribute attribute : extraAttributes) {
 			if (setAttribute(attribute.getName(), attribute.getValue()) == null) {
 				addExtraAttribute(attribute.getName(), attribute.getValue());
 			}
@@ -147,7 +147,7 @@
 	/**
 	 * Gets the class path entry kind.
 	 * @return the entry kind
-	 * @see IBuildpathElement#getType()
+	 * @see BuildpathElement#getType()
 	 */
 	public BuildpathElementType getType() {
 		return this.type;
@@ -173,7 +173,7 @@
 	/**
 	 * Gets the class path entry path.
 	 * @return returns the path
-	 * @see IBuildpathElement#getPath()
+	 * @see BuildpathElement#getPath()
 	 */
 	public IPath getPath() {
 		return this.path;
@@ -203,24 +203,24 @@
 	}
 	
 	
-	public IBuildpathElement getCoreElement() {
+	public BuildpathElement getCoreElement() {
 		if (this.cachedElement == null) {
 			this.cachedElement= newCoreElement();
 		}
 		return this.cachedElement;
 	}
 	
-	private IBuildpathElement newCoreElement() {
-		return new BuildpathElement(this.type, this.path,
-				(this.type.isAttributeBuiltin(IBuildpathAttribute.FILTER_INCLUSIONS)) ?
-						(ImList<IPath>) getAttributeValue(IBuildpathAttribute.FILTER_INCLUSIONS) : null,
-				(this.type.isAttributeBuiltin(IBuildpathAttribute.FILTER_EXCLUSIONS)) ?
-						(ImList<IPath>) getAttributeValue(IBuildpathAttribute.FILTER_EXCLUSIONS) : null,
-				(this.type.isAttributeBuiltin(IBuildpathAttribute.SOURCE_ATTACHMENT)) ?
-						(IPath) getAttributeValue(IBuildpathAttribute.SOURCE_ATTACHMENT) : null,
+	private BuildpathElement newCoreElement() {
+		return new BasicBuildpathElement(this.type, this.path,
+				(this.type.isAttributeBuiltin(BuildpathAttribute.FILTER_INCLUSIONS)) ?
+						(ImList<IPath>) getAttributeValue(BuildpathAttribute.FILTER_INCLUSIONS) : null,
+				(this.type.isAttributeBuiltin(BuildpathAttribute.FILTER_EXCLUSIONS)) ?
+						(ImList<IPath>) getAttributeValue(BuildpathAttribute.FILTER_EXCLUSIONS) : null,
+				(this.type.isAttributeBuiltin(BuildpathAttribute.SOURCE_ATTACHMENT)) ?
+						(IPath) getAttributeValue(BuildpathAttribute.SOURCE_ATTACHMENT) : null,
 				null,
-				(this.type.isAttributeBuiltin(IBuildpathAttribute.OUTPUT)) ?
-						(IPath) getAttributeValue(IBuildpathAttribute.OUTPUT) : null,
+				(this.type.isAttributeBuiltin(BuildpathAttribute.OUTPUT)) ?
+						(IPath) getAttributeValue(BuildpathAttribute.OUTPUT) : null,
 				null,
 				false,
 				ImCollections.toList(getExtraAttributes()) );
@@ -234,11 +234,11 @@
 	private void initBuiltinAttributes() {
 		for (final String attributeKey : this.type.getAttributeBuiltinKeys()) {
 			switch (attributeKey) {
-			case IBuildpathAttribute.FILTER_INCLUSIONS:
-			case IBuildpathAttribute.FILTER_EXCLUSIONS:
+			case BuildpathAttribute.FILTER_INCLUSIONS:
+			case BuildpathAttribute.FILTER_EXCLUSIONS:
 				createAttribute(attributeKey, ImCollections.emptyList(), true);
 				continue;
-			case IBuildpathAttribute.OUTPUT:
+			case BuildpathAttribute.OUTPUT:
 				createAttribute(attributeKey, null, true);
 				continue;
 			default:
@@ -247,8 +247,8 @@
 		}
 	}
 	
-	private List<IBuildpathAttribute> getExtraAttributes() {
-		final ArrayList<IBuildpathAttribute> list= new ArrayList<>(Math.min(this.children.size(), 8));
+	private List<BuildpathAttribute> getExtraAttributes() {
+		final ArrayList<BuildpathAttribute> list= new ArrayList<>(Math.min(this.children.size(), 8));
 		for (final Object child : this.children) {
 			if (child instanceof BuildpathListElementAttribute) {
 				final BuildpathListElementAttribute attribute= (BuildpathListElementAttribute) child;
@@ -270,7 +270,7 @@
 				return true;
 			}
 			if (!attribute.isBuiltin()) {
-//				return !BuildpathsUtils.getDefault().getClasspathAttributeConfigurationDescriptors().containsKey(key);
+//				return !BuildpathUtils.getDefault().getClasspathAttributeConfigurationDescriptors().containsKey(key);
 			}
 		}
 		return false;
@@ -335,8 +335,8 @@
 		}
 		
 		switch(name) {
-		case IBuildpathAttribute.FILTER_INCLUSIONS:
-		case IBuildpathAttribute.FILTER_EXCLUSIONS:
+		case BuildpathAttribute.FILTER_INCLUSIONS:
+		case BuildpathAttribute.FILTER_EXCLUSIONS:
 			if (!(value instanceof ImList<?>)) {
 				throw new IllegalArgumentException();
 			}
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathListElementAttribute.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListElementAttribute.java
similarity index 86%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathListElementAttribute.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListElementAttribute.java
index 7de235a..12a9698 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathListElementAttribute.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListElementAttribute.java
@@ -12,12 +12,12 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.ui;
+package org.eclipse.statet.ltk.buildpath.ui;
 
 import org.eclipse.core.runtime.IStatus;
 
-import org.eclipse.statet.ltk.buildpaths.core.BuildpathAttribute;
-import org.eclipse.statet.ltk.buildpaths.core.IBuildpathAttribute;
+import org.eclipse.statet.ltk.buildpath.core.BasicBuildpathAttribute;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathAttribute;
 
 
 public class BuildpathListElementAttribute {
@@ -81,8 +81,8 @@
 		return this.status;
 	}
 	
-	public IBuildpathAttribute getCoreAttribute() {
-		return new BuildpathAttribute(this.name, (this.value != null) ? this.value.toString() : null);
+	public BuildpathAttribute getCoreAttribute() {
+		return new BasicBuildpathAttribute(this.name, (this.value != null) ? this.value.toString() : null);
 	}
 	
 	
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathListElementComparator.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListElementComparator.java
similarity index 89%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathListElementComparator.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListElementComparator.java
index 68ab6e4..9a72a32 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathListElementComparator.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListElementComparator.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.ui;
+package org.eclipse.statet.ltk.buildpath.ui;
 
 import org.eclipse.jface.viewers.ContentViewer;
 import org.eclipse.jface.viewers.IBaseLabelProvider;
@@ -20,7 +20,7 @@
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerComparator;
 
-import org.eclipse.statet.ltk.buildpaths.core.IBuildpathElement;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathElement;
 
 
 public class BuildpathListElementComparator extends ViewerComparator {
@@ -59,16 +59,16 @@
 	
 	protected int getCategory(final BuildpathListElement element) {
 		final String typeName= element.getType().getName();
-		if (typeName == IBuildpathElement.SOURCE) {
+		if (typeName == BuildpathElement.SOURCE) {
 			return SOURCE;
 		}
-		else if (typeName == IBuildpathElement.PROJECT) {
+		else if (typeName == BuildpathElement.PROJECT) {
 			return PROJECT;
 		}
-		else if (typeName == IBuildpathElement.LIBRARY) {
+		else if (typeName == BuildpathElement.LIBRARY) {
 			return LIBRARY;
 		}
-		else if (typeName == IBuildpathElement.VARIABLE) {
+		else if (typeName == BuildpathElement.VARIABLE) {
 			return VARIABLE;
 		}
 		else {
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathListLabelProvider.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListLabelProvider.java
similarity index 88%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathListLabelProvider.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListLabelProvider.java
index 05643c6..e077bf3 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathListLabelProvider.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListLabelProvider.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.ui;
+package org.eclipse.statet.ltk.buildpath.ui;
 
 import java.util.List;
 
@@ -30,12 +30,12 @@
 import org.eclipse.statet.ecommons.ui.util.ImageDescriptorRegistry;
 import org.eclipse.statet.ecommons.ui.util.MessageUtils;
 
-import org.eclipse.statet.internal.ltk.buildpaths.ui.BuildpathElementImageDescriptor;
-import org.eclipse.statet.internal.ltk.buildpaths.ui.BuildpathsUIPlugin;
-import org.eclipse.statet.internal.ltk.buildpaths.ui.Messages;
-import org.eclipse.statet.ltk.buildpaths.core.BuildpathInitializer;
-import org.eclipse.statet.ltk.buildpaths.core.IBuildpathAttribute;
-import org.eclipse.statet.ltk.buildpaths.core.IBuildpathElement;
+import org.eclipse.statet.internal.ltk.buildpath.ui.BuildpathElementImageDescriptor;
+import org.eclipse.statet.internal.ltk.buildpath.ui.BuildpathsUIPlugin;
+import org.eclipse.statet.internal.ltk.buildpath.ui.Messages;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathAttribute;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathElement;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathInitializer;
 
 
 public class BuildpathListLabelProvider extends LabelProvider {
@@ -72,16 +72,16 @@
 		else if (element instanceof BuildpathListElementAttribute) {
 			final BuildpathListElementAttribute attribute= (BuildpathListElementAttribute) element;
 			switch (attribute.getName()) {
-			case IBuildpathAttribute.SOURCE_ATTACHMENT:
+			case BuildpathAttribute.SOURCE_ATTACHMENT:
 				return this.uiResources.getImage(
 						BuildpathsUIResources.OBJ_SOURCE_ATTACHMENT_ATTRIBUTE_IMAGE_ID );
-			case IBuildpathAttribute.FILTER_INCLUSIONS:
+			case BuildpathAttribute.FILTER_INCLUSIONS:
 				return this.uiResources.getImage(
 						BuildpathsUIResources.OBJ_INCLUSION_FILTER_ATTRIBUTE_IMAGE_ID );
-			case IBuildpathAttribute.FILTER_EXCLUSIONS:
+			case BuildpathAttribute.FILTER_EXCLUSIONS:
 				return this.uiResources.getImage(
 						BuildpathsUIResources.OBJ_EXCLUSION_FILTER_ATTRIBUTE_IMAGE_ID );
-			case IBuildpathAttribute.OUTPUT:
+			case BuildpathAttribute.OUTPUT:
 				return this.uiResources.getImage(
 						BuildpathsUIResources.OBJ_OUTPUT_FOLDER_ATTRIBUTE_IMAGE_ID );
 			default:
@@ -110,10 +110,10 @@
 	
 	private ImageDescriptor getListElementBaseImage(final BuildpathListElement listElement) {
 		switch (listElement.getType().getName()) {
-		case IBuildpathElement.PROJECT:
+		case BuildpathElement.PROJECT:
 			return this.workbenchImages.getImageDescriptor(
 					IDE.SharedImages.IMG_OBJ_PROJECT );
-		case IBuildpathElement.SOURCE:
+		case BuildpathElement.SOURCE:
 			if (listElement.getPath().segmentCount() == 1) {
 				return this.workbenchImages.getImageDescriptor(
 						IDE.SharedImages.IMG_OBJ_PROJECT );
@@ -130,13 +130,13 @@
 	public String getListElementText(final BuildpathListElement element) {
 		final IPath path= element.getPath();
 		switch (element.getType().getName()) {
-		case IBuildpathElement.PROJECT:
+		case BuildpathElement.PROJECT:
 			String label= path.lastSegment();
 			if (element.isMissing()) {
 				label= label + ' ' + Messages.ListLabel_Deco_Missing_label;
 			}
 			return label;
-		case IBuildpathElement.SOURCE: {
+		case BuildpathElement.SOURCE: {
 			final String pathLabel= getPathString(path, false);
 			final StringBuilder sb= new StringBuilder(pathLabel);
 			final IPath linkTarget= element.getLinkTarget();
@@ -169,11 +169,11 @@
 	public String getListElementAttributeText(final BuildpathListElementAttribute attribute) {
 		final String key= attribute.getName();
 		switch (key) {
-		case IBuildpathAttribute.SOURCE_ATTACHMENT: {
+		case BuildpathAttribute.SOURCE_ATTACHMENT: {
 				final String detail;
 				final IPath path= (IPath) attribute.getValue();
 				if (path != null && !path.isEmpty()) {
-					if (attribute.getParent().getType().getName() == IBuildpathElement.VARIABLE) {
+					if (attribute.getParent().getType().getName() == BuildpathElement.VARIABLE) {
 						detail= getVariableString(path);
 					}
 					else {
@@ -185,7 +185,7 @@
 				}
 				return NLS.bind(Messages.ListLabel_Attribute_SourceAttachment_label, detail);
 			}
-		case IBuildpathAttribute.FILTER_INCLUSIONS: {
+		case BuildpathAttribute.FILTER_INCLUSIONS: {
 				final String detail;
 				final List<? extends IPath> patterns= (List<? extends IPath>) attribute.getValue();
 				if (patterns != null && !patterns.isEmpty()) {
@@ -203,7 +203,7 @@
 				}
 				return NLS.bind(Messages.ListLabel_Attribute_Inclusion_label, detail);
 			}
-		case IBuildpathAttribute.FILTER_EXCLUSIONS: {
+		case BuildpathAttribute.FILTER_EXCLUSIONS: {
 				final String detail;
 				final List<? extends IPath> patterns= (List<? extends IPath>) attribute.getValue();
 				if (patterns != null && !patterns.isEmpty()) {
@@ -221,7 +221,7 @@
 				}
 				return NLS.bind(Messages.ListLabel_Attribute_Exclusion_label, detail);
 			}
-		case IBuildpathAttribute.OUTPUT: {
+		case BuildpathAttribute.OUTPUT: {
 				final String detail;
 				final IPath path= (IPath) attribute.getValue();
 				if (path != null) {
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathsUIDescription.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathsUIDescription.java
similarity index 77%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathsUIDescription.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathsUIDescription.java
index 6df5207..4de41bf 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathsUIDescription.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathsUIDescription.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.ui;
+package org.eclipse.statet.ltk.buildpath.ui;
 
 import java.util.List;
 
@@ -21,22 +21,22 @@
 import org.eclipse.statet.jcommons.collections.ImCollections;
 import org.eclipse.statet.jcommons.collections.ImList;
 
-import org.eclipse.statet.ltk.buildpaths.core.BuildpathElementType;
-import org.eclipse.statet.ltk.buildpaths.core.IBuildpathElement;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathElement;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathElementType;
 
 
 public class BuildpathsUIDescription {
 	
 	
-	public void toListElements(final IProject project, final List<IBuildpathElement> coreElements,
+	public void toListElements(final IProject project, final List<BuildpathElement> coreElements,
 			final List<BuildpathListElement> listElements) {
-		for (final IBuildpathElement element : coreElements) {
+		for (final BuildpathElement element : coreElements) {
 			listElements.add(new BuildpathListElement(project, null, element, false));
 		}
 	}
 	
-	public ImList<IBuildpathElement> toCoreElements(final List<BuildpathListElement> listElements) {
-		final IBuildpathElement[] coreElements= new IBuildpathElement[listElements.size()];
+	public ImList<BuildpathElement> toCoreElements(final List<BuildpathListElement> listElements) {
+		final BuildpathElement[] coreElements= new BuildpathElement[listElements.size()];
 		int j= 0;
 		for (final BuildpathListElement listElement : listElements) {
 			coreElements[j++]= listElement.getCoreElement();
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathsUIResources.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathsUIResources.java
similarity index 93%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathsUIResources.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathsUIResources.java
index bda144a..bf9433d 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/BuildpathsUIResources.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathsUIResources.java
@@ -12,13 +12,13 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.ui;
+package org.eclipse.statet.ltk.buildpath.ui;
 
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.resource.ImageRegistry;
 import org.eclipse.swt.graphics.Image;
 
-import org.eclipse.statet.internal.ltk.buildpaths.ui.BuildpathsUIPlugin;
+import org.eclipse.statet.internal.ltk.buildpath.ui.BuildpathsUIPlugin;
 
 
 public class BuildpathsUIResources {
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/SourceContainerComponent.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/SourceContainerComponent.java
similarity index 92%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/SourceContainerComponent.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/SourceContainerComponent.java
index dad58c1..8505df3 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/SourceContainerComponent.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/SourceContainerComponent.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.ui;
+package org.eclipse.statet.ltk.buildpath.ui;
 
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -53,11 +53,11 @@
 import org.eclipse.statet.ecommons.ui.util.LayoutUtils;
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
-import org.eclipse.statet.internal.ltk.buildpaths.ui.Messages;
-import org.eclipse.statet.ltk.buildpaths.core.BuildpathElementType;
-import org.eclipse.statet.ltk.buildpaths.core.IBuildpathAttribute;
-import org.eclipse.statet.ltk.buildpaths.core.IBuildpathElement;
-import org.eclipse.statet.ltk.buildpaths.ui.wizards.EditFilterWizard;
+import org.eclipse.statet.internal.ltk.buildpath.ui.Messages;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathAttribute;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathElement;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathElementType;
+import org.eclipse.statet.ltk.buildpath.ui.wizards.EditFilterWizard;
 
 
 public class SourceContainerComponent implements ButtonGroup.IActions<Object> {
@@ -66,7 +66,7 @@
 	private static final ImIdentitySet<String> FILTER_NO= ImCollections.emptyIdentitySet();
 	
 	private static final ImIdentitySet<String> FILTER_OUTPUT= ImCollections.newIdentitySet(
-			IBuildpathAttribute.OUTPUT );
+			BuildpathAttribute.OUTPUT );
 	
 	private static final Object[] NO_CHILDREN= new Object[0];
 	
@@ -136,7 +136,7 @@
 		public boolean isModifyAllowed(final Object element) {
 			if (element instanceof BuildpathListElement) {
 				final BuildpathListElement listElement= (BuildpathListElement) element;
-				if (listElement.getType().getName() == IBuildpathElement.SOURCE) {
+				if (listElement.getType().getName() == BuildpathElement.SOURCE) {
 					if (listElement.getPath().equals(SourceContainerComponent.this.project.getFullPath())) {
 						return false;
 					}
@@ -166,8 +166,8 @@
 				if (SourceContainerComponent.this.uiDescription.getAllowEdit(attribute)) {
 					if (attribute.isBuiltin()) {
 						switch (attribute.getName()) {
-						case IBuildpathAttribute.FILTER_INCLUSIONS:
-						case IBuildpathAttribute.FILTER_EXCLUSIONS:
+						case BuildpathAttribute.FILTER_INCLUSIONS:
+						case BuildpathAttribute.FILTER_EXCLUSIONS:
 							return (!((List<?>) attribute.getValue()).isEmpty());
 						default:
 							return (attribute.getValue() != null);
@@ -196,8 +196,8 @@
 					if (attribute.isBuiltin()) {
 						final Object value;
 						switch (attribute.getName()) {
-						case IBuildpathAttribute.FILTER_INCLUSIONS:
-						case IBuildpathAttribute.FILTER_EXCLUSIONS:
+						case BuildpathAttribute.FILTER_INCLUSIONS:
+						case BuildpathAttribute.FILTER_EXCLUSIONS:
 							value= ImCollections.emptyList();
 							break;
 						default:
@@ -255,7 +255,7 @@
 		this.outputPathValue= (outputType != null) ?
 				new WritableValue<>(null, String.class) : null;
 		this.outputByContainerValue= (outputType != null
-						&& this.type.isAttributeBuiltin(IBuildpathAttribute.OUTPUT) ) ?
+						&& this.type.isAttributeBuiltin(BuildpathAttribute.OUTPUT) ) ?
 				new WritableValue<>(false, Boolean.TYPE) : null;
 	}
 	
@@ -370,7 +370,7 @@
 							for (final Object object : SourceContainerComponent.this.containerList) {
 								final BuildpathListElement element= (BuildpathListElement) object;
 								final BuildpathListElementAttribute attribute= element
-										.setAttribute(IBuildpathAttribute.OUTPUT, null);
+										.setAttribute(BuildpathAttribute.OUTPUT, null);
 								
 								if (attribute != null) {
 									SourceContainerComponent.this.changedContainers.add(element);
@@ -400,7 +400,7 @@
 			for (final BuildpathListElement element : this.buildpathList) {
 				if (isElement(element)) {
 					folders.add(element);
-					outputLocationByFolder|= (element.getAttributeValue(IBuildpathAttribute.OUTPUT) != null);
+					outputLocationByFolder|= (element.getAttributeValue(BuildpathAttribute.OUTPUT) != null);
 				}
 			}
 			this.containerList.addAll(folders);
@@ -442,9 +442,9 @@
 	private void updateExpandStates() {
 		for (int i= 0; i < this.containerList.size(); i++) {
 			final BuildpathListElement element= this.containerList.get(i);
-			final List<IPath> inclusionPatterns= (List<IPath>) element.getAttributeValue(IBuildpathAttribute.FILTER_INCLUSIONS);
-			final List<IPath> exclusionPatterns= (List<IPath>) element.getAttributeValue(IBuildpathAttribute.FILTER_EXCLUSIONS);
-			final IPath outputFolder= (IPath) element.getAttributeValue(IBuildpathAttribute.OUTPUT);
+			final List<IPath> inclusionPatterns= (List<IPath>) element.getAttributeValue(BuildpathAttribute.FILTER_INCLUSIONS);
+			final List<IPath> exclusionPatterns= (List<IPath>) element.getAttributeValue(BuildpathAttribute.FILTER_EXCLUSIONS);
+			final IPath outputFolder= (IPath) element.getAttributeValue(BuildpathAttribute.OUTPUT);
 			if (!inclusionPatterns.isEmpty() || !exclusionPatterns.isEmpty() || outputFolder != null) {
 				this.containerListViewer.expandToLevel(element, 1);
 			}
@@ -502,8 +502,8 @@
 	
 	private BuildpathListElementAttribute editAttribute(final BuildpathListElementAttribute attribute) {
 		switch (attribute.getName()) {
-		case IBuildpathAttribute.FILTER_INCLUSIONS:
-		case IBuildpathAttribute.FILTER_EXCLUSIONS: {
+		case BuildpathAttribute.FILTER_INCLUSIONS:
+		case BuildpathAttribute.FILTER_EXCLUSIONS: {
 			final EditFilterWizard wizard= new EditFilterWizard(
 					ImCollections.toList((List<BuildpathListElement>) this.containerList),
 					attribute.getParent(), this.uiDescription );
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/wizards/BuildPathWizard.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/wizards/BuildPathWizard.java
similarity index 89%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/wizards/BuildPathWizard.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/wizards/BuildPathWizard.java
index 82f70a3..6626708 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/wizards/BuildPathWizard.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/wizards/BuildPathWizard.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.ui.wizards;
+package org.eclipse.statet.ltk.buildpath.ui.wizards;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -22,9 +22,9 @@
 
 import org.eclipse.statet.jcommons.collections.ImList;
 
-import org.eclipse.statet.internal.ltk.buildpaths.ui.BuildpathsUIPlugin;
-import org.eclipse.statet.ltk.buildpaths.ui.BuildpathListElement;
-import org.eclipse.statet.ltk.buildpaths.ui.BuildpathsUIDescription;
+import org.eclipse.statet.internal.ltk.buildpath.ui.BuildpathsUIPlugin;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathListElement;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathsUIDescription;
 
 
 public abstract class BuildPathWizard extends Wizard {
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/wizards/EditFilterWizard.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/wizards/EditFilterWizard.java
similarity index 70%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/wizards/EditFilterWizard.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/wizards/EditFilterWizard.java
index bdbcab3..5e5f97b 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/wizards/EditFilterWizard.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/wizards/EditFilterWizard.java
@@ -12,14 +12,14 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.ui.wizards;
+package org.eclipse.statet.ltk.buildpath.ui.wizards;
 
 import org.eclipse.statet.jcommons.collections.ImList;
 
-import org.eclipse.statet.internal.ltk.buildpaths.ui.Messages;
-import org.eclipse.statet.ltk.buildpaths.core.IBuildpathAttribute;
-import org.eclipse.statet.ltk.buildpaths.ui.BuildpathListElement;
-import org.eclipse.statet.ltk.buildpaths.ui.BuildpathsUIDescription;
+import org.eclipse.statet.internal.ltk.buildpath.ui.Messages;
+import org.eclipse.statet.ltk.buildpath.core.BuildpathAttribute;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathListElement;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathsUIDescription;
 
 
 public class EditFilterWizard extends BuildPathWizard {
@@ -45,8 +45,8 @@
 	
 	public void setFocus(final String attributeName) {
 		switch (attributeName) {
-		case IBuildpathAttribute.FILTER_INCLUSIONS:
-		case IBuildpathAttribute.FILTER_EXCLUSIONS:
+		case BuildpathAttribute.FILTER_INCLUSIONS:
+		case BuildpathAttribute.FILTER_EXCLUSIONS:
 			this.filterPage.setFocus(attributeName);
 			break;
 		default:
@@ -57,8 +57,8 @@
 	@Override
 	public boolean performFinish() {
 		final BuildpathListElement entryToEdit= getEntryToEdit();
-		entryToEdit.setAttribute(IBuildpathAttribute.FILTER_INCLUSIONS, this.filterPage.getInclusionPatterns());
-		entryToEdit.setAttribute(IBuildpathAttribute.FILTER_EXCLUSIONS, this.filterPage.getExclusionPatterns());
+		entryToEdit.setAttribute(BuildpathAttribute.FILTER_INCLUSIONS, this.filterPage.getInclusionPatterns());
+		entryToEdit.setAttribute(BuildpathAttribute.FILTER_EXCLUSIONS, this.filterPage.getExclusionPatterns());
 		
 		return true;
 	}
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/wizards/FilterWizardPage.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/wizards/FilterWizardPage.java
similarity index 90%
rename from ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/wizards/FilterWizardPage.java
rename to ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/wizards/FilterWizardPage.java
index 0d98103..a6d797c 100644
--- a/ltk/org.eclipse.statet.ltk.buildpaths.ui/src/org/eclipse/statet/ltk/buildpaths/ui/wizards/FilterWizardPage.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/wizards/FilterWizardPage.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.buildpaths.ui.wizards;
+package org.eclipse.statet.ltk.buildpath.ui.wizards;
 
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.jface.dialogs.Dialog;
@@ -26,10 +26,10 @@
 
 import org.eclipse.statet.ecommons.ui.util.LayoutUtils;
 
-import org.eclipse.statet.internal.ltk.buildpaths.ui.ExclusionInclusionComponent;
-import org.eclipse.statet.internal.ltk.buildpaths.ui.Messages;
-import org.eclipse.statet.ltk.buildpaths.ui.BuildpathListElement;
-import org.eclipse.statet.ltk.buildpaths.ui.BuildpathsUIDescription;
+import org.eclipse.statet.internal.ltk.buildpath.ui.ExclusionInclusionComponent;
+import org.eclipse.statet.internal.ltk.buildpath.ui.Messages;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathListElement;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathsUIDescription;
 
 
 public class FilterWizardPage extends WizardPage {
diff --git a/ltk/org.eclipse.statet.ltk.buildpaths.core/.project b/ltk/org.eclipse.statet.ltk.buildpaths.core/.project
deleted file mode 100644
index 76e896c..0000000
--- a/ltk/org.eclipse.statet.ltk.buildpaths.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.statet.ltk.buildpaths.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/ltk/org.eclipse.statet.ltk.core/META-INF/MANIFEST.MF b/ltk/org.eclipse.statet.ltk.core/META-INF/MANIFEST.MF
index ef2e0fc..72ecfde 100644
--- a/ltk/org.eclipse.statet.ltk.core/META-INF/MANIFEST.MF
+++ b/ltk/org.eclipse.statet.ltk.core/META-INF/MANIFEST.MF
@@ -5,7 +5,7 @@
 Bundle-Vendor: Eclipse StatET
 Bundle-Name: StatET LTK - Core  (Incubation)
 Bundle-ActivationPolicy: lazy
-Bundle-Activator: org.eclipse.statet.internal.ltk.core.LTKCorePlugin
+Bundle-Activator: org.eclipse.statet.internal.ltk.core.LtkCorePlugin
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Require-Bundle: org.eclipse.statet.ecommons.runtime.core;bundle-version="[4.2.0,4.3.0)",
  org.eclipse.core.contenttype,
@@ -33,7 +33,8 @@
  org.eclipse.statet.ltk.issues.core,
  org.eclipse.statet.ltk.issues.core.impl,
  org.eclipse.statet.ltk.model.core,
- org.eclipse.statet.ltk.model.core.elements,
+ org.eclipse.statet.ltk.model.core.build,
+ org.eclipse.statet.ltk.model.core.element,
  org.eclipse.statet.ltk.model.core.impl,
  org.eclipse.statet.ltk.model.core.util,
  org.eclipse.statet.ltk.refactoring.core
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/BasicHeuristicTokenScanner.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/BasicHeuristicTokenScanner.java
index 4824adf..f70392f 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/BasicHeuristicTokenScanner.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/BasicHeuristicTokenScanner.java
@@ -420,7 +420,7 @@
 	
 	
 	protected StopCondition createFindPeerStopCondition(final int start, final char[] pair, final char escapeChar) {
-		return (escapeChar == (char) 0) ?
+		return (escapeChar == (char)0) ?
 				new CharacterMatchCondition(pair) : new ExtCharacterMatchCondition(pair, escapeChar);
 	}
 	
@@ -434,7 +434,7 @@
 	
 	@Override
 	public int findClosingPeer(final int start, final char[] pair) {
-		return findClosingPeer(start, pair, (char) 0);
+		return findClosingPeer(start, pair, (char)0);
 	}
 	
 	@Override
@@ -477,7 +477,7 @@
 			start= this.document.getLength()-1;
 		}
 		try {
-			final StopCondition cond= createFindPeerStopCondition(start, pair, (char) 0);
+			final StopCondition cond= createFindPeerStopCondition(start, pair, (char)0);
 			final int bound= createBackwardBound(start);
 			
 			int depth= 1;
@@ -508,7 +508,7 @@
 	@Override
 	public int findOpeningPeer(int start, final char[] pair, final char escapeChar) {
 		Assert.isTrue(start < this.document.getLength());
-		if (escapeChar == (char) 0) {
+		if (escapeChar == (char)0) {
 			return findOpeningPeer(start, pair);
 		}
 		
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/DocumentCodepointIterator.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/DocumentCodepointIterator.java
index debc8af..566fad7 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/DocumentCodepointIterator.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/DocumentCodepointIterator.java
@@ -93,7 +93,7 @@
 			catch (final BadLocationException e) {
 				this.fFragmentOffset= Integer.MIN_VALUE;
 				this.fFragment= null;
-				return (char) EOF;
+				return (char)EOF;
 			}
 		}
 		return this.fFragment.charAt(offsetInFragment);
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/IndentUtil.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/IndentUtil.java
index bef5941..0c6603a 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/IndentUtil.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/IndentUtil.java
@@ -882,7 +882,7 @@
 	}
 	
 	private String createNoIndentationCharMessage(final int c) {
-		return NLS.bind("No indentation char: ''{0}''.", ((char) c)); //$NON-NLS-1$
+		return NLS.bind("No indentation char: ''{0}''.", ((char)c)); //$NON-NLS-1$
 	}
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/MultiContentSectionCharPairMatcher.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/MultiContentSectionCharPairMatcher.java
index cffb430..1a5f277 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/MultiContentSectionCharPairMatcher.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/MultiContentSectionCharPairMatcher.java
@@ -79,7 +79,7 @@
 	public void dispose() {
 		for (final Object handler : this.handlers.values()) {
 			if (handler != NULL) {
-				((ICharPairMatcher) handler).dispose();
+				((ICharPairMatcher)handler).dispose();
 			}
 		}
 		this.handlers.clear();
@@ -110,7 +110,7 @@
 				this.handlers.put(sectionType, handler);
 			}
 		}
-		return (handler != NULL) ? (ICharPairMatcher) handler : null;
+		return (handler != NULL) ? (ICharPairMatcher)handler : null;
 	}
 	
 	protected ICharPairMatcher createHandler(final String sectionType) {
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/Partitioner.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/Partitioner.java
index 3f52e6b..95ccf92 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/Partitioner.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/Partitioner.java
@@ -35,7 +35,7 @@
 	
 	public void setStartPartitionType(final String partitionType) {
 		if (this.fScanner instanceof IPartitionScannerConfigExt) {
-			((IPartitionScannerConfigExt) this.fScanner).setStartPartitionType(partitionType);
+			((IPartitionScannerConfigExt)this.fScanner).setStartPartitionType(partitionType);
 		}
 		else {
 			throw new UnsupportedOperationException();
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/PartitionerDocumentSetupParticipant.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/PartitionerDocumentSetupParticipant.java
index 210a2ba..e6f492b 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/PartitionerDocumentSetupParticipant.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ecommons/text/PartitionerDocumentSetupParticipant.java
@@ -50,10 +50,10 @@
 		Object synch;
 		if (document instanceof ISynchronizable) {
 			synchronized (document) {
-				synch= ((ISynchronizable) document).getLockObject();
+				synch= ((ISynchronizable)document).getLockObject();
 				if (synch == null) {
 					synch= new Object();
-					((ISynchronizable) document).setLockObject(synch);
+					((ISynchronizable)document).setLockObject(synch);
 				}
 			}
 		}
@@ -64,12 +64,12 @@
 	}
 	
 	protected void doSetup(final IDocument document) {
-		final IDocumentExtension3 extension3= (IDocumentExtension3) document;
+		final IDocumentExtension3 extension3= (IDocumentExtension3)document;
 		if (extension3.getDocumentPartitioner(getPartitioningId()) == null) {
 			// Setup the document scanner
 			final IDocumentPartitioner partitioner= createDocumentPartitioner();
 			if (partitioner instanceof IDocumentPartitionerExtension3) {
-				((IDocumentPartitionerExtension3) partitioner).connect(document, true);
+				((IDocumentPartitionerExtension3)partitioner).connect(document, true);
 			}
 			else {
 				partitioner.connect(document);
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/AdapterFactory.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/AdapterFactory.java
index 1a1a62d..ea2dae2 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/AdapterFactory.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/AdapterFactory.java
@@ -27,7 +27,11 @@
 import org.eclipse.core.runtime.Status;
 import org.eclipse.osgi.util.NLS;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
+
+@NonNullByDefault
 public class AdapterFactory {
 	
 	
@@ -40,13 +44,13 @@
 	
 	private static interface AdapterContribution {
 		
-		<T> T getAdapter(String modelTypeId, Class<T> adapterType);
+		<T> @Nullable T getAdapter(final String modelTypeId, final Class<T> adapterType);
 		
 	}
 	
 	private static class ClassContribution implements AdapterContribution {
 		
-		private IConfigurationElement configurationElement;
+		private @Nullable IConfigurationElement configurationElement;
 		
 		public ClassContribution(final IConfigurationElement contributionElement) {
 			this.configurationElement= contributionElement;
@@ -54,15 +58,18 @@
 		
 		@Override
 		@SuppressWarnings("unchecked")
-		public <T> T getAdapter(final String modelTypeId, final Class<T> adapterType) {
-			try {
-				return (T) this.configurationElement.createExecutableExtension(CLASS_ATTRIBUTE_NAME);
-			}
-			catch (final CoreException e) {
-				LTKCorePlugin.log(new Status(IStatus.ERROR, LTKCorePlugin.BUNDLE_ID, 0,
-						NLS.bind("An error occurred when loading adapter class for model ''{0}''.", modelTypeId),
-						e ));
-				this.configurationElement= null;
+		public <T> @Nullable T getAdapter(final String modelTypeId, final Class<T> adapterType) {
+			final IConfigurationElement configurationElement= this.configurationElement;
+			if (configurationElement != null) {
+				try {
+					return (T) configurationElement.createExecutableExtension(CLASS_ATTRIBUTE_NAME);
+				}
+				catch (final CoreException e) {
+					this.configurationElement= null;
+					LtkCorePlugin.log(new Status(IStatus.ERROR, LtkCorePlugin.BUNDLE_ID, 0,
+							NLS.bind("An error occurred when loading adapter class for model ''{0}''.", modelTypeId),
+							e ));
+				}
 			}
 			return null;
 		}
@@ -71,31 +78,34 @@
 	
 	private static class FactoryContribution implements AdapterContribution {
 		
-		private IConfigurationElement configurationElement;
-		private IAdapterFactory factory;
+		private @Nullable IConfigurationElement configurationElement;
+		private @Nullable IAdapterFactory factory;
 		
 		public FactoryContribution(final IConfigurationElement configurationElement) {
 			this.configurationElement= configurationElement;
 		}
 		
 		@Override
-		public <T> T getAdapter(final String modelTypeId, final Class<T> adapterType) {
+		public <T> @Nullable T getAdapter(final String modelTypeId, final Class<T> adapterType) {
+			IAdapterFactory factory;
 			synchronized (this) {
-				if (this.configurationElement != null) {
+				factory = this.factory;
+				final IConfigurationElement configurationElement;
+				if (factory == null && (configurationElement= this.configurationElement) != null) {
 					try {
-						this.factory= (IAdapterFactory) this.configurationElement.createExecutableExtension(CLASS_ATTRIBUTE_NAME);
-						this.configurationElement= null;
+						factory= (IAdapterFactory)configurationElement.createExecutableExtension(CLASS_ATTRIBUTE_NAME);
+						this.factory= factory;
 					}
 					catch (final CoreException e) {
-						LTKCorePlugin.log(new Status(IStatus.ERROR, LTKCorePlugin.BUNDLE_ID, 0,
+						this.configurationElement= null;
+						LtkCorePlugin.log(new Status(IStatus.ERROR, LtkCorePlugin.BUNDLE_ID, 0,
 								NLS.bind("An error occurred when loading adapter factory for model ''{0}''.", modelTypeId),
 								e ));
-						this.configurationElement= null;
 					}
 				}
 			}
-			if (this.factory != null) {
-				return this.factory.getAdapter(modelTypeId, adapterType);
+			if (factory != null) {
+				return factory.getAdapter(modelTypeId, adapterType);
 			}
 			return null;
 		}
@@ -146,7 +156,7 @@
 		}
 	}
 	
-	public <T> T get(final String modelTypeId, final Class<T> adapterType) {
+	public <T> @Nullable T get(final String modelTypeId, final Class<T> adapterType) {
 		AdapterContribution contribution;
 		synchronized (this.map) {
 			final Map<String, AdapterContribution> map= this.map.get(modelTypeId);
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/ExtContentTypeServices.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/ExtContentTypeServices.java
index 986aaa3..2123094 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/ExtContentTypeServices.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/ExtContentTypeServices.java
@@ -87,7 +87,7 @@
 	private Map<String, String[]> primaryToSecondary;
 	private Map<String, String[]> secondaryToPrimary;
 	private Map<String, String> primaryToModel;
-	private Map<String, ModelTypeDescriptor> modelDescriptors;
+	private Map<String, ModelTypeDescriptorImpl> modelDescriptors;
 	
 	
 	public ExtContentTypeServices() {
@@ -98,7 +98,7 @@
 	private void load() {
 		final IExtensionRegistry extensionRegistry= Platform.getExtensionRegistry();
 		
-		final Map<String, ModelTypeDescriptor> modelTypes= new HashMap<>();
+		final Map<String, ModelTypeDescriptorImpl> modelTypes= new HashMap<>();
 		
 		final Map<String, Set<String>> primaryToSecondary= new HashMap<>();
 		final Map<String, Set<String>> secondaryToPrimary= new HashMap<>();
@@ -127,9 +127,9 @@
 					String id= element.getAttribute(CONFIG_ID_ATTRIBUTE_NAME); 
 					if (id != null && !id.isEmpty()) {
 						id= id.intern();
-						ModelTypeDescriptor descriptor= modelTypes.get(id);
+						ModelTypeDescriptorImpl descriptor= modelTypes.get(id);
 						if (descriptor == null) {
-							descriptor= new ModelTypeDescriptor(id);
+							descriptor= new ModelTypeDescriptorImpl(id);
 							modelTypes.put(id, descriptor);
 						}
 						final IConfigurationElement[] children= element.getChildren();
@@ -167,9 +167,9 @@
 		this.modelDescriptors= modelTypes;
 	}
 	
-	private static void checkModelTypes(final Map<String, ModelTypeDescriptor> modelTypes) {
+	private static void checkModelTypes(final Map<String, ModelTypeDescriptorImpl> modelTypes) {
 		final List<String> temp= new ArrayList<>();
-		for (final ModelTypeDescriptor descriptor : modelTypes.values()) {
+		for (final ModelTypeDescriptorImpl descriptor : modelTypes.values()) {
 			synchronized (descriptor) {
 				temp.clear();
 				for (final String sId : descriptor.secondaryTypeIds) {
@@ -217,12 +217,12 @@
 	
 	
 	@Override
-	public ModelTypeDescriptor getModelType(final String modelTypeId) {
+	public ModelTypeDescriptorImpl getModelType(final String modelTypeId) {
 		return (modelTypeId != null) ? this.modelDescriptors.get(modelTypeId) : null;
 	}
 	
 	@Override
-	public ModelTypeDescriptor getModelTypeForContentType(final String contentTypeId) {
+	public ModelTypeDescriptorImpl getModelTypeForContentType(final String contentTypeId) {
 		return getModelType(this.primaryToModel.get(contentTypeId));
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/LTKCorePlugin.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/LtkCorePlugin.java
similarity index 82%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/LTKCorePlugin.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/LtkCorePlugin.java
index f45821e..6fb6767 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/LTKCorePlugin.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/LtkCorePlugin.java
@@ -25,27 +25,27 @@
 import org.eclipse.statet.jcommons.lang.Disposable;
 
 import org.eclipse.statet.ltk.core.IExtContentTypeManager;
-import org.eclipse.statet.ltk.model.core.ISourceUnitManager;
+import org.eclipse.statet.ltk.model.core.SourceUnitManager;
 
 
 /**
  * The activator class controls the plug-in life cycle
  */
-public final class LTKCorePlugin extends Plugin {
+public final class LtkCorePlugin extends Plugin {
 	
 	
 	public static final String BUNDLE_ID= "org.eclipse.statet.ltk.core"; //$NON-NLS-1$
 	
 	
-	private static LTKCorePlugin instance;
-	private static LTKCorePlugin gSafe;
+	private static LtkCorePlugin instance;
+	private static LtkCorePlugin gSafe;
 	
 	/**
 	 * Returns the shared plug-in instance
 	 *
 	 * @return the shared instance
 	 */
-	public static LTKCorePlugin getInstance() {
+	public static LtkCorePlugin getInstance() {
 		return instance;
 	}
 	
@@ -54,13 +54,13 @@
 	 * 
 	 * @return the shared instance
 	 */
-	public static LTKCorePlugin getSafe() {
+	public static LtkCorePlugin getSafe() {
 		return gSafe;
 	}
 	
 	
 	public static void log(final IStatus status) {
-		final LTKCorePlugin plugin= getInstance();
+		final LtkCorePlugin plugin= getInstance();
 		if (plugin != null) {
 			plugin.getLog().log(status);
 		}
@@ -72,7 +72,7 @@
 	private final List<Disposable> disposables= new ArrayList<>();
 	
 	private ExtContentTypeServices contentTypeServices;
-	private SourceUnitManager sourceUnitManager;
+	private SourceUnitManagerImpl sourceUnitManagerImpl;
 	
 	private AdapterFactory modelAdapterFactory;
 	
@@ -80,14 +80,11 @@
 	/**
 	 * The default constructor
 	 */
-	public LTKCorePlugin() {
+	public LtkCorePlugin() {
 		instance= this;
 		gSafe= this;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public void start(final BundleContext context) throws Exception {
 		super.start(context);
@@ -97,14 +94,11 @@
 			
 			this.contentTypeServices= new ExtContentTypeServices();
 			addStoppingListener(this.contentTypeServices);
-			this.sourceUnitManager= new SourceUnitManager();
-			addStoppingListener(this.sourceUnitManager);
+			this.sourceUnitManagerImpl= new SourceUnitManagerImpl();
+			addStoppingListener(this.sourceUnitManagerImpl);
 		}
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public void stop(final BundleContext context) throws Exception {
 		try {
@@ -112,7 +106,7 @@
 				this.started= false;
 				
 				this.contentTypeServices= null;
-				this.sourceUnitManager= null;
+				this.sourceUnitManagerImpl= null;
 			}
 			
 			try {
@@ -147,8 +141,8 @@
 		return this.contentTypeServices;
 	}
 	
-	public ISourceUnitManager getSourceUnitManager() {
-		return this.sourceUnitManager;
+	public SourceUnitManager getSourceUnitManager() {
+		return this.sourceUnitManagerImpl;
 	}
 	
 	public synchronized AdapterFactory getModelAdapterFactory() {
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/ModelTypeDescriptor.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/ModelTypeDescriptorImpl.java
similarity index 62%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/ModelTypeDescriptor.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/ModelTypeDescriptorImpl.java
index aa831fd..6962a15 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/ModelTypeDescriptor.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/ModelTypeDescriptorImpl.java
@@ -15,22 +15,27 @@
 package org.eclipse.statet.internal.ltk.core;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 
-import org.eclipse.statet.ltk.core.IModelTypeDescriptor;
+import org.eclipse.statet.jcommons.collections.ImCollection;
+import org.eclipse.statet.jcommons.collections.ImList;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.ltk.model.core.ModelTypeDescriptor;
 
 
-public class ModelTypeDescriptor implements IModelTypeDescriptor {
+@NonNullByDefault
+public class ModelTypeDescriptorImpl implements ModelTypeDescriptor {
 	
 	
 	private final String id;
 	
 	List<String> secondaryTypeIds= new ArrayList<>(1);
-	List<String> checkedSecondaryTypeIds;
+	ImList<String> checkedSecondaryTypeIds;
 	
 	
-	public ModelTypeDescriptor(final String id) {
+	public ModelTypeDescriptorImpl(final String id) {
 		this.id= id;
 	}
 	
@@ -41,7 +46,7 @@
 	}
 	
 	@Override
-	public Collection<String> getSecondaryTypeIds() {
+	public ImCollection<String> getSecondaryTypeIds() {
 		return this.checkedSecondaryTypeIds;
 	}
 	
@@ -52,12 +57,11 @@
 	}
 	
 	@Override
-	public boolean equals(final Object obj) {
-		return (obj instanceof ModelTypeDescriptor
-				&& this.id == ((ModelTypeDescriptor) obj).id);
+	public boolean equals(final @Nullable Object obj) {
+		return (obj instanceof ModelTypeDescriptorImpl
+				&& this.id == ((ModelTypeDescriptorImpl)obj).id);
 	}
 	
-	
 	@Override
 	public String toString() {
 		return this.id;
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/SourceUnitManager.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/SourceUnitManagerImpl.java
similarity index 75%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/SourceUnitManager.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/SourceUnitManagerImpl.java
index e06ded4..e3902a6 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/SourceUnitManager.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/internal/ltk/core/SourceUnitManagerImpl.java
@@ -41,30 +41,33 @@
 import org.eclipse.statet.jcommons.collections.ImCollections;
 import org.eclipse.statet.jcommons.collections.ImList;
 import org.eclipse.statet.jcommons.lang.Disposable;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.ltk.core.IExtContentTypeManager;
-import org.eclipse.statet.ltk.core.IModelTypeDescriptor;
-import org.eclipse.statet.ltk.core.LTK;
+import org.eclipse.statet.ltk.core.Ltk;
 import org.eclipse.statet.ltk.core.WorkingContext;
-import org.eclipse.statet.ltk.model.core.ISourceUnitFactory;
-import org.eclipse.statet.ltk.model.core.ISourceUnitManager;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.ModelTypeDescriptor;
+import org.eclipse.statet.ltk.model.core.SourceUnitFactory;
+import org.eclipse.statet.ltk.model.core.SourceUnitManager;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
-public class SourceUnitManager implements ISourceUnitManager, Disposable {
+@NonNullByDefault
+public class SourceUnitManagerImpl implements SourceUnitManager, Disposable {
 	
 	
 	private static final String CONFIG_MODELTYPE_ID_ATTRIBUTE_NAME= "modelTypeId"; //$NON-NLS-1$
 	private static final String CONFIG_CONTEXT_KEY_ATTRIBUTE_NAME= "contextKey"; //$NON-NLS-1$
 	
 	
-	private static final class SuItem extends SoftReference<ISourceUnit> {
+	private static final class SuItem extends SoftReference<SourceUnit> {
 		
 		private final String key;
 		
-		public SuItem(final String key, final ISourceUnit su, final ReferenceQueue<ISourceUnit> queue) {
-			super(su);
+		public SuItem(final String key, final SourceUnit su, final ReferenceQueue<SourceUnit> queue) {
+			super(su, queue);
 			this.key= key;
 		}
 		
@@ -73,10 +76,10 @@
 		}
 		
 		public void dispose() {
-			final ISourceUnit su= get();
+			final SourceUnit su= get();
 			if (su != null && su.isConnected()) {
-				LTKCorePlugin.log(
-						new Status(IStatus.WARNING, LTKCorePlugin.BUNDLE_ID, -1,
+				LtkCorePlugin.log(
+						new Status(IStatus.WARNING, LtkCorePlugin.BUNDLE_ID, -1,
 								NLS.bind("Source Unit ''{0}'' disposed but connected.", su.getId()), null));
 			}
 			clear();
@@ -87,11 +90,11 @@
 	private static class ContextItem {
 		
 		private final WorkingContext context;
-		private final ISourceUnitFactory factory;
+		private final SourceUnitFactory factory;
 		private final HashMap<String, SuItem> sus;
-		private final ReferenceQueue<ISourceUnit> susToClean;
+		private final ReferenceQueue<SourceUnit> susToClean;
 		
-		public ContextItem(final WorkingContext context, final ISourceUnitFactory factory) {
+		public ContextItem(final WorkingContext context, final SourceUnitFactory factory) {
 			this.context= context;
 			this.factory= factory;
 			this.sus= new HashMap<>();
@@ -104,20 +107,20 @@
 		}
 		
 		@Override
-		public boolean equals(final Object obj) {
+		public boolean equals(final @Nullable Object obj) {
 			if (obj instanceof ContextItem) {
-				return ( ((ContextItem) obj).context == this.context);
+				return ( ((ContextItem)obj).context == this.context);
 			}
 			return false;
 		}
 		
 		
-		public synchronized ISourceUnit getOpenSu(final Object from) {
+		public synchronized @Nullable SourceUnit getOpenSu(final Object from) {
 			final String id= this.factory.createId(from);
 			if (id != null) {
 				final SuItem suItem= this.sus.get(id);
 				if (suItem != null) {
-					final ISourceUnit su= suItem.get();
+					final SourceUnit su= suItem.get();
 					if (su != null && !suItem.isEnqueued()) {
 						return su;
 					}
@@ -126,11 +129,11 @@
 			return null;
 		}
 		
-		public synchronized void appendOpenSus(final ArrayList<ISourceUnit> list) {
+		public synchronized void appendOpenSus(final ArrayList<SourceUnit> list) {
 			final Collection<SuItem> suItems= this.sus.values();
 			list.ensureCapacity(list.size() + suItems.size());
 			for (final SuItem suItem : suItems) {
-				final ISourceUnit su= suItem.get();
+				final SourceUnit su= suItem.get();
 				if (su != null && !suItem.isEnqueued()) {
 					list.add(su);
 				}
@@ -151,7 +154,7 @@
 			this.modelTypeId= modelTypeId;
 		}
 		
-		public ContextItem getContextItem(final WorkingContext context, final boolean create) {
+		public @Nullable ContextItem getContextItem(final WorkingContext context, final boolean create) {
 			final ImList<ContextItem> contextItems= this.contextItems;
 			for (final ContextItem contextItem : contextItems) {
 				if (contextItem.context == context) {
@@ -184,14 +187,14 @@
 							}
 						}
 						if (matchingElement != null) {
-							final ISourceUnitFactory factory= (ISourceUnitFactory) matchingElement.createExecutableExtension("unitFactory"); //$NON-NLS-1$
+							final SourceUnitFactory factory= (SourceUnitFactory)matchingElement.createExecutableExtension("unitFactory"); //$NON-NLS-1$
 							final ContextItem contextItem= new ContextItem(context, factory);
 							this.contextItems= ImCollections.addElement(contextItems, contextItem);
 							return contextItem;
 						}
 					}
 					catch (final Exception e) {
-						LTKCorePlugin.log(new Status(IStatus.ERROR, LTK.BUNDLE_ID, 0,
+						LtkCorePlugin.log(new Status(IStatus.ERROR, Ltk.BUNDLE_ID, 0,
 								"Error loading working context contributions", e )); //$NON-NLS-1$
 					}
 				}
@@ -199,7 +202,7 @@
 			return null;
 		}
 		
-		public ImList<ContextItem> getOpenContextItems(final WorkingContext context) {
+		public ImList<ContextItem> getOpenContextItems(final @Nullable WorkingContext context) {
 			final ImList<ContextItem> contextItems= this.contextItems;
 			if (context != null) {
 				for (final ContextItem contextItem : contextItems) {
@@ -220,9 +223,9 @@
 		}
 		
 		@Override
-		public boolean equals(final Object obj) {
+		public boolean equals(final @Nullable Object obj) {
 			return (obj instanceof ModelItem
-					&& this.modelTypeId.equals(((ModelItem) obj).modelTypeId));
+					&& this.modelTypeId.equals(((ModelItem)obj).modelTypeId));
 		}
 		
 	}
@@ -272,10 +275,10 @@
 	
 	private volatile ImList<ModelItem> modelItems= ImCollections.newList();
 	
-	private final IExtContentTypeManager contentManager= LTK.getExtContentTypeManager();
+	private final IExtContentTypeManager contentManager= Ltk.getExtContentTypeManager();
 	
 	
-	public SourceUnitManager() {
+	public SourceUnitManagerImpl() {
 		this.cleanupJob.initialSchedule();
 	}
 	
@@ -287,7 +290,7 @@
 			final List<ContextItem> contextItems= modelItem.contextItems;
 			for (final ContextItem contextItem : contextItems) {
 				SuItem suItem;
-				while ((suItem= (SuItem) contextItem.susToClean.poll()) != null){
+				while ((suItem= (SuItem)contextItem.susToClean.poll()) != null){
 					synchronized (contextItem.sus) {
 						if (contextItem.sus.get(suItem.getKey()) == suItem) {
 							contextItem.sus.remove(suItem.getKey());
@@ -307,7 +310,7 @@
 	}
 	
 	@Override
-	public ISourceUnit getSourceUnit(final String modelTypeId, final WorkingContext context,
+	public @Nullable SourceUnit getSourceUnit(final String modelTypeId, final WorkingContext context,
 			final Object from, final boolean create,
 			final IProgressMonitor monitor) {
 		if (modelTypeId == null) {
@@ -317,20 +320,20 @@
 			throw new NullPointerException("context"); //$NON-NLS-1$
 		}
 		
-		return doGetSourceUnit(modelTypeId, context, from, null, create, monitor);
+		return doGetSourceUnit(modelTypeId, context, from, create, monitor);
 	}
 	
 	@Override
-	public ISourceUnit getSourceUnit(final WorkingContext context,
-			final Object from, IContentType contentType, final boolean create,
+	public @Nullable SourceUnit getSourceUnit(final WorkingContext context,
+			final Object from, @Nullable IContentType contentType, final boolean create,
 			final IProgressMonitor monitor) {
 		if (context == null) {
 			throw new NullPointerException("context"); //$NON-NLS-1$
 		}
 		
 		String modelTypeId;
-		if (from instanceof ISourceUnit) {
-			modelTypeId= ((ISourceUnit) from).getModelTypeId();
+		if (from instanceof SourceUnit) {
+			modelTypeId= ((SourceUnit)from).getModelTypeId();
 		}
 		else {
 			if (contentType == null) {
@@ -339,24 +342,24 @@
 					return null;
 				}
 			}
-			final IModelTypeDescriptor modelType= this.contentManager.getModelTypeForContentType(contentType.getId());
+			final ModelTypeDescriptor modelType= this.contentManager.getModelTypeForContentType(contentType.getId());
 			if (modelType == null) {
 				return null;
 			}
 			modelTypeId= modelType.getId();
 		}
 		
-		return doGetSourceUnit(modelTypeId, context, from, contentType, create, monitor);
+		return doGetSourceUnit(modelTypeId, context, from, create, monitor);
 	}
 	
-	private ISourceUnit doGetSourceUnit(final String modelTypeId, final WorkingContext context,
-			final Object from, final IContentType contentType, final boolean create,
+	private @Nullable SourceUnit doGetSourceUnit(final String modelTypeId, final WorkingContext context,
+			final Object from, final boolean create,
 			final IProgressMonitor monitor) {
-		final ISourceUnit fromUnit= (from instanceof ISourceUnit) ? ((ISourceUnit) from) : null;
+		final SourceUnit fromUnit= (from instanceof SourceUnit) ? ((SourceUnit)from) : null;
 		
 		final ModelItem modelItem= getModelItem(modelTypeId);
 		final ContextItem contextItem= modelItem.getContextItem(context, create);
-		ISourceUnit su= null;
+		SourceUnit su= null;
 		if (contextItem != null) {
 			final String id= (fromUnit != null) ? fromUnit.getId() : contextItem.factory.createId(from);
 			if (id != null) {
@@ -372,7 +375,7 @@
 						if (create) {
 							su= contextItem.factory.createSourceUnit(id, from);
 							if (su == null || !su.getModelTypeId().equals(modelItem.modelTypeId)
-									|| (su.getElementType() & IModelElement.MASK_C1) != IModelElement.C1_SOURCE) {
+									|| (su.getElementType() & LtkModelElement.MASK_C1) != LtkModelElement.C1_SOURCE) {
 								// TODO log
 								return null; 
 							}
@@ -396,7 +399,7 @@
 			su.connect(monitor);
 			
 			if (fromUnit != null) {
-				fromUnit.disconnect(null);
+				fromUnit.disconnect(monitor);
 			}
 			
 			return su;
@@ -407,14 +410,14 @@
 	}
 	
 	@Override
-	public List<ISourceUnit> getOpenSourceUnits(final String modelTypeId,
-			final WorkingContext context) {
+	public List<SourceUnit> getOpenSourceUnits(final String modelTypeId,
+			final @Nullable WorkingContext context) {
 		final List<ModelItem> modelItems= getOpenModelItems(modelTypeId);
 		if (modelItems.isEmpty()) {
 			return Collections.emptyList();
 		}
 		
-		final ArrayList<ISourceUnit> list= new ArrayList<>();
+		final ArrayList<SourceUnit> list= new ArrayList<>();
 		
 		for (int i= 0; i < modelItems.size(); i++) {
 			final ImList<ContextItem> contextItems= modelItems.get(i).getOpenContextItems(context);
@@ -430,14 +433,14 @@
 	}
 	
 	@Override
-	public List<ISourceUnit> getOpenSourceUnits(final List<String> modelTypeIds,
-			final WorkingContext context) {
+	public List<SourceUnit> getOpenSourceUnits(final List<String> modelTypeIds,
+			final @Nullable WorkingContext context) {
 		final List<ModelItem> includedModelItems= getOpenModelItems(modelTypeIds);
 		if (includedModelItems.isEmpty()) {
 			return Collections.emptyList();
 		}
 		
-		final ArrayList<ISourceUnit> list= new ArrayList<>(4);
+		final ArrayList<SourceUnit> list= new ArrayList<>(4);
 		
 		for (int i= 0; i < includedModelItems.size(); i++) {
 			final ImList<ContextItem> contextItems= this.modelItems.get(i).getOpenContextItems(context);
@@ -453,14 +456,14 @@
 	}
 	
 	@Override
-	public List<ISourceUnit> getOpenSourceUnits(final List<String> modelTypeIds,
-			final WorkingContext context, final Object from) {
+	public List<SourceUnit> getOpenSourceUnits(final List<String> modelTypeIds,
+			final @Nullable WorkingContext context, final Object from) {
 		final List<ModelItem> includedModelItems= getOpenModelItems(modelTypeIds);
 		if (includedModelItems.isEmpty()) {
 			return Collections.emptyList();
 		}
 		
-		final ArrayList<ISourceUnit> list= new ArrayList<>(4);
+		final ArrayList<SourceUnit> list= new ArrayList<>(4);
 		
 		for (int i= 0; i < includedModelItems.size(); i++) {
 			final ImList<ContextItem> contextItems= this.modelItems.get(i).getOpenContextItems(context);
@@ -469,7 +472,7 @@
 			}
 			
 			for (final ContextItem contextItem : contextItems) {
-				final ISourceUnit su= contextItem.getOpenSu(from);
+				final SourceUnit su= contextItem.getOpenSu(from);
 				if (su != null) {
 					list.add(su);
 				}
@@ -479,10 +482,10 @@
 	}
 	
 	
-	private IContentType detectContentType(final Object from) {
+	private @Nullable IContentType detectContentType(final Object from) {
 		try {
 			if (from instanceof IFile) {
-				final IFile file= (IFile) from;
+				final IFile file= (IFile)from;
 				final IContentDescription contentDescription= file.getContentDescription();
 				if (contentDescription != null) {
 					return contentDescription.getContentType();
@@ -492,7 +495,7 @@
 				}
 			}
 			else if (from instanceof IFileStore) {
-				final IFileStore file= (IFileStore) from;
+				final IFileStore file= (IFileStore)from;
 				try (final InputStream stream= file.openInputStream(EFS.NONE, null)) {
 					final IContentDescription contentDescription= Platform.getContentTypeManager()
 							.getDescriptionFor(stream, file.getName(), IContentDescription.ALL);
@@ -509,7 +512,7 @@
 			}
 		}
 		catch (final CoreException | IOException | UnsupportedOperationException e) {
-			LTKCorePlugin.log(new Status(IStatus.ERROR, LTK.BUNDLE_ID, 0,
+			LtkCorePlugin.log(new Status(IStatus.ERROR, Ltk.BUNDLE_ID, 0,
 					"An error occurred when trying to detect content type of " + from,
 					e ));
 			return null;
@@ -517,8 +520,6 @@
 	}
 	
 	
-	
-	
 	private ModelItem getModelItem(final String modelTypeId) {
 		final ImList<ModelItem> modelItems= this.modelItems;
 		for (final ModelItem modelItem : modelItems) {
@@ -536,7 +537,7 @@
 		}
 	}
 	
-	private List<ModelItem> getOpenModelItems(final String modelTypeId) {
+	private List<ModelItem> getOpenModelItems(final @Nullable String modelTypeId) {
 		final ImList<ModelItem> modelItems= this.modelItems;
 		if (modelTypeId != null) {
 			for (final ModelItem modelItem : modelItems) {
@@ -551,7 +552,7 @@
 		}
 	}
 	
-	private List<ModelItem> getOpenModelItems(final List<String> modelTypeIds) {
+	private List<ModelItem> getOpenModelItems(final @Nullable List<String> modelTypeIds) {
 		final ImList<ModelItem> modelItems= this.modelItems;
 		if (modelTypeIds != null) {
 			final List<ModelItem> matches= new ArrayList<>(modelTypeIds.size());
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/AstInfo.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/AstInfo.java
index 15faf9b..fad83c8 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/AstInfo.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/AstInfo.java
@@ -16,7 +16,7 @@
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
-import org.eclipse.statet.ltk.core.ISourceModelStamp;
+import org.eclipse.statet.ltk.core.SourceModelStamp;
 
 
 /**
@@ -39,14 +39,14 @@
 	public static final int LEVEL_MODEL_DEFAULT=           0x4;
 	
 	
-	private final ISourceModelStamp stamp;
+	private final SourceModelStamp stamp;
 	
 	private final int level;
 	
 	private final AstNode root;
 	
 	
-	public AstInfo(final int level, final ISourceModelStamp stamp, final AstNode root) {
+	public AstInfo(final int level, final SourceModelStamp stamp, final AstNode root) {
 		this.level= level;
 		this.stamp= stamp;
 		this.root= root;
@@ -64,7 +64,7 @@
 	 * 
 	 * @return the stamp
 	 */
-	public ISourceModelStamp getStamp() {
+	public SourceModelStamp getStamp() {
 		return this.stamp;
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/Ast.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/Asts.java
similarity index 97%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/Ast.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/Asts.java
index 30855d6..dd689cd 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/Ast.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/Asts.java
@@ -18,7 +18,7 @@
 
 
 @NonNullByDefault
-public class Ast {
+public class Asts {
 	
 	
 	public static final AstNode getRoot(AstNode node) {
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/StatusDetail.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/StatusDetail.java
index ada1acf..f340068 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/StatusDetail.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/StatusDetail.java
@@ -31,7 +31,7 @@
 	public static final @Nullable StatusDetail getStatusDetail(final AstNode node) {
 		for (final Object aAttachment : node.getAttachments()) {
 			if (aAttachment instanceof StatusDetail) {
-				return (StatusDetail) aAttachment;
+				return (StatusDetail)aAttachment;
 			}
 		}
 		return null;
@@ -58,7 +58,7 @@
 			return true;
 		}
 		if (obj instanceof StatusDetail) {
-			final StatusDetail other= (StatusDetail) obj;
+			final StatusDetail other= (StatusDetail)obj;
 			return (equalsByOffsets(other)
 					&& Objects.equals(this.text, other.text) );
 		}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/util/AstPrinter.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/util/AstPrinter.java
index 31814e1..dd7015e 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/util/AstPrinter.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/util/AstPrinter.java
@@ -55,7 +55,7 @@
 			node.accept(this);
 		}
 		catch (final InvocationTargetException e) {
-			throw (IOException) e.getCause();
+			throw (IOException)e.getCause();
 		}
 		finally {
 			this.text= null;
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/ElementName.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/ElementName.java
index ea15bcf..c92f96e 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/ElementName.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/ElementName.java
@@ -19,11 +19,11 @@
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
 
 
 /**
- * Name of an element like an {@link IModelElement}.
+ * Name of an element like an {@link LtkModelElement}.
  * <p>
  * A element name consists of one or multiple segments. Each segment is of a special
  * type (to differ different way to identify the element). The type is model type dependent.
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/IExtContentTypeManager.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/IExtContentTypeManager.java
index f760cc3..43b4e55 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/IExtContentTypeManager.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/IExtContentTypeManager.java
@@ -14,6 +14,9 @@
 
 package org.eclipse.statet.ltk.core;
 
+import org.eclipse.statet.ltk.model.core.ModelTypeDescriptor;
+
+
 /**
  * Allows multiple content types in addition to the primary content type.
  * <p>
@@ -28,8 +31,8 @@
 	boolean matchesActivatedContentType(String primaryContentTypeId, String secondaryContentTypeId, boolean self);
 	
 	
-	IModelTypeDescriptor getModelType(String modelTypeId);
+	ModelTypeDescriptor getModelType(String modelTypeId);
 	
-	IModelTypeDescriptor getModelTypeForContentType(String contentTypeId);
+	ModelTypeDescriptor getModelTypeForContentType(String contentTypeId);
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/LTKUtils.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/LTKUtils.java
deleted file mode 100644
index 32dc0b3..0000000
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/LTKUtils.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*=============================================================================#
- # Copyright (c) 2009, 2020 Stephan Wahlbrink and others.
- # 
- # This program and the accompanying materials are made available under the
- # terms of the Eclipse Public License 2.0 which is available at
- # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
- # which is available at https://www.apache.org/licenses/LICENSE-2.0.
- # 
- # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
- # 
- # Contributors:
- #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
- #=============================================================================*/
-
-package org.eclipse.statet.ltk.core;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.statet.jcommons.text.core.TextRegion;
-
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-
-
-public class LTKUtils {
-	
-	
-	public static IModelElement getModelElement(final Object element) {
-		if (element instanceof IModelElement) {
-			return (IModelElement) element;
-		}
-		if (element instanceof IAdaptable) {
-			return ((IAdaptable) element).getAdapter(IModelElement.class);
-		}
-		return null;
-	}
-	
-	public static ISourceUnit getSourceUnit(final IModelElement element) {
-		if (element instanceof ISourceUnit) {
-			return (ISourceUnit) element;
-		}
-		if (element instanceof ISourceElement) {
-			return ((ISourceElement) element).getSourceUnit();
-		}
-		return null;
-	}
-	
-	public static ISourceStructElement getCoveringSourceElement(final ISourceStructElement root, final TextRegion region) {
-		return getCoveringSourceElement(root, region.getStartOffset(), region.getEndOffset());
-	}
-	
-	public static ISourceStructElement getCoveringSourceElement(final ISourceStructElement root,
-			final int startOffset, final int endOffset) {
-		ISourceStructElement ok= root;
-		CHECK: while (ok != null) {
-			final List<? extends ISourceStructElement> children= ok.getSourceChildren(null);
-			for (final ISourceStructElement child : children) {
-				final TextRegion sourceRange= child.getSourceRange();
-				final TextRegion docRange= child.getDocumentationRange();
-				final int childOffset= (docRange != null) ?
-						Math.min(sourceRange.getStartOffset(), docRange.getStartOffset()) :
-						sourceRange.getStartOffset();
-				if (startOffset >= childOffset) {
-					final int childEnd= (docRange != null) ?
-							Math.max(sourceRange.getEndOffset(), docRange.getEndOffset()) :
-							sourceRange.getEndOffset();
-					if ((startOffset < endOffset) ?
-							(endOffset <= childEnd) : (endOffset < childEnd)) {
-						ok= child;
-						continue CHECK;
-					}
-				}
-				else {
-					break CHECK;
-				}
-			}
-			break CHECK;
-		}
-		return ok;
-	}
-	
-	public static int searchCoveringSourceElement(final List<? extends ISourceStructElement> elements,
-			final int offset) {
-		// binary search
-		int low= 0;
-		int high= elements.size() - 1;
-		while (low <= high) {
-			final int mid= (low + high) >> 1;
-			final TextRegion region= elements.get(mid).getSourceRange();
-			
-			if (region.getEndOffset() < offset) {
-				low= mid + 1;
-			}
-			else if (region.getStartOffset() > offset) {
-				high= mid - 1;
-			}
-			else {
-				return mid;
-			}
-		}
-		return -(low + 1);
-	}
-	
-	public static <T extends ISourceStructElement> T getCoveringSourceElement(final List<T> elements,
-			final int offset) {
-		final int idx= searchCoveringSourceElement(elements, offset);
-		if (idx >= 0) {
-			return elements.get(idx);
-		}
-		return null;
-	}
-	
-}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/LTK.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/Ltk.java
similarity index 69%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/LTK.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/Ltk.java
index 8441b56..abf6afa 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/LTK.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/Ltk.java
@@ -14,11 +14,13 @@
 
 package org.eclipse.statet.ltk.core;
 
-import org.eclipse.statet.internal.ltk.core.LTKCorePlugin;
-import org.eclipse.statet.ltk.model.core.ISourceUnitManager;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.internal.ltk.core.LtkCorePlugin;
 
 
-public class LTK {
+@NonNullByDefault
+public class Ltk {
 	
 	
 	public static final String BUNDLE_ID= "org.eclipse.statet.ltk.core"; //$NON-NLS-1$
@@ -29,16 +31,8 @@
 	public static final WorkingContext EDITOR_CONTEXT= new WorkingContext("editor.default"); //$NON-NLS-1$
 	
 	
-	public static ISourceUnitManager getSourceUnitManager() {
-		return LTKCorePlugin.getSafe().getSourceUnitManager();
-	}
-	
 	public static IExtContentTypeManager getExtContentTypeManager() {
-		return LTKCorePlugin.getSafe().getContentTypeServices();
-	}
-	
-	public static Object getModelAdapter(final String type, final Class<?> adapterType) {
-		return LTKCorePlugin.getSafe().getModelAdapterFactory().get(type, adapterType);
+		return LtkCorePlugin.getSafe().getContentTypeServices();
 	}
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/SourceContent.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/SourceContent.java
index db94d9a..0f6478c 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/SourceContent.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/SourceContent.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ltk.core;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.text.core.BasicTextRegion;
 import org.eclipse.statet.jcommons.text.core.TextLineInformation;
 import org.eclipse.statet.jcommons.text.core.TextRegion;
@@ -23,6 +25,7 @@
 /**
  * Source code with time stamp.
  */
+@NonNullByDefault
 public class SourceContent extends BasicTextRegion implements TextRegion {
 	
 	
@@ -33,24 +36,24 @@
 	
 	private final String text;
 	
-	private volatile TextLineInformation lines;
+	private volatile @Nullable TextLineInformation lines;
 	
 	
 	public SourceContent(final long stamp, final String text) {
-		this(stamp, text, 0, null);
+		this(stamp, text, 0);
 	}
 	
 	public SourceContent(final long stamp, final String text, final int startOffset) {
-		this(stamp, text, startOffset, null);
+		super(startOffset, startOffset + text.length());
+		this.stamp= stamp;
+		this.text= text;
+		this.lines= null;
 	}
 	
 	public SourceContent(final long stamp, final String text,
 			final int startOffset,
 			final TextLineInformation lines) {
 		super(startOffset, startOffset + text.length());
-		if (text == null) {
-			throw new NullPointerException("text"); //$NON-NLS-1$
-		}
 		this.stamp= stamp;
 		this.text= text;
 		this.lines= lines;
@@ -80,14 +83,16 @@
 //	public final int getEndOffset() {
 	
 	public final TextLineInformation getLines() {
-		if (this.lines == null) {
+		TextLineInformation lines= this.lines;
+		if (lines == null) {
 			synchronized (LINES_CREATOR) {
-				if (this.lines == null) {
-					this.lines= LINES_CREATOR.create(this.text);
+				lines= this.lines;
+				if (lines == null) {
+					lines= LINES_CREATOR.create(this.text);
 				}
 			}
 		}
-		return this.lines;
+		return lines;
 	}
 	
 	
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/ISourceModelStamp.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/SourceModelStamp.java
similarity index 81%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/ISourceModelStamp.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/SourceModelStamp.java
index 3cdaa85..18be2f2 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/ISourceModelStamp.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/SourceModelStamp.java
@@ -16,14 +16,17 @@
 
 import org.eclipse.jface.text.IDocumentExtension4;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 
 /**
  * The version of a source model like an AST.
  * 
- * Beside the {@link #getSourceStamp() source content stamp} it can e.g. consider the language
+ * Beside the {@link #getContentStamp() source content stamp} it can e.g. consider the language
  * configuration used when parsing the source.
  */
-public interface ISourceModelStamp {
+@NonNullByDefault
+public interface SourceModelStamp {
 	
 	
 	/**
@@ -34,6 +37,6 @@
 	 * 
 	 * @return the stamp
 	 */
-	long getSourceStamp();
+	long getContentStamp();
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/WorkingContext.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/WorkingContext.java
index e86a93b..21e30a0 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/WorkingContext.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/WorkingContext.java
@@ -14,15 +14,18 @@
 
 package org.eclipse.statet.ltk.core;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 /**
  * Represents a context when working with LTK sources and models.
  * <p>
  * The objects can be used to identify the context (by identity). It has only the
  * key attribute and doesn't provides further functions.</p>
  * 
- * @see LTK
+ * @see Ltk
  * @noextend
  */
+@NonNullByDefault
 public final class WorkingContext {
 	
 	
@@ -44,7 +47,6 @@
 		return this.key.hashCode();
 	}
 	
-	
 	@Override
 	public String toString() {
 		return this.key;
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/util/NameUtils.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/util/NameUtils.java
index 199870c..72c2521 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/util/NameUtils.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/util/NameUtils.java
@@ -20,7 +20,7 @@
 import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
-import org.eclipse.statet.ltk.model.core.elements.NameAccess;
+import org.eclipse.statet.ltk.model.core.element.NameAccess;
 
 
 @NonNullByDefault
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/ProblemRequestor.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/ProblemRequestor.java
index df2f8f0..5a1670f 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/ProblemRequestor.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/ProblemRequestor.java
@@ -18,13 +18,13 @@
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
  * Accept problems by a problem checker.
  * 
- * {@link ISourceUnit#getProblemRequestor()}
+ * {@link SourceUnit#getProblemRequestor()}
  */
 @NonNullByDefault
 public interface ProblemRequestor {
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/TaskPriority.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/TaskPriority.java
index 0e363e5..796e841 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/TaskPriority.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/TaskPriority.java
@@ -16,7 +16,10 @@
 
 import org.eclipse.core.resources.IMarker;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
+
+@NonNullByDefault
 public enum TaskPriority {
 	
 	
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/ITaskTag.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/TaskTag.java
similarity index 88%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/ITaskTag.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/TaskTag.java
index 3d979c1..8fe3e1c 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/ITaskTag.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/TaskTag.java
@@ -14,10 +14,15 @@
 
 package org.eclipse.statet.ltk.issues.core;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+
 /**
  * 
  */
-public interface ITaskTag {
+@NonNullByDefault
+public interface TaskTag {
+	
 	
 	String getKeyword();
 	
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/impl/TaskTag.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/impl/BasicTaskTag.java
similarity index 83%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/impl/TaskTag.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/impl/BasicTaskTag.java
index 76f0ac1..edf303c 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/impl/TaskTag.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/impl/BasicTaskTag.java
@@ -14,11 +14,14 @@
 
 package org.eclipse.statet.ltk.issues.core.impl;
 
-import org.eclipse.statet.ltk.issues.core.ITaskTag;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 import org.eclipse.statet.ltk.issues.core.TaskPriority;
+import org.eclipse.statet.ltk.issues.core.TaskTag;
 
 
-public class TaskTag implements ITaskTag {
+@NonNullByDefault
+public class BasicTaskTag implements TaskTag {
 	
 	
 	private final String keyword;
@@ -26,7 +29,7 @@
 	private final TaskPriority priority;
 	
 	
-	public TaskTag(final String tag, final TaskPriority priority) {
+	public BasicTaskTag(final String tag, final TaskPriority priority) {
 		this.keyword= tag;
 		this.priority= priority;
 	}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/impl/TaskMarkerHandler.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/impl/TaskMarkerHandler.java
index c330bc2..5ae4e66 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/impl/TaskMarkerHandler.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/impl/TaskMarkerHandler.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ltk.issues.core.impl;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -25,19 +27,22 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jface.text.BadLocationException;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.text.core.TextLineInformation;
 
-import org.eclipse.statet.ltk.issues.core.ITaskTag;
 import org.eclipse.statet.ltk.issues.core.TaskPriority;
+import org.eclipse.statet.ltk.issues.core.TaskTag;
 
 
+@NonNullByDefault
 public class TaskMarkerHandler {
 	
 	
 	private final String markerId;
 	
-	private Pattern taskTagPattern;
-	private Map<String, TaskPriority> taskTagMap;
+	private @Nullable Pattern taskTagPattern;
+	private final Map<String, TaskPriority> taskTagMap= new HashMap<>();
 	
 	private IResource resource;
 	
@@ -52,9 +57,11 @@
 	}
 	
 	public void addTaskMarker(final String message, final int offset, int lineNumber, final String match) 
-		throws CoreException {
-		
+			throws CoreException {
 		final TaskPriority prio= this.taskTagMap.get(match);
+		if (prio == null) {
+			return;
+		}
 		
 		final IMarker marker= this.resource.createMarker(this.markerId);
 		
@@ -75,19 +82,18 @@
 		this.resource.deleteMarkers(this.markerId, false, IResource.DEPTH_INFINITE);
 	}
 	
-	protected void initTaskPattern(final List<ITaskTag> taskTags) {
+	protected void initTaskPattern(final List<TaskTag> taskTags) {
 		this.taskTagPattern= null;
-		this.taskTagMap= null;
+		this.taskTagMap.clear();
 		
 		if (taskTags.isEmpty()) {
 			return;
 		}
 		
-		this.taskTagMap= new HashMap<>(taskTags.size());
 		final String separatorRegex= "[^\\p{L}\\p{N}]"; //$NON-NLS-1$
 		final StringBuilder regex= new StringBuilder(separatorRegex);
 		regex.append('(');
-		for (final ITaskTag taskTag : taskTags) {
+		for (final TaskTag taskTag : taskTags) {
 			regex.append(Pattern.quote(taskTag.getKeyword()));
 			regex.append('|'); 
 			this.taskTagMap.put(taskTag.getKeyword(), taskTag.getPriority());
@@ -99,13 +105,16 @@
 	
 	public void checkForTasks(final String content, final int offset, final TextLineInformation lines)
 			throws CoreException, BadLocationException {
-		if (this.taskTagPattern != null) {
-			final Matcher matcher= this.taskTagPattern.matcher(content);
-			if (matcher.find()) {
-				final int start= matcher.start(1);
-				final String text= new String(content.substring(start));
-				addTaskMarker(text, offset+start, lines.getLineOfOffset(offset)+1, matcher.group(1));
-			}
+		final Pattern taskTagPattern= this.taskTagPattern;
+		if (taskTagPattern == null) {
+			return;
+		}
+		final Matcher matcher= taskTagPattern.matcher(content);
+		if (matcher.find()) {
+			final int start= matcher.start(1);
+			final String text= new String(content.substring(start));
+			addTaskMarker(text, offset + start, lines.getLineOfOffset(offset) + 1,
+					nonNullAssert(matcher.group(1)) );
 		}
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IModelElementDelta.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/DocumentModelProvider.java
similarity index 71%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IModelElementDelta.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/DocumentModelProvider.java
index fa3357b..2379a25 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IModelElementDelta.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/DocumentModelProvider.java
@@ -14,16 +14,16 @@
 
 package org.eclipse.statet.ltk.model.core;
 
-import org.eclipse.statet.ltk.ast.core.AstInfo;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
-public interface IModelElementDelta {
+@NonNullByDefault
+public interface DocumentModelProvider {
 	
 	
-	IModelElement getModelElement();
-	
-	AstInfo getOldAst();
-	AstInfo getNewAst();
+	@Nullable SourceUnit getWorkingCopy(final Object element);
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ElementChangedEvent.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ElementChangedEvent.java
index a337475..eace5a6 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ElementChangedEvent.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ElementChangedEvent.java
@@ -15,6 +15,7 @@
 package org.eclipse.statet.ltk.model.core;
 
 import org.eclipse.statet.ltk.core.WorkingContext;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElementDelta;
 
 
 /**
@@ -26,14 +27,14 @@
  * Instances of this class are automatically created by the Java model.
  * </p>
  * 
- * @see IElementChangedListener
+ * @see ElementChangedListener
  * @see IJavaElementDelta
  */
 public class ElementChangedEvent {
 	
 	
 	public final WorkingContext context;
-	public final IModelElementDelta delta;
+	public final LtkModelElementDelta delta;
 	
 	
 	/**
@@ -42,7 +43,7 @@
 	 * @param delta the Java element delta.
 	 * @param type the type of delta (ADDED, REMOVED, CHANGED) this event contains
 	 */
-	public ElementChangedEvent(final IModelElementDelta delta, final WorkingContext context) {
+	public ElementChangedEvent(final LtkModelElementDelta delta, final WorkingContext context) {
 		this.context= context;
 		this.delta= delta;
 	}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IElementChangedListener.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ElementChangedListener.java
similarity index 86%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IElementChangedListener.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ElementChangedListener.java
index bf6ab48..25809a7 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IElementChangedListener.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ElementChangedListener.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ltk.model.core;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 
 /**
  * An element changed listener receives notification of changes to language elements
@@ -21,7 +23,8 @@
  * <p>
  * This interface may be implemented by clients.</p>
  */
-public interface IElementChangedListener {
+@NonNullByDefault
+public interface ElementChangedListener {
 	
 	
 	/**
@@ -30,6 +33,6 @@
 	 * 
 	 * @param event the change event
 	 */
-	public void elementChanged(ElementChangedEvent event);
+	void elementChanged(final ElementChangedEvent event);
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ElementSet.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ElementSet.java
index 9955a3c..fe261b7 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ElementSet.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ElementSet.java
@@ -14,9 +14,10 @@
 
 package org.eclipse.statet.ltk.model.core;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import java.nio.channels.IllegalSelectorException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -29,23 +30,25 @@
 
 import org.eclipse.statet.jcommons.collections.ImCollections;
 import org.eclipse.statet.jcommons.collections.ImList;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
-import org.eclipse.statet.ltk.core.LTKUtils;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.IWorkspaceSourceUnit;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.WorkspaceSourceUnit;
 
 
+@NonNullByDefault
 public class ElementSet {
 	
 	
-	public static String[] getAffectedProjectNatures(final ElementSet set)
+	public static Set<String> getAffectedProjectNatures(final ElementSet set)
 			throws CoreException {
-		return getAffectedProjectNatures(Collections.singletonList(set));
+		return getAffectedProjectNatures(ImCollections.newList(set));
 	}
 	
-	public static String[] getAffectedProjectNatures(final List<ElementSet> sets)
+	public static Set<String> getAffectedProjectNatures(final List<ElementSet> sets)
 			throws CoreException {
 		final Set<String> natureIds= new HashSet<>();
 		for (final ElementSet set : sets) {
@@ -57,7 +60,7 @@
 				}
 			}
 		}
-		return natureIds.toArray(new String[natureIds.size()]);
+		return natureIds;
 	}
 	
 	
@@ -65,10 +68,10 @@
 	private static final int POST_PROCESS= 0x70000;
 	
 	
-	protected ImList<Object> initialElements;
+	private final ImList<Object> initialElements;
 	
-	private List<IModelElement> modelElements;
-	private List<IResource> resources;
+	private List<LtkModelElement<?>> modelElements= new ArrayList<>();
+	private List<IResource> resources= new ArrayList<>();
 	
 	private int processState= 0;
 	private List<IResource> resourcesOwnedByElements;
@@ -79,12 +82,6 @@
 		this.initialElements= ImCollections.toList(elements);
 		init(elements);
 		
-		if (this.modelElements == null) {
-			this.modelElements= new ArrayList<>(0);
-		}
-		if (this.resources == null) {
-			this.resources= new ArrayList<>(0);
-		}
 		if (countElements() == this.initialElements.size()) {
 			this.processState= POST_INIT;
 		}
@@ -105,18 +102,19 @@
 	}
 	
 	protected void add(final Object o) {
-		if (o instanceof IModelElement) {
-			if (this.modelElements == null) {
-				this.modelElements= new ArrayList<>();
-			}
-			this.modelElements.add((IModelElement) o);
+		if (o instanceof LtkModelElement) {
+			this.modelElements.add((LtkModelElement<?>)o);
 			return;
 		}
 		if (o instanceof IResource) {
+			final IResource resource = (IResource)o;
+			if (resource.getType() == IResource.ROOT) {
+				throw new IllegalArgumentException("ROOT");
+			}
 			if (this.resources == null) {
 				this.resources= new ArrayList<>();
 			}
-			this.resources.add((IResource) o);
+			this.resources.add((IResource)o);
 			return;
 		}
 	}
@@ -142,7 +140,7 @@
 		return this.resources;
 	}
 	
-	public List<IModelElement> getModelElements() {
+	public List<LtkModelElement<?>> getModelElements() {
 		return this.modelElements;
 	}
 	
@@ -154,8 +152,8 @@
 		return this.filesContainingElements;
 	}
 	
-	public IResource getOwningResource(final IModelElement element) {
-		if ((element.getElementType() & IModelElement.MASK_C2) < IModelElement.C2_SOURCE_CHUNK) {
+	public @Nullable IResource getOwningResource(final LtkModelElement<?> element) {
+		if ((element.getElementType() & LtkModelElement.MASK_C2) < LtkModelElement.C2_SOURCE_CHUNK) {
 			IResource resource;
 			resource= element.getAdapter(IResource.class);
 			return resource;
@@ -163,15 +161,15 @@
 		return null;
 	}
 	
-	public IResource getResource(final IModelElement element) {
-		final ISourceUnit su= LTKUtils.getSourceUnit(element);
-		if (su instanceof IWorkspaceSourceUnit) {
-			return ((IWorkspaceSourceUnit) su).getResource();
+	public @Nullable IResource getResource(final LtkModelElement<?> element) {
+		final SourceUnit su= LtkModelUtils.getSourceUnit(element);
+		if (su instanceof WorkspaceSourceUnit) {
+			return ((WorkspaceSourceUnit)su).getResource();
 		}
 		return null;
 	}
 	
-	public IProject getSingleProject() {
+	public @Nullable IProject getSingleProject() {
 		IProject project= null;
 		for (final IResource resource : this.resources) {
 			final IProject p= resource.getProject();
@@ -183,7 +181,7 @@
 				return null;
 			}
 		}
-		for (final IModelElement element : this.modelElements) {
+		for (final LtkModelElement<?> element : this.modelElements) {
 			final IResource resource= getResource(element);
 			if (resource == null) {
 				continue;
@@ -203,12 +201,12 @@
 	public Set<IProject> getProjects() {
 		final Set<IProject> projects= new HashSet<>();
 		for (final IResource resource : this.resources) {
-			projects.add(resource.getProject());
+			projects.add(nonNullAssert(resource.getProject()));
 		}
-		for (final IModelElement element : this.modelElements) {
+		for (final LtkModelElement<?> element : this.modelElements) {
 			final IResource resource= getResource(element);
 			if (resource != null) {
-				projects.add(resource.getProject());
+				projects.add(nonNullAssert(resource.getProject()));
 			}
 		}
 		return projects;
@@ -264,7 +262,7 @@
 		final Iterator<IResource> iter= this.resources.iterator();
 		ITER_RESOURCE : while (iter.hasNext()) {
 			final IResource subResource= iter.next();
-			for (final IModelElement superElement : this.modelElements) {
+			for (final LtkModelElement<?> superElement : this.modelElements) {
 				if (isDescendantOf(subResource, superElement)) {
 					iter.remove();
 					continue ITER_RESOURCE;
@@ -274,10 +272,10 @@
 	}
 	
 	private void removeModelElementsDescendantsOfModelElements() {
-		final Iterator<IModelElement> iter= this.modelElements.iterator();
+		final Iterator<LtkModelElement<?>> iter= this.modelElements.iterator();
 		ITER_ELEMENT : while (iter.hasNext()) {
-			final IModelElement subElement= iter.next();
-			for (final IModelElement superElement : this.modelElements) {
+			final LtkModelElement<?> subElement= iter.next();
+			for (final LtkModelElement<?> superElement : this.modelElements) {
 				if (isDescendantOf(subElement, superElement)) {
 					iter.remove();
 					continue ITER_ELEMENT;
@@ -286,11 +284,11 @@
 		}
 	}
 	
-	public boolean includes(final IModelElement element) {
+	public boolean includes(final LtkModelElement<?> element) {
 		if (this.modelElements.contains(element)) {
 			return true;
 		}
-		for (final IModelElement e : this.modelElements) {
+		for (final LtkModelElement<?> e : this.modelElements) {
 			if (isDescendantOf(element, e)) {
 				return true;
 			}
@@ -303,7 +301,7 @@
 		return !subResource.equals(superResource) && superResource.getFullPath().isPrefixOf(subResource.getFullPath());
 	}
 	
-	protected boolean isDescendantOf(final IResource subResource, final IModelElement superElement) {
+	protected boolean isDescendantOf(final IResource subResource, final LtkModelElement<?> superElement) {
 		final IResource superResource= getOwningResource(superElement);
 		if (superResource != null) {
 			return isDescendantOf(subResource, superResource);
@@ -311,12 +309,12 @@
 		return false;
 	}
 	
-	protected boolean isDescendantOf(final IModelElement subElement, final IModelElement superElement) {
+	protected boolean isDescendantOf(final LtkModelElement<?> subElement, final LtkModelElement<?> superElement) {
 		if (subElement.equals(superElement)
-				|| !(subElement instanceof ISourceStructElement)) {
+				|| !(subElement instanceof SourceStructElement)) {
 			return false;
 		}
-		ISourceStructElement parent= ((ISourceStructElement) subElement).getSourceParent();
+		SourceStructElement<?, ?> parent= ((SourceStructElement<?, ?>)subElement).getSourceParent();
 		while (parent != null){
 			if (parent.equals(superElement)) {
 				return true;
@@ -326,7 +324,7 @@
 		return false;
 	}
 	
-	protected void setModelElements(final List<IModelElement> newElements) {
+	protected void setModelElements(final List<LtkModelElement<?>> newElements) {
 		if (this.processState >= POST_PROCESS) {
 			throw new IllegalSelectorException();
 		}
@@ -340,7 +338,7 @@
 		if (this.processState < POST_PROCESS) {
 			this.resourcesOwnedByElements= new ArrayList<>(1);
 			this.filesContainingElements= new ArrayList<>(1);
-			for (final IModelElement element : this.modelElements) {
+			for (final LtkModelElement<?> element : this.modelElements) {
 				IResource resource;
 				resource= getOwningResource(element);
 				if (resource != null) {
@@ -349,7 +347,7 @@
 				}
 				resource= getResource(element);
 				if (resource != null && resource.getType() == IResource.FILE) {
-					this.filesContainingElements.add((IFile) resource);
+					this.filesContainingElements.add((IFile)resource);
 					continue;
 				}
 			}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IDocumentModelProvider.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IDocumentModelProvider.java
deleted file mode 100644
index b6069e5..0000000
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IDocumentModelProvider.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*=============================================================================#
- # Copyright (c) 2007, 2020 Stephan Wahlbrink and others.
- # 
- # This program and the accompanying materials are made available under the
- # terms of the Eclipse Public License 2.0 which is available at
- # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
- # which is available at https://www.apache.org/licenses/LICENSE-2.0.
- # 
- # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
- # 
- # Contributors:
- #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
- #=============================================================================*/
-
-package org.eclipse.statet.ltk.model.core;
-
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-
-
-public interface IDocumentModelProvider {
-	
-	
-	ISourceUnit getWorkingCopy(final Object element);
-	
-}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/LtkModelUtils.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/LtkModelUtils.java
new file mode 100644
index 0000000..5078053
--- /dev/null
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/LtkModelUtils.java
@@ -0,0 +1,155 @@
+/*=============================================================================#
+ # Copyright (c) 2009, 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.ltk.model.core;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+import org.eclipse.statet.jcommons.text.core.TextRegion;
+
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElementFilter;
+import org.eclipse.statet.ltk.model.core.element.SourceElement;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+
+
+@NonNullByDefault
+public final class LtkModelUtils {
+	
+	
+	public static @Nullable LtkModelElement<?> getModelElement(final @Nullable Object element) {
+		if (element instanceof LtkModelElement) {
+			return (LtkModelElement<?>)element;
+		}
+		if (element instanceof IAdaptable) {
+			return ((IAdaptable)element).getAdapter(LtkModelElement.class);
+		}
+		return null;
+	}
+	
+	public static @Nullable SourceUnit getSourceUnit(final @Nullable LtkModelElement<?> element) {
+		if (element instanceof SourceUnit) {
+			return (SourceUnit)element;
+		}
+		if (element instanceof SourceElement) {
+			return ((SourceElement<?>)element).getSourceUnit();
+		}
+		return null;
+	}
+	
+	
+	public static final <T> boolean hasChildren(final List<? extends @NonNull T> children, final @Nullable LtkModelElementFilter<? super @NonNull T> filter) {
+		if (filter == null) {
+			return (!children.isEmpty());
+		}
+		else {
+			for (final T child : children) {
+				if (filter.include(child)) {
+					return true;
+				}
+			}
+			return false;
+		}
+	}
+	
+	public static final <T> List<? extends T> getChildren(final List<? extends @NonNull T> children, final @Nullable LtkModelElementFilter<? super @NonNull T> filter) {
+		if (filter == null) {
+			return children;
+		}
+		else {
+			final ArrayList<T> filtered= new ArrayList<>(children.size());
+			for (final T child : children) {
+				if (filter.include(child)) {
+					filtered.add(child);
+				}
+			}
+			return filtered;
+		}
+	}
+	
+	
+	public static @Nullable SourceStructElement getCoveringSourceElement(final SourceStructElement root,
+			final TextRegion region) {
+		return getCoveringSourceElement(root, region.getStartOffset(), region.getEndOffset());
+	}
+	
+	public static @Nullable SourceStructElement getCoveringSourceElement(final SourceStructElement root,
+			final int startOffset, final int endOffset) {
+		SourceStructElement ok= root;
+		CHECK: while (ok != null) {
+			final List<? extends SourceStructElement> children= ok.getSourceChildren(null);
+			for (final SourceStructElement child : children) {
+				final TextRegion sourceRange= child.getSourceRange();
+				final TextRegion docRange= child.getDocumentationRange();
+				final int childOffset= (docRange != null) ?
+						Math.min(sourceRange.getStartOffset(), docRange.getStartOffset()) :
+						sourceRange.getStartOffset();
+				if (startOffset >= childOffset) {
+					final int childEnd= (docRange != null) ?
+							Math.max(sourceRange.getEndOffset(), docRange.getEndOffset()) :
+							sourceRange.getEndOffset();
+					if ((startOffset < endOffset) ?
+							(endOffset <= childEnd) : (endOffset < childEnd)) {
+						ok= child;
+						continue CHECK;
+					}
+				}
+				else {
+					break CHECK;
+				}
+			}
+			break CHECK;
+		}
+		return ok;
+	}
+	
+	public static int searchCoveringSourceElement(final List<? extends SourceStructElement> elements,
+			final int offset) {
+		// binary search
+		int low= 0;
+		int high= elements.size() - 1;
+		while (low <= high) {
+			final int mid= (low + high) >> 1;
+			final TextRegion region= elements.get(mid).getSourceRange();
+			
+			if (region.getEndOffset() < offset) {
+				low= mid + 1;
+			}
+			else if (region.getStartOffset() > offset) {
+				high= mid - 1;
+			}
+			else {
+				return mid;
+			}
+		}
+		return -(low + 1);
+	}
+	
+	public static <T extends SourceStructElement> @Nullable T getCoveringSourceElement(final List<T> elements,
+			final int offset) {
+		final int idx= searchCoveringSourceElement(elements, offset);
+		if (idx >= 0) {
+			return elements.get(idx);
+		}
+		return null;
+	}
+	
+}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/LtkModels.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/LtkModels.java
new file mode 100644
index 0000000..d22c855
--- /dev/null
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/LtkModels.java
@@ -0,0 +1,39 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.ltk.model.core;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.internal.ltk.core.LtkCorePlugin;
+
+
+@NonNullByDefault
+public class LtkModels {
+	
+	
+	public static SourceUnitManager getSourceUnitManager() {
+		return LtkCorePlugin.getSafe().getSourceUnitManager();
+	}
+	
+	public static @Nullable Object getModelAdapter(final String modelTypeId, final Class<?> adapterType) {
+		return LtkCorePlugin.getSafe().getModelAdapterFactory().get(modelTypeId, adapterType);
+	}
+	
+	
+	private LtkModels() {
+	}
+	
+}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IModelManager.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ModelManager.java
similarity index 65%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IModelManager.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ModelManager.java
index fbfc46c..f8ad38b 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IModelManager.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ModelManager.java
@@ -16,15 +16,18 @@
 
 import org.eclipse.core.runtime.IProgressMonitor;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 import org.eclipse.statet.ltk.core.WorkingContext;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.impl.SourceUnitModelContainer;
+import org.eclipse.statet.ltk.model.core.build.SourceUnitModelContainer;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
  * 
  */
-public interface IModelManager {
+@NonNullByDefault
+public interface ModelManager {
 	
 	int NONE=                                              0x00_00_00_00;
 	
@@ -39,14 +42,15 @@
 	/**
 	 * Refreshes the model info of all loaded source units in given context.
 	 */
-	void refresh(WorkingContext context);
+	void refresh(final WorkingContext context);
 	
-	void addElementChangedListener(IElementChangedListener listener, WorkingContext context);
-	void removeElementChangedListener(IElementChangedListener listener, WorkingContext context);
+	void addElementChangedListener(final ElementChangedListener listener, final WorkingContext context);
+	void removeElementChangedListener(final ElementChangedListener listener, final WorkingContext context);
 	
-	void registerDependentUnit(ISourceUnit su);
-	void deregisterDependentUnit(ISourceUnit su);
+	void registerDependentUnit(final SourceUnit su);
+	void deregisterDependentUnit(final SourceUnit su);
 	
-	void reconcile(SourceUnitModelContainer<?, ?> adapter, int level, IProgressMonitor monitor);
+	void reconcile(final SourceUnitModelContainer<?, ?> adapter, final int level,
+			final IProgressMonitor monitor);
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/IModelTypeDescriptor.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ModelTypeDescriptor.java
similarity index 72%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/IModelTypeDescriptor.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ModelTypeDescriptor.java
index a3a1325..8e00b5e 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/core/IModelTypeDescriptor.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ModelTypeDescriptor.java
@@ -12,16 +12,18 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.core;
+package org.eclipse.statet.ltk.model.core;
 
-import java.util.Collection;
+import org.eclipse.statet.jcommons.collections.ImCollection;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
 
-public interface IModelTypeDescriptor {
+@NonNullByDefault
+public interface ModelTypeDescriptor {
 	
 	
 	String getId();
 	
-	Collection<String> getSecondaryTypeIds();
+	ImCollection<String> getSecondaryTypeIds();
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ISourceUnitFactory.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/SourceUnitFactory.java
similarity index 67%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ISourceUnitFactory.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/SourceUnitFactory.java
index df4d344..386ea82 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ISourceUnitFactory.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/SourceUnitFactory.java
@@ -14,18 +14,22 @@
 
 package org.eclipse.statet.ltk.model.core;
 
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
- * Interface for factories creation {@link ISourceUnit}.
+ * Interface for factories creation {@link SourceUnit}.
  * Can be registered via extension point <code>org.eclipse.statet.ltk.workingContexts</code>
  */
-public interface ISourceUnitFactory {
+@NonNullByDefault
+public interface SourceUnitFactory {
 	
 	
-	String createId(Object from);
+	@Nullable String createId(final Object from);
 	
-	ISourceUnit createSourceUnit(String id, Object from);
+	@Nullable SourceUnit createSourceUnit(final String id, final Object from);
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ISourceUnitManager.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/SourceUnitManager.java
similarity index 62%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ISourceUnitManager.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/SourceUnitManager.java
index 903f738..d16e141 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/ISourceUnitManager.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/SourceUnitManager.java
@@ -19,14 +19,18 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.content.IContentType;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ltk.core.WorkingContext;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
  * Manages shared instances of source units.
  */
-public interface ISourceUnitManager {
+@NonNullByDefault
+public interface SourceUnitManager {
 	
 	/**
 	 * Returns the source unit for the given object in the given LTK model and working context.
@@ -35,7 +39,7 @@
 	 * the workspace context it is IFile, for the editor context an existing source unit
 	 * (a working copy is created) or IFileStore (URI).
 	 * The returned source unit is already connected. If it is a working copy of an existing source
-	 * unit (if <code>from</code> was instance of ISourceUnit), the parent is disconnected.
+	 * unit (if <code>from</code> was instance of SourceUnit), the parent is disconnected.
 	 * 
 	 * @param modelTypeId the model type id
 	 * @param context the working context
@@ -44,15 +48,18 @@
 	 * @param monitor
 	 * @return the source unit or <code>null</code>
 	 */
-	ISourceUnit getSourceUnit(String modelTypeId, WorkingContext context, Object from,
-			boolean create, IProgressMonitor monitor);
+	@Nullable SourceUnit getSourceUnit(final String modelTypeId, final WorkingContext context, final Object from,
+			final boolean create, final IProgressMonitor monitor);
 	
-	ISourceUnit getSourceUnit(WorkingContext context, Object from, IContentType contentType,
-			boolean create, IProgressMonitor monitor);
+	@Nullable SourceUnit getSourceUnit(final WorkingContext context, final Object from,
+			final @Nullable IContentType contentType,
+			final boolean create, final IProgressMonitor monitor);
 	
-	List<ISourceUnit> getOpenSourceUnits(String modelTypeId, WorkingContext context);
-	List<ISourceUnit> getOpenSourceUnits(List<String> modelTypeIds, WorkingContext context);
-	List<ISourceUnit> getOpenSourceUnits(List<String> modelTypeIds, WorkingContext context,
-			Object from);
+	List<SourceUnit> getOpenSourceUnits(final List<String> modelTypeIds,
+			final @Nullable WorkingContext context);
+	List<SourceUnit> getOpenSourceUnits(final String modelTypeId,
+			final @Nullable WorkingContext context);
+	List<SourceUnit> getOpenSourceUnits(final List<String> modelTypeIds,
+			final @Nullable WorkingContext context, final Object from);
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/IEmbeddingReconcileItem.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/build/EmbeddingForeignReconcileTask.java
similarity index 63%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/IEmbeddingReconcileItem.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/build/EmbeddingForeignReconcileTask.java
index aa9fa79..e021d6d 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/IEmbeddingReconcileItem.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/build/EmbeddingForeignReconcileTask.java
@@ -12,20 +12,25 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.model.core.elements;
+package org.eclipse.statet.ltk.model.core.build;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
 import org.eclipse.statet.ltk.ast.core.EmbeddingAstNode;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
 
 
-public interface IEmbeddingReconcileItem<N extends EmbeddingAstNode, E extends ISourceStructElement> {
+@NonNullByDefault
+public interface EmbeddingForeignReconcileTask<TAstNode extends EmbeddingAstNode, TElement extends SourceStructElement> {
 	
 	
 	String getForeignTypeId();
 	
-	N getAstNode();
+	TAstNode getAstNode();
 	
-	E getModelRefElement();
 	
-	void setModelTypeElement(ISourceStructElement element);
+	TElement getEmbeddingElement();
+	
+	void setEmbeddedElement(final SourceStructElement element);
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/build/SourceUnitModelContainer.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/build/SourceUnitModelContainer.java
new file mode 100644
index 0000000..6f7faae
--- /dev/null
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/build/SourceUnitModelContainer.java
@@ -0,0 +1,145 @@
+/*=============================================================================#
+ # Copyright (c) 2009, 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.ltk.model.core.build;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.ltk.ast.core.AstInfo;
+import org.eclipse.statet.ltk.core.Ltk;
+import org.eclipse.statet.ltk.core.SourceContent;
+import org.eclipse.statet.ltk.core.WorkingContext;
+import org.eclipse.statet.ltk.issues.core.ProblemRequestor;
+import org.eclipse.statet.ltk.model.core.ModelManager;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.element.WorkspaceSourceUnit;
+
+
+@NonNullByDefault
+public abstract class SourceUnitModelContainer<TSourceUnit extends SourceUnit, TModelInfo extends SourceUnitModelInfo> {
+	
+	
+	private final @Nullable WorkingContext mode;
+	
+	private final TSourceUnit unit;
+	
+	private @Nullable AstInfo astInfo;
+	
+	private @Nullable TModelInfo modelInfo;
+	
+	
+	public SourceUnitModelContainer(final TSourceUnit unit) {
+		this.unit= unit;
+		this.mode= getMode(unit);
+	}
+	
+	
+	public abstract boolean isContainerFor(String modelTypeId);
+	
+	public abstract Class<?> getAdapterClass();
+	
+	
+	protected @Nullable WorkingContext getMode(final TSourceUnit su) {
+		if (su instanceof WorkspaceSourceUnit) {
+			return su.getWorkingContext();
+		}
+		return null;
+	}
+	
+	protected final @Nullable WorkingContext getMode() {
+		return this.mode;
+	}
+	
+	
+	public TSourceUnit getSourceUnit() {
+		return this.unit;
+	}
+	
+	public SourceContent getParseContent(final IProgressMonitor monitor) {
+		return this.unit.getContent(monitor);
+	}
+	
+	public @Nullable AstInfo getAstInfo(final boolean ensureSync, final IProgressMonitor monitor) {
+		if (ensureSync) {
+			getModelManager().reconcile(this, ModelManager.AST, monitor);
+		}
+		return this.astInfo;
+	}
+	
+	public @Nullable TModelInfo getModelInfo(final int syncLevel, final IProgressMonitor monitor) {
+		if ((syncLevel & ModelManager.REFRESH) != 0) {
+			clear();
+		}
+		if ((syncLevel & 0xf) >= ModelManager.MODEL_FILE) {
+			final @Nullable TModelInfo currentModel= this.modelInfo;
+			if ((syncLevel & ModelManager.RECONCILE) != 0
+					|| currentModel == null
+					|| currentModel.getStamp().getContentStamp() == 0
+					|| currentModel.getStamp().getContentStamp() != this.unit.getContentStamp(monitor) ) {
+				getModelManager().reconcile(this, syncLevel, monitor);
+			}
+		}
+		return this.modelInfo;
+	}
+	
+	protected abstract ModelManager getModelManager();
+	
+	
+	public void clear() {
+		this.astInfo= null;
+		this.modelInfo= null;
+	}
+	
+	public @Nullable AstInfo getCurrentAst() {
+		if (this.mode == Ltk.PERSISTENCE_CONTEXT) {
+			final @Nullable TModelInfo model= getCurrentModel();
+			if (model != null) {
+				return model.getAst();
+			}
+			return null;
+		}
+		return this.astInfo;
+	}
+	
+	public void setAst(final AstInfo ast) {
+		if (this.mode == Ltk.PERSISTENCE_CONTEXT) {
+			return;
+		}
+		this.astInfo= ast;
+	}
+	
+	public @Nullable TModelInfo getCurrentModel() {
+		return this.modelInfo;
+	}
+	
+	public void setModel(final @Nullable TModelInfo modelInfo) {
+		final AstInfo astInfo;
+		if (modelInfo != null
+				&& ((astInfo= this.astInfo) == null || astInfo.getStamp().equals(modelInfo.getAst().getStamp())) ) {
+									// otherwise, the ast is probably newer
+			setAst(modelInfo.getAst());
+		}
+		this.modelInfo= modelInfo;
+	}
+	
+	
+	public @Nullable ProblemRequestor createProblemRequestor() {
+		return null;
+	}
+	
+}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/Ast.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/EmbeddingForeignElement.java
similarity index 62%
copy from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/Ast.java
copy to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/EmbeddingForeignElement.java
index 30855d6..822ca03 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/Ast.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/EmbeddingForeignElement.java
@@ -1,5 +1,5 @@
 /*=============================================================================#
- # Copyright (c) 2015, 2020 Stephan Wahlbrink and others.
+ # Copyright (c) 2009, 2020 Stephan Wahlbrink and others.
  # 
  # This program and the accompanying materials are made available under the
  # terms of the Eclipse Public License 2.0 which is available at
@@ -12,22 +12,19 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.ast.core;
+package org.eclipse.statet.ltk.model.core.element;
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 
 @NonNullByDefault
-public class Ast {
+public interface EmbeddingForeignElement<
+				TModelChild extends LtkModelElement<?>,
+				TSourceChild extends SourceStructElement<?, ?>>
+		extends SourceStructElement<TModelChild, TSourceChild> {
 	
 	
-	public static final AstNode getRoot(AstNode node) {
-		AstNode parent;
-		while ((parent= node.getParent()) != null) {
-			node= parent;
-		}
-		return node;
-	}
-	
+	@Nullable SourceStructElement<?, ?> getForeignElement();
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/IModelElement.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/LtkModelElement.java
similarity index 71%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/IModelElement.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/LtkModelElement.java
index ef89722..af0159a 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/IModelElement.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/LtkModelElement.java
@@ -12,26 +12,23 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.model.core.elements;
+package org.eclipse.statet.ltk.model.core.element;
 
 import java.util.List;
 
 import org.eclipse.core.runtime.IAdaptable;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ltk.core.ElementName;
 
 
 /**
- * Interface for all types of elements in the ltk model
+ * Interface for all types of model elements
  */
-public interface IModelElement extends IAdaptable {
-	
-	
-	interface Filter {
-		
-		boolean include(IModelElement element);
-		
-	}
+@NonNullByDefault
+public interface LtkModelElement<TModelChild extends LtkModelElement<?>> extends IAdaptable {
 	
 	
 	static final int MASK_C1=            0xf00;
@@ -60,9 +57,9 @@
 	boolean exists();
 	boolean isReadOnly();
 	
-	IModelElement getModelParent();
-	boolean hasModelChildren(Filter filter); // can also be used to visit children
-	List<? extends IModelElement> getModelChildren(Filter filter);
+	@Nullable LtkModelElement<?> getModelParent();
+	boolean hasModelChildren(final @Nullable LtkModelElementFilter<? super TModelChild> filter); // can also be used to visit children
+	List<? extends TModelChild> getModelChildren(final @Nullable LtkModelElementFilter<? super TModelChild> filter);
 	
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IModelElementDelta.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/LtkModelElementDelta.java
similarity index 69%
copy from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IModelElementDelta.java
copy to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/LtkModelElementDelta.java
index fa3357b..9107c71 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/IModelElementDelta.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/LtkModelElementDelta.java
@@ -12,18 +12,21 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.model.core;
+package org.eclipse.statet.ltk.model.core.element;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.ltk.ast.core.AstInfo;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
 
 
-public interface IModelElementDelta {
+@NonNullByDefault
+public interface LtkModelElementDelta {
 	
 	
-	IModelElement getModelElement();
+	LtkModelElement<?> getModelElement();
 	
-	AstInfo getOldAst();
-	AstInfo getNewAst();
+	@Nullable AstInfo getOldAst();
+	@Nullable AstInfo getNewAst();
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/Ast.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/LtkModelElementFilter.java
similarity index 71%
copy from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/Ast.java
copy to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/LtkModelElementFilter.java
index 30855d6..596a095 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/Ast.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/LtkModelElementFilter.java
@@ -1,5 +1,5 @@
 /*=============================================================================#
- # Copyright (c) 2015, 2020 Stephan Wahlbrink and others.
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
  # 
  # This program and the accompanying materials are made available under the
  # terms of the Eclipse Public License 2.0 which is available at
@@ -12,22 +12,15 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.ast.core;
+package org.eclipse.statet.ltk.model.core.element;
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
 
 @NonNullByDefault
-public class Ast {
+public interface LtkModelElementFilter<TModelElement extends LtkModelElement<?>> {
 	
 	
-	public static final AstNode getRoot(AstNode node) {
-		AstNode parent;
-		while ((parent= node.getParent()) != null) {
-			node= parent;
-		}
-		return node;
-	}
-	
+	boolean include(final TModelElement element);
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/NameAccess.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/NameAccess.java
similarity index 85%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/NameAccess.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/NameAccess.java
index 8232414..4d41a4d 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/NameAccess.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/NameAccess.java
@@ -12,9 +12,10 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.model.core.elements;
+package org.eclipse.statet.ltk.model.core.element;
 
 import org.eclipse.statet.jcommons.collections.ImList;
+import org.eclipse.statet.jcommons.lang.NonNull;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
@@ -24,7 +25,7 @@
 
 @NonNullByDefault
 public interface NameAccess<TAstNode extends AstNode,
-		TNameAccess extends NameAccess<TAstNode, ? super TNameAccess>> extends ElementName {
+		TNameAccess extends NameAccess<TAstNode, @NonNull ? super TNameAccess>> extends ElementName {
 	
 	
 	TAstNode getNode();
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/NameAccessSet.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/NameAccessSet.java
similarity index 95%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/NameAccessSet.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/NameAccessSet.java
index d489aa7..5f86e57 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/NameAccessSet.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/NameAccessSet.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.model.core.elements;
+package org.eclipse.statet.ltk.model.core.element;
 
 import org.eclipse.statet.jcommons.collections.ImList;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/SourceDocumentRunnable.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceDocumentRunnable.java
similarity index 90%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/SourceDocumentRunnable.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceDocumentRunnable.java
index 7bf113c..ab2435d 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/SourceDocumentRunnable.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceDocumentRunnable.java
@@ -12,21 +12,22 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.model.core;
+package org.eclipse.statet.ltk.model.core.element;
 
 import java.lang.reflect.InvocationTargetException;
 
 import org.eclipse.jface.text.AbstractDocument;
 import org.eclipse.jface.text.DocumentRewriteSessionType;
 
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
 
 /**
  * Runnable to execute a document operation in a special context.
  * 
- * @see ISourceUnit#syncExec(SourceDocumentRunnable)
+ * @see SourceUnit#syncExec(SourceDocumentRunnable)
  */
+@NonNullByDefault
 public abstract class SourceDocumentRunnable {
 	
 	
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/ISourceElement.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceElement.java
similarity index 60%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/ISourceElement.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceElement.java
index 62df50a..1e3ddbb 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/ISourceElement.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceElement.java
@@ -12,23 +12,28 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.model.core.elements;
+package org.eclipse.statet.ltk.model.core.element;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.text.core.TextRegion;
 
 
 /**
- * A element in a {@link ISourceUnit}.
+ * A element in a {@link SourceUnit}.
  */
-public interface ISourceElement extends IModelElement {
+@NonNullByDefault
+public interface SourceElement<TModelChild extends LtkModelElement<?>>
+		extends LtkModelElement<TModelChild> {
 	
 	
-	ISourceUnit getSourceUnit();
+	SourceUnit getSourceUnit();
 	
-	TextRegion getNameSourceRange();
 	
-	TextRegion getSourceRange();
+	@Nullable TextRegion getNameSourceRange();
 	
-	TextRegion getDocumentationRange();
+	@Nullable TextRegion getSourceRange();
+	
+	@Nullable TextRegion getDocumentationRange();
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceStructElement.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceStructElement.java
new file mode 100644
index 0000000..a420561
--- /dev/null
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceStructElement.java
@@ -0,0 +1,41 @@
+/*=============================================================================#
+ # Copyright (c) 2008, 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.ltk.model.core.element;
+
+import java.util.List;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+import org.eclipse.statet.jcommons.text.core.TextRegion;
+
+
+/**
+ * Represents Source structure instead of model structure
+ */
+@NonNullByDefault
+public interface SourceStructElement<
+				TModelChild extends LtkModelElement<?>,
+				TSourceChild extends SourceStructElement<?, ?>>
+		extends SourceElement<TModelChild> {
+	
+	
+	@Nullable SourceStructElement<?, ?> getSourceParent();
+	boolean hasSourceChildren(final @Nullable LtkModelElementFilter<? super TSourceChild> filter);
+	List<? extends TSourceChild> getSourceChildren(final @Nullable LtkModelElementFilter<? super TSourceChild> filter);
+	
+	@Override
+	TextRegion getSourceRange();
+	
+}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/ISourceUnit.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceUnit.java
similarity index 69%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/ISourceUnit.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceUnit.java
index 9d2bf53..8116ad9 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/ISourceUnit.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceUnit.java
@@ -12,9 +12,10 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.model.core.elements;
+package org.eclipse.statet.ltk.model.core.element;
 
 import java.lang.reflect.InvocationTargetException;
+import java.util.List;
 
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -22,13 +23,16 @@
 import org.eclipse.jface.text.IDocumentExtension4;
 import org.eclipse.jface.text.ISynchronizable;
 
+import org.eclipse.statet.jcommons.collections.ImCollections;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.core.sections.DocContentSections;
 
 import org.eclipse.statet.ltk.ast.core.AstInfo;
 import org.eclipse.statet.ltk.core.SourceContent;
 import org.eclipse.statet.ltk.core.WorkingContext;
-import org.eclipse.statet.ltk.model.core.ISourceUnitManager;
-import org.eclipse.statet.ltk.model.core.SourceDocumentRunnable;
+import org.eclipse.statet.ltk.model.core.SourceUnitManager;
 
 
 /**
@@ -36,17 +40,18 @@
  * <p>
  * The typical example for a source unit is a text file.</p>
  * <p>
- * Source units should be created using the {@link ISourceUnitManager}.
+ * Source units should be created using the {@link SourceUnitManager}.
  * For the progress monitors of the methods the SubMonitor pattern is applied.</p>
  */
-public interface ISourceUnit extends IModelElement, IAdaptable {
+@NonNullByDefault
+public interface SourceUnit extends LtkModelElement<LtkModelElement<?>>, IAdaptable {
 	
 	
 	long UNKNOWN_MODIFICATION_STAMP= IDocumentExtension4.UNKNOWN_MODIFICATION_STAMP;
 	
 	
 	WorkingContext getWorkingContext();
-	ISourceUnit getUnderlyingUnit();
+	@Nullable SourceUnit getUnderlyingUnit();
 	
 	/**
 	 * If the content is synchronized with the underlying unit.
@@ -60,7 +65,13 @@
 	 * 
 	 * @return the resource or <code>null</code> if without resource
 	 */
-	Object getResource();
+	@Nullable Object getResource();
+	
+	
+	void connect(final IProgressMonitor monitor);
+	void disconnect(final IProgressMonitor monitor);
+	boolean isConnected();
+	
 	
 	/**
 	 * Checks if the source is modifiable.
@@ -70,7 +81,7 @@
 	 * @return <code>true</code> if not yet validated or validated and modifiable,
 	 *     otherwise <code>false</code> (finally not modifiable).
 	 */
-	boolean checkState(boolean validate, IProgressMonitor monitor);
+	boolean checkState(final boolean validate, final IProgressMonitor monitor);
 	
 	/**
 	 * Access to the document with the content of this source unit
@@ -82,7 +93,7 @@
 	 * @param monitor progress monitor (optional but recommended)
 	 * @return the shared document
 	 */
-	AbstractDocument getDocument(IProgressMonitor monitor);
+	AbstractDocument getDocument(final @Nullable IProgressMonitor monitor);
 	
 	/**
 	 * Returns the information about partitioning and content sections types of the document for 
@@ -101,7 +112,7 @@
 	 * @param monitor
 	 * @return the current stamp
 	 */
-	long getContentStamp(IProgressMonitor monitor);
+	long getContentStamp(final IProgressMonitor monitor);
 	
 	/**
 	 * Access to the current content of this source unit.
@@ -110,7 +121,7 @@
 	 * @param monitor progress monitor (optional but recommended)
 	 * @return the current content
 	 */
-	SourceContent getContent(IProgressMonitor monitor);
+	SourceContent getContent(final IProgressMonitor monitor);
 	
 	/**
 	 * Runs {@link SourceDocumentRunnable} with checks (modification stamp) and 
@@ -123,14 +134,27 @@
 	 * @param runnable the runnable
 	 * @throws InvocationTargetException forwarded from runnable
 	 */
-	void syncExec(SourceDocumentRunnable runnable) throws InvocationTargetException;
+	void syncExec(final SourceDocumentRunnable runnable) throws InvocationTargetException;
 	
-	AstInfo getAstInfo(String type, boolean ensureSync, IProgressMonitor monitor);
+	@Nullable AstInfo getAstInfo(final @Nullable String type, final boolean ensureSync,
+			final IProgressMonitor monitor);
 	
-	ISourceUnitModelInfo getModelInfo(String type, int flags, IProgressMonitor monitor);
+	@Nullable SourceUnitModelInfo getModelInfo(final @Nullable String type, final int flags,
+			final IProgressMonitor monitor);
 	
-	void connect(IProgressMonitor monitor);
-	void disconnect(IProgressMonitor monitor);
-	boolean isConnected();
+	@Override
+	default @Nullable LtkModelElement<?> getModelParent() {
+		return null;
+	}
+	
+	@Override
+	default boolean hasModelChildren(final @Nullable LtkModelElementFilter<? super LtkModelElement<?>> filter) {
+		return false;
+	}
+	
+	@Override
+	default List<? extends LtkModelElement<?>> getModelChildren(final @Nullable LtkModelElementFilter<? super LtkModelElement<?>> filter) {
+		return ImCollections.emptyList();
+	}
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/ISourceUnitModelInfo.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceUnitModelInfo.java
similarity index 75%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/ISourceUnitModelInfo.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceUnitModelInfo.java
index a133078..9c305ad 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/ISourceUnitModelInfo.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/SourceUnitModelInfo.java
@@ -12,18 +12,20 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.model.core.elements;
+package org.eclipse.statet.ltk.model.core.element;
 
 import org.eclipse.statet.jcommons.collections.ImList;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
 import org.eclipse.statet.ltk.ast.core.AstInfo;
-import org.eclipse.statet.ltk.core.ISourceModelStamp;
+import org.eclipse.statet.ltk.core.SourceModelStamp;
 
 
 /**
  * Container for model information of an source unit
  */
-public interface ISourceUnitModelInfo {
+@NonNullByDefault
+public interface SourceUnitModelInfo {
 	
 	
 	/**
@@ -31,7 +33,7 @@
 	 * 
 	 * @return the stamp
 	 */
-	ISourceModelStamp getStamp();
+	SourceModelStamp getStamp();
 	
 	/**
 	 * The AST used to create this info.
@@ -45,10 +47,10 @@
 	 * 
 	 * @return the element
 	 */
-	ISourceStructElement getSourceElement();
+	SourceStructElement<?, ?> getSourceElement();
 	
-	void addAttachment(Object data);
-	void removeAttachment(Object data);
+	void addAttachment(final Object data);
+	void removeAttachment(final Object data);
 	ImList<Object> getAttachments();
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/IWorkspaceSourceUnit.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/WorkspaceSourceUnit.java
similarity index 85%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/IWorkspaceSourceUnit.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/WorkspaceSourceUnit.java
index b5e22e1..5e147b3 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/IWorkspaceSourceUnit.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/element/WorkspaceSourceUnit.java
@@ -12,7 +12,7 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.ltk.model.core.elements;
+package org.eclipse.statet.ltk.model.core.element;
 
 import org.eclipse.core.resources.IResource;
 
@@ -26,7 +26,7 @@
  * Source unit of a workspace resource
  */
 @NonNullByDefault
-public interface IWorkspaceSourceUnit extends ISourceUnit {
+public interface WorkspaceSourceUnit extends SourceUnit {
 	
 	
 	/**
@@ -35,7 +35,7 @@
 	 * @return the resource
 	 */
 	@Override
-	public IResource getResource();
+	IResource getResource();
 	
 	/**
 	 * Returns a resolver for markers in the resource providing the position in the current
@@ -43,6 +43,6 @@
 	 * 
 	 * @return the resolver if required
 	 */
-	public @Nullable IMarkerPositionResolver getMarkerPositionResolver();
+	@Nullable IMarkerPositionResolver getMarkerPositionResolver();
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/IEmbeddedForeignElement.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/IEmbeddedForeignElement.java
deleted file mode 100644
index 6614257..0000000
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/IEmbeddedForeignElement.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*=============================================================================#
- # Copyright (c) 2009, 2020 Stephan Wahlbrink and others.
- # 
- # This program and the accompanying materials are made available under the
- # terms of the Eclipse Public License 2.0 which is available at
- # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
- # which is available at https://www.apache.org/licenses/LICENSE-2.0.
- # 
- # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
- # 
- # Contributors:
- #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
- #=============================================================================*/
-
-package org.eclipse.statet.ltk.model.core.elements;
-
-
-public interface IEmbeddedForeignElement extends ISourceStructElement {
-	
-	
-	ISourceStructElement getForeignElement();
-	
-}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/ISourceStructElement.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/ISourceStructElement.java
deleted file mode 100644
index 04150e2..0000000
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/elements/ISourceStructElement.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*=============================================================================#
- # Copyright (c) 2008, 2020 Stephan Wahlbrink and others.
- # 
- # This program and the accompanying materials are made available under the
- # terms of the Eclipse Public License 2.0 which is available at
- # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
- # which is available at https://www.apache.org/licenses/LICENSE-2.0.
- # 
- # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
- # 
- # Contributors:
- #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
- #=============================================================================*/
-
-package org.eclipse.statet.ltk.model.core.elements;
-
-import java.util.List;
-
-
-/**
- * Represents Source structure instead of model structure
- */
-public interface ISourceStructElement extends ISourceElement {
-	
-	
-	ISourceStructElement getSourceParent();
-	boolean hasSourceChildren(IModelElement.Filter filter);
-	List<? extends ISourceStructElement> getSourceChildren(IModelElement.Filter filter);
-	
-}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractEditorSourceUnitFactory.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractEditorSourceUnitFactory.java
index d195a4d..bff0a83 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractEditorSourceUnitFactory.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractEditorSourceUnitFactory.java
@@ -16,51 +16,55 @@
 
 import org.eclipse.core.filesystem.IFileStore;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.ISourceFragment;
 
-import org.eclipse.statet.ltk.core.LTK;
-import org.eclipse.statet.ltk.model.core.ISourceUnitFactory;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.IWorkspaceSourceUnit;
+import org.eclipse.statet.ltk.core.Ltk;
+import org.eclipse.statet.ltk.model.core.SourceUnitFactory;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.WorkspaceSourceUnit;
 
 
 /**
- * Abstract factory for {@link LTK#EDITOR_CONTEXT}.
+ * Abstract factory for {@link Ltk#EDITOR_CONTEXT}.
  */
-public abstract class AbstractEditorSourceUnitFactory implements ISourceUnitFactory {
+@NonNullByDefault
+public abstract class AbstractEditorSourceUnitFactory implements SourceUnitFactory {
 	
 	
 	@Override
-	public String createId(final Object from) {
+	public @Nullable String createId(final Object from) {
 		if (from instanceof IFileStore) {
-			return AbstractFilePersistenceSourceUnitFactory.createResourceId(((IFileStore) from).toURI());
+			return AbstractFilePersistenceSourceUnitFactory.createResourceId(((IFileStore)from).toURI());
 		}
 		if (from instanceof ISourceFragment) {
-			return ((ISourceFragment) from).getId();
+			return ((ISourceFragment)from).getId();
 		}
 		return null;
 	}
 	
 	@Override
-	public ISourceUnit createSourceUnit(final String id, final Object from) {
-		if (from instanceof IWorkspaceSourceUnit) {
-			return createSourceUnit(id, (IWorkspaceSourceUnit) from);
+	public @Nullable SourceUnit createSourceUnit(final String id, final Object from) {
+		if (from instanceof WorkspaceSourceUnit) {
+			return createSourceUnit(id, (WorkspaceSourceUnit)from);
 		}
 		if (from instanceof IFileStore) {
-			return createSourceUnit(id, (IFileStore) from);
+			return createSourceUnit(id, (IFileStore)from);
 		}
 		if (from instanceof ISourceFragment) {
-			return createSourceUnit(id, (ISourceFragment) from);
+			return createSourceUnit(id, (ISourceFragment)from);
 		}
 		return null;
 	}
 	
 	
-	protected abstract ISourceUnit createSourceUnit(final String id, final IWorkspaceSourceUnit su);
+	protected abstract @Nullable SourceUnit createSourceUnit(final String id, final WorkspaceSourceUnit su);
 	
-	protected abstract ISourceUnit createSourceUnit(final String id, final IFileStore file);
+	protected abstract @Nullable SourceUnit createSourceUnit(final String id, final IFileStore file);
 	
-	protected ISourceUnit createSourceUnit(final String id, final ISourceFragment fragment) {
+	protected @Nullable SourceUnit createSourceUnit(final String id, final ISourceFragment fragment) {
 		return null;
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractFilePersistenceSourceUnitFactory.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractFilePersistenceSourceUnitFactory.java
index 0343bcb..b360b20 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractFilePersistenceSourceUnitFactory.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractFilePersistenceSourceUnitFactory.java
@@ -22,41 +22,37 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 
-import org.eclipse.statet.ltk.core.LTK;
-import org.eclipse.statet.ltk.model.core.ISourceUnitFactory;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.ltk.core.Ltk;
+import org.eclipse.statet.ltk.model.core.SourceUnitFactory;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
- * Abstract factory for {@link LTK#PERSISTENCE_CONTEXT}.
+ * Abstract factory for {@link Ltk#PERSISTENCE_CONTEXT}.
  */
-public abstract class AbstractFilePersistenceSourceUnitFactory implements ISourceUnitFactory {
+@NonNullByDefault
+public abstract class AbstractFilePersistenceSourceUnitFactory implements SourceUnitFactory {
 	
 	
 	private static final String IFILE_PREFIX= "platform:/resource"; //$NON-NLS-1$
 	
 	
 	public static String createResourceId(final IResource file) {
-		if (file != null) {
-			final IPath path= file.getFullPath();
-			if (path != null) {
-				return IFILE_PREFIX + path.toPortableString(); // eclipse-platform-resource
-			}
-		}
-		return null;
+		final IPath path= file.getFullPath();
+		return IFILE_PREFIX + path.toPortableString(); // eclipse-platform-resource
 	}
 	
 	public static String createResourceId(URI uri) {
-		if (uri != null) {
-			uri= uri.normalize();
-			if (uri.getScheme() == null) {
-				return "xxx:"+uri.toString(); //$NON-NLS-1$
-			}
-			else {
-				return uri.toString();
-			}
+		uri= uri.normalize();
+		if (uri.getScheme() == null) {
+			return "xxx:"+uri.toString(); //$NON-NLS-1$
 		}
-		return null;
+		else {
+			return uri.toString();
+		}
 	}
 	
 	
@@ -65,12 +61,12 @@
 	
 	
 	@Override
-	public String createId(final Object from) {
+	public @Nullable String createId(final Object from) {
 		if (from instanceof IFile) {
-			return createResourceId((IFile) from);
+			return createResourceId((IFile)from);
 		}
 		if (from instanceof String) {
-			final String s= (String) from;
+			final String s= (String)from;
 			if (s.startsWith(IFILE_PREFIX)) {
 				return s;
 			}
@@ -79,10 +75,10 @@
 	}
 	
 	@Override
-	public ISourceUnit createSourceUnit(final String id, final Object from) {
-		IFile ifile;
+	public @Nullable SourceUnit createSourceUnit(final String id, final Object from) {
+		final IFile ifile;
 		if (from instanceof IFile) {
-			ifile= (IFile) from;
+			ifile= (IFile)from;
 		}
 		else {
 			final IPath path= Path.fromPortableString(id.substring(IFILE_PREFIX.length()));
@@ -92,6 +88,6 @@
 	}
 	
 	
-	protected abstract ISourceUnit createSourceUnit(final String id, final IFile file);
+	protected abstract SourceUnit createSourceUnit(final String id, final IFile file);
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractModelEventJob.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractModelEventJob.java
index ca99a98..7e88c24 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractModelEventJob.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractModelEventJob.java
@@ -25,29 +25,32 @@
 import org.eclipse.core.runtime.jobs.Job;
 
 import org.eclipse.statet.jcommons.collections.ImIdentityList;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
-import org.eclipse.statet.internal.ltk.core.LTKCorePlugin;
-import org.eclipse.statet.ltk.core.LTK;
-import org.eclipse.statet.ltk.core.LTKUtils;
+import org.eclipse.statet.internal.ltk.core.LtkCorePlugin;
+import org.eclipse.statet.ltk.core.Ltk;
 import org.eclipse.statet.ltk.core.WorkingContext;
 import org.eclipse.statet.ltk.model.core.ElementChangedEvent;
-import org.eclipse.statet.ltk.model.core.IElementChangedListener;
-import org.eclipse.statet.ltk.model.core.IModelElementDelta;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.ElementChangedListener;
+import org.eclipse.statet.ltk.model.core.LtkModelUtils;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElementDelta;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 
 
 /**
  * Abstract model update event job
  */
-public abstract class AbstractModelEventJob<ElementType extends IModelElement, InfoType extends ISourceUnitModelInfo> extends Job {
+@NonNullByDefault
+public abstract class AbstractModelEventJob<TModelElement extends LtkModelElement<?>, InfoType extends SourceUnitModelInfo> extends Job {
 	
 	
 	private static class SafeRunnable implements ISafeRunnable {
 		
 		final ElementChangedEvent event;
-		IElementChangedListener listener;
+		ElementChangedListener listener;
 		
 		public SafeRunnable(final ElementChangedEvent event) {
 			this.event= event;
@@ -60,7 +63,7 @@
 		
 		@Override
 		public void handleException(final Throwable e) {
-			LTKCorePlugin.log(new Status(IStatus.ERROR, LTK.BUNDLE_ID, -1,
+			LtkCorePlugin.log(new Status(IStatus.ERROR, Ltk.BUNDLE_ID, -1,
 					"An error occured while notifying an ElementChangedListener.", e )); //$NON-NLS-1$
 		}
 		
@@ -68,17 +71,17 @@
 	
 	protected class Task {
 		
-		private final ElementType element;
+		private final TModelElement element;
 		private InfoType oldInfo;
 		private InfoType newInfo;
 		
 		
-		public Task(final ElementType element) {
+		public Task(final TModelElement element) {
 			this.element= element;
 		}
 		
 		
-		public ElementType getElement() {
+		public TModelElement getElement() {
 			return this.element;
 		}
 		
@@ -92,7 +95,7 @@
 		
 		
 		void run() {
-			final IModelElementDelta delta= createDelta(this);
+			final LtkModelElementDelta delta= createDelta(this);
 			fireDelta(delta);
 		}
 	}
@@ -101,8 +104,8 @@
 	private final AbstractModelManager modelManager;
 	
 	private final Object tasksLock= new Object();
-	private final LinkedList<IModelElement> taskQueue= new LinkedList<>();
-	private final HashMap<IModelElement, Task> taskDetail= new HashMap<>();
+	private final LinkedList<TModelElement> taskQueue= new LinkedList<>();
+	private final HashMap<TModelElement, Task> taskDetail= new HashMap<>();
 	
 	private boolean working= false;
 	private boolean stop= false;
@@ -118,7 +121,7 @@
 	}
 	
 	
-	public void addUpdate(final ElementType element,
+	public void addUpdate(final TModelElement element,
 			final InfoType oldModel, final InfoType newModel) {
 		synchronized (this.tasksLock) {
 			Task task= this.taskDetail.get(element);
@@ -139,7 +142,7 @@
 		}
 	}
 	
-	protected abstract IModelElementDelta createDelta(Task task);
+	protected abstract LtkModelElementDelta createDelta(Task task);
 	
 	
 	@Override
@@ -147,7 +150,7 @@
 		while (true) {
 			Task task;
 			synchronized (this.tasksLock) {
-				final IModelElement element= (!this.taskQueue.isEmpty()) ? this.taskQueue.removeFirst() : null;
+				final @Nullable TModelElement element= (!this.taskQueue.isEmpty()) ? this.taskQueue.removeFirst() : null;
 				if (element == null || this.stop) {
 					this.working= false;
 					return Status.OK_STATUS;
@@ -159,7 +162,7 @@
 				task.run();
 			}
 			catch (final Throwable e) {
-				LTKCorePlugin.log(new Status(IStatus.ERROR, LTK.BUNDLE_ID, -1,
+				LtkCorePlugin.log(new Status(IStatus.ERROR, Ltk.BUNDLE_ID, -1,
 						"An error occurred when firing model event for " + this.modelManager.getModelTypeId() + ".", //$NON-NLS-1$
 						e ));
 			}
@@ -174,16 +177,16 @@
 		}
 	}
 	
-	private void fireDelta(final IModelElementDelta delta) {
-		final ISourceUnit su= LTKUtils.getSourceUnit(delta.getModelElement());
+	private void fireDelta(final LtkModelElementDelta delta) {
+		final SourceUnit su= LtkModelUtils.getSourceUnit(delta.getModelElement());
 		if (su == null) {
 			return;
 		}
 		final WorkingContext context= su.getWorkingContext();
 		final ElementChangedEvent event= new ElementChangedEvent(delta, context);
 		final SafeRunnable runnable= new SafeRunnable(event);
-		final ImIdentityList<IElementChangedListener> listeners= this.modelManager.getElementChangedListeners(context);
-		for (final IElementChangedListener listener : listeners) {
+		final ImIdentityList<ElementChangedListener> listeners= this.modelManager.getElementChangedListeners(context);
+		for (final ElementChangedListener listener : listeners) {
 			runnable.listener= listener;
 			SafeRunner.run(runnable);
 		}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractModelManager.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractModelManager.java
index 890e62a..1bc258f 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractModelManager.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractModelManager.java
@@ -24,22 +24,27 @@
 import org.eclipse.statet.jcommons.collections.CopyOnWriteIdentityListSet;
 import org.eclipse.statet.jcommons.collections.ImCollections;
 import org.eclipse.statet.jcommons.collections.ImIdentityList;
+import org.eclipse.statet.jcommons.collections.ImSet;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
-import org.eclipse.statet.ltk.core.LTK;
+import org.eclipse.statet.ltk.core.Ltk;
 import org.eclipse.statet.ltk.core.WorkingContext;
-import org.eclipse.statet.ltk.model.core.IElementChangedListener;
-import org.eclipse.statet.ltk.model.core.IModelManager;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.ElementChangedListener;
+import org.eclipse.statet.ltk.model.core.LtkModels;
+import org.eclipse.statet.ltk.model.core.ModelManager;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
-public abstract class AbstractModelManager implements IModelManager {
+@NonNullByDefault
+public abstract class AbstractModelManager implements ModelManager {
 	
 	
 	protected static class ContextItem {
 		
 		public final WorkingContext context;
 		
-		public final CopyOnWriteIdentityListSet<IElementChangedListener> listeners= new CopyOnWriteIdentityListSet<>();
+		public final CopyOnWriteIdentityListSet<ElementChangedListener> listeners= new CopyOnWriteIdentityListSet<>();
 		
 		
 		protected ContextItem(final WorkingContext context) {
@@ -53,18 +58,18 @@
 		}
 		
 		@Override
-		public final boolean equals(final Object obj) {
+		public final boolean equals(final @Nullable Object obj) {
 			return (this == obj);
 		}
 		
 	}
 	
-	private static final ImIdentityList<IElementChangedListener> NO_LISTENERS= ImCollections.emptyIdentityList();
+	private static final ImIdentityList<ElementChangedListener> NO_LISTENERS= ImCollections.emptyIdentityList();
 	
 	private class RefreshJob extends Job {
 		
 		
-		private final List<ISourceUnit> list;
+		private final List<SourceUnit> list;
 		
 		private final int flags;
 		
@@ -75,13 +80,13 @@
 			setSystem(true);
 			setPriority(DECORATE);
 			
-			this.list= LTK.getSourceUnitManager().getOpenSourceUnits(AbstractModelManager.this.typeId, context);
+			this.list= LtkModels.getSourceUnitManager().getOpenSourceUnits(AbstractModelManager.this.typeId, context);
 			this.flags= flags;
 		}
 		
 		@Override
 		protected IStatus run(final IProgressMonitor monitor) {
-			for (final ISourceUnit su : this.list) {
+			for (final SourceUnit su : this.list) {
 				su.getModelInfo(null, this.flags, monitor);
 			}
 			return Status.OK_STATUS;
@@ -97,6 +102,14 @@
 	
 	public AbstractModelManager(final String typeId) {
 		this.typeId= typeId;
+		
+		for (final WorkingContext context : getInitialContexts()) {
+			getContextItemCreate(context);
+		}
+	}
+	
+	protected ImSet<WorkingContext> getInitialContexts() {
+		return ImCollections.newIdentitySet(Ltk.PERSISTENCE_CONTEXT, Ltk.EDITOR_CONTEXT);
 	}
 	
 	
@@ -104,7 +117,17 @@
 		return this.typeId;
 	}
 	
-	protected ContextItem getContextItem(final WorkingContext context, final boolean create) {
+	protected @Nullable ContextItem getContextItem(final WorkingContext context) {
+		final ImIdentityList<ContextItem> contextItems= this.contexts.toList();
+		for (final ContextItem contextItem : contextItems) {
+			if (contextItem.context == context) {
+				return contextItem;
+			}
+		}
+		return null;
+	}
+	
+	protected ContextItem getContextItemCreate(final WorkingContext context) {
 		while (true) {
 			final ImIdentityList<ContextItem> contextItems= this.contexts.toList();
 			for (final ContextItem contextItem : contextItems) {
@@ -112,9 +135,6 @@
 					return contextItem;
 				}
 			}
-			if (!create) {
-				return null;
-			}
 			synchronized (this.contexts) {
 				if (contextItems == this.contexts.toList()) {
 					final ContextItem item= doCreateContextItem(context);
@@ -130,23 +150,23 @@
 	}
 	
 	@Override
-	public void addElementChangedListener(final IElementChangedListener listener,
+	public void addElementChangedListener(final ElementChangedListener listener,
 			final WorkingContext context) {
-		final ContextItem contextItem= getContextItem(context, true);
+		final ContextItem contextItem= getContextItemCreate(context);
 		contextItem.listeners.add(listener);
 	}
 	
 	@Override
-	public void removeElementChangedListener(final IElementChangedListener listener,
+	public void removeElementChangedListener(final ElementChangedListener listener,
 			final WorkingContext context) {
-		final ContextItem contextItem= getContextItem(context, false);
+		final ContextItem contextItem= getContextItem(context);
 		if (contextItem != null) {
 			contextItem.listeners.remove(listener);
 		}
 	}
 	
-	protected ImIdentityList<IElementChangedListener> getElementChangedListeners(final WorkingContext context) {
-		final ContextItem contextItem= getContextItem(context, false);
+	protected ImIdentityList<ElementChangedListener> getElementChangedListeners(final WorkingContext context) {
+		final ContextItem contextItem= getContextItem(context);
 		if (contextItem == null) {
 			return NO_LISTENERS;
 		}
@@ -162,11 +182,11 @@
 	}
 	
 	@Override
-	public void registerDependentUnit(final ISourceUnit su) {
+	public void registerDependentUnit(final SourceUnit su) {
 	}
 	
 	@Override
-	public void deregisterDependentUnit(final ISourceUnit su) {
+	public void deregisterDependentUnit(final SourceUnit su) {
 	}
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/BasicNameAccessSet.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/BasicNameAccessSet.java
index 4bb4d31..6cb21ab 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/BasicNameAccessSet.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/BasicNameAccessSet.java
@@ -24,8 +24,8 @@
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
-import org.eclipse.statet.ltk.model.core.elements.NameAccess;
-import org.eclipse.statet.ltk.model.core.elements.NameAccessSet;
+import org.eclipse.statet.ltk.model.core.element.NameAccess;
+import org.eclipse.statet.ltk.model.core.element.NameAccessSet;
 
 
 @NonNullByDefault
@@ -34,8 +34,9 @@
 	
 	
 	@SuppressWarnings({ "rawtypes", "unchecked" })
-	private static final BasicNameAccessSet EMPTY_SET= new BasicNameAccessSet(Collections.EMPTY_MAP);
+	private static final BasicNameAccessSet EMPTY_SET= new BasicNameAccessSet<>(Collections.EMPTY_MAP);
 	
+	@SuppressWarnings("unchecked")
 	public static final <TNameAccess extends NameAccess<?, TNameAccess>> BasicNameAccessSet<TNameAccess> emptySet() {
 		return EMPTY_SET;
 	}
@@ -68,7 +69,7 @@
 	@Override
 	public @Nullable ImList<TNameAccess> getAllInUnit(final String label) {
 		final NameAccessAccumulator<TNameAccess> shared= this.map.get(label);
-		return (shared != null) ? (ImList<TNameAccess>) shared.getList() : null;
+		return (shared != null) ? (ImList<TNameAccess>)shared.getList() : null;
 	}
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/SourceModelStamp.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/BasicSourceModelStamp.java
similarity index 66%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/SourceModelStamp.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/BasicSourceModelStamp.java
index 5668b2f..5fe2550 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/SourceModelStamp.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/BasicSourceModelStamp.java
@@ -14,22 +14,26 @@
 
 package org.eclipse.statet.ltk.model.core.impl;
 
-import org.eclipse.statet.ltk.core.ISourceModelStamp;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.ltk.core.SourceModelStamp;
 
 
-public class SourceModelStamp implements ISourceModelStamp {
+@NonNullByDefault
+public class BasicSourceModelStamp implements SourceModelStamp {
 	
 	
 	private final long sourceStamp;
 	
 	
-	public SourceModelStamp(final long sourceStamp) {
+	public BasicSourceModelStamp(final long sourceStamp) {
 		this.sourceStamp= sourceStamp;
 	}
 	
 	
 	@Override
-	public final long getSourceStamp() {
+	public final long getContentStamp() {
 		return this.sourceStamp;
 	}
 	
@@ -40,10 +44,10 @@
 	}
 	
 	@Override
-	public boolean equals(final Object other) {
-		return (other instanceof ISourceModelStamp
+	public boolean equals(final @Nullable Object other) {
+		return (other instanceof SourceModelStamp
 				&& getClass() == other.getClass()
-				&& this.sourceStamp == ((ISourceModelStamp) other).getSourceStamp() );
+				&& this.sourceStamp == ((SourceModelStamp)other).getContentStamp() );
 	}
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractSourceModelInfo.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/BasicSourceUnitModelInfo.java
similarity index 78%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractSourceModelInfo.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/BasicSourceUnitModelInfo.java
index 8378c74..74b2c81 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractSourceModelInfo.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/BasicSourceUnitModelInfo.java
@@ -16,13 +16,15 @@
 
 import org.eclipse.statet.jcommons.collections.ImCollections;
 import org.eclipse.statet.jcommons.collections.ImList;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
 import org.eclipse.statet.ltk.ast.core.AstInfo;
-import org.eclipse.statet.ltk.core.ISourceModelStamp;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.core.SourceModelStamp;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 
 
-public abstract class AbstractSourceModelInfo implements ISourceUnitModelInfo {
+@NonNullByDefault
+public abstract class BasicSourceUnitModelInfo implements SourceUnitModelInfo {
 	
 	
 	private static final ImList<Object> NO_ATTACHMENTS= ImCollections.emptyList();
@@ -33,13 +35,13 @@
 	private volatile ImList<Object> attachments= NO_ATTACHMENTS;
 	
 	
-	public AbstractSourceModelInfo(final AstInfo ast) {
+	public BasicSourceUnitModelInfo(final AstInfo ast) {
 		this.ast= ast;
 	}
 	
 	
 	@Override
-	public ISourceModelStamp getStamp() {
+	public SourceModelStamp getStamp() {
 		return this.ast.getStamp();
 	}
 	
@@ -55,7 +57,7 @@
 	}
 	
 	@Override
-	public void removeAttachment(final Object data) {
+	public synchronized void removeAttachment(final Object data) {
 		this.attachments= ImCollections.removeElement(this.attachments, data);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/BasicWorkingBuffer.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/BasicWorkingBuffer.java
new file mode 100644
index 0000000..f46dc91
--- /dev/null
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/BasicWorkingBuffer.java
@@ -0,0 +1,344 @@
+/*=============================================================================#
+ # Copyright (c) 2007, 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.ltk.model.core.impl;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.core.filebuffers.FileBuffers;
+import org.eclipse.core.filebuffers.LocationKind;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.filesystem.URIUtil;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.jface.text.AbstractDocument;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension4;
+import org.eclipse.jface.text.ISynchronizable;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.ecommons.io.FileUtil;
+
+import org.eclipse.statet.internal.ltk.core.LtkCorePlugin;
+import org.eclipse.statet.ltk.core.SourceContent;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+
+
+/**
+ * Common implementation of {@link WorkingBuffer} for source units based on
+ * an {@link IFile} or an {@link IFileStore}.
+ */
+@NonNullByDefault
+public class BasicWorkingBuffer implements WorkingBuffer {
+	
+	/** Mode for IFile (in workspace) */
+	protected static final byte IFILE= 1;
+	/** Mode for IFileStore (URI) */
+	protected static final byte FILESTORE= 2;
+	
+	protected static final byte DOCUMENT= 1;
+	
+	
+	public static SourceContent createContentFromDocument(final IDocument doc) {
+		Object lock= null;
+		if (doc instanceof ISynchronizable) {
+			lock= ((ISynchronizable)doc).getLockObject();
+		}
+		if (lock != null && doc instanceof IDocumentExtension4) {
+			synchronized (lock) {
+				return new SourceContent(
+						((IDocumentExtension4)doc).getModificationStamp(),
+						doc.get() );
+			}
+		}
+		else {
+			return new SourceContent(System.currentTimeMillis(), doc.get());
+		}
+	}
+	
+	
+	protected final SourceUnit unit;
+	private @Nullable AbstractDocument document;
+	
+	/**
+	 * Mode of this working buffer:<ul>
+	 *   <li>= 0 - uninitialized</li>
+	 *   <li>< 0 - invalid/no source found</li>
+	 *   <li>> 0 - mode constant {@link #IFILE}, {@link #FILESTORE}</li>
+	 * </ul>
+	 */
+	private byte mode;
+	
+	public BasicWorkingBuffer(final SourceUnit unit) {
+		this.unit= unit;
+	}
+	
+	
+	/**
+	 * Checks the mode of this working buffer
+	 * 
+	 * @return <code>true</code> if valid mode, otherwise <code>false</code>
+	 */
+	protected final byte detectResourceMode() {
+		if (this.mode == 0) {
+			final Object resource= this.unit.getResource();
+			if (resource instanceof IFile) {
+				this.mode= IFILE;
+			}
+			else if (resource instanceof IFileStore 
+					&& !((IFileStore)resource).fetchInfo().isDirectory() ) {
+				this.mode= FILESTORE;
+			}
+			if (this.mode == 0) {
+				this.mode= -1;
+			}
+		}
+		return this.mode;
+	}
+	
+	protected final byte getResourceMode() {
+		return this.mode;
+	}
+	
+	protected byte getContentMode() {
+		return 0;
+	}
+	
+	
+	@Override
+	public long getContentStamp(final IProgressMonitor monitor) {
+		{	final AbstractDocument doc= this.document;
+			if (doc != null) {
+				return doc.getModificationStamp();
+			}
+		}
+		{	final SourceUnit underlyingUnit= this.unit.getUnderlyingUnit();
+			if (underlyingUnit != null) {
+				return underlyingUnit.getContentStamp(monitor);
+			}
+		}
+		if (detectResourceMode() == IFILE) {
+			final IFile resource= (IFile)this.unit.getResource();
+			if (resource != null) {
+				return resource.getModificationStamp();
+			}
+		}
+		return 0;
+	}
+	
+	@Override
+	public synchronized @Nullable AbstractDocument getDocument() {
+		return this.document;
+	}
+	
+	@Override
+	public synchronized AbstractDocument getDocument(final @Nullable IProgressMonitor monitor) {
+		AbstractDocument doc= this.document;
+		if (doc == null) {
+			final SubMonitor m= SubMonitor.convert(monitor);
+			doc= createDocument(m);
+			checkDocument(doc);
+			if ((getContentMode() & DOCUMENT) != 0) {
+				this.document= doc;
+			}
+		}
+		return doc;
+	}
+	
+	@Override
+	public SourceContent getContent(final IProgressMonitor monitor) {
+		final SubMonitor m= SubMonitor.convert(monitor);
+		final IDocument doc= ((getContentMode() & DOCUMENT) != 0) ? getDocument(monitor) : getDocument();
+		if (doc != null) {
+			return createContentFromDocument(doc);
+		}
+		return createContent(m);
+	}
+	
+	@Override
+	public void saveDocument(final IProgressMonitor monitor) {
+	}
+	
+	@Override
+	public synchronized void releaseDocument(final IProgressMonitor monitor) {
+		this.document= null;
+	}
+	
+	@Override
+	public boolean checkState(final boolean validate, final IProgressMonitor monitor) {
+		{	final SourceUnit underlyingUnit= this.unit.getUnderlyingUnit();
+			if (underlyingUnit != null) {
+				return underlyingUnit.checkState(validate, monitor);
+			}
+		}
+		switch (detectResourceMode()) {
+		case IFILE:
+			{	final IFile resource= (IFile)this.unit.getResource();
+				if (!validate) {
+					return !resource.getResourceAttributes().isReadOnly();
+				}
+				else {
+					return resource.getWorkspace().validateEdit(new IFile[] { resource }, IWorkspace.VALIDATE_PROMPT).isOK();
+				}
+			}
+		case FILESTORE:
+			{	final IFileStore store= (IFileStore)this.unit.getResource();
+				try {
+					return !store.fetchInfo(EFS.NONE, monitor).getAttribute(EFS.ATTRIBUTE_READ_ONLY);
+				}
+				catch (final CoreException e) {
+					LtkCorePlugin.log(new Status(IStatus.ERROR, LtkCorePlugin.BUNDLE_ID, 0,
+							"An error occurred when checking modifiable state of the file.", e));
+					return false;
+				}
+			}
+		default:
+			return false;
+		}
+	}
+	
+	
+	protected @Nullable AbstractDocument createDocument(final SubMonitor m) {
+		final IDocument fileDoc= createEmptyDocument();
+		if (!(fileDoc instanceof AbstractDocument)) {
+			return null;
+		}
+		final AbstractDocument document= (AbstractDocument)fileDoc;
+		
+		final SourceUnit underlyingUnit= this.unit.getUnderlyingUnit();
+		if (underlyingUnit != null) {
+			final SourceContent underlyingContent= underlyingUnit.getContent(m);
+//			if (document instanceof IDocumentExtension4) {
+			document.set(underlyingContent.getText(), underlyingContent.getStamp());
+//			}
+//			else {
+//				document.set(underlyingContent.text);
+//			}
+		}
+		else {
+			final Object resource= this.unit.getResource();
+			if (resource instanceof IFile) {
+				loadDocumentFromFile((IFile)resource, document, m);
+			}
+		}
+		
+		return document;
+	}
+	
+	private IDocument createEmptyDocument() {
+		switch (detectResourceMode()) {
+		case IFILE:
+			return FileBuffers.getTextFileBufferManager().createEmptyDocument(
+					((IFile)this.unit.getResource()).getFullPath(),
+					LocationKind.IFILE );
+		case FILESTORE:
+			return FileBuffers.getTextFileBufferManager().createEmptyDocument(
+					URIUtil.toPath(((IFileStore)this.unit.getResource()).toURI()),
+					LocationKind.LOCATION );
+		default:
+			return FileBuffers.getTextFileBufferManager().createEmptyDocument(null, null);
+		}
+	}
+	
+	protected void checkDocument(final AbstractDocument document) {
+		if (document instanceof ISynchronizable) {
+			synchronized (document) {
+				if (((ISynchronizable)document).getLockObject() == null) {
+					((ISynchronizable)document).setLockObject(new Object());
+				}
+			}
+		}
+	}
+	
+	protected final void loadDocumentFromFile(final IFile file, final AbstractDocument document, final SubMonitor m) {
+		try {
+			FileUtil.getFileUtil(file).createReadTextFileOp(new FileUtil.ReaderAction() {
+				@Override
+				public void run(final BufferedReader reader, final IProgressMonitor monitor) throws IOException {
+					final StringBuilder buffer= new StringBuilder();
+					final char[] readBuffer= new char[2048];
+					int n;
+					while ((n= reader.read(readBuffer)) > 0) {
+						buffer.append(readBuffer, 0, n);
+					}
+//					if (document instanceof IDocumentExtension4) {
+					document.set(buffer.toString(), file.getModificationStamp());
+//					}
+//					else {
+//						document.set(buffer.toString());
+//					}
+				}
+			}).doOperation(m);
+		}
+		catch (final OperationCanceledException e) {
+		}
+		catch (final CoreException e) {
+			LtkCorePlugin.log(e.getStatus());
+		}
+	}
+	
+	protected SourceContent createContent(final SubMonitor m) {
+		final SourceUnit underlyingUnit= this.unit.getUnderlyingUnit();
+		if (underlyingUnit != null) {
+			return underlyingUnit.getContent(m);
+		}
+		else {
+			final Object resource= this.unit.getResource();
+			final AtomicReference<SourceContent> content= new AtomicReference<>();
+			if (resource instanceof IFile) {
+				loadContentFromFile((IFile)resource, content, m);
+			}
+			return content.get();
+		}
+	}
+	
+	protected final void loadContentFromFile(final IFile file, final AtomicReference<SourceContent> content, final SubMonitor m) {
+		try {
+			FileUtil.getFileUtil(file).createReadTextFileOp(new FileUtil.ReaderAction() {
+				@Override
+				public void run(final BufferedReader reader, final IProgressMonitor monitor) throws IOException {
+					final StringBuilder buffer= new StringBuilder();
+					final char[] readBuffer= new char[2048];
+					int n;
+					while ((n= reader.read(readBuffer)) >= 0) {
+						buffer.append(readBuffer, 0, n);
+					}
+					content.set(new SourceContent(file.getModificationStamp(), buffer.toString()));
+				}
+			}).doOperation(m);
+		}
+		catch (final OperationCanceledException e) {
+		}
+		catch (final CoreException e) {
+			LtkCorePlugin.log(e.getStatus());
+		}
+	}
+	
+	@Override
+	public boolean isSynchronized() {
+		return false;
+	}
+	
+}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/FileBufferWorkingBuffer.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/FileBufferWorkingBuffer.java
index d3cb986..d59cc6f 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/FileBufferWorkingBuffer.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/FileBufferWorkingBuffer.java
@@ -29,23 +29,27 @@
 import org.eclipse.jface.text.AbstractDocument;
 import org.eclipse.jface.text.IDocument;
 
-import org.eclipse.statet.internal.ltk.core.LTKCorePlugin;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.internal.ltk.core.LtkCorePlugin;
 import org.eclipse.statet.ltk.core.SourceContent;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
- * WorkingBuffer using {@link ITextFileBuffer} and following JFace UI rules.
+ * BasicWorkingBuffer using {@link ITextFileBuffer} and following JFace UI rules.
  * <p>
  * Usually used for editors / the editor context.</p>
  */
-public class FileBufferWorkingBuffer extends WorkingBuffer {
+@NonNullByDefault
+public class FileBufferWorkingBuffer extends BasicWorkingBuffer {
 	
 	
-	private ITextFileBuffer fileBuffer;
+	private @Nullable ITextFileBuffer fileBuffer;
 	
 	
-	public FileBufferWorkingBuffer(final ISourceUnit unit) {
+	public FileBufferWorkingBuffer(final SourceUnit unit) {
 		super(unit);
 	}
 	
@@ -56,29 +60,30 @@
 	}
 	
 	@Override
-	protected AbstractDocument createDocument(final SubMonitor m) {
+	protected @Nullable AbstractDocument createDocument(final SubMonitor m) {
+		ITextFileBuffer fileBuffer= null;
 		switch (detectResourceMode()) {
 		case IFILE:
-			{	final IPath path= ((IFile) this.unit.getResource()).getFullPath();
+			{	final IPath path= ((IFile)this.unit.getResource()).getFullPath();
 				try {
 					FileBuffers.getTextFileBufferManager().connect(path, LocationKind.IFILE, m);
-					this.fileBuffer= FileBuffers.getTextFileBufferManager().getTextFileBuffer(path, LocationKind.IFILE);
+					fileBuffer= FileBuffers.getTextFileBufferManager().getTextFileBuffer(path, LocationKind.IFILE);
 				}
 				catch (final CoreException e) {
-					LTKCorePlugin.log(new Status(IStatus.ERROR, LTKCorePlugin.BUNDLE_ID, -1,
+					LtkCorePlugin.log(new Status(IStatus.ERROR, LtkCorePlugin.BUNDLE_ID, -1,
 							"An error occurred when allocating the document of the file buffer.",
 							e ));
 				}
 				break;
 			}
 		case FILESTORE:
-			{	final IFileStore store= (IFileStore) this.unit.getResource();
+			{	final IFileStore store= (IFileStore)this.unit.getResource();
 				try {
 					FileBuffers.getTextFileBufferManager().connectFileStore(store, m);
-					this.fileBuffer= FileBuffers.getTextFileBufferManager().getFileStoreTextFileBuffer(store);
+					fileBuffer= FileBuffers.getTextFileBufferManager().getFileStoreTextFileBuffer(store);
 				}
 				catch (final CoreException e) {
-					LTKCorePlugin.log(new Status(IStatus.ERROR, LTKCorePlugin.BUNDLE_ID, -1,
+					LtkCorePlugin.log(new Status(IStatus.ERROR, LtkCorePlugin.BUNDLE_ID, -1,
 							"An error occurred when allocating the document of the file buffer.",
 							e ));
 				}
@@ -88,28 +93,30 @@
 			return super.createDocument(m);
 		}
 		
-		if (this.fileBuffer != null) {
-			final IDocument fileDoc= this.fileBuffer.getDocument();
+		this.fileBuffer= fileBuffer;
+		if (fileBuffer != null) {
+			final IDocument fileDoc= fileBuffer.getDocument();
 			if (fileDoc instanceof AbstractDocument) {
-				return (AbstractDocument) fileDoc;
+				return (AbstractDocument)fileDoc;
 			}
 		}
 		return null;
 	}
 	
-	private ITextFileBuffer getBuffer() {
+	private @Nullable ITextFileBuffer getBuffer() {
 		synchronized (this) {
-			if (this.fileBuffer != null) {
-				return this.fileBuffer;
+			final ITextFileBuffer fileBuffer= this.fileBuffer;
+			if (fileBuffer != null) {
+				return fileBuffer;
 			}
 		}
 		switch (getResourceMode()) {
 		case IFILE:
-			{	final IPath path= ((IFile) this.unit.getResource()).getFullPath();
+			{	final IPath path= ((IFile)this.unit.getResource()).getFullPath();
 				return FileBuffers.getTextFileBufferManager().getTextFileBuffer(path, LocationKind.IFILE);
 			}
 		case FILESTORE:
-			{	final IFileStore store= (IFileStore) this.unit.getResource();
+			{	final IFileStore store= (IFileStore)this.unit.getResource();
 				return FileBuffers.getTextFileBufferManager().getFileStoreTextFileBuffer(store);
 			}
 		default:
@@ -135,12 +142,12 @@
 				final SubMonitor m= SubMonitor.convert(monitor);
 				switch (getResourceMode()) {
 				case IFILE:
-					{	final IPath path= ((IFile) this.unit.getResource()).getFullPath();
+					{	final IPath path= ((IFile)this.unit.getResource()).getFullPath();
 						FileBuffers.getTextFileBufferManager().disconnect(path, LocationKind.IFILE, m);
 						break;
 					}
 				case FILESTORE:
-					{	final IFileStore store= (IFileStore) this.unit.getResource();
+					{	final IFileStore store= (IFileStore)this.unit.getResource();
 						FileBuffers.getTextFileBufferManager().disconnectFileStore(store, m);
 						break;
 					}
@@ -149,7 +156,7 @@
 				}
 			}
 			catch (final CoreException e) {
-				LTKCorePlugin.log(new Status(IStatus.ERROR, LTKCorePlugin.BUNDLE_ID, -1,
+				LtkCorePlugin.log(new Status(IStatus.ERROR, LtkCorePlugin.BUNDLE_ID, -1,
 						"An error occurred when releasing the document of the file buffer.", e ));
 			}
 			finally {
@@ -174,7 +181,7 @@
 					buffer.validateState(monitor, IWorkspace.VALIDATE_PROMPT);
 				}
 				catch (final CoreException e) {
-					LTKCorePlugin.log(new Status(IStatus.ERROR, LTKCorePlugin.BUNDLE_ID, -1,
+					LtkCorePlugin.log(new Status(IStatus.ERROR, LtkCorePlugin.BUNDLE_ID, -1,
 							"An error occurred when validating file buffer state.", e ));
 				}
 			}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericFragmentSourceUnit.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericFragmentSourceUnit.java
index 0ce9e99..b876144 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericFragmentSourceUnit.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericFragmentSourceUnit.java
@@ -14,25 +14,28 @@
 
 package org.eclipse.statet.ltk.model.core.impl;
 
-import java.util.Collections;
-import java.util.List;
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.SubMonitor;
 import org.eclipse.jface.text.AbstractDocument;
 import org.eclipse.jface.text.ISynchronizable;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.ISourceFragment;
 
 import org.eclipse.statet.ltk.ast.core.AstInfo;
 import org.eclipse.statet.ltk.core.ElementName;
 import org.eclipse.statet.ltk.core.SourceContent;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 
 
-public abstract class GenericFragmentSourceUnit implements ISourceUnit {
+@NonNullByDefault
+public abstract class GenericFragmentSourceUnit implements SourceUnit {
 	
 	
 	private final ElementName name;
@@ -40,16 +43,12 @@
 	private final ISourceFragment fragment;
 	private final long timestamp;
 	
-	private AbstractDocument document;
+	private @Nullable AbstractDocument document;
 	
 	private int counter= 0;
 	
 	
 	public GenericFragmentSourceUnit(final String id, final ISourceFragment fragment) {
-		if (fragment == null) {
-			throw new NullPointerException("fragment"); //$NON-NLS-1$
-		}
-		this.fragment= fragment;
 		this.name= new ElementName() {
 			@Override
 			public int getType() {
@@ -64,16 +63,17 @@
 				return GenericFragmentSourceUnit.this.fragment.getName();
 			}
 			@Override
-			public ElementName getNextSegment() {
+			public @Nullable ElementName getNextSegment() {
 				return null;
 			}
 		};
+		this.fragment= nonNullAssert(fragment);
 		this.timestamp= System.currentTimeMillis();
 	}
 	
 	
 	@Override
-	public ISourceUnit getUnderlyingUnit() {
+	public @Nullable SourceUnit getUnderlyingUnit() {
 		return null;
 	}
 	
@@ -95,32 +95,23 @@
 	 * {@inheritDoc}
 	 * 
 	 * A source unit of this type is usually of the type
-	 * {@link IModelElement#C2_SOURCE_CHUNK C2_SOURCE_CHUNK}.
+	 * {@link LtkModelElement#C2_SOURCE_CHUNK C2_SOURCE_CHUNK}.
 	 */
 	@Override
 	public int getElementType() {
-		return IModelElement.C2_SOURCE_CHUNK;
+		return LtkModelElement.C2_SOURCE_CHUNK;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public ElementName getElementName() {
 		return this.name;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public boolean exists() {
 		return this.counter > 0;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public boolean isReadOnly() {
 		return true;
@@ -138,39 +129,32 @@
 	 * A source unit of this type is usually doesn't have a resource/path.
 	 */
 	@Override
-	public Object getResource() {
+	public @Nullable Object getResource() {
 		return null;
 	}
 	
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public synchronized AbstractDocument getDocument(final IProgressMonitor monitor) {
-		if (this.document == null) {
-			this.document= this.fragment.getDocument();
+	public synchronized AbstractDocument getDocument(final @Nullable IProgressMonitor monitor) {
+		AbstractDocument document= this.document;
+		if (document == null) {
+			document= this.fragment.getDocument();
+			this.document= document;
 		}
-		return this.document;
+		return document;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public long getContentStamp(final IProgressMonitor monitor) {
 		return this.timestamp;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public SourceContent getContent(final IProgressMonitor monitor) {
 		final AbstractDocument document= getDocument(monitor);
 		Object lockObject= null;
 		if (document instanceof ISynchronizable) {
-			lockObject= ((ISynchronizable) document).getLockObject();
+			lockObject= ((ISynchronizable)document).getLockObject();
 		}
 		if (lockObject == null) {
 			lockObject= this.fragment;
@@ -180,63 +164,19 @@
 		}
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	@SuppressWarnings("unchecked")
-	public <T> T getAdapter(final Class<T> adapterType) {
-		if (adapterType == ISourceFragment.class) {
-			return (T) this.fragment;
-		}
+	public @Nullable AstInfo getAstInfo(final @Nullable String type, final boolean ensureSync,
+			final IProgressMonitor monitor) {
+		return null;
+	}
+	
+	@Override
+	public @Nullable SourceUnitModelInfo getModelInfo(final @Nullable String type, final int syncLevel,
+			final IProgressMonitor monitor) {
 		return null;
 	}
 	
 	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public AstInfo getAstInfo(final String type, final boolean ensureSync, final IProgressMonitor monitor) {
-		return null;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public ISourceUnitModelInfo getModelInfo(final String type, final int syncLevel, final IProgressMonitor monitor) {
-		return null;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public IModelElement getModelParent() {
-		return null;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public boolean hasModelChildren(final Filter filter) {
-		return false;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public List<? extends IModelElement> getModelChildren(final Filter filter) {
-		return Collections.EMPTY_LIST;
-	}
-	
-	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public synchronized final void connect(final IProgressMonitor monitor) {
 		this.counter++;
@@ -246,9 +186,6 @@
 		}
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public synchronized final void disconnect(final IProgressMonitor monitor) {
 		this.counter--;
@@ -257,9 +194,6 @@
 		}
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public synchronized boolean isConnected() {
 		return (this.counter > 0);
@@ -273,6 +207,16 @@
 	
 	
 	@Override
+	@SuppressWarnings("unchecked")
+	public <T> @Nullable T getAdapter(final Class<T> adapterType) {
+		if (adapterType == ISourceFragment.class) {
+			return (T)this.fragment;
+		}
+		return null;
+	}
+	
+	
+	@Override
 	public String toString() {
 		return getModelTypeId() + '/' + getWorkingContext() + ": " + getId(); //$NON-NLS-1$
 	}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericFragmentSourceUnit2.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericFragmentSourceUnit2.java
index 237c0ae..bfae543 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericFragmentSourceUnit2.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericFragmentSourceUnit2.java
@@ -16,11 +16,15 @@
 
 import org.eclipse.core.runtime.IProgressMonitor;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.ISourceFragment;
 
 import org.eclipse.statet.ltk.ast.core.AstInfo;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.build.SourceUnitModelContainer;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 
 
 /**
@@ -29,13 +33,15 @@
  *   <li>Support for {@link SourceUnitModelContainer}</li>
  * </ul>
  * 
- * @param <M>
+ * @param <TModelContainer>
  */
-public abstract class GenericFragmentSourceUnit2<M extends SourceUnitModelContainer<? extends ISourceUnit, ? extends ISourceUnitModelInfo>>
+@NonNullByDefault
+public abstract class GenericFragmentSourceUnit2<
+				TModelContainer extends SourceUnitModelContainer<? extends SourceUnit, ? extends SourceUnitModelInfo>>
 		extends GenericFragmentSourceUnit {
 	
 	
-	private final M model;
+	private final TModelContainer model;
 	
 	
 	public GenericFragmentSourceUnit2(final String id, final ISourceFragment fragment) {
@@ -44,10 +50,10 @@
 	}
 	
 	
-	protected abstract M createModelContainer();
+	protected abstract TModelContainer createModelContainer();
 	
 	
-	protected final M getModelContainer() {
+	protected final TModelContainer getModelContainer() {
 		return this.model;
 	}
 	
@@ -60,7 +66,7 @@
 	}
 	
 	@Override
-	public AstInfo getAstInfo(final String type, final boolean ensureSync,
+	public @Nullable AstInfo getAstInfo(final @Nullable String type, final boolean ensureSync,
 			final IProgressMonitor monitor) {
 		if (type == null || this.model.isContainerFor(type)) {
 			return this.model.getAstInfo(ensureSync, monitor);
@@ -69,7 +75,7 @@
 	}
 	
 	@Override
-	public ISourceUnitModelInfo getModelInfo(final String type, final int flags,
+	public @Nullable SourceUnitModelInfo getModelInfo(final @Nullable String type, final int flags,
 			final IProgressMonitor monitor) {
 		if (type == null || this.model.isContainerFor(type)) {
 			return this.model.getModelInfo(flags, monitor);
@@ -79,9 +85,9 @@
 	
 	@Override
 	@SuppressWarnings("unchecked")
-	public <T> T getAdapter(final Class<T> adapterType) {
+	public <T> @Nullable T getAdapter(final Class<T> adapterType) {
 		if (adapterType == this.model.getAdapterClass()) {
-			return (T) this.model;
+			return (T)this.model;
 		}
 		return super.getAdapter(adapterType);
 	}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericResourceSourceUnit.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericResourceSourceUnit.java
index c75bb9e..10a17a4 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericResourceSourceUnit.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericResourceSourceUnit.java
@@ -15,8 +15,6 @@
 package org.eclipse.statet.ltk.model.core.impl;
 
 import java.lang.reflect.InvocationTargetException;
-import java.util.Collections;
-import java.util.List;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
@@ -24,50 +22,36 @@
 import org.eclipse.core.runtime.SubMonitor;
 import org.eclipse.jface.text.AbstractDocument;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+import org.eclipse.statet.jcommons.lang.ObjectUtils;
+
 import org.eclipse.statet.ecommons.text.IMarkerPositionResolver;
 
 import org.eclipse.statet.ltk.ast.core.AstInfo;
 import org.eclipse.statet.ltk.core.ElementName;
-import org.eclipse.statet.ltk.core.LTK;
+import org.eclipse.statet.ltk.core.Ltk;
 import org.eclipse.statet.ltk.core.SourceContent;
 import org.eclipse.statet.ltk.core.WorkingContext;
-import org.eclipse.statet.ltk.model.core.SourceDocumentRunnable;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
-import org.eclipse.statet.ltk.model.core.elements.IWorkspaceSourceUnit;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.SourceDocumentRunnable;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.element.WorkspaceSourceUnit;
 
 
 /**
  * Generic source unit for files in the Eclipse workspace (IFile).
  */
-public abstract class GenericResourceSourceUnit implements IWorkspaceSourceUnit {
+@NonNullByDefault
+public abstract class GenericResourceSourceUnit implements WorkspaceSourceUnit {
 	
 	
 	public static String createResourceId(final IResource file) {
 		return AbstractFilePersistenceSourceUnitFactory.createResourceId(file);
 	}
 	
-	
-	private final String id;
-	private final ElementName name;
-	
-	private final IFile file;
-	private IWorkingBuffer buffer;
-	
-	private int counter= 0;
-	
-	
-	public GenericResourceSourceUnit(final String id, final IFile file) {
-		if (file == null) {
-			throw new NullPointerException("file"); //$NON-NLS-1$
-		}
-		this.id= id;
-		this.file= file;
-		this.name= createElementName();
-	}
-	
-	protected ElementName createElementName() {
+	protected static ElementName createResourceName(final IFile file) {
 		return new ElementName() {
 			@Override
 			public int getType() {
@@ -75,27 +59,48 @@
 			}
 			@Override
 			public String getDisplayName() {
-				return GenericResourceSourceUnit.this.file.getName();
+				return file.getName();
 			}
 			@Override
 			public String getSegmentName() {
-				return GenericResourceSourceUnit.this.file.getName();
+				return file.getName();
 			}
 			@Override
-			public ElementName getNextSegment() {
+			public @Nullable ElementName getNextSegment() {
 				return null;
 			}
 		};
 	}
 	
 	
+	private final String id;
+	private final ElementName name;
+	
+	private final IFile file;
+	private WorkingBuffer buffer;
+	
+	private int counter= 0;
+	
+	
+	@SuppressWarnings("null")
+	public GenericResourceSourceUnit(final String id, final ElementName name, final IFile file) {
+		this.id= id;
+		this.name= name;
+		this.file= ObjectUtils.nonNullAssert(file);
+	}
+	
+	public GenericResourceSourceUnit(final String id, final IFile file) {
+		this(id, createResourceName(file), file);
+	}
+	
+	
 	/**
 	 * {@inheritDoc}
 	 * 
 	 * A source unit of this type usually doesn't have a underlying unit.
 	 */
 	@Override
-	public ISourceUnit getUnderlyingUnit() {
+	public @Nullable SourceUnit getUnderlyingUnit() {
 		return null;
 	}
 	
@@ -104,9 +109,6 @@
 		return true;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public final String getId() {
 		return this.id;
@@ -116,35 +118,29 @@
 	 * {@inheritDoc}
 	 * 
 	 * A source unit of this type usually belongs to the
-	 * {@link LTK#PERSISTENCE_CONTEXT}.
+	 * {@link Ltk#PERSISTENCE_CONTEXT}.
 	 */
 	@Override
 	public WorkingContext getWorkingContext() {
-		return LTK.PERSISTENCE_CONTEXT;
+		return Ltk.PERSISTENCE_CONTEXT;
 	}
 	
 	/**
 	 * {@inheritDoc}
 	 * 
 	 * A source unit of this type is usually of the type
-	 * {@link IModelElement#C2_SOURCE_FILE C2_SOURCE_FILE}.
+	 * {@link LtkModelElement#C2_SOURCE_FILE C2_SOURCE_FILE}.
 	 */
 	@Override
 	public int getElementType() {
 		return C2_SOURCE_FILE;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public final ElementName getElementName() {
 		return this.name;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public boolean exists() {
 		return true;
@@ -162,131 +158,77 @@
 	}
 	
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public final IResource getResource() {
 		return this.file;
 	}
 	
 	@Override
-	public IMarkerPositionResolver getMarkerPositionResolver() {
+	public @Nullable IMarkerPositionResolver getMarkerPositionResolver() {
 		return null;
 	}
 	
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public boolean checkState(final boolean validate, final IProgressMonitor monitor) {
 		return this.buffer.checkState(validate, monitor);
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public AbstractDocument getDocument(final IProgressMonitor monitor) {
+	public AbstractDocument getDocument(final @Nullable IProgressMonitor monitor) {
 		return this.buffer.getDocument(monitor);
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public long getContentStamp(final IProgressMonitor monitor) {
 		return this.buffer.getContentStamp(monitor);
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public SourceContent getContent(final IProgressMonitor monitor) {
 		return this.buffer.getContent(monitor);
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public void syncExec(final SourceDocumentRunnable runnable) throws InvocationTargetException {
 		throw new UnsupportedOperationException();
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	@SuppressWarnings("unchecked")
-	public <T> T getAdapter(final Class<T> adapterType) {
+	public <T> @Nullable T getAdapter(final Class<T> adapterType) {
 		if (adapterType.equals(IResource.class)) {
-			return (T) getResource();
+			return (T)getResource();
 		}
 		return null;
 	}
 	
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public AstInfo getAstInfo(final String type, final boolean ensureSync, final IProgressMonitor monitor) {
+	public @Nullable AstInfo getAstInfo(final @Nullable String type, final boolean ensureSync,
+			final IProgressMonitor monitor) {
 		return null;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public ISourceUnitModelInfo getModelInfo(final String type, final int syncLevel, final IProgressMonitor monitor) {
+	public @Nullable SourceUnitModelInfo getModelInfo(final @Nullable String type, final int syncLevel,
+			final IProgressMonitor monitor) {
 		return null;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public IModelElement getModelParent() {
-		return null; // directory
-	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public boolean hasModelChildren(final Filter filter) {
-		return false; 
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public List<? extends IModelElement> getModelChildren(final Filter filter) {
-		return Collections.EMPTY_LIST; 
-	}
-	
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
+	@SuppressWarnings("unused")
 	public synchronized final void connect(final IProgressMonitor monitor) {
 		this.counter++;
 		if (this.counter == 1) {
 			if (this.buffer == null) {
-				this.buffer= new WorkingBuffer(this);
+				this.buffer= new BasicWorkingBuffer(this);
 			}
 			register();
 		}
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public synchronized final void disconnect(final IProgressMonitor monitor) {
 		this.counter--;
@@ -297,9 +239,6 @@
 		}
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public synchronized boolean isConnected() {
 		return (this.counter > 0);
@@ -318,15 +257,18 @@
 	}
 	
 	@Override
-	public boolean equals(final Object obj) {
-		if (!(obj instanceof ISourceUnit)) {
-			return false;
+	public boolean equals(final @Nullable Object obj) {
+		if (this == obj) {
+			return true;
 		}
-		final ISourceUnit other= (ISourceUnit) obj;
-		return (getElementType() == other.getElementType()
-				&& getWorkingContext() == other.getWorkingContext()
-				&& getId().equals(other.getId())
-				&& getModelTypeId().equals(other.getModelTypeId()) );
+		if (obj instanceof SourceUnit) {
+			final SourceUnit other= (SourceUnit)obj;
+			return (getElementType() == other.getElementType()
+					&& getWorkingContext() == other.getWorkingContext()
+					&& getId().equals(other.getId())
+					&& getModelTypeId().equals(other.getModelTypeId()) );
+		}
+		return false;
 	}
 	
 	@Override
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericResourceSourceUnit2.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericResourceSourceUnit2.java
index 8cdf086..5bf72bf 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericResourceSourceUnit2.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericResourceSourceUnit2.java
@@ -17,10 +17,14 @@
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.IProgressMonitor;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ltk.ast.core.AstInfo;
-import org.eclipse.statet.ltk.model.core.IModelManager;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.ModelManager;
+import org.eclipse.statet.ltk.model.core.build.SourceUnitModelContainer;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 
 
 /**
@@ -29,13 +33,15 @@
  *   <li>Support for {@link SourceUnitModelContainer}</li>
  * </ul>
  * 
- * @param <M>
+ * @param <TModelContainer>
  */
-public abstract class GenericResourceSourceUnit2<M extends SourceUnitModelContainer<? extends ISourceUnit, ? extends ISourceUnitModelInfo>>
+@NonNullByDefault
+public abstract class GenericResourceSourceUnit2<
+				TModelContainer extends SourceUnitModelContainer<? extends SourceUnit, ? extends SourceUnitModelInfo>>
 		extends GenericResourceSourceUnit {
 	
 	
-	private final M model;
+	private final TModelContainer model;
 	
 	
 	public GenericResourceSourceUnit2(final String id, final IFile file) {
@@ -45,9 +51,9 @@
 	}
 	
 	
-	protected abstract M createModelContainer();
+	protected abstract TModelContainer createModelContainer();
 	
-	protected final M getModelContainer() {
+	protected final TModelContainer getModelContainer() {
 		return this.model;
 	}
 	
@@ -60,12 +66,12 @@
 	}
 	
 	@Override
-	public AstInfo getAstInfo(final String type, final boolean ensureSync,
+	public @Nullable AstInfo getAstInfo(final @Nullable String type, final boolean ensureSync,
 			final IProgressMonitor monitor) {
 		if (type == null || this.model.isContainerFor(type)) {
 			final AstInfo ast= this.model.getCurrentAst();
 			final long stamp= getResource().getModificationStamp();
-			if (ast != null && ast.getStamp().getSourceStamp() == stamp) {
+			if (ast != null && ast.getStamp().getContentStamp() == stamp) {
 				return ast;
 			}
 			// TODO
@@ -74,11 +80,11 @@
 	}
 	
 	@Override
-	public ISourceUnitModelInfo getModelInfo(final String type, final int flags,
+	public @Nullable SourceUnitModelInfo getModelInfo(final @Nullable String type, final int flags,
 			final IProgressMonitor monitor) {
 		if (type == null || this.model.isContainerFor(type)) {
-			if ((flags & IModelManager.RECONCILE) != 0) {
-				if ((flags & IModelManager.REFRESH) != 0) {
+			if ((flags & ModelManager.RECONCILE) != 0) {
+				if ((flags & ModelManager.REFRESH) != 0) {
 					this.model.clear();
 				}
 				// trigger rebuild?
@@ -92,9 +98,9 @@
 	
 	@Override
 	@SuppressWarnings("unchecked")
-	public <T> T getAdapter(final Class<T> adapterType) {
+	public <T> @Nullable T getAdapter(final Class<T> adapterType) {
 		if (adapterType == this.model.getAdapterClass()) {
-			return (T) this.model;
+			return (T)this.model;
 		}
 		return super.getAdapter(adapterType);
 	}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericSourceUnitWorkingCopy.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericSourceUnitWorkingCopy.java
index 0e9feb9..9cbf389 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericSourceUnitWorkingCopy.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericSourceUnitWorkingCopy.java
@@ -14,31 +14,31 @@
 
 package org.eclipse.statet.ltk.model.core.impl;
 
-import java.util.Collections;
-import java.util.List;
-
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.SubMonitor;
 import org.eclipse.jface.text.AbstractDocument;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.core.sections.DocContentSections;
 
 import org.eclipse.statet.ltk.ast.core.AstInfo;
 import org.eclipse.statet.ltk.core.ElementName;
 import org.eclipse.statet.ltk.core.SourceContent;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 
 
 /**
  * Generic source unit for working copies based on the same unit in the underlying context
  */
-public abstract class GenericSourceUnitWorkingCopy implements ISourceUnit {
+@NonNullByDefault
+public abstract class GenericSourceUnitWorkingCopy implements SourceUnit {
 	
 	
-	private final ISourceUnit from;
-	private IWorkingBuffer buffer;
+	private final SourceUnit from;
+	private WorkingBuffer buffer;
 	
 	private int counter= 0;
 	
@@ -48,17 +48,18 @@
 	 * 
 	 * @param from the underlying unit to create a working copy from
 	 */
-	public GenericSourceUnitWorkingCopy(final ISourceUnit from) {
+	@SuppressWarnings("null")
+	public GenericSourceUnitWorkingCopy(final SourceUnit from) {
 		this.from= from;
 	}
 	
 	
 	@Override
-	public final ISourceUnit getUnderlyingUnit() {
+	public final SourceUnit getUnderlyingUnit() {
 		return this.from;
 	}
 	
-	protected final IWorkingBuffer getWorkingBuffer() {
+	protected final WorkingBuffer getWorkingBuffer() {
 		return this.buffer;
 	}
 	
@@ -67,49 +68,31 @@
 		return this.buffer.isSynchronized();
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public String getModelTypeId() {
 		return this.from.getModelTypeId();
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public int getElementType() {
 		return this.from.getElementType();
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public ElementName getElementName() {
 		return this.from.getElementName();
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public String getId() {
 		return this.from.getId();
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public boolean exists() {
 		return this.counter > 0;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public boolean isReadOnly() {
 		return false;
@@ -120,20 +103,14 @@
 		return this.buffer.checkState(validate, monitor);
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public Object getResource() {
+	public @Nullable Object getResource() {
 		return this.from.getResource();
 	}
 	
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public AbstractDocument getDocument(final IProgressMonitor monitor) {
+	public AbstractDocument getDocument(final @Nullable IProgressMonitor monitor) {
 		return this.buffer.getDocument(monitor);
 	}
 	
@@ -142,68 +119,32 @@
 		return this.from.getDocumentContentInfo();
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public long getContentStamp(final IProgressMonitor monitor) {
 		return this.buffer.getContentStamp(monitor);
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public SourceContent getContent(final IProgressMonitor monitor) {
 		return this.buffer.getContent(monitor);
 	}
 	
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public AstInfo getAstInfo(final String type, final boolean ensureSync, final IProgressMonitor monitor) {
+	public @Nullable AstInfo getAstInfo(final @Nullable String type, final boolean ensureSync,
+			final IProgressMonitor monitor) {
 		return null;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public ISourceUnitModelInfo getModelInfo(final String type, final int syncLevel, final IProgressMonitor monitor) {
+	public @Nullable SourceUnitModelInfo getModelInfo(final @Nullable String type, final int syncLevel,
+			final IProgressMonitor monitor) {
 		return null;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public IModelElement getModelParent() {
-		return null; // directory
-	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public boolean hasModelChildren(final Filter filter) {
-		return false; 
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public List<? extends IModelElement> getModelChildren(final Filter filter) {
-		return Collections.EMPTY_LIST; 
-	}
-	
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
+	@SuppressWarnings("unused")
 	public synchronized final void connect(final IProgressMonitor monitor) {
 		this.counter++;
 		if (this.counter == 1) {
@@ -217,9 +158,6 @@
 		}
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public synchronized final void disconnect(final IProgressMonitor monitor) {
 		this.counter--;
@@ -231,15 +169,12 @@
 		}
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public synchronized boolean isConnected() {
 		return (this.counter > 0);
 	}
 	
-	protected abstract IWorkingBuffer createWorkingBuffer(SubMonitor m);
+	protected abstract WorkingBuffer createWorkingBuffer(SubMonitor m);
 	
 	protected void register() {
 	}
@@ -247,8 +182,9 @@
 	protected void unregister() {
 	}
 	
+	
 	@Override
-	public <T> T getAdapter(final Class<T> adapterType) {
+	public <T> @Nullable T getAdapter(final Class<T> adapterType) {
 		return this.from.getAdapter(adapterType);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericSourceUnitWorkingCopy2.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericSourceUnitWorkingCopy2.java
index 7b97cbb..98856dd 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericSourceUnitWorkingCopy2.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericSourceUnitWorkingCopy2.java
@@ -16,9 +16,13 @@
 
 import org.eclipse.core.runtime.IProgressMonitor;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ltk.ast.core.AstInfo;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.build.SourceUnitModelContainer;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 
 
 /**
@@ -27,25 +31,27 @@
  *   <li>Support for {@link SourceUnitModelContainer}</li>
  * </ul>
  * 
- * @param <M>
+ * @param <TModelContainer>
  */
-public abstract class GenericSourceUnitWorkingCopy2<M extends SourceUnitModelContainer<? extends ISourceUnit, ? extends ISourceUnitModelInfo>>
+@NonNullByDefault
+public abstract class GenericSourceUnitWorkingCopy2<
+				TModelContainer extends SourceUnitModelContainer<? extends SourceUnit, ? extends SourceUnitModelInfo>>
 		extends GenericSourceUnitWorkingCopy {
 	
 	
-	private final M model;
+	private final TModelContainer model;
 	
 	
-	public GenericSourceUnitWorkingCopy2(final ISourceUnit from) {
+	public GenericSourceUnitWorkingCopy2(final SourceUnit from) {
 		super(from);
 		
 		this.model= createModelContainer();
 	}
 	
 	
-	protected abstract M createModelContainer();
+	protected abstract TModelContainer createModelContainer();
 	
-	protected final M getModelContainer() {
+	protected final TModelContainer getModelContainer() {
 		return this.model;
 	}
 	
@@ -58,7 +64,7 @@
 	}
 	
 	@Override
-	public AstInfo getAstInfo(final String type, final boolean ensureSync,
+	public @Nullable AstInfo getAstInfo(final @Nullable String type, final boolean ensureSync,
 			final IProgressMonitor monitor) {
 		if (type == null || this.model.isContainerFor(type)) {
 			return this.model.getAstInfo(ensureSync, monitor);
@@ -67,7 +73,7 @@
 	}
 	
 	@Override
-	public ISourceUnitModelInfo getModelInfo(final String type, final int flags,
+	public @Nullable SourceUnitModelInfo getModelInfo(final @Nullable String type, final int flags,
 			final IProgressMonitor monitor) {
 		if (type == null || this.model.isContainerFor(type)) {
 			return this.model.getModelInfo(flags, monitor);
@@ -77,9 +83,9 @@
 	
 	@Override
 	@SuppressWarnings("unchecked")
-	public <T> T getAdapter(final Class<T> adapterType) {
+	public <T> @Nullable T getAdapter(final Class<T> adapterType) {
 		if (adapterType == this.model.getAdapterClass()) {
-			return (T) this.model;
+			return (T)this.model;
 		}
 		return super.getAdapter(adapterType);
 	}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericUriSourceUnit.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericUriSourceUnit.java
index 1338d54..97b21de 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericUriSourceUnit.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericUriSourceUnit.java
@@ -14,41 +14,42 @@
 
 package org.eclipse.statet.ltk.model.core.impl;
 
-import java.util.Collections;
-import java.util.List;
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
 
 import org.eclipse.core.filesystem.IFileStore;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.SubMonitor;
 import org.eclipse.jface.text.AbstractDocument;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ltk.ast.core.AstInfo;
 import org.eclipse.statet.ltk.core.ElementName;
 import org.eclipse.statet.ltk.core.SourceContent;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 
 
 /**
  * Generic source unit for external files (URI/EFS).
  */
-public abstract class GenericUriSourceUnit implements ISourceUnit {
+@NonNullByDefault
+public abstract class GenericUriSourceUnit implements SourceUnit {
 	
 	
 	private final String id;
 	private final ElementName name;
 	
 	private final IFileStore fileStore;
-	private IWorkingBuffer buffer;
+	private WorkingBuffer buffer;
 	
 	private int counter= 0;
 	
 	
+	@SuppressWarnings("null")
 	public GenericUriSourceUnit(final String id, final IFileStore fileStore) {
-		if (fileStore == null) {
-			throw new NullPointerException("fileStore"); //$NON-NLS-1$
-		}
 		this.id= id;
 		this.name= new ElementName() {
 			@Override
@@ -64,19 +65,16 @@
 				return GenericUriSourceUnit.this.id;
 			}
 			@Override
-			public ElementName getNextSegment() {
+			public @Nullable ElementName getNextSegment() {
 				return null;
 			}
 		};
-		this.fileStore= fileStore;
+		this.fileStore= nonNullAssert(fileStore);
 	}
 	
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public ISourceUnit getUnderlyingUnit() {
+	public @Nullable SourceUnit getUnderlyingUnit() {
 		return null;
 	}
 	
@@ -85,9 +83,6 @@
 		return this.buffer.isSynchronized();
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public String getId() {
 		return this.id;
@@ -97,32 +92,23 @@
 	 * {@inheritDoc}
 	 * 
 	 * A source unit of this type is usually of the type
-	 * {@link IModelElement#C2_SOURCE_FILE C2_SOURCE_FILE}.
+	 * {@link LtkModelElement#C2_SOURCE_FILE C2_SOURCE_FILE}.
 	 */
 	@Override
 	public int getElementType() {
-		return IModelElement.C2_SOURCE_FILE;
+		return LtkModelElement.C2_SOURCE_FILE;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public ElementName getElementName() {
 		return this.name;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public boolean exists() {
 		return this.counter > 0;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public boolean isReadOnly() {
 		return false;
@@ -145,85 +131,37 @@
 	}
 	
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public AbstractDocument getDocument(final IProgressMonitor monitor) {
+	public AbstractDocument getDocument(final @Nullable IProgressMonitor monitor) {
 		return this.buffer.getDocument(monitor);
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public long getContentStamp(final IProgressMonitor monitor) {
 		return this.buffer.getContentStamp(monitor);
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public SourceContent getContent(final IProgressMonitor monitor) {
 		return this.buffer.getContent(monitor);
 	}
 	
+	
 	@Override
-	@SuppressWarnings("unchecked")
-	public <T> T getAdapter(final Class<T> adapterType) {
-		if (adapterType == IFileStore.class) {
-			return (T) this.fileStore;
-		}
+	public @Nullable AstInfo getAstInfo(final @Nullable String type, final boolean ensureSync,
+			final IProgressMonitor monitor) {
+		return null;
+	}
+	
+	@Override
+	public @Nullable SourceUnitModelInfo getModelInfo(final @Nullable String type, final int syncLevel,
+			final IProgressMonitor monitor) {
 		return null;
 	}
 	
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public AstInfo getAstInfo(final String type, final boolean ensureSync, final IProgressMonitor monitor) {
-		return null;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public ISourceUnitModelInfo getModelInfo(final String type, final int syncLevel, final IProgressMonitor monitor) {
-		return null;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public IModelElement getModelParent() {
-		return null;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public boolean hasModelChildren(final Filter filter) {
-		return false;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public List<? extends IModelElement> getModelChildren(final Filter filter) {
-		return Collections.EMPTY_LIST;
-	}
-	
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
+	@SuppressWarnings("unused")
 	public synchronized final void connect(final IProgressMonitor monitor) {
 		this.counter++;
 		if (this.counter == 1) {
@@ -236,9 +174,6 @@
 		}
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public synchronized final void disconnect(final IProgressMonitor monitor) {
 		this.counter--;
@@ -249,15 +184,12 @@
 		}
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public synchronized boolean isConnected() {
 		return (this.counter > 0);
 	}
 	
-	protected abstract IWorkingBuffer createWorkingBuffer(SubMonitor m);
+	protected abstract WorkingBuffer createWorkingBuffer(SubMonitor m);
 	
 	protected void register() {
 	}
@@ -267,6 +199,16 @@
 	
 	
 	@Override
+	@SuppressWarnings("unchecked")
+	public <T> @Nullable T getAdapter(final Class<T> adapterType) {
+		if (adapterType == IFileStore.class) {
+			return (T)this.fileStore;
+		}
+		return null;
+	}
+	
+	
+	@Override
 	public String toString() {
 		return getModelTypeId() + '/' + getWorkingContext() + ": " + getId(); //$NON-NLS-1$
 	}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericUriSourceUnit2.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericUriSourceUnit2.java
index 4e54f72..1ad0119 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericUriSourceUnit2.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/GenericUriSourceUnit2.java
@@ -17,9 +17,13 @@
 import org.eclipse.core.filesystem.IFileStore;
 import org.eclipse.core.runtime.IProgressMonitor;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ltk.ast.core.AstInfo;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.build.SourceUnitModelContainer;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 
 
 /**
@@ -28,13 +32,15 @@
  *   <li>Support for {@link SourceUnitModelContainer}</li>
  * </ul>
  * 
- * @param <M>
+ * @param <TModelContainer>
  */
-public abstract class GenericUriSourceUnit2<M extends SourceUnitModelContainer<? extends ISourceUnit, ? extends ISourceUnitModelInfo>>
+@NonNullByDefault
+public abstract class GenericUriSourceUnit2<
+				TModelContainer extends SourceUnitModelContainer<? extends SourceUnit, ? extends SourceUnitModelInfo>>
 		extends GenericUriSourceUnit {
 	
 	
-	private final M model;
+	private final TModelContainer model;
 	
 	
 	public GenericUriSourceUnit2(final String id, final IFileStore fileStore) {
@@ -44,10 +50,10 @@
 	}
 	
 	
-	protected abstract M createModelContainer();
+	protected abstract TModelContainer createModelContainer();
 	
 	
-	protected final M getModelContainer() {
+	protected final TModelContainer getModelContainer() {
 		return this.model;
 	}
 	
@@ -60,7 +66,7 @@
 	}
 	
 	@Override
-	public AstInfo getAstInfo(final String type, final boolean ensureSync,
+	public @Nullable AstInfo getAstInfo(final @Nullable String type, final boolean ensureSync,
 			final IProgressMonitor monitor) {
 		if (type == null || this.model.isContainerFor(type)) {
 			return this.model.getAstInfo(ensureSync, monitor);
@@ -69,7 +75,7 @@
 	}
 	
 	@Override
-	public ISourceUnitModelInfo getModelInfo(final String type, final int flags,
+	public @Nullable SourceUnitModelInfo getModelInfo(final @Nullable String type, final int flags,
 			final IProgressMonitor monitor) {
 		if (type == null || this.model.isContainerFor(type)) {
 			return this.model.getModelInfo(flags, monitor);
@@ -79,9 +85,9 @@
 	
 	@Override
 	@SuppressWarnings("unchecked")
-	public <T> T getAdapter(final Class<T> adapterType) {
+	public <T> @Nullable T getAdapter(final Class<T> adapterType) {
 		if (adapterType == this.model.getAdapterClass()) {
-			return (T) this.model;
+			return (T)this.model;
 		}
 		return super.getAdapter(adapterType);
 	}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/IWorkingBuffer.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/IWorkingBuffer.java
deleted file mode 100644
index e08aa8c..0000000
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/IWorkingBuffer.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*=============================================================================#
- # Copyright (c) 2007, 2020 Stephan Wahlbrink and others.
- # 
- # This program and the accompanying materials are made available under the
- # terms of the Eclipse Public License 2.0 which is available at
- # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
- # which is available at https://www.apache.org/licenses/LICENSE-2.0.
- # 
- # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
- # 
- # Contributors:
- #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
- #=============================================================================*/
-
-package org.eclipse.statet.ltk.model.core.impl;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.text.AbstractDocument;
-
-import org.eclipse.statet.ltk.core.SourceContent;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-
-
-/**
- * Interface to access documents. 
- * Usually only used inside implementations of {@link ISourceUnit}.
- * <p>
- * For the progress monitors of the methods the SubMonitor pattern is applied.</p>
- */
-public interface IWorkingBuffer {
-	
-	
-	long getContentStamp(IProgressMonitor monitor);
-	
-	/**
-	 * @return the document or <code>null</code>
-	 */
-	AbstractDocument getDocument();
-	
-	/**
-	 * @return the document
-	 */
-	AbstractDocument getDocument(IProgressMonitor monitor);
-	SourceContent getContent(IProgressMonitor monitor);
-	boolean checkState(boolean validate, IProgressMonitor monitor);
-	boolean isSynchronized();
-	void saveDocument(IProgressMonitor monitor);
-	void releaseDocument(IProgressMonitor monitor);
-	
-}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/NameAccessAccumulator.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/NameAccessAccumulator.java
index 6390fd9..9325ecb 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/NameAccessAccumulator.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/NameAccessAccumulator.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ltk.model.core.impl;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -33,10 +35,7 @@
 	
 	
 	public NameAccessAccumulator(final String label) {
-		if (label == null) {
-			throw new NullPointerException("label"); //$NON-NLS-1$
-		}
-		this.label= label;
+		this.label= nonNullAssert(label);
 		this.list= new ArrayList<>(8);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/SourceUnitModelContainer.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/SourceUnitModelContainer.java
deleted file mode 100644
index 65974fe..0000000
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/SourceUnitModelContainer.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*=============================================================================#
- # Copyright (c) 2009, 2020 Stephan Wahlbrink and others.
- # 
- # This program and the accompanying materials are made available under the
- # terms of the Eclipse Public License 2.0 which is available at
- # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
- # which is available at https://www.apache.org/licenses/LICENSE-2.0.
- # 
- # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
- # 
- # Contributors:
- #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
- #=============================================================================*/
-
-package org.eclipse.statet.ltk.model.core.impl;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import org.eclipse.statet.ltk.ast.core.AstInfo;
-import org.eclipse.statet.ltk.core.LTK;
-import org.eclipse.statet.ltk.core.SourceContent;
-import org.eclipse.statet.ltk.core.WorkingContext;
-import org.eclipse.statet.ltk.issues.core.ProblemRequestor;
-import org.eclipse.statet.ltk.model.core.IModelManager;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
-import org.eclipse.statet.ltk.model.core.elements.IWorkspaceSourceUnit;
-
-
-public abstract class SourceUnitModelContainer<U extends ISourceUnit, M extends ISourceUnitModelInfo> {
-	
-	
-	private final WorkingContext mode;
-	
-	private final U unit;
-	
-	private AstInfo astInfo;
-	
-	private M modelInfo;
-	
-	
-	public SourceUnitModelContainer(final U unit) {
-		this.unit= unit;
-		this.mode= getMode(unit);
-	}
-	
-	
-	public abstract boolean isContainerFor(String modelTypeId);
-	
-	public abstract Class<?> getAdapterClass();
-	
-	
-	protected WorkingContext getMode(final U su) {
-		if (su instanceof IWorkspaceSourceUnit) {
-			return su.getWorkingContext();
-		}
-		return null;
-	}
-	
-	protected final WorkingContext getMode() {
-		return this.mode;
-	}
-	
-	
-	public U getSourceUnit() {
-		return this.unit;
-	}
-	
-	public SourceContent getParseContent(final IProgressMonitor monitor) {
-		return this.unit.getContent(monitor);
-	}
-	
-	public AstInfo getAstInfo(final boolean ensureSync, final IProgressMonitor monitor) {
-		if (ensureSync) {
-			getModelManager().reconcile(this, IModelManager.AST, monitor);
-		}
-		return this.astInfo;
-	}
-	
-	public M getModelInfo(final int syncLevel, final IProgressMonitor monitor) {
-		if ((syncLevel & IModelManager.REFRESH) != 0) {
-			clear();
-		}
-		if ((syncLevel & 0xf) >= IModelManager.MODEL_FILE) {
-			final M currentModel= this.modelInfo;
-			if ((syncLevel & IModelManager.RECONCILE) != 0
-					|| currentModel == null
-					|| currentModel.getStamp().getSourceStamp() == 0
-					|| currentModel.getStamp().getSourceStamp() != this.unit.getContentStamp(monitor) ) {
-				getModelManager().reconcile(this, syncLevel, monitor);
-			}
-		}
-		return this.modelInfo;
-	}
-	
-	protected abstract IModelManager getModelManager();
-	
-	
-	public void clear() {
-		this.astInfo= null;
-		this.modelInfo= null;
-	}
-	
-	public AstInfo getCurrentAst() {
-		if (this.mode == LTK.PERSISTENCE_CONTEXT) {
-			final M model= getCurrentModel();
-			if (model != null) {
-				return model.getAst();
-			}
-			return null;
-		}
-		return this.astInfo;
-	}
-	
-	public void setAst(final AstInfo ast) {
-		if (this.mode == LTK.PERSISTENCE_CONTEXT) {
-			return;
-		}
-		this.astInfo= ast;
-	}
-	
-	public M getCurrentModel() {
-		return this.modelInfo;
-	}
-	
-	public void setModel(final M modelInfo) {
-		if (modelInfo != null
-				&& (this.astInfo == null || this.astInfo.getStamp().equals(modelInfo.getAst().getStamp())) ) {
-									// otherwise, the ast is probably newer
-			setAst(modelInfo.getAst());
-		}
-		this.modelInfo= modelInfo;
-	}
-	
-	
-	public ProblemRequestor createProblemRequestor() {
-		return null;
-	}
-	
-}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/WorkingBuffer.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/WorkingBuffer.java
index 70fb15a..04f49c0 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/WorkingBuffer.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/WorkingBuffer.java
@@ -14,327 +14,41 @@
 
 package org.eclipse.statet.ltk.model.core.impl;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.eclipse.core.filebuffers.FileBuffers;
-import org.eclipse.core.filebuffers.LocationKind;
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubMonitor;
 import org.eclipse.jface.text.AbstractDocument;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentExtension4;
-import org.eclipse.jface.text.ISynchronizable;
 
-import org.eclipse.statet.ecommons.io.FileUtil;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
-import org.eclipse.statet.internal.ltk.core.LTKCorePlugin;
 import org.eclipse.statet.ltk.core.SourceContent;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
- * Common implementation of {@link IWorkingBuffer} for source units based on
- * an {@link IFile} or an {@link IFileStore}.
+ * Interface to access documents. 
+ * Usually only used inside implementations of {@link SourceUnit}.
+ * <p>
+ * For the progress monitors of the methods the SubMonitor pattern is applied.</p>
  */
-public class WorkingBuffer implements IWorkingBuffer {
-	
-	/** Mode for IFile (in workspace) */
-	protected static final byte IFILE= 1;
-	/** Mode for IFileStore (URI) */
-	protected static final byte FILESTORE= 2;
-	
-	protected static final byte DOCUMENT= 1;
+@NonNullByDefault
+public interface WorkingBuffer {
 	
 	
-	public static SourceContent createContentFromDocument(final IDocument doc) {
-		Object lock= null;
-		if (doc instanceof ISynchronizable) {
-			lock= ((ISynchronizable) doc).getLockObject();
-		}
-		if (lock != null && doc instanceof IDocumentExtension4) {
-			synchronized (lock) {
-				return new SourceContent(
-						((IDocumentExtension4) doc).getModificationStamp(),
-						doc.get() );
-			}
-		}
-		else {
-			return new SourceContent(System.currentTimeMillis(), doc.get());
-		}
-	}
-	
-	
-	protected final ISourceUnit unit;
-	private AbstractDocument document;
+	long getContentStamp(final IProgressMonitor monitor);
 	
 	/**
-	 * Mode of this working buffer:<ul>
-	 *   <li>= 0 - uninitialized</li>
-	 *   <li>< 0 - invalid/no source found</li>
-	 *   <li>> 0 - mode constant {@link #IFILE}, {@link #FILESTORE}</li>
-	 * </ul>
+	 * @return the document or <code>null</code>
 	 */
-	private byte mode;
-	
-	public WorkingBuffer(final ISourceUnit unit) {
-		this.unit= unit;
-	}
-	
+	@Nullable AbstractDocument getDocument();
 	
 	/**
-	 * Checks the mode of this working buffer
-	 * 
-	 * @return <code>true</code> if valid mode, otherwise <code>false</code>
+	 * @return the document
 	 */
-	protected final byte detectResourceMode() {
-		if (this.mode == 0) {
-			final Object resource= this.unit.getResource();
-			if (resource instanceof IFile) {
-				this.mode= IFILE;
-			}
-			else if (resource instanceof IFileStore 
-					&& !((IFileStore) resource).fetchInfo().isDirectory() ) {
-				this.mode= FILESTORE;
-			}
-			if (this.mode == 0) {
-				this.mode= -1;
-			}
-		}
-		return this.mode;
-	}
-	
-	protected final byte getResourceMode() {
-		return this.mode;
-	}
-	
-	protected byte getContentMode() {
-		return 0;
-	}
-	
-	
-	@Override
-	public long getContentStamp(final IProgressMonitor monitor) {
-		{	final AbstractDocument doc= this.document;
-			if (doc != null) {
-				return doc.getModificationStamp();
-			}
-		}
-		{	final ISourceUnit underlyingUnit= this.unit.getUnderlyingUnit();
-			if (underlyingUnit != null) {
-				return underlyingUnit.getContentStamp(monitor);
-			}
-		}
-		if (detectResourceMode() == IFILE) {
-			final IFile resource= (IFile) this.unit.getResource();
-			if (resource != null) {
-				return resource.getModificationStamp();
-			}
-		}
-		return 0;
-	}
-	
-	@Override
-	public synchronized AbstractDocument getDocument() {
-		return this.document;
-	}
-	
-	@Override
-	public synchronized AbstractDocument getDocument(final IProgressMonitor monitor) {
-		AbstractDocument doc= this.document;
-		if (doc == null) {
-			final SubMonitor m= SubMonitor.convert(monitor);
-			doc= createDocument(m);
-			checkDocument(doc);
-			if ((getContentMode() & DOCUMENT) != 0) {
-				this.document= doc;
-			}
-		}
-		return doc;
-	}
-	
-	@Override
-	public SourceContent getContent(final IProgressMonitor monitor) {
-		final SubMonitor m= SubMonitor.convert(monitor);
-		final IDocument doc= ((getContentMode() & DOCUMENT) != 0) ? getDocument(monitor) : getDocument();
-		if (doc != null) {
-			return createContentFromDocument(doc);
-		}
-		return createContent(m);
-	}
-	
-	@Override
-	public void saveDocument(final IProgressMonitor monitor) {
-	}
-	
-	@Override
-	public synchronized void releaseDocument(final IProgressMonitor monitor) {
-		this.document= null;
-	}
-	
-	@Override
-	public boolean checkState(final boolean validate, final IProgressMonitor monitor) {
-		{	final ISourceUnit underlyingUnit= this.unit.getUnderlyingUnit();
-			if (underlyingUnit != null) {
-				return underlyingUnit.checkState(validate, monitor);
-			}
-		}
-		switch (detectResourceMode()) {
-		case IFILE:
-			{	final IFile resource= (IFile) this.unit.getResource();
-				if (!validate) {
-					return !resource.getResourceAttributes().isReadOnly();
-				}
-				else {
-					return resource.getWorkspace().validateEdit(new IFile[] { resource }, IWorkspace.VALIDATE_PROMPT).isOK();
-				}
-			}
-		case FILESTORE:
-			{	final IFileStore store= (IFileStore) this.unit.getResource();
-				try {
-					return !store.fetchInfo(EFS.NONE, monitor).getAttribute(EFS.ATTRIBUTE_READ_ONLY);
-				}
-				catch (final CoreException e) {
-					LTKCorePlugin.log(new Status(IStatus.ERROR, LTKCorePlugin.BUNDLE_ID, 0,
-							"An error occurred when checking modifiable state of the file.", e));
-					return false;
-				}
-			}
-		default:
-			return false;
-		}
-	}
-	
-	
-	protected AbstractDocument createDocument(final SubMonitor m) {
-		final IDocument fileDoc= createEmptyDocument();
-		if (!(fileDoc instanceof AbstractDocument)) {
-			return null;
-		}
-		final AbstractDocument document= (AbstractDocument) fileDoc;
-		
-		final ISourceUnit underlyingUnit= this.unit.getUnderlyingUnit();
-		if (underlyingUnit != null) {
-			final SourceContent underlyingContent= underlyingUnit.getContent(m);
-//			if (document instanceof IDocumentExtension4) {
-			document.set(underlyingContent.getText(), underlyingContent.getStamp());
-//			}
-//			else {
-//				document.set(underlyingContent.text);
-//			}
-		}
-		else {
-			final Object resource= this.unit.getResource();
-			if (resource instanceof IFile) {
-				loadDocumentFromFile((IFile) resource, document, m);
-			}
-		}
-		
-		return document;
-	}
-	
-	private IDocument createEmptyDocument() {
-		switch (detectResourceMode()) {
-		case IFILE:
-			return FileBuffers.getTextFileBufferManager().createEmptyDocument(
-					((IFile) this.unit.getResource()).getFullPath(),
-					LocationKind.IFILE );
-		case FILESTORE:
-			return FileBuffers.getTextFileBufferManager().createEmptyDocument(
-					URIUtil.toPath(((IFileStore) this.unit.getResource()).toURI()),
-					LocationKind.LOCATION );
-		default:
-			return FileBuffers.getTextFileBufferManager().createEmptyDocument(null, null);
-		}
-	}
-	
-	protected void checkDocument(final AbstractDocument document) {
-		if (document instanceof ISynchronizable) {
-			synchronized (document) {
-				if (((ISynchronizable) document).getLockObject() == null) {
-					((ISynchronizable) document).setLockObject(new Object());
-				}
-			}
-		}
-	}
-	
-	protected final void loadDocumentFromFile(final IFile file, final AbstractDocument document, final SubMonitor m) {
-		try {
-			FileUtil.getFileUtil(file).createReadTextFileOp(new FileUtil.ReaderAction() {
-				@Override
-				public void run(final BufferedReader reader, final IProgressMonitor monitor) throws IOException {
-					final StringBuilder buffer= new StringBuilder();
-					final char[] readBuffer= new char[2048];
-					int n;
-					while ((n= reader.read(readBuffer)) > 0) {
-						buffer.append(readBuffer, 0, n);
-					}
-//					if (document instanceof IDocumentExtension4) {
-					document.set(buffer.toString(), file.getModificationStamp());
-//					}
-//					else {
-//						document.set(buffer.toString());
-//					}
-				}
-			}).doOperation(m);
-		}
-		catch (final OperationCanceledException e) {
-		}
-		catch (final CoreException e) {
-			LTKCorePlugin.log(e.getStatus());
-		}
-	}
-	
-	protected SourceContent createContent(final SubMonitor m) {
-		final ISourceUnit underlyingUnit= this.unit.getUnderlyingUnit();
-		if (underlyingUnit != null) {
-			return underlyingUnit.getContent(m);
-		}
-		else {
-			final Object resource= this.unit.getResource();
-			final AtomicReference<SourceContent> content= new AtomicReference<>();
-			if (resource instanceof IFile) {
-				loadContentFromFile((IFile) resource, content, m);
-			}
-			return content.get();
-		}
-	}
-	
-	protected final void loadContentFromFile(final IFile file, final AtomicReference<SourceContent> content, final SubMonitor m) {
-		try {
-			FileUtil.getFileUtil(file).createReadTextFileOp(new FileUtil.ReaderAction() {
-				@Override
-				public void run(final BufferedReader reader, final IProgressMonitor monitor) throws IOException {
-					final StringBuilder buffer= new StringBuilder();
-					final char[] readBuffer= new char[2048];
-					int n;
-					while ((n= reader.read(readBuffer)) >= 0) {
-						buffer.append(readBuffer, 0, n);
-					}
-					content.set(new SourceContent(file.getModificationStamp(), buffer.toString()));
-				}
-			}).doOperation(m);
-		}
-		catch (final OperationCanceledException e) {
-		}
-		catch (final CoreException e) {
-			LTKCorePlugin.log(e.getStatus());
-		}
-	}
-	
-	@Override
-	public boolean isSynchronized() {
-		return false;
-	}
+	AbstractDocument getDocument(final @Nullable IProgressMonitor monitor);
+	SourceContent getContent(final IProgressMonitor monitor);
+	boolean checkState(final boolean validate, final IProgressMonitor monitor);
+	boolean isSynchronized();
+	void saveDocument(final IProgressMonitor monitor);
+	void releaseDocument(final IProgressMonitor monitor);
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/util/ElementComparator.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/util/ElementComparator.java
deleted file mode 100644
index ba78dc8..0000000
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/util/ElementComparator.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*=============================================================================#
- # Copyright (c) 2013, 2020 Stephan Wahlbrink and others.
- # 
- # This program and the accompanying materials are made available under the
- # terms of the Eclipse Public License 2.0 which is available at
- # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
- # which is available at https://www.apache.org/licenses/LICENSE-2.0.
- # 
- # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
- # 
- # Contributors:
- #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
- #=============================================================================*/
-
-package org.eclipse.statet.ltk.model.core.util;
-
-import java.util.Comparator;
-
-import com.ibm.icu.text.Collator;
-
-import org.eclipse.statet.ltk.core.LTKUtils;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-
-
-public class ElementComparator implements Comparator<IModelElement> {
-	
-	
-	private final Collator unitComparator;
-	private final Collator elementComparator;
-	
-	
-	public ElementComparator() {
-		this(Collator.getInstance());
-	}
-	
-	public ElementComparator(final Collator elementComparator) {
-		this.unitComparator= Collator.getInstance();
-		this.elementComparator= elementComparator;
-	}
-	
-	
-	@Override
-	public int compare(final IModelElement e1, final IModelElement e2) {
-		final ISourceUnit u1= LTKUtils.getSourceUnit(e1);
-		final ISourceUnit u2= LTKUtils.getSourceUnit(e2);
-		int result= 0;
-		if (u1 != null && u2 != null) {
-			if (u1 != u2) {
-				result= this.unitComparator.compare(u1.getId(), u2.getId());
-			}
-			if (result != 0) {
-				return result;
-			}
-			if (e1 instanceof ISourceElement) {
-				if (e2 instanceof ISourceElement) {
-					return compareSourceElementsInUnit((ISourceElement) e1, (ISourceElement) e2);
-				}
-				return -1000000;
-			}
-			else if (e2 instanceof ISourceElement) { // && !(e1 instanceof ISourceUnit)
-				return 1000000;
-			}
-			else {
-				return this.elementComparator.compare(e1.getId(), e2.getId());
-			}
-		}
-		if (u1 == null && u2 != null) {
-			return Integer.MAX_VALUE;
-		}
-		if (u2 == null && u1 != null) {
-			return Integer.MIN_VALUE;
-		}
-		return 0;
-	}
-	
-	protected int compareSourceElementsInUnit(final ISourceElement e1, final ISourceElement e2) {
-		return e1.getSourceRange().getStartOffset() - e2.getSourceRange().getStartOffset();
-	}
-	
-}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/util/LtkModelElementComparator.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/util/LtkModelElementComparator.java
new file mode 100644
index 0000000..93e600d
--- /dev/null
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/util/LtkModelElementComparator.java
@@ -0,0 +1,96 @@
+/*=============================================================================#
+ # Copyright (c) 2013, 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.ltk.model.core.util;
+
+import java.util.Comparator;
+
+import com.ibm.icu.text.Collator;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.ltk.model.core.LtkModelUtils;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.SourceElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+
+
+@NonNullByDefault
+public class LtkModelElementComparator implements Comparator<LtkModelElement> {
+	
+	
+	private final Collator unitIdComparator;
+	private final Collator elementIdComparator;
+	
+	
+	public LtkModelElementComparator() {
+		this(Collator.getInstance());
+	}
+	
+	public LtkModelElementComparator(final Collator elementIdComparator) {
+		this.unitIdComparator= Collator.getInstance();
+		this.elementIdComparator= elementIdComparator;
+	}
+	
+	
+	@Override
+	public int compare(final @Nullable LtkModelElement e1, final @Nullable LtkModelElement e2) {
+		if (e1 == e2) {
+			return 0;
+		}
+		if (e1 == null) {
+			return 1;
+		}
+		if (e2 == null) {
+			return -1;
+		}
+		final SourceUnit u1= LtkModelUtils.getSourceUnit(e1);
+		final SourceUnit u2= LtkModelUtils.getSourceUnit(e2);
+		final int result= compareSourceUnits(u1, u2);
+		if (result != 0) {
+			return result;
+		}
+		if (e1 instanceof SourceElement) {
+			if (e2 instanceof SourceElement) {
+				return compareSourceElementsInUnit((SourceElement)e1, (SourceElement)e2);
+			}
+			return -1;
+		}
+		else if (e2 instanceof SourceElement) { // && !(e1 instanceof SourceUnit)
+			return 1;
+		}
+		else {
+			return this.elementIdComparator.compare(e1.getId(), e2.getId());
+		}
+	}
+	
+	protected int compareSourceUnits(final @Nullable SourceUnit u1, final @Nullable SourceUnit u2) {
+		if (u1 == u2) {
+			return 0;
+		}
+		if (u1 == null) {
+			return 1;
+		}
+		if (u2 == null) {
+			return -1;
+		}
+		return this.unitIdComparator.compare(u1.getId(), u2.getId());
+	}
+	
+	protected int compareSourceElementsInUnit(final SourceElement e1, final SourceElement e2) {
+		return e1.getSourceRange().getStartOffset() - e2.getSourceRange().getStartOffset();
+	}
+	
+}
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonCopyProcessor.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonCopyProcessor.java
index 2d36cca..f2013a6 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonCopyProcessor.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonCopyProcessor.java
@@ -37,7 +37,7 @@
 
 import org.eclipse.statet.internal.ltk.refactoring.core.Messages;
 import org.eclipse.statet.ltk.model.core.ElementSet;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
 
 
 public abstract class CommonCopyProcessor extends CopyProcessor {
@@ -60,7 +60,7 @@
 		this.elementsToCopy= elements;
 		this.destination= destination;
 		if (destination.getInitialObjects().size() != 1
-				|| !(destination.getInitialObjects().get(0) instanceof IModelElement) ) {
+				|| !(destination.getInitialObjects().get(0) instanceof LtkModelElement) ) {
 			throw new IllegalArgumentException();
 		}
 		this.adapter= adapter;
@@ -155,7 +155,9 @@
 					Messages.CopyRefactoring_description_singular : Messages.CopyRefactoring_description_plural;
 			final IProject resource= this.elementsToCopy.getSingleProject();
 			final String project= (resource != null) ? resource.getName() : null;
-			final String source= (project != null) ? NLS.bind(RefactoringMessages.Common_Source_Project_label, project) : RefactoringMessages.Common_Source_Workspace_label;
+			final String source= (project != null) ?
+					NLS.bind(RefactoringMessages.Common_Source_Project_label, project) :
+					RefactoringMessages.Common_Source_Workspace_label;
 //			final String header= NLS.bind(RefactoringCoreMessages.JavaDeleteProcessor_header, new String[] { String.valueOf(this.elements.length), source});
 //			final int flags= JavaRefactoringDescriptor.JAR_MIGRATION | JavaRefactoringDescriptor.JAR_REFACTORING | RefactoringDescriptor.STRUCTURAL_CHANGE | RefactoringDescriptor.MULTI_CHANGE;
 //			final JDTRefactoringDescriptorComment comment= new JDTRefactoringDescriptorComment(project, this, header);
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonDeleteProcessor.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonDeleteProcessor.java
index acba2b4..1d97a7e 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonDeleteProcessor.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonDeleteProcessor.java
@@ -156,7 +156,9 @@
 					Messages.DeleteRefactoring_description_singular : Messages.DeleteRefactoring_description_plural;
 			final IProject resource= this.elementsToDelete.getSingleProject();
 			final String project= (resource != null) ? resource.getName() : null;
-			final String source= (project != null) ? NLS.bind(RefactoringMessages.Common_Source_Project_label, project) : RefactoringMessages.Common_Source_Workspace_label;
+			final String source= (project != null) ?
+					NLS.bind(RefactoringMessages.Common_Source_Project_label, project) :
+					RefactoringMessages.Common_Source_Workspace_label;
 //			final String header= NLS.bind(RefactoringCoreMessages.JavaDeleteProcessor_header, new String[] { String.valueOf(this.elements.length), source});
 //			final int flags= JavaRefactoringDescriptor.JAR_MIGRATION | JavaRefactoringDescriptor.JAR_REFACTORING | RefactoringDescriptor.STRUCTURAL_CHANGE | RefactoringDescriptor.MULTI_CHANGE;
 //			final JDTRefactoringDescriptorComment comment= new JDTRefactoringDescriptorComment(project, this, header);
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonMoveProcessor.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonMoveProcessor.java
index d53aafa..a086a59 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonMoveProcessor.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonMoveProcessor.java
@@ -37,7 +37,7 @@
 
 import org.eclipse.statet.internal.ltk.refactoring.core.Messages;
 import org.eclipse.statet.ltk.model.core.ElementSet;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
 
 
 public abstract class CommonMoveProcessor extends MoveProcessor {
@@ -60,7 +60,7 @@
 		this.elementsToMove= elements;
 		this.destination= destination;
 		if (destination.getInitialObjects().size() != 1
-				|| !(destination.getInitialObjects().get(0) instanceof IModelElement) ) {
+				|| !(destination.getInitialObjects().get(0) instanceof LtkModelElement) ) {
 			throw new IllegalArgumentException();
 		}
 		this.adapter= adapter;
@@ -157,7 +157,9 @@
 					Messages.MoveRefactoring_description_singular : Messages.MoveRefactoring_description_plural;
 			final IProject resource= this.elementsToMove.getSingleProject();
 			final String project= (resource != null) ? resource.getName() : null;
-			final String source= (project != null) ? NLS.bind(RefactoringMessages.Common_Source_Project_label, project) : RefactoringMessages.Common_Source_Workspace_label;
+			final String source= (project != null) ?
+					NLS.bind(RefactoringMessages.Common_Source_Project_label, project) :
+					RefactoringMessages.Common_Source_Workspace_label;
 //			final String header= NLS.bind(RefactoringCoreMessages.JavaDeleteProcessor_header, new String[] { String.valueOf(this.elements.length), source});
 //			final int flags= JavaRefactoringDescriptor.JAR_MIGRATION | JavaRefactoringDescriptor.JAR_REFACTORING | RefactoringDescriptor.STRUCTURAL_CHANGE | RefactoringDescriptor.MULTI_CHANGE;
 //			final JDTRefactoringDescriptorComment comment= new JDTRefactoringDescriptorComment(project, this, header);
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonPasteCodeProcessor.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonPasteCodeProcessor.java
index c68c7a2..ac90840 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonPasteCodeProcessor.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonPasteCodeProcessor.java
@@ -142,7 +142,9 @@
 			final String description= Messages.PasteRefactoring_Code_description;
 			final IProject resource= this.destination.getSingleProject();
 			final String project= (resource != null) ? resource.getName() : null;
-			final String source= (project != null) ? NLS.bind(RefactoringMessages.Common_Source_Project_label, project) : RefactoringMessages.Common_Source_Workspace_label;
+			final String source= (project != null) ?
+					NLS.bind(RefactoringMessages.Common_Source_Project_label, project) :
+					RefactoringMessages.Common_Source_Workspace_label;
 //			final String header= NLS.bind(RefactoringCoreMessages.JavaDeleteProcessor_header, new String[] { String.valueOf(this.elements.length), source});
 //			final int flags= JavaRefactoringDescriptor.JAR_MIGRATION | JavaRefactoringDescriptor.JAR_REFACTORING | RefactoringDescriptor.STRUCTURAL_CHANGE | RefactoringDescriptor.MULTI_CHANGE;
 //			final JDTRefactoringDescriptorComment comment= new JDTRefactoringDescriptorComment(project, this, header);
@@ -174,5 +176,4 @@
 		}
 	}
 	
-	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonRefactoringFactory.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonRefactoringFactory.java
index f0a39b0..1615f3c 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonRefactoringFactory.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/CommonRefactoringFactory.java
@@ -55,7 +55,7 @@
 	
 	protected ElementSet createElementSet(final Object elements) {
 		if (elements instanceof ElementSet) {
-			return (ElementSet) elements;
+			return (ElementSet)elements;
 		}
 		if (elements instanceof Object[]) {
 			return new ElementSet((Object[]) elements);
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/MultiRefactoringFactory.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/MultiRefactoringFactory.java
index bfdf8b8..132c4b6 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/MultiRefactoringFactory.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/MultiRefactoringFactory.java
@@ -23,7 +23,7 @@
 import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
 
 import org.eclipse.statet.ltk.model.core.ElementSet;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
 
 
 public abstract class MultiRefactoringFactory extends CommonRefactoringFactory {
@@ -57,7 +57,7 @@
 			}
 			this.secondaryFactories.put(modelTypeId, factory);
 		}
-		return (factory != NO_FACTORY) ? (CommonRefactoringFactory) factory : null;
+		return (factory != NO_FACTORY) ? (CommonRefactoringFactory)factory : null;
 	}
 	
 	protected abstract CommonRefactoringFactory createFactory(String modelTypeId);
@@ -67,13 +67,13 @@
 	public RefactoringAdapter createAdapter(Object elements) {
 		String type= null;
 		if (elements instanceof ElementSet) {
-			elements= ((ElementSet) elements).getInitialObjects();
+			elements= ((ElementSet)elements).getInitialObjects();
 		}
 		else if (elements instanceof Object[]) {
 			final Object[] array= (Object[]) elements;
 			for (int i= 0; i < array.length; i++) {
-				if (array[i] instanceof IModelElement) {
-					final String elementType= ((IModelElement) array[i]).getModelTypeId();
+				if (array[i] instanceof LtkModelElement) {
+					final String elementType= ((LtkModelElement)array[i]).getModelTypeId();
 					if (type == null) {
 						type= elementType;
 						continue;
@@ -87,8 +87,8 @@
 				}
 			}
 		}
-		else if (elements instanceof IModelElement) {
-			type= ((IModelElement) elements).getModelTypeId();
+		else if (elements instanceof LtkModelElement) {
+			type= ((LtkModelElement)elements).getModelTypeId();
 		}
 		
 		final CommonRefactoringFactory factory= getFactory(type);
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/RefactoringAdapter.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/RefactoringAdapter.java
index 020c801..9815ab3 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/RefactoringAdapter.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/RefactoringAdapter.java
@@ -77,15 +77,15 @@
 import org.eclipse.statet.ecommons.text.TextUtil;
 
 import org.eclipse.statet.internal.ltk.refactoring.core.Messages;
-import org.eclipse.statet.ltk.core.LTK;
-import org.eclipse.statet.ltk.core.LTKUtils;
+import org.eclipse.statet.ltk.core.Ltk;
 import org.eclipse.statet.ltk.model.core.ElementSet;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.IWorkspaceSourceUnit;
-import org.eclipse.statet.ltk.model.core.util.ElementComparator;
+import org.eclipse.statet.ltk.model.core.LtkModelUtils;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.SourceElement;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.WorkspaceSourceUnit;
+import org.eclipse.statet.ltk.model.core.util.LtkModelElementComparator;
 
 
 /**
@@ -95,7 +95,7 @@
 public abstract class RefactoringAdapter {
 	
 	
-	private static final Comparator<IModelElement> MODELELEMENT_SORTER= new ElementComparator();
+	private static final Comparator<LtkModelElement> MODELELEMENT_SORTER= new LtkModelElementComparator();
 	
 	
 	private final String modelTypeId;
@@ -106,7 +106,7 @@
 	}
 	
 	
-	public Comparator<IModelElement> getModelElementComparator() {
+	public Comparator<LtkModelElement> getModelElementComparator() {
 		return MODELELEMENT_SORTER;
 	}
 	
@@ -122,7 +122,7 @@
 	
 	public abstract boolean isCommentContent(final ITypedRegion partition);
 	
-	public abstract BasicHeuristicTokenScanner getScanner(final ISourceUnit su);
+	public abstract BasicHeuristicTokenScanner getScanner(final SourceUnit su);
 	
 	/**
 	 * - Sort elements
@@ -131,17 +131,17 @@
 	 * @param elements must be sorted by unit and order
 	 * @return
 	 */
-	public ISourceStructElement[] checkElements(final ISourceStructElement[] elements) {
+	public SourceStructElement[] checkElements(final SourceStructElement[] elements) {
 		if (elements.length <= 1) {
 			return elements;
 		}
 		Arrays.sort(elements, getModelElementComparator());
-		ISourceStructElement last= elements[0];
-		ISourceUnit unitOfLast= last.getSourceUnit();
+		SourceStructElement last= elements[0];
+		SourceUnit unitOfLast= last.getSourceUnit();
 		int endOfLast= last.getSourceRange().getEndOffset();
-		final List<ISourceStructElement> checked= new ArrayList<>(elements.length);
-		for (final ISourceStructElement element : elements) {
-			final ISourceUnit unit= element.getSourceUnit();
+		final List<SourceStructElement> checked= new ArrayList<>(elements.length);
+		for (final SourceStructElement element : elements) {
+			final SourceUnit unit= element.getSourceUnit();
 			final int end= last.getSourceRange().getEndOffset();
 			if (unit != unitOfLast) {
 				checked.add(element);
@@ -159,14 +159,14 @@
 			// is child, ignore
 			continue;
 		}
-		return checked.toArray(new ISourceStructElement[checked.size()]);
+		return checked.toArray(new SourceStructElement[checked.size()]);
 	}
 	
-	public IRegion getContinuousSourceRange(final ISourceStructElement[] elements) {
+	public IRegion getContinuousSourceRange(final SourceStructElement[] elements) {
 		if (elements == null || elements.length == 0) {
 			return null;
 		}
-		final ISourceUnit su= elements[0].getSourceUnit();
+		final SourceUnit su= elements[0].getSourceUnit();
 		if (su == null) {
 			return null;
 		}
@@ -222,7 +222,7 @@
 		return null;
 	}
 	
-	public String getSourceCodeStringedTogether(final ISourceStructElement[] sourceElements,
+	public String getSourceCodeStringedTogether(final SourceStructElement[] sourceElements,
 			final IProgressMonitor monitor) throws CoreException {
 		return getSourceCodeStringedTogether(new ElementSet((Object[]) sourceElements), monitor);
 	}
@@ -230,7 +230,7 @@
 	public String getSourceCodeStringedTogether(final ElementSet sourceElements,
 			final IProgressMonitor monitor) throws CoreException {
 		final SubMonitor m= SubMonitor.convert(monitor);
-		ISourceUnit lastUnit= null;
+		SourceUnit lastUnit= null;
 		BasicHeuristicTokenScanner scanner= null;
 		try {
 			sourceElements.removeElementsWithAncestorsOnList();
@@ -238,16 +238,16 @@
 			final String lineDelimiter= TextUtil.getPlatformLineDelimiter();
 			
 			AbstractDocument doc= null;
-			final List<IModelElement> modelElements= sourceElements.getModelElements();
+			final List<LtkModelElement<?>> modelElements= sourceElements.getModelElements();
 			
 			int workRemaining= modelElements.size() * 3 + 1;
 			
 			final StringBuilder sb= new StringBuilder(modelElements.size() * 100);
 			final List<String> codeFragments= new ArrayList<>();
-			for (final IModelElement element : modelElements) {
+			for (final LtkModelElement<?> element : modelElements) {
 				m.setWorkRemaining(workRemaining); workRemaining-= 3;
 				
-				final ISourceUnit su= LTKUtils.getSourceUnit(element);
+				final SourceUnit su= LtkModelUtils.getSourceUnit(element);
 				if (su != lastUnit) {
 					if (lastUnit != null) {
 						lastUnit.disconnect(m.newChild(1));
@@ -258,7 +258,7 @@
 					scanner= getScanner(su);
 					doc= su.getDocument(monitor);
 				}
-				getSourceCode((ISourceElement) element, doc, scanner, codeFragments);
+				getSourceCode((SourceElement)element, doc, scanner, codeFragments);
 				for (final String s : codeFragments) {
 					sb.append(s);
 					sb.append(lineDelimiter);
@@ -284,7 +284,7 @@
 		}
 	}
 	
-	protected void getSourceCode(final ISourceElement element, final AbstractDocument doc,
+	protected void getSourceCode(final SourceElement element, final AbstractDocument doc,
 			final BasicHeuristicTokenScanner scanner, final List<String> codeFragments)
 			throws BadLocationException, BadPartitioningException {
 		final TextRegion range= expandElementRange(element, doc, scanner);
@@ -293,7 +293,7 @@
 		}
 	}
 	
-	public TextRegion expandElementRange(final ISourceElement element, final AbstractDocument document,
+	public TextRegion expandElementRange(final SourceElement element, final AbstractDocument document,
 			final BasicHeuristicTokenScanner scanner)
 			throws BadLocationException, BadPartitioningException {
 		final TextRegion sourceRange= element.getSourceRange();
@@ -372,7 +372,7 @@
 		if (!elements.isOK()) {
 			return false;
 		}
-		for (final IModelElement element : elements.getModelElements()) {
+		for (final LtkModelElement element : elements.getModelElements()) {
 			if (!canDelete(element)) {
 				return false;
 			}
@@ -385,11 +385,11 @@
 		return true;
 	}
 	
-	public boolean canDelete(final IModelElement element) {
+	public boolean canDelete(final LtkModelElement element) {
 		if (!element.exists()) {
 			return false;
 		}
-//		if ((element.getElementType() & IModelElement.MASK_C1) == IModelElement.PROJECT) {
+//		if ((element.getElementType() & LtkModelElement.MASK_C1) == LtkModelElement.PROJECT) {
 //			return false;
 //		}
 		if (!isSupportedModelType(element.getModelTypeId())) {
@@ -418,13 +418,13 @@
 	}
 	
 	public boolean canInsert(final ElementSet elements, final RefactoringDestination to) {
-		if (to.getInitialObjects().get(0) instanceof ISourceElement) {
-			return canInsert(elements, (ISourceElement) to.getInitialObjects().get(0), to.getPosition());
+		if (to.getInitialObjects().get(0) instanceof SourceElement) {
+			return canInsert(elements, (SourceElement)to.getInitialObjects().get(0), to.getPosition());
 		}
 		return false;
 	}
 	
-	protected boolean canInsert(final ElementSet elements, final ISourceElement to,
+	protected boolean canInsert(final ElementSet elements, final SourceElement to,
 			final RefactoringDestination.Position pos) {
 		if (elements.getInitialObjects().size() == 0) {
 			return false;
@@ -435,7 +435,7 @@
 		if (!canInsertTo(to)) {
 			return false;
 		}
-		for (final IModelElement element : elements.getModelElements()) {
+		for (final LtkModelElement element : elements.getModelElements()) {
 			if (!canInsert(element)) {
 				return false;
 			}
@@ -448,7 +448,7 @@
 		return !elements.includes(to);
 	}
 	
-	protected boolean canInsert(final IModelElement element) {
+	protected boolean canInsert(final LtkModelElement element) {
 		if (!element.exists()) {
 			return false;
 		}
@@ -465,7 +465,7 @@
 		return canInsertTo(destination.getModelElements().get(0));
 	}
 	
-	protected boolean canInsertTo(final IModelElement element) {
+	protected boolean canInsertTo(final LtkModelElement element) {
 		if (!element.exists()) {
 			return false;
 		}
@@ -482,10 +482,10 @@
 	public void checkInitialToModify(final RefactoringStatus result, final ElementSet elements) {
 		final Set<IResource> resources= new HashSet<>();
 		resources.addAll(elements.getResources());
-		for(final IModelElement element : elements.getModelElements()) {
-			final ISourceUnit su= LTKUtils.getSourceUnit(element);
-			if (su instanceof IWorkspaceSourceUnit) {
-				resources.add(((IWorkspaceSourceUnit) su).getResource());
+		for(final LtkModelElement element : elements.getModelElements()) {
+			final SourceUnit su= LtkModelUtils.getSourceUnit(element);
+			if (su instanceof WorkspaceSourceUnit) {
+				resources.add(((WorkspaceSourceUnit)su).getResource());
 				continue;
 			}
 			result.addFatalError(Messages.Check_ElementNotInWS_message);
@@ -499,10 +499,10 @@
 	public void checkFinalToModify(final RefactoringStatus result, final ElementSet elements, final IProgressMonitor monitor) {
 		final Set<IResource> resources= new HashSet<>();
 		resources.addAll(elements.getResources());
-		for(final IModelElement element : elements.getModelElements()) {
-			final ISourceUnit su= LTKUtils.getSourceUnit(element);
-			if (su instanceof IWorkspaceSourceUnit) {
-				resources.add(((IWorkspaceSourceUnit) su).getResource());
+		for(final LtkModelElement element : elements.getModelElements()) {
+			final SourceUnit su= LtkModelUtils.getSourceUnit(element);
+			if (su instanceof WorkspaceSourceUnit) {
+				resources.add(((WorkspaceSourceUnit)su).getResource());
 				continue;
 			}
 			result.addFatalError(Messages.Check_ElementNotInWS_message);
@@ -514,7 +514,7 @@
 	}
 	
 	public void checkFinalToDelete(final RefactoringStatus result, final ElementSet elements) throws CoreException {
-		for (final IModelElement element : elements.getModelElements()) {
+		for (final LtkModelElement element : elements.getModelElements()) {
 			checkFinalToDelete(result, element);
 		}
 		for (final IResource element : elements.getResources()) {
@@ -524,7 +524,7 @@
 	
 	public void checkFinalToDelete(final RefactoringStatus result, final IResource element) throws CoreException {
 		if (element.getType() == IResource.FILE) {
-			warnIfDirty(result, (IFile) element);
+			warnIfDirty(result, (IFile)element);
 			return;
 		}
 		else {
@@ -532,7 +532,7 @@
 				@Override
 				public boolean visit(final IResource visitedResource) throws CoreException {
 					if (visitedResource instanceof IFile) {
-						warnIfDirty(result, (IFile) visitedResource);
+						warnIfDirty(result, (IFile)visitedResource);
 					}
 					return true;
 				}
@@ -540,16 +540,16 @@
 		}
 	}
 	
-	public void checkFinalToDelete(final RefactoringStatus result, final IModelElement element) throws CoreException {
-		if ((element.getElementType() & IModelElement.MASK_C2) == IModelElement.C2_SOURCE_FILE) {
-			if (element instanceof IWorkspaceSourceUnit) {
-				checkFinalToDelete(result, ((IWorkspaceSourceUnit) element).getResource());
+	public void checkFinalToDelete(final RefactoringStatus result, final LtkModelElement element) throws CoreException {
+		if ((element.getElementType() & LtkModelElement.MASK_C2) == LtkModelElement.C2_SOURCE_FILE) {
+			if (element instanceof WorkspaceSourceUnit) {
+				checkFinalToDelete(result, ((WorkspaceSourceUnit)element).getResource());
 			}
 		}
-		else if ((element.getElementType() & IModelElement.MASK_C1) == IModelElement.C1_BUNDLE
-				&& element instanceof ISourceStructElement) {
-			final List<? extends IModelElement> children= ((ISourceStructElement) element).getSourceChildren(null);
-			for (final IModelElement child : children) {
+		else if ((element.getElementType() & LtkModelElement.MASK_C1) == LtkModelElement.C1_BUNDLE
+				&& element instanceof SourceStructElement) {
+			final List<? extends LtkModelElement> children= ((SourceStructElement)element).getSourceChildren(null);
+			for (final LtkModelElement child : children) {
 				checkFinalToDelete(result, child);
 			}
 		}
@@ -584,7 +584,7 @@
 				return true;
 			}
 		}
-		for (final IModelElement element : elements.getModelElements()) {
+		for (final LtkModelElement element : elements.getModelElements()) {
 			if (hasReadOnlyElements(element)) {
 				return true;
 			}
@@ -597,7 +597,7 @@
 			return true;
 		}
 		if (element instanceof IContainer) {
-			final IResource[] members= ((IContainer) element).members(false);
+			final IResource[] members= ((IContainer)element).members(false);
 			for (final IResource member : members) {
 				if (hasReadOnlyElements(member)) {
 					return true;
@@ -607,11 +607,11 @@
 		return false;
 	}
 	
-	public boolean hasReadOnlyElements(final IModelElement element) throws CoreException {
-		final ISourceUnit su= LTKUtils.getSourceUnit(element);
+	public boolean hasReadOnlyElements(final LtkModelElement element) throws CoreException {
+		final SourceUnit su= LtkModelUtils.getSourceUnit(element);
 		IResource resource= null;
-		if (su instanceof IWorkspaceSourceUnit) {
-			resource= ((IWorkspaceSourceUnit) su).getResource();
+		if (su instanceof WorkspaceSourceUnit) {
+			resource= ((WorkspaceSourceUnit)su).getResource();
 		}
 		if (resource == null) {
 			resource= element.getAdapter(IResource.class);
@@ -636,7 +636,8 @@
 			final RefactoringStatus status, final RefactoringProcessor processor, 
 			final SharableParticipants shared)
 			throws CoreException {
-		final String[] natures= ElementSet.getAffectedProjectNatures(elementsToDelete);
+		final Set<String> natureIds= ElementSet.getAffectedProjectNatures(elementsToDelete);
+		final String[] natures= natureIds.toArray(new String[natureIds.size()]);
 		final DeleteArguments arguments= new DeleteArguments();
 		for (final IResource resource : elementsToDelete.getResources()) {
 			final DeleteParticipant[] deletes= ParticipantManager.loadDeleteParticipants(status, 
@@ -650,7 +651,7 @@
 				arguments, natures, shared);
 			list.addAll(Arrays.asList(deletes));
 		}
-		for (final IModelElement element : elementsToDelete.getModelElements()) {
+		for (final LtkModelElement element : elementsToDelete.getModelElements()) {
 			final DeleteParticipant[] deletes= ParticipantManager.loadDeleteParticipants(status, 
 				processor, element, 
 				arguments, natures, shared);
@@ -664,8 +665,9 @@
 			final RefactoringStatus status, final RefactoringProcessor processor, 
 			final SharableParticipants shared, final ReorgExecutionLog executionLog)
 			throws CoreException {
-		final String[] natures= ElementSet.getAffectedProjectNatures(
+		final Set<String> natureIds= ElementSet.getAffectedProjectNatures(
 				ImCollections.newList(elementsToMove, destination) );
+		final String[] natures= natureIds.toArray(new String[natureIds.size()]);
 		final MoveArguments mArguments= new MoveArguments(destination.getModelElements().get(0),
 				false );
 //		for (final IResource resource : elementsToCopy.getResources()) {
@@ -678,7 +680,7 @@
 //					processor, resource, arguments, natures, shared );
 //			list.addAll(Arrays.asList(deletes));
 //		}
-		for (final IModelElement element : elementsToMove.getModelElements()) {
+		for (final LtkModelElement element : elementsToMove.getModelElements()) {
 			final MoveParticipant[] deletes= ParticipantManager.loadMoveParticipants(status,
 					processor, element, mArguments, natures, shared );
 			list.addAll(Arrays.asList(deletes));
@@ -691,8 +693,9 @@
 			final RefactoringStatus status, final RefactoringProcessor processor, 
 			final SharableParticipants shared, final ReorgExecutionLog executionLog)
 			throws CoreException {
-		final String[] natures= ElementSet.getAffectedProjectNatures(
+		final Set<String> natureIds= ElementSet.getAffectedProjectNatures(
 				ImCollections.newList(elementsToCopy, destination) );
+		final String[] natures= natureIds.toArray(new String[natureIds.size()]);
 		final CopyArguments mArguments= new CopyArguments(destination.getModelElements().get(0),
 				executionLog );
 //		for (final IResource resource : elementsToCopy.getResources()) {
@@ -705,7 +708,7 @@
 //					processor, resource, arguments, natures, shared);
 //			list.addAll(Arrays.asList(deletes));
 //		}
-		for (final IModelElement element : elementsToCopy.getModelElements()) {
+		for (final LtkModelElement element : elementsToCopy.getModelElements()) {
 			final CopyParticipant[] deletes= ParticipantManager.loadCopyParticipants(status,
 					processor, element,
 					mArguments, natures, shared);
@@ -730,12 +733,12 @@
 			final IResourceChangeDescriptionFactory resourceDelta) {
 		for (final IResource resource : elements.getResources()) {
 			if (resource instanceof IFile) {
-				resourceDelta.change((IFile) resource);
+				resourceDelta.change((IFile)resource);
 			}
 		}
 		for (final IResource resource : elements.getResourcesOwnedByElements()) {
 			if (resource instanceof IFile) {
-				resourceDelta.change((IFile) resource);
+				resourceDelta.change((IFile)resource);
 			}
 		}
 		for (final IFile file : elements.getFilesContainingElements()) {
@@ -815,15 +818,15 @@
 		for (final IResource resource : elements.getResources()) {
 			result.add(createChangeToDelete(elements, resource));
 		}
-		final Map<ISourceUnit, List<IModelElement>> suSubChanges= new HashMap<>();
-		for (final IModelElement element : elements.getModelElements()) {
+		final Map<SourceUnit, List<LtkModelElement>> suSubChanges= new HashMap<>();
+		for (final LtkModelElement element : elements.getModelElements()) {
 			final IResource resource= elements.getOwningResource(element);
 			if (resource != null) {
 				result.add(createChangeToDelete(elements, resource));
 			}
 			else {
-				final ISourceUnit su= LTKUtils.getSourceUnit(element);
-				List<IModelElement> list= suSubChanges.get(su);
+				final SourceUnit su= LtkModelUtils.getSourceUnit(element);
+				List<LtkModelElement> list= suSubChanges.get(su);
 				if (list == null) {
 					list= new ArrayList<>(1);
 					suSubChanges.put(su, list);
@@ -833,17 +836,17 @@
 		}
 		if (!suSubChanges.isEmpty()) {
 			m.setWorkRemaining(suSubChanges.size() * 3);
-			for (final Map.Entry<ISourceUnit, List<IModelElement>> suChanges : suSubChanges.entrySet()) {
+			for (final Map.Entry<SourceUnit, List<LtkModelElement>> suChanges : suSubChanges.entrySet()) {
 				createChangeToDelete(elements, suChanges.getKey(), suChanges.getValue(), manager, m);
 			}
 		}
 	}
 	
 	private void createChangeToDelete(final ElementSet elements,
-			final ISourceUnit su, final List<IModelElement> elementsInUnit,
+			final SourceUnit su, final List<LtkModelElement> elementsInUnit,
 			final TextChangeManager manager, final SubMonitor m) throws CoreException {
-		if (!(su instanceof IWorkspaceSourceUnit)
-				|| ((IWorkspaceSourceUnit) su).getResource().getType() != IResource.FILE ) {
+		if (!(su instanceof WorkspaceSourceUnit)
+				|| ((WorkspaceSourceUnit)su).getResource().getType() != IResource.FILE ) {
 			throw new IllegalArgumentException();
 		}
 		su.connect(m.newChild(1));
@@ -852,8 +855,8 @@
 			
 			final BasicHeuristicTokenScanner scanner= getScanner(su);
 			final AbstractDocument document= su.getDocument(null);
-			for (final IModelElement element : elementsInUnit) {
-				final ISourceElement member= (ISourceElement) element;
+			for (final LtkModelElement element : elementsInUnit) {
+				final SourceElement member= (SourceElement)element;
 				final TextRegion sourceRange= expandElementRange(member, document, scanner);
 				final DeleteEdit edit= new DeleteEdit(sourceRange.getStartOffset(), sourceRange.getLength());
 				rootEdit.addChild(edit);
@@ -871,7 +874,7 @@
 		}
 	}
 	
-	protected Change createChangeToDelete(final ElementSet elements, final IModelElement element) throws CoreException {
+	protected Change createChangeToDelete(final ElementSet elements, final LtkModelElement element) throws CoreException {
 		final IResource resource= elements.getOwningResource(element);
 		if (resource != null) {
 			return createChangeToDelete(elements, resource);
@@ -886,9 +889,9 @@
 		return new DeleteResourceChange(resource.getFullPath(), true);
 	}
 	
-	protected Change createChangeToDelete(final ElementSet elements, final ISourceUnit su) throws CoreException {
-		if (su instanceof IWorkspaceSourceUnit) {
-			return createChangeToDelete(elements, ((IWorkspaceSourceUnit) su).getResource());
+	protected Change createChangeToDelete(final ElementSet elements, final SourceUnit su) throws CoreException {
+		if (su instanceof WorkspaceSourceUnit) {
+			return createChangeToDelete(elements, ((WorkspaceSourceUnit)su).getResource());
 		}
 		throw new IllegalStateException();
 	}
@@ -897,19 +900,19 @@
 	protected void addChangesToInsert(final CompositeChange result, final String code,
 			final RefactoringDestination destination,
 			final TextChangeManager manager, final SubMonitor m) throws CoreException {
-		final ISourceElement element= (ISourceElement) destination.getModelElements().get(0);
-		final ISourceUnit su= LTKUtils.getSourceUnit(element);
+		final SourceElement element= (SourceElement)destination.getModelElements().get(0);
+		final SourceUnit su= LtkModelUtils.getSourceUnit(element);
 		
 		m.setWorkRemaining(3);
 		createChangeToInsert(su, code, element, destination, manager, m);
 	}
 	
-	private void createChangeToInsert(final ISourceUnit su,
+	private void createChangeToInsert(final SourceUnit su,
 			final String code,
-			final ISourceElement desElement, final RefactoringDestination destination,
+			final SourceElement desElement, final RefactoringDestination destination,
 			final TextChangeManager manager, final SubMonitor m) throws CoreException {
-		if (!(su instanceof IWorkspaceSourceUnit)
-				|| ((IWorkspaceSourceUnit) su).getResource().getType() != IResource.FILE ) {
+		if (!(su instanceof WorkspaceSourceUnit)
+				|| ((WorkspaceSourceUnit)su).getResource().getType() != IResource.FILE ) {
 			throw new IllegalArgumentException();
 		}
 		su.connect(m.newChild(1));
@@ -929,7 +932,7 @@
 			
 			final InsertEdit edit= new InsertEdit(offset, code);
 			rootEdit.addChild(edit);
-			((SourceUnitChange) manager.get(su)).setInsertPosition(new Position(edit.getOffset()));
+			((SourceUnitChange)manager.get(su)).setInsertPosition(new Position(edit.getOffset()));
 			
 			m.worked(1);
 		}
@@ -944,7 +947,7 @@
 		}
 	}
 	
-	protected int getInsertionOffset(final AbstractDocument document, final ISourceElement element,
+	protected int getInsertionOffset(final AbstractDocument document, final SourceElement element,
 			final RefactoringDestination.Position pos,
 			final BasicHeuristicTokenScanner scanner) throws BadLocationException, BadPartitioningException {
 		final TextRegion range= expandElementRange(element, document, scanner);
@@ -965,24 +968,24 @@
 		}
 	}
 	
-	private MultiTextEdit getRootEdit(final TextChangeManager manager, final ISourceUnit su) {
+	private MultiTextEdit getRootEdit(final TextChangeManager manager, final SourceUnit su) {
 		final TextFileChange textFileChange= manager.get(su);
-		if (su.getWorkingContext() == LTK.EDITOR_CONTEXT) {
+		if (su.getWorkingContext() == Ltk.EDITOR_CONTEXT) {
 			textFileChange.setSaveMode(TextFileChange.LEAVE_DIRTY);
 		}
 		if (textFileChange.getEdit() == null) {
 			textFileChange.setEdit(new MultiTextEdit());
 		}
-		return (MultiTextEdit) textFileChange.getEdit();
+		return (MultiTextEdit)textFileChange.getEdit();
 	}
 	
 	
 	protected IStatus failDocAnalyzation(final Throwable e) {
-		return new Status(IStatus.ERROR, LTK.BUNDLE_ID, Messages.Common_error_AnalyzingSourceDocument_message, e);
+		return new Status(IStatus.ERROR, Ltk.BUNDLE_ID, Messages.Common_error_AnalyzingSourceDocument_message, e);
 	}
 	
 	protected IStatus failCreation(final Throwable e) {
-		return new Status(IStatus.ERROR, LTK.BUNDLE_ID, Messages.Common_error_CreatingElementChange_message, e);
+		return new Status(IStatus.ERROR, Ltk.BUNDLE_ID, Messages.Common_error_CreatingElementChange_message, e);
 	}
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/RefactoringDestination.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/RefactoringDestination.java
index 37199b0..5c0703c 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/RefactoringDestination.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/RefactoringDestination.java
@@ -15,7 +15,7 @@
 package org.eclipse.statet.ltk.refactoring.core;
 
 import org.eclipse.statet.ltk.model.core.ElementSet;
-import org.eclipse.statet.ltk.model.core.elements.ISourceElement;
+import org.eclipse.statet.ltk.model.core.element.SourceElement;
 
 
 public class RefactoringDestination extends ElementSet {
@@ -44,7 +44,7 @@
 		this.position= pos;
 	}
 	
-	public RefactoringDestination(final ISourceElement element, final int offset) {
+	public RefactoringDestination(final SourceElement element, final int offset) {
 		super(element);
 		this.position= Position.AT;
 		this.offset= offset;
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/IScheduledRefactoring.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/ScheduledRefactoring.java
similarity index 89%
rename from ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/IScheduledRefactoring.java
rename to ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/ScheduledRefactoring.java
index ebf4863..f92c3e6 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/IScheduledRefactoring.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/ScheduledRefactoring.java
@@ -16,11 +16,14 @@
 
 import org.eclipse.core.runtime.jobs.ISchedulingRule;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 
 /**
  * Offers optionally an scheduling rule to use when performing the refactoring.
  */
-public interface IScheduledRefactoring {
+@NonNullByDefault
+public interface ScheduledRefactoring {
 	
 	
 	/**
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/SourceUnitChange.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/SourceUnitChange.java
index 2a740b3..76c2b78 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/SourceUnitChange.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/SourceUnitChange.java
@@ -30,18 +30,18 @@
 import org.eclipse.ltk.core.refactoring.TextFileChange;
 import org.eclipse.text.edits.UndoEdit;
 
-import org.eclipse.statet.internal.ltk.core.LTKCorePlugin;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.internal.ltk.core.LtkCorePlugin;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
- * A {@link TextChange} for LTK {@link ISourceUnit}s.
+ * A {@link TextChange} for Ltk {@link SourceUnit}s.
  */
 public final class SourceUnitChange extends TextFileChange {
 	
 	
-	private final ISourceUnit sourceUnit;
+	private final SourceUnit sourceUnit;
 	
 	private Position insertPosition;
 	
@@ -55,8 +55,8 @@
 	 * @param name the change's name mainly used to render the change in the UI
 	 * @param su the compilation unit this text change works on
 	 */
-	public SourceUnitChange(final ISourceUnit su) {
-		super(su.getElementName().getDisplayName(), (IFile) su.getResource());
+	public SourceUnitChange(final SourceUnit su) {
+		super(su.getElementName().getDisplayName(), (IFile)su.getResource());
 		assert (su != null);
 		this.sourceUnit= su;
 		try {
@@ -80,7 +80,7 @@
 	 * 
 	 * @return the source unit this change works on
 	 */
-	public ISourceUnit getSourceUnit() {
+	public SourceUnit getSourceUnit() {
 		return this.sourceUnit;
 	}
 	
@@ -133,10 +133,10 @@
 	@Override
 	protected Change createUndoChange(final UndoEdit edit, final ContentStamp stampToRestore) {
 		try {
-			return new UndoSourceUnitChange(getName(), this.sourceUnit, (IFile) super.getModifiedElement(), edit, stampToRestore, getSaveMode());
+			return new UndoSourceUnitChange(getName(), this.sourceUnit, (IFile)super.getModifiedElement(), edit, stampToRestore, getSaveMode());
 		}
 		catch (final CoreException e) {
-			LTKCorePlugin.log(new Status(IStatus.ERROR, LTKCorePlugin.BUNDLE_ID, -1,
+			LtkCorePlugin.log(new Status(IStatus.ERROR, LtkCorePlugin.BUNDLE_ID, -1,
 					"Failed to create Refactoring Undo", e )); //$NON-NLS-1$
 			return null;
 		}
@@ -145,7 +145,7 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public <T> T getAdapter(final Class<T> adapterType) {
-		if (adapterType == ISourceUnit.class || adapterType == IModelElement.class) {
+		if (adapterType == SourceUnit.class || adapterType == LtkModelElement.class) {
 			return (T) this.sourceUnit;
 		}
 		return super.getAdapter(adapterType);
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/TextChangeManager.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/TextChangeManager.java
index b9eb73d..717a5ce 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/TextChangeManager.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/TextChangeManager.java
@@ -23,17 +23,17 @@
 import org.eclipse.ltk.core.refactoring.TextChange;
 import org.eclipse.ltk.core.refactoring.TextFileChange;
 
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
- * A <code>TextChangeManager</code> manages associations between <code>ISourceUnit</code>
+ * A <code>TextChangeManager</code> manages associations between <code>SourceUnit</code>
  * or <code>IFile</code> and <code>TextChange</code> objects.
  */
 public class TextChangeManager {
 	
 	
-	private final Map<ISourceUnit, TextFileChange> map= new HashMap<>(10);
+	private final Map<SourceUnit, TextFileChange> map= new HashMap<>(10);
 	
 	private final boolean keepExecutedTextEdits;
 	
@@ -54,7 +54,7 @@
 //	 * @param cu the compilation unit (key)
 //	 * @param change the change associated with the compilation unit
 //	 */
-//	public void manage(final ISourceUnit su, final TextChange change) {
+//	public void manage(final SourceUnit su, final TextChange change) {
 //		thi.map.put(su, change);
 //	}
 	
@@ -65,7 +65,7 @@
 	 * @param su the source unit for which the text buffer change is requested
 	 * @return the text change associated with the given source unit. 
 	 */
-	public TextFileChange get(final ISourceUnit su) {
+	public TextFileChange get(final SourceUnit su) {
 		TextFileChange result= this.map.get(su);
 		if (result == null) {
 			result= new SourceUnitChange(su);
@@ -82,7 +82,7 @@
 	 * @param unit the key determining the <tt>TextChange</tt> to be removed.
 	 * @return the removed <tt>TextChange</tt>.
 	 */
-	public TextChange remove(final ISourceUnit unit) {
+	public TextChange remove(final SourceUnit unit) {
 		return this.map.remove(unit);
 	}
 	
@@ -91,8 +91,8 @@
 	 * 
 	 * @return all source units managed by this instance
 	 */	
-	public ISourceUnit[] getAllSourceUnits(){
-		return this.map.keySet().toArray(new ISourceUnit[this.map.keySet().size()]);
+	public SourceUnit[] getAllSourceUnits(){
+		return this.map.keySet().toArray(new SourceUnit[this.map.keySet().size()]);
 	}
 	
 	/**
@@ -101,11 +101,11 @@
 	 * @return all text changes managed by this instance
 	 */
 	public TextChange[] getAllChanges(){
-		final Set<ISourceUnit> suSet= this.map.keySet();
-		final ISourceUnit[] sus= suSet.toArray(new ISourceUnit[suSet.size()]);
-		Arrays.sort(sus, new Comparator<ISourceUnit>() {
+		final Set<SourceUnit> suSet= this.map.keySet();
+		final SourceUnit[] sus= suSet.toArray(new SourceUnit[suSet.size()]);
+		Arrays.sort(sus, new Comparator<SourceUnit>() {
 			@Override
-			public int compare(final ISourceUnit su1, final ISourceUnit su2) {
+			public int compare(final SourceUnit su1, final SourceUnit su2) {
 				return su1.getId().compareTo(su2.getId());
 			}
 		});
@@ -123,7 +123,7 @@
 	 * @param su the source unit
 	 * @return <code>true</code> if any text changes are managed for the specified source unit and <code>false</code> otherwise
 	 */
-	public boolean containsChangesIn(final ISourceUnit su){
+	public boolean containsChangesIn(final SourceUnit su){
 		return this.map.containsKey(su);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/UndoSourceUnitChange.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/UndoSourceUnitChange.java
index af2ae43..db84e7b 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/UndoSourceUnitChange.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/refactoring/core/UndoSourceUnitChange.java
@@ -23,7 +23,7 @@
 import org.eclipse.ltk.core.refactoring.UndoTextFileChange;
 import org.eclipse.text.edits.UndoEdit;
 
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
@@ -32,10 +32,10 @@
 public class UndoSourceUnitChange extends UndoTextFileChange {
 	
 	
-	private final ISourceUnit sourceUnit;
+	private final SourceUnit sourceUnit;
 	
 	
-	public UndoSourceUnitChange(final String name, final ISourceUnit su, final IFile file, 
+	public UndoSourceUnitChange(final String name, final SourceUnit su, final IFile file, 
 			final UndoEdit undo, final ContentStamp stampToRestore, final int saveMode) throws CoreException {
 		super(name, file, undo, stampToRestore, saveMode);
 		this.sourceUnit= su;
@@ -55,7 +55,7 @@
 	 */
 	@Override
 	protected Change createUndoChange(final UndoEdit edit, final ContentStamp stampToRestore) throws CoreException {
-		return new UndoSourceUnitChange(getName(), this.sourceUnit, (IFile) super.getModifiedElement(), edit, stampToRestore, getSaveMode());
+		return new UndoSourceUnitChange(getName(), this.sourceUnit, (IFile)super.getModifiedElement(), edit, stampToRestore, getSaveMode());
 	}
 	
 	/**
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/ActivatedContentTypeTester.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/ActivatedContentTypeTester.java
index 219f87b..00b603e 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/ActivatedContentTypeTester.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/ActivatedContentTypeTester.java
@@ -25,7 +25,7 @@
 import org.eclipse.ui.IEditorPart;
 
 import org.eclipse.statet.ltk.core.IExtContentTypeManager;
-import org.eclipse.statet.ltk.core.LTK;
+import org.eclipse.statet.ltk.core.Ltk;
 
 
 /**
@@ -95,7 +95,7 @@
 		if (property.equals(MATCH_ACTIVATED_TYPE)) {
 			final String expectedContentTypeId= (String) expectedValue;
 			if (contentType != null) {
-				return LTK.getExtContentTypeManager().matchesActivatedContentType(
+				return Ltk.getExtContentTypeManager().matchesActivatedContentType(
 						contentType.getId(), expectedContentTypeId, true);
 			}
 			return false;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/refactoring/ModelElementTester.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/refactoring/ModelElementTester.java
index 315ee13..73add86 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/refactoring/ModelElementTester.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/refactoring/ModelElementTester.java
@@ -19,9 +19,9 @@
 import org.eclipse.core.expressions.PropertyTester;
 import org.eclipse.jface.viewers.IStructuredSelection;
 
-import org.eclipse.statet.ltk.core.LTKUtils;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.LtkModelUtils;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 public class ModelElementTester extends PropertyTester {
@@ -44,10 +44,10 @@
 		final IStructuredSelection selection= (IStructuredSelection) receiver;
 		int mask= 0;
 		if (IS_ELEMENT_C1_TYPE_SELECTION.equals(property)) {
-			mask= IModelElement.MASK_C1;
+			mask= LtkModelElement.MASK_C1;
 		}
 		else if (IS_ELEMENT_C2_TYPE_SELECTION.equals(property)) {
-			mask= IModelElement.MASK_C2;
+			mask= LtkModelElement.MASK_C2;
 		}
 		int numSu= 1;
 		String modelType= (String) expectedValue;
@@ -63,20 +63,20 @@
 		final int[] types= parseInts(args);
 		final Iterator iter= selection.iterator();
 		boolean first= true;
-		ISourceUnit su= null;
+		SourceUnit su= null;
 		ITER_ELEMENTS : while (iter.hasNext()) {
 			final Object obj= iter.next();
-			if (obj instanceof IModelElement) {
-				final IModelElement element= (IModelElement) obj;
+			if (obj instanceof LtkModelElement) {
+				final LtkModelElement element= (LtkModelElement) obj;
 				if (numSu == 1) {
 					if (first) {
 						first= false;
-						if ((su= LTKUtils.getSourceUnit(element)) == null) {
+						if ((su= LtkModelUtils.getSourceUnit(element)) == null) {
 							return false;
 						}
 					}
 					else {
-						if (su != LTKUtils.getSourceUnit(element)) {
+						if (su != LtkModelUtils.getSourceUnit(element)) {
 							return false;
 						}
 					}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/EditorUtils.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/EditorUtils.java
index 264b286..ca0758b 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/EditorUtils.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/EditorUtils.java
@@ -39,9 +39,10 @@
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
-import org.eclipse.statet.ltk.core.LTK;
-import org.eclipse.statet.ltk.model.core.ISourceUnitManager;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.core.Ltk;
+import org.eclipse.statet.ltk.model.core.LtkModels;
+import org.eclipse.statet.ltk.model.core.SourceUnitManager;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
@@ -99,9 +100,9 @@
 	
 	public static boolean isModelTypeEditorInput(final IEditorInput input, final String modelTypeId) {
 		final Object ifile= input.getAdapter(IFile.class);
-		final ISourceUnitManager suManager= LTK.getSourceUnitManager();
+		final SourceUnitManager suManager= LtkModels.getSourceUnitManager();
 		if (ifile != null) {
-			final ISourceUnit su= suManager.getSourceUnit(modelTypeId, LTK.PERSISTENCE_CONTEXT, ifile, false, null);
+			final SourceUnit su= suManager.getSourceUnit(modelTypeId, Ltk.PERSISTENCE_CONTEXT, ifile, false, null);
 			if (su != null) {
 				su.disconnect(null);
 				return true;
@@ -116,7 +117,7 @@
 			catch (final CoreException e) {
 				return false;
 			}
-			final ISourceUnit su= suManager.getSourceUnit(modelTypeId, LTK.EDITOR_CONTEXT, store, false, null);
+			final SourceUnit su= suManager.getSourceUnit(modelTypeId, Ltk.EDITOR_CONTEXT, store, false, null);
 			if (su != null) {
 				su.disconnect(null);
 				return true;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ElementInfoController.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ElementInfoController.java
index e9b7236..eceea03 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ElementInfoController.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ElementInfoController.java
@@ -29,10 +29,10 @@
 import org.eclipse.statet.ltk.ast.core.AstInfo;
 import org.eclipse.statet.ltk.core.WorkingContext;
 import org.eclipse.statet.ltk.model.core.ElementChangedEvent;
-import org.eclipse.statet.ltk.model.core.IElementChangedListener;
-import org.eclipse.statet.ltk.model.core.IModelElementDelta;
-import org.eclipse.statet.ltk.model.core.IModelManager;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.ElementChangedListener;
+import org.eclipse.statet.ltk.model.core.ModelManager;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElementDelta;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
@@ -43,16 +43,16 @@
 	private static int NEWINPUT_DELAY= 100;
 	
 	
-	private final IModelManager modelProvider;
+	private final ModelManager modelProvider;
 	private final WorkingContext modelContext;
-	private final IElementChangedListener elementChangeListener;
+	private final ElementChangedListener elementChangeListener;
 	
 	private final CopyOnWriteIdentityListSet<IModelElementInputListener> listenerList= new CopyOnWriteIdentityListSet<>();
 	private final CopyOnWriteIdentityListSet<IModelElementInputListener> newListenerList= new CopyOnWriteIdentityListSet<>();
 	
 	private final Object inputLock= new Object();
-	private volatile ISourceUnit input;
-	private ISourceUnit newInput;
+	private volatile SourceUnit input;
+	private SourceUnit newInput;
 	private final NewInputUpdater newInputJob= new NewInputUpdater();
 	
 	private class NewInputUpdater extends Job implements ISchedulingRule {
@@ -77,7 +77,7 @@
 		
 		@Override
 		protected IStatus run(final IProgressMonitor monitor) {
-			ISourceUnit input;
+			SourceUnit input;
 			ImIdentityList<IModelElementInputListener> listeners;
 			synchronized (ElementInfoController.this.inputLock) {
 				if (monitor.isCanceled()
@@ -115,11 +115,11 @@
 	private final IProgressMonitor notifyMonitor= new NullProgressMonitor();
 	
 	
-	public ElementInfoController(final IModelManager manager, final WorkingContext context) {
-		this.elementChangeListener= new IElementChangedListener() {
+	public ElementInfoController(final ModelManager manager, final WorkingContext context) {
+		this.elementChangeListener= new ElementChangedListener() {
 			@Override
 			public void elementChanged(final ElementChangedEvent event) {
-				ISourceUnit input;
+				SourceUnit input;
 				ImIdentityList<IModelElementInputListener> listeners;
 				synchronized (ElementInfoController.this.inputLock) {
 					if (ElementInfoController.this.newInput != null && ElementInfoController.this.newInput.equals(event.delta.getModelElement())) {
@@ -157,7 +157,7 @@
 	}
 	
 	
-	public void setInput(final ISourceUnit input) {
+	public void setInput(final SourceUnit input) {
 		synchronized (this.inputLock) {
 			this.input= null;
 			this.newInput= input;
@@ -178,13 +178,13 @@
 		return listeners;
 	}
 	
-	private void notifyChanged(final ImIdentityList<IModelElementInputListener> listeners, final ISourceUnit input) {
+	private void notifyChanged(final ImIdentityList<IModelElementInputListener> listeners, final SourceUnit input) {
 		for (final IModelElementInputListener listener : listeners) {
 			listener.elementChanged(input);
 		}
 	}
 	
-	private void notifyInitial(final ImIdentityList<IModelElementInputListener> listeners, final ISourceUnit input, 
+	private void notifyInitial(final ImIdentityList<IModelElementInputListener> listeners, final SourceUnit input, 
 			final IProgressMonitor monitor) {
 		if (listeners.isEmpty() || input != this.input) {
 			return;
@@ -203,7 +203,7 @@
 		}
 	}
 	
-	private void notifyUpdated(final ImIdentityList<IModelElementInputListener> listeners, final ISourceUnit input, final IModelElementDelta delta, 
+	private void notifyUpdated(final ImIdentityList<IModelElementInputListener> listeners, final SourceUnit input, final LtkModelElementDelta delta, 
 			final IProgressMonitor monitor) {
 		if (input != this.input) {
 			return;
@@ -223,14 +223,14 @@
 	}
 	
 	@Override
-	public ISourceUnit getInput() {
+	public SourceUnit getInput() {
 		return this.input;
 	}
 	
 	@Override
 	public void addListener(final IModelElementInputListener listener) {
 		synchronized (this.inputLock) {
-			ISourceUnit input= this.newInput;
+			SourceUnit input= this.newInput;
 			if (input == null) {
 				input= this.input;
 			}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ElementLabelProvider.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ElementLabelProvider.java
index 649fe3d..3cb6a6f 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ElementLabelProvider.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ElementLabelProvider.java
@@ -23,11 +23,11 @@
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
 
 
 /**
- * Label provider for objects of the type {@link IModelElement}.
+ * Label provider for objects of the type {@link LtkModelElement}.
  */
 @NonNullByDefault
 public interface ElementLabelProvider {
@@ -41,19 +41,19 @@
 	};
 	
 	
-	String getText(final IModelElement element);
+	String getText(final LtkModelElement element);
 	
-//	void decorateText(final StringBuilder text, final IModelElement element);
+//	void decorateText(final StringBuilder text, final LtkModelElement element);
 	
-	StyledString getStyledText(final IModelElement element);
+	StyledString getStyledText(final LtkModelElement element);
 	
-	default int @Nullable [] getStyledTextRegions(final IModelElement element,
+	default int @Nullable [] getStyledTextRegions(final LtkModelElement element,
 			final int flags, final int[] regions) {
 		return null;
 	}
 	
-//	void decorateStyledText(final StyledString text, final IModelElement element);
+//	void decorateStyledText(final StyledString text, final LtkModelElement element);
 	
-	Image getImage(final IModelElement element);
+	Image getImage(final LtkModelElement element);
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ElementNameComparator.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ElementNameComparator.java
index acaac23..3d735ad 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ElementNameComparator.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ElementNameComparator.java
@@ -20,11 +20,11 @@
 import org.eclipse.jface.viewers.ViewerComparator;
 
 import org.eclipse.statet.ltk.core.ElementName;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
 
 
-public class ElementNameComparator extends ViewerComparator implements Comparator<IModelElement> {
+public class ElementNameComparator extends ViewerComparator implements Comparator<LtkModelElement> {
 	
 	
 	public ElementNameComparator(final Comparator<? super ElementName> nameComparator) {
@@ -34,21 +34,21 @@
 	
 	@Override
 	public int category(final Object element) {
-		return category((IModelElement) element);
+		return category((LtkModelElement) element);
 	}
 	
-	public int category(final IModelElement element) {
-		switch (element.getElementType() & IModelElement.MASK_C1) {
-		case IModelElement.C1_IMPORT:
+	public int category(final LtkModelElement element) {
+		switch (element.getElementType() & LtkModelElement.MASK_C1) {
+		case LtkModelElement.C1_IMPORT:
 			return 1;
-		case IModelElement.C1_CLASS:
+		case LtkModelElement.C1_CLASS:
 			return 2;
 		}
 		return 100;
 	}
 	
 	@Override
-	public int compare(final IModelElement e1, final IModelElement e2) {
+	public int compare(final LtkModelElement e1, final LtkModelElement e2) {
 		final int c1= category(e1);
 		final int c2= category(e2);
 		if (c1 != c2) {
@@ -59,25 +59,25 @@
 		if (result != 0) {
 			return result;
 		}
-		if (e1 instanceof ISourceStructElement && e2 instanceof ISourceStructElement) {
-			return ((ISourceStructElement) e1).getSourceRange().getStartOffset()
-					- ((ISourceStructElement) e2).getSourceRange().getStartOffset();
+		if (e1 instanceof SourceStructElement && e2 instanceof SourceStructElement) {
+			return ((SourceStructElement) e1).getSourceRange().getStartOffset()
+					- ((SourceStructElement) e2).getSourceRange().getStartOffset();
 		}
 		return 0;
 	}
 	
 	@Override
 	public int compare(final Viewer viewer, final Object e1, final Object e2) {
-		if (e1 instanceof IModelElement) {
-			if (e2 instanceof IModelElement) {
-				return compare((IModelElement) e1, (IModelElement) e2);
+		if (e1 instanceof LtkModelElement) {
+			if (e2 instanceof LtkModelElement) {
+				return compare((LtkModelElement) e1, (LtkModelElement) e2);
 			}
 			else {
 				return Integer.MIN_VALUE;
 			}
 		}
 		else {
-			if (e2 instanceof IModelElement) {
+			if (e2 instanceof LtkModelElement) {
 				return Integer.MAX_VALUE;
 			}
 			else {
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/FileBufferWorkingBuffer.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/FileBufferWorkingBuffer.java
index 1ba6b42..bb73f97 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/FileBufferWorkingBuffer.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/FileBufferWorkingBuffer.java
@@ -25,18 +25,21 @@
 import org.eclipse.jface.text.DocumentRewriteSession;
 import org.eclipse.jface.text.ISynchronizable;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
 import org.eclipse.statet.internal.ltk.ui.LTKUIPlugin;
-import org.eclipse.statet.ltk.model.core.SourceDocumentRunnable;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceDocumentRunnable;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
- * WorkingBuffer using {@link ITextFileBuffer}.
+ * BasicWorkingBuffer using {@link ITextFileBuffer}.
  * <p>
  * Usually used for editors / the editor context.</p>
  */
+@NonNullByDefault
 public class FileBufferWorkingBuffer extends org.eclipse.statet.ltk.model.core.impl.FileBufferWorkingBuffer {
 	
 	
@@ -87,7 +90,7 @@
 	}
 	
 	
-	public FileBufferWorkingBuffer(final ISourceUnit unit) {
+	public FileBufferWorkingBuffer(final SourceUnit unit) {
 		super(unit);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/GenericEditorWorkspaceSourceUnitWorkingCopy2.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/GenericEditorWorkspaceSourceUnitWorkingCopy2.java
index d73ecc9..72460ac 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/GenericEditorWorkspaceSourceUnitWorkingCopy2.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/GenericEditorWorkspaceSourceUnitWorkingCopy2.java
@@ -19,47 +19,52 @@
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.SubMonitor;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.IMarkerPositionResolver;
 import org.eclipse.statet.ecommons.text.ui.AnnotationMarkerPositionResolver;
 
-import org.eclipse.statet.ltk.core.LTK;
+import org.eclipse.statet.ltk.core.Ltk;
 import org.eclipse.statet.ltk.core.WorkingContext;
-import org.eclipse.statet.ltk.model.core.SourceDocumentRunnable;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
-import org.eclipse.statet.ltk.model.core.elements.IWorkspaceSourceUnit;
+import org.eclipse.statet.ltk.model.core.build.SourceUnitModelContainer;
+import org.eclipse.statet.ltk.model.core.element.SourceDocumentRunnable;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.element.WorkspaceSourceUnit;
 import org.eclipse.statet.ltk.model.core.impl.GenericSourceUnitWorkingCopy2;
-import org.eclipse.statet.ltk.model.core.impl.IWorkingBuffer;
-import org.eclipse.statet.ltk.model.core.impl.SourceUnitModelContainer;
+import org.eclipse.statet.ltk.model.core.impl.WorkingBuffer;
 
 
-public abstract class GenericEditorWorkspaceSourceUnitWorkingCopy2<M extends SourceUnitModelContainer<? extends ISourceUnit, ? extends ISourceUnitModelInfo>>
-		extends GenericSourceUnitWorkingCopy2<M>
-		implements IWorkspaceSourceUnit {
+@NonNullByDefault
+public abstract class GenericEditorWorkspaceSourceUnitWorkingCopy2<
+				TModelContainer extends SourceUnitModelContainer<? extends SourceUnit, ? extends SourceUnitModelInfo>>
+		extends GenericSourceUnitWorkingCopy2<TModelContainer>
+		implements WorkspaceSourceUnit {
 	
 	
-	public GenericEditorWorkspaceSourceUnitWorkingCopy2(final IWorkspaceSourceUnit from) {
+	public GenericEditorWorkspaceSourceUnitWorkingCopy2(final WorkspaceSourceUnit from) {
 		super(from);
 	}
 	
 	
 	@Override
 	public WorkingContext getWorkingContext() {
-		return LTK.EDITOR_CONTEXT;
+		return Ltk.EDITOR_CONTEXT;
 	}
 	
 	@Override
 	public IResource getResource() {
-		return ((IWorkspaceSourceUnit) getUnderlyingUnit()).getResource();
+		return ((WorkspaceSourceUnit) getUnderlyingUnit()).getResource();
 	}
 	
 	@Override
-	public IMarkerPositionResolver getMarkerPositionResolver() {
+	public @Nullable IMarkerPositionResolver getMarkerPositionResolver() {
 		return AnnotationMarkerPositionResolver.createIfRequired(getResource());
 	}
 	
 	@Override
-	protected IWorkingBuffer createWorkingBuffer(final SubMonitor m) {
+	protected WorkingBuffer createWorkingBuffer(final SubMonitor m) {
 		return new FileBufferWorkingBuffer(this);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/IModelElementInputListener.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/IModelElementInputListener.java
index d1592b2..73e173b 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/IModelElementInputListener.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/IModelElementInputListener.java
@@ -14,12 +14,12 @@
 
 package org.eclipse.statet.ltk.ui;
 
-import org.eclipse.statet.ltk.model.core.IModelElementDelta;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElementDelta;
 
 
 /**
- * Interface to listen to changes of object input of the type {@link IModelElement}.
+ * Interface to listen to changes of object input of the type {@link LtkModelElement}.
  * 
  * @see IModelElementInputProvider
  */
@@ -30,18 +30,18 @@
 	 * The element of the provider has changed.
 	 * 
 	 * Directly called while changing the input.
-	 * For longer tasks, wait for {@link #elementInitialInfo(IModelElement)}.
+	 * For longer tasks, wait for {@link #elementInitialInfo(LtkModelElement)}.
 	 */
-	public void elementChanged(IModelElement element);
+	public void elementChanged(LtkModelElement element);
 	
 	/**
 	 * First detail info for the element.
 	 */
-	public void elementInitialInfo(IModelElement element);
+	public void elementInitialInfo(LtkModelElement element);
 	
 	/**
 	 * Detail info changed.
 	 */
-	public void elementUpdatedInfo(IModelElement element, IModelElementDelta delta);
+	public void elementUpdatedInfo(LtkModelElement element, LtkModelElementDelta delta);
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/IModelElementInputProvider.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/IModelElementInputProvider.java
index f0a0792..810cdba 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/IModelElementInputProvider.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/IModelElementInputProvider.java
@@ -14,16 +14,16 @@
 
 package org.eclipse.statet.ltk.ui;
 
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
- * Object having an {@link ISourceUnit} as input.
+ * Object having an {@link SourceUnit} as input.
  */
 public interface IModelElementInputProvider {
 	
 	
-	public abstract ISourceUnit getInput();
+	public abstract SourceUnit getInput();
 	
 	public abstract void addListener(IModelElementInputListener listener);
 	public abstract void removeListener(IModelElementInputListener listener);
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/LTKInputData.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/LTKInputData.java
index 28a5ada..b26a5bf 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/LTKInputData.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/LTKInputData.java
@@ -21,12 +21,12 @@
 import org.eclipse.ui.part.ShowInContext;
 
 import org.eclipse.statet.ltk.ast.core.util.AstSelection;
-import org.eclipse.statet.ltk.core.LTKUtils;
-import org.eclipse.statet.ltk.model.core.IModelManager;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.LtkModelUtils;
+import org.eclipse.statet.ltk.model.core.ModelManager;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 
 
 /**
@@ -37,21 +37,21 @@
 public class LTKInputData implements ISelection {
 	
 	
-	protected ISourceUnit inputElement;
-	protected ISourceUnitModelInfo inputInfo;
+	protected SourceUnit inputElement;
+	protected SourceUnitModelInfo inputInfo;
 	
 	protected ISelectionProvider selectionProvider;
 	protected ISelection selection;
 	protected AstSelection astSelection;
-	protected ISourceStructElement modelSelection;
+	protected SourceStructElement modelSelection;
 	
 	
-	public LTKInputData(final ISourceUnit inputElement, final ISelection selection) {
+	public LTKInputData(final SourceUnit inputElement, final ISelection selection) {
 		this.inputElement= inputElement;
 		this.selection= selection;
 	}
 	
-	public LTKInputData(final ISourceUnit inputElement, final ISelectionProvider selectionProvider) {
+	public LTKInputData(final SourceUnit inputElement, final ISelectionProvider selectionProvider) {
 		this.inputElement= inputElement;
 		this.selectionProvider= selectionProvider;
 		this.selection= selectionProvider.getSelection();
@@ -70,13 +70,13 @@
 		return false;
 	}
 	
-	public IModelElement getInputElement() {
+	public LtkModelElement getInputElement() {
 		return this.inputElement;
 	}
 	
-	public ISourceUnitModelInfo getInputInfo() {
+	public SourceUnitModelInfo getInputInfo() {
 		if (this.inputInfo == null) {
-			this.inputInfo= this.inputElement.getModelInfo(null, IModelManager.NONE, new NullProgressMonitor());
+			this.inputInfo= this.inputElement.getModelInfo(null, ModelManager.NONE, new NullProgressMonitor());
 		}
 		return this.inputInfo;
 	}
@@ -103,11 +103,11 @@
 		return this.astSelection;
 	}
 	
-	public ISourceStructElement getModelSelection() {
+	public SourceStructElement getModelSelection() {
 		if (this.modelSelection == null) {
 			if (this.selection instanceof ITextSelection && getInputInfo() != null) {
 				final ITextSelection textSelection= (ITextSelection) this.selection;
-				this.modelSelection= LTKUtils.getCoveringSourceElement(getInputInfo().getSourceElement(), textSelection.getOffset(), textSelection.getOffset()+textSelection.getLength());
+				this.modelSelection= LtkModelUtils.getCoveringSourceElement(getInputInfo().getSourceElement(), textSelection.getOffset(), textSelection.getOffset()+textSelection.getLength());
 			}
 		}
 		return this.modelSelection;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/LTKUIPreferences.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/LTKUIPreferences.java
index 92975ee..d6e02ed 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/LTKUIPreferences.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/LTKUIPreferences.java
@@ -45,7 +45,7 @@
 	}
 	
 	
-	public static final String ASSIST_GROUP_ID= "LTK/assist"; //$NON-NLS-1$
+	public static final String ASSIST_GROUP_ID= "Ltk/assist"; //$NON-NLS-1$
 	
 	public static final String ASSIST_PREF_QUALIFIER= LTKUIPlugin.BUNDLE_ID + "/assist"; //$NON-NLS-1$
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/PostSelectionWithElementInfoController.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/PostSelectionWithElementInfoController.java
index 462e117..5d107bd 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/PostSelectionWithElementInfoController.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/PostSelectionWithElementInfoController.java
@@ -30,9 +30,9 @@
 import org.eclipse.statet.jcommons.collections.ImIdentityList;
 
 import org.eclipse.statet.internal.ltk.ui.LTKUIPlugin;
-import org.eclipse.statet.ltk.model.core.IModelElementDelta;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElementDelta;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
@@ -50,7 +50,7 @@
 			
 			int stateNr;
 			
-			Data(final ISourceUnit input, final SelectionChangedEvent currentSelection, final int runNr) {
+			Data(final SourceUnit input, final SelectionChangedEvent currentSelection, final int runNr) {
 				super(input, (currentSelection != null) ? currentSelection.getSelection() : null);
 				this.stateNr= runNr;
 			}
@@ -77,7 +77,7 @@
 		
 		@Override
 		protected synchronized IStatus run(final IProgressMonitor monitor) {
-			ISourceUnit input= null;
+			SourceUnit input= null;
 			try {
 				checkNewInput();
 				
@@ -109,7 +109,7 @@
 					input.connect(monitor);
 				}
 				if (run.getInputInfo() == null
-						|| run.getInputInfo().getStamp().getSourceStamp() != input.getDocument(null).getModificationStamp()) {
+						|| run.getInputInfo().getStamp().getContentStamp() != input.getDocument(null).getModificationStamp()) {
 					return Status.OK_STATUS;
 				}
 				
@@ -222,7 +222,7 @@
 	
 	private final List<IgnoreActivation> ignoreList= new ArrayList<>();
 	
-	private ISourceUnit input; // current input
+	private SourceUnit input; // current input
 	private boolean inputChanged;
 	private SelectionChangedEvent currentSelection; // current selection
 	private volatile int currentNr; // stamp to check, if information still up-to-date
@@ -238,12 +238,12 @@
 		
 		this.elementChangeListener= new IModelElementInputListener() {
 			@Override
-			public void elementChanged(final IModelElement element) {
+			public void elementChanged(final LtkModelElement element) {
 				synchronized (PostSelectionWithElementInfoController.this.inputLock) {
 					if (PostSelectionWithElementInfoController.this.updateJob.getState() == Job.WAITING) {
 						PostSelectionWithElementInfoController.this.updateJob.cancel();
 					}
-					PostSelectionWithElementInfoController.this.input= (ISourceUnit) element;
+					PostSelectionWithElementInfoController.this.input= (SourceUnit) element;
 					PostSelectionWithElementInfoController.this.inputChanged= true;
 					PostSelectionWithElementInfoController.this.currentNr++;
 					PostSelectionWithElementInfoController.this.currentSelection= null;
@@ -251,14 +251,14 @@
 				}
 			}
 			@Override
-			public void elementInitialInfo(final IModelElement element) {
+			public void elementInitialInfo(final LtkModelElement element) {
 				checkUpdate(element);
 			}
 			@Override
-			public void elementUpdatedInfo(final IModelElement element, final IModelElementDelta delta) {
+			public void elementUpdatedInfo(final LtkModelElement element, final LtkModelElementDelta delta) {
 				checkUpdate(element);
 			}
-			private void checkUpdate(final IModelElement element) {
+			private void checkUpdate(final LtkModelElement element) {
 				synchronized (PostSelectionWithElementInfoController.this.inputLock) {
 					PostSelectionWithElementInfoController.this.currentNr++;
 					if (PostSelectionWithElementInfoController.this.currentSelection == null) {
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/CopyElementsHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/CopyElementsHandler.java
index 8516c8a..25001a5 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/CopyElementsHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/CopyElementsHandler.java
@@ -25,7 +25,7 @@
 import org.eclipse.statet.ecommons.ui.workbench.WorkbenchUIUtils;
 
 import org.eclipse.statet.internal.ltk.ui.refactoring.Messages;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
 import org.eclipse.statet.ltk.refactoring.core.CommonRefactoringFactory;
 import org.eclipse.statet.ltk.refactoring.core.RefactoringAdapter;
 import org.eclipse.statet.ltk.ui.util.LTKSelectionUtils;
@@ -56,7 +56,7 @@
 		if (selection == null || selection.isEmpty()) {
 			return null;
 		}
-		final ISourceStructElement[] sourceElements= LTKSelectionUtils.getSelectedSourceStructElements(selection);
+		final SourceStructElement[] sourceElements= LTKSelectionUtils.getSelectedSourceStructElements(selection);
 		if (sourceElements != null) {
 			final RefactoringAdapter adapter= this.refactoring.createAdapter(sourceElements);
 			if (adapter == null) {
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/CopyNamesHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/CopyNamesHandler.java
index cf37e9f..a5db9d1 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/CopyNamesHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/CopyNamesHandler.java
@@ -28,7 +28,7 @@
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 import org.eclipse.statet.ecommons.ui.workbench.WorkbenchUIUtils;
 
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
 import org.eclipse.statet.ltk.refactoring.core.CommonRefactoringFactory;
 
 
@@ -87,8 +87,8 @@
 	}
 	
 	protected String getName(final Object o) {
-		if (o instanceof IModelElement) {
-			return ((IModelElement) o).getElementName().getDisplayName();
+		if (o instanceof LtkModelElement) {
+			return ((LtkModelElement) o).getElementName().getDisplayName();
 		}
 		return null;
 	}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/CutElementsHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/CutElementsHandler.java
index 0f0406d..441f5fd 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/CutElementsHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/CutElementsHandler.java
@@ -36,7 +36,7 @@
 import org.eclipse.statet.ecommons.ui.workbench.WorkbenchUIUtils;
 
 import org.eclipse.statet.internal.ltk.ui.refactoring.Messages;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
 import org.eclipse.statet.ltk.refactoring.core.CommonRefactoringFactory;
 import org.eclipse.statet.ltk.refactoring.core.RefactoringAdapter;
 import org.eclipse.statet.ltk.ui.util.LTKSelectionUtils;
@@ -73,7 +73,7 @@
 		if (selection == null || selection.isEmpty()) {
 			return null;
 		}
-		final ISourceStructElement[] sourceElements= LTKSelectionUtils.getSelectedSourceStructElements(selection);
+		final SourceStructElement[] sourceElements= LTKSelectionUtils.getSelectedSourceStructElements(selection);
 		if (sourceElements != null) {
 			final RefactoringAdapter adapter= this.refactoring.createAdapter(sourceElements);
 			if (adapter == null) {
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/DeleteElementsHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/DeleteElementsHandler.java
index 718b073..d64ff6c 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/DeleteElementsHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/DeleteElementsHandler.java
@@ -35,7 +35,7 @@
 import org.eclipse.statet.ecommons.ui.workbench.WorkbenchUIUtils;
 
 import org.eclipse.statet.internal.ltk.ui.refactoring.Messages;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
 import org.eclipse.statet.ltk.refactoring.core.CommonRefactoringFactory;
 import org.eclipse.statet.ltk.refactoring.core.RefactoringAdapter;
 import org.eclipse.statet.ltk.ui.util.LTKSelectionUtils;
@@ -72,7 +72,7 @@
 		if (selection == null || selection.isEmpty()) {
 			return null;
 		}
-		final ISourceStructElement[] sourceElements= LTKSelectionUtils.getSelectedSourceStructElements(selection);
+		final SourceStructElement[] sourceElements= LTKSelectionUtils.getSelectedSourceStructElements(selection);
 		if (sourceElements != null) {
 			final RefactoringAdapter adapter= this.refactoring.createAdapter(sourceElements);
 			if (adapter == null) {
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/PasteElementsHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/PasteElementsHandler.java
index 5fd01de..daa9641 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/PasteElementsHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/PasteElementsHandler.java
@@ -39,9 +39,9 @@
 import org.eclipse.statet.ecommons.ui.workbench.WorkbenchUIUtils;
 
 import org.eclipse.statet.internal.ltk.ui.refactoring.Messages;
-import org.eclipse.statet.ltk.model.core.IModelManager;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.ModelManager;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 import org.eclipse.statet.ltk.refactoring.core.CommonRefactoringFactory;
 import org.eclipse.statet.ltk.refactoring.core.RefactoringAdapter;
 import org.eclipse.statet.ltk.refactoring.core.RefactoringDestination;
@@ -80,7 +80,7 @@
 		if (selection == null) {
 			return null;
 		}
-		final ISourceUnit su= this.editor.getSourceUnit();
+		final SourceUnit su= this.editor.getSourceUnit();
 		if (su == null) {
 			return null;
 		}
@@ -88,7 +88,7 @@
 		if (selection instanceof IStructuredSelection) {
 			final IProgressMonitor monitor= new NullProgressMonitor();
 			final IStructuredSelection structuredSelection= (IStructuredSelection) selection;
-			final ISourceUnitModelInfo modelInfo= su.getModelInfo(null, IModelManager.MODEL_FILE,
+			final SourceUnitModelInfo modelInfo= su.getModelInfo(null, ModelManager.MODEL_FILE,
 					monitor );
 			if (modelInfo == null) {
 				return null;
@@ -138,7 +138,7 @@
 	}
 	
 	private Position startInsertRefactoring(final String code, final RefactoringDestination destination,
-			final ISourceUnit su, final RefactoringAdapter adapter,
+			final SourceUnit su, final RefactoringAdapter adapter,
 			final Shell shell, final IProgressService context)
 			throws InvocationTargetException, InterruptedException {
 		final RefactoringProcessor processor= this.refactoring.createPasteProcessor(code, destination, adapter);
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/RefactoringExecutionHelper.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/RefactoringExecutionHelper.java
index 34ba9ac..dbdc4e4 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/RefactoringExecutionHelper.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/refactoring/RefactoringExecutionHelper.java
@@ -45,8 +45,8 @@
 import org.eclipse.ui.progress.IProgressService;
 
 import org.eclipse.statet.internal.ltk.ui.refactoring.Messages;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.refactoring.core.IScheduledRefactoring;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.refactoring.core.ScheduledRefactoring;
 import org.eclipse.statet.ltk.refactoring.core.SourceUnitChange;
 
 
@@ -65,7 +65,7 @@
 	private final Shell parent;
 	private final int stopSeverity;
 	
-	private ISourceUnit insertPositionSourceUnit;
+	private SourceUnit insertPositionSourceUnit;
 	private Position insertPosition;
 	
 	
@@ -106,8 +106,8 @@
 					
 					final IJobManager manager=  Job.getJobManager();
 					final Thread workingThread= Thread.currentThread();
-					final ISchedulingRule rule= (RefactoringExecutionHelper.this.refactoring instanceof IScheduledRefactoring) ?
-							((IScheduledRefactoring) RefactoringExecutionHelper.this.refactoring).getSchedulingRule() :
+					final ISchedulingRule rule= (RefactoringExecutionHelper.this.refactoring instanceof ScheduledRefactoring) ?
+							((ScheduledRefactoring) RefactoringExecutionHelper.this.refactoring).getSchedulingRule() :
 							ResourcesPlugin.getWorkspace().getRoot();
 					
 					manager.beginRule(rule, m.newChild(1));
@@ -242,7 +242,7 @@
 	
 	
 	
-	public void enableInsertPosition(final ISourceUnit su) {
+	public void enableInsertPosition(final SourceUnit su) {
 		this.insertPositionSourceUnit= su;
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/AbstractMarkOccurrencesProvider.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/AbstractMarkOccurrencesProvider.java
index 710ba87..03cae24 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/AbstractMarkOccurrencesProvider.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/AbstractMarkOccurrencesProvider.java
@@ -33,10 +33,10 @@
 import org.eclipse.statet.ecommons.text.core.PartitionConstraint;
 
 import org.eclipse.statet.ltk.ast.core.util.AstSelection;
-import org.eclipse.statet.ltk.core.ISourceModelStamp;
-import org.eclipse.statet.ltk.model.core.IModelManager;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.core.SourceModelStamp;
+import org.eclipse.statet.ltk.model.core.ModelManager;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 import org.eclipse.statet.ltk.ui.ISelectionWithElementInfoListener;
 import org.eclipse.statet.ltk.ui.LTKInputData;
 
@@ -53,7 +53,7 @@
 	public final class RunData {
 		
 		public final AbstractDocument doc;
-		public ISourceModelStamp stamp;
+		public SourceModelStamp stamp;
 		
 		private Annotation[] annotations;
 		private Point range;
@@ -62,7 +62,7 @@
 		private Map<Annotation, Position> todo;
 		
 		
-		RunData(final AbstractDocument doc, final ISourceModelStamp stamp) {
+		RunData(final AbstractDocument doc, final SourceModelStamp stamp) {
 			this.doc= doc;
 			this.stamp= stamp;
 		}
@@ -72,7 +72,7 @@
 			final Point currentSelection= AbstractMarkOccurrencesProvider.this.editor.currentSelection;
 			return (this.range != null && currentSelection.x >= this.range.x
 					&& currentSelection.x+currentSelection.y <= this.range.y
-					&& this.doc.getModificationStamp() == this.stamp.getSourceStamp() );
+					&& this.doc.getModificationStamp() == this.stamp.getContentStamp() );
 		}
 		
 		public boolean accept(final Point range) {
@@ -144,7 +144,7 @@
 	@Override
 	public void stateChanged(final LTKInputData state) {
 		final ISelection selection= state.getSelection();
-		final boolean ok= update((ISourceUnit) state.getInputElement(), state.getAstSelection(),
+		final boolean ok= update((SourceUnit) state.getInputElement(), state.getAstSelection(),
 				(selection instanceof ITextSelection) ? (ITextSelection) selection : null );
 		if (!ok && state.isStillValid()) {
 			removeAnnotations();
@@ -157,14 +157,14 @@
 	 * @return <code>true</code> if the annotation is ok (still valid or updated), 
 	 *     otherwise <code>false</code>
 	 */
-	protected boolean update(final ISourceUnit inputElement, final AstSelection astSelection,
+	protected boolean update(final SourceUnit inputElement, final AstSelection astSelection,
 			final ITextSelection orgSelection) {
 		if (!this.isMarkEnabled) {
 			return false;
 		}
 		try {
-			final ISourceUnitModelInfo info= inputElement.getModelInfo(this.editor.getModelTypeId(),
-					IModelManager.NONE, new NullProgressMonitor() );
+			final SourceUnitModelInfo info= inputElement.getModelInfo(this.editor.getModelTypeId(),
+					ModelManager.NONE, new NullProgressMonitor() );
 			if (this.editor.getSourceUnit() != inputElement || info == null || astSelection == null) {
 				return false;
 			}
@@ -204,7 +204,7 @@
 		return false;
 	}
 	
-	protected abstract void doUpdate(RunData run, ISourceUnitModelInfo info,
+	protected abstract void doUpdate(RunData run, SourceUnitModelInfo info,
 			AstSelection astSelection, ITextSelection orgSelection) 
 			throws BadLocationException, BadPartitioningException, UnsupportedOperationException;
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EcoReconciler2.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EcoReconciler2.java
index 90c9773..6a8dbbb 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EcoReconciler2.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EcoReconciler2.java
@@ -38,7 +38,7 @@
 import org.eclipse.statet.jcommons.collections.CopyOnWriteIdentityListSet;
 import org.eclipse.statet.jcommons.collections.ImIdentityList;
 
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
@@ -49,7 +49,7 @@
 	
 	public static interface ISourceUnitStrategy {
 		
-		void setInput(ISourceUnit su);
+		void setInput(SourceUnit su);
 		
 	}
 	
@@ -174,7 +174,7 @@
 	private volatile boolean isEditorVisible;
 	
 	/** The current source unit */
-	private ISourceUnit sourceUnit;
+	private SourceUnit sourceUnit;
 	
 	private final CopyOnWriteIdentityListSet<StrategyEntry> strategies= new CopyOnWriteIdentityListSet<>();
 	
@@ -322,7 +322,7 @@
 	
 	protected void processReconcile(final IProgressMonitor monitor) {
 		final IDocument document= getDocument();
-		final ISourceUnit input= this.sourceUnit;
+		final SourceUnit input= this.sourceUnit;
 		if (document == null || input == null) {
 			return;
 		}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EditorTextInfoHoverProxy.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EditorTextInfoHoverProxy.java
index b041bc1..60c3372 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EditorTextInfoHoverProxy.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EditorTextInfoHoverProxy.java
@@ -50,7 +50,7 @@
 
 
 /**
- * Wraps an LTK {@link InfoHover} to an editor text hover.
+ * Wraps an Ltk {@link InfoHover} to an editor text hover.
  */
 @NonNullByDefault
 public abstract class EditorTextInfoHoverProxy implements ITextHover, ITextHoverExtension, ITextHoverExtension2 {
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ForwardSourceDocumentProvider.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ForwardSourceDocumentProvider.java
index cec7877..a82f945 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ForwardSourceDocumentProvider.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ForwardSourceDocumentProvider.java
@@ -34,17 +34,21 @@
 import org.eclipse.ui.texteditor.IDocumentProviderExtension5;
 import org.eclipse.ui.texteditor.IElementStateListener;
 
-import org.eclipse.statet.ltk.model.core.IDocumentModelProvider;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.ltk.model.core.DocumentModelProvider;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
  * Forward provider for {@link SourceDocumentProvider}s allowing special document setup
  * (similar to {@link org.eclipse.ui.editors.text.ForwardingDocumentProvider}).
  */
+@NonNullByDefault
 public class ForwardSourceDocumentProvider implements IDocumentProvider,
 		IDocumentProviderExtension, IDocumentProviderExtension2, IDocumentProviderExtension3, IDocumentProviderExtension4, IDocumentProviderExtension5,
-		IStorageDocumentProvider, IDocumentModelProvider {
+		IStorageDocumentProvider, DocumentModelProvider {
 	
 	
 	private final SourceDocumentProvider<?> parentProvider;
@@ -89,17 +93,17 @@
 	}
 	
 	@Override
-	public IDocument getDocument(final Object element) {
+	public @Nullable IDocument getDocument(final @Nullable Object element) {
 		return this.parentProvider.getDocument(element);
 	}
 	
 	@Override
-	public void resetDocument(final Object element) throws CoreException {
+	public void resetDocument(final @Nullable Object element) throws CoreException {
 		this.parentProvider.resetDocument(element);
 	}
 	
 	@Override
-	public void saveDocument(final IProgressMonitor monitor, final Object element,
+	public void saveDocument(final @Nullable IProgressMonitor monitor, final @Nullable Object element,
 			final IDocument document, final boolean overwrite) throws CoreException {
 		this.parentProvider.saveDocument(monitor, element, document, overwrite);
 	}
@@ -115,32 +119,32 @@
 	}
 	
 	@Override
-	public boolean isDeleted(final Object element) {
+	public boolean isDeleted(final @Nullable Object element) {
 		return this.parentProvider.isDeleted(element);
 	}
 	
 	@Override
-	public boolean mustSaveDocument(final Object element) {
+	public boolean mustSaveDocument(final @Nullable Object element) {
 		return this.parentProvider.mustSaveDocument(element);
 	}
 	
 	@Override
-	public boolean canSaveDocument(final Object element) {
+	public boolean canSaveDocument(final @Nullable Object element) {
 		return this.parentProvider.canSaveDocument(element);
 	}
 	
 	@Override
-	public IAnnotationModel getAnnotationModel(final Object element) {
+	public @Nullable IAnnotationModel getAnnotationModel(final @Nullable Object element) {
 		return this.parentProvider.getAnnotationModel(element);
 	}
 	
 	@Override
-	public void aboutToChange(final Object element) {
+	public void aboutToChange(final @Nullable Object element) {
 		this.parentProvider.aboutToChange(element);
 	}
 	
 	@Override
-	public void changed(final Object element) {
+	public void changed(final @Nullable Object element) {
 		this.parentProvider.changed(element);
 	}
 	
@@ -165,7 +169,7 @@
 	}
 	
 	@Override
-	public void validateState(final Object element, final Object computationContext) throws CoreException {
+	public void validateState(final Object element, final @Nullable Object computationContext) throws CoreException {
 		this.parentProvider.validateState(element, computationContext);
 	}
 	
@@ -190,13 +194,13 @@
 	}
 	
 	@Override
-	public void synchronize(final Object element) throws CoreException {
-		this.parentProvider.synchronize(element);
+	public boolean isSynchronized(final Object element) {
+		return this.parentProvider.isSynchronized(element);
 	}
 	
 	@Override
-	public void setProgressMonitor(final IProgressMonitor progressMonitor) {
-		this.parentProvider.setProgressMonitor(progressMonitor);
+	public void synchronize(final Object element) throws CoreException {
+		this.parentProvider.synchronize(element);
 	}
 	
 	@Override
@@ -205,12 +209,12 @@
 	}
 	
 	@Override
-	public boolean isSynchronized(final Object element) {
-		return this.parentProvider.isSynchronized(element);
+	public void setProgressMonitor(final IProgressMonitor progressMonitor) {
+		this.parentProvider.setProgressMonitor(progressMonitor);
 	}
 	
 	@Override
-	public IContentType getContentType(final Object element) throws CoreException {
+	public @Nullable IContentType getContentType(final Object element) throws CoreException {
 		return this.parentProvider.getContentType(element);
 	}
 	
@@ -226,18 +230,18 @@
 	}
 	
 	@Override
-	public String getEncoding(final Object element) {
+	public @Nullable String getEncoding(final Object element) {
 		return this.parentProvider.getEncoding(element);
 	}
 	
 	@Override
-	public void setEncoding(final Object element, final String encoding) {
+	public void setEncoding(final Object element, final @Nullable String encoding) {
 		this.parentProvider.setEncoding(element, encoding);
 	}
 	
 	
 	@Override
-	public ISourceUnit getWorkingCopy(final Object element) {
+	public @Nullable SourceUnit getWorkingCopy(final Object element) {
 		return this.parentProvider.getWorkingCopy(element);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/FragmentDocumentProvider.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/FragmentDocumentProvider.java
index 9237e2f..5abca45 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/FragmentDocumentProvider.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/FragmentDocumentProvider.java
@@ -25,21 +25,26 @@
 import org.eclipse.jface.text.source.IAnnotationModel;
 import org.eclipse.ui.texteditor.AbstractDocumentProvider;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.ISourceFragment;
 import org.eclipse.statet.ecommons.text.PartitionerDocumentSetupParticipant;
 
-import org.eclipse.statet.ltk.core.LTK;
-import org.eclipse.statet.ltk.model.core.IDocumentModelProvider;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.core.Ltk;
+import org.eclipse.statet.ltk.model.core.DocumentModelProvider;
+import org.eclipse.statet.ltk.model.core.LtkModels;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
+@NonNullByDefault
 public class FragmentDocumentProvider extends AbstractDocumentProvider
-		implements IDocumentModelProvider {
+		implements DocumentModelProvider {
 	
 	
 	public class SourceElementInfo extends ElementInfo {
 		
-		private ISourceUnit workingCopy;
+		private @Nullable SourceUnit workingCopy;
 		
 		public SourceElementInfo(final IDocument document, final IAnnotationModel model) {
 			super(document, model);
@@ -64,15 +69,15 @@
 	
 	
 	@Override
-	protected ElementInfo createElementInfo(final Object element) throws CoreException {
-		ISourceUnit su= null;
+	protected @Nullable ElementInfo createElementInfo(final Object element) throws CoreException {
+		SourceUnit su= null;
 		AbstractDocument document= null;
 		if (element instanceof ISourceFragmentEditorInput) {
 			final ISourceFragmentEditorInput fragmentInput= ((ISourceFragmentEditorInput) element);
 			
 			final SubMonitor m= SubMonitor.convert(getProgressMonitor(), 2);
 			try {
-				su= LTK.getSourceUnitManager().getSourceUnit(this.modelTypeId, LTK.EDITOR_CONTEXT,
+				su= LtkModels.getSourceUnitManager().getSourceUnit(this.modelTypeId, Ltk.EDITOR_CONTEXT,
 						fragmentInput.getSourceFragment(), true, m.newChild(1));
 				document= su.getDocument(m.newChild(1));
 			}
@@ -94,7 +99,7 @@
 	}
 	
 	@Override
-	protected AbstractDocument createDocument(final Object element) throws CoreException {
+	protected @Nullable AbstractDocument createDocument(final Object element) throws CoreException {
 		if (element instanceof ISourceFragmentEditorInput) {
 			final ISourceFragment fragment= ((ISourceFragmentEditorInput) element).getSourceFragment();
 			return fragment.getDocument();
@@ -114,12 +119,12 @@
 	}
 	
 	@Override
-	protected IRunnableContext getOperationRunner(final IProgressMonitor monitor) {
+	protected @Nullable IRunnableContext getOperationRunner(final @Nullable IProgressMonitor monitor) {
 		return null;
 	}
 	
 	@Override
-	protected void doSaveDocument(final IProgressMonitor monitor, final Object element,
+	protected void doSaveDocument(final @Nullable IProgressMonitor monitor, final Object element,
 			final IDocument document, final boolean overwrite) throws CoreException {
 	}
 	
@@ -140,8 +145,8 @@
 	}
 	
 	@Override
-	public ISourceUnit getWorkingCopy(final Object element) {
-		final SourceElementInfo info= (SourceElementInfo) getElementInfo(element);
+	public @Nullable SourceUnit getWorkingCopy(final Object element) {
+		final SourceElementInfo info= (SourceElementInfo)getElementInfo(element);
 		if (info != null) {
 			return info.workingCopy;
 		}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISourceEditor.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISourceEditor.java
index f615bea..e5e6694 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISourceEditor.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISourceEditor.java
@@ -27,7 +27,7 @@
 
 import org.eclipse.statet.ecommons.text.core.sections.DocContentSections;
 
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 import org.eclipse.statet.ltk.ui.util.LTKSelectionUtils;
 
 
@@ -50,7 +50,7 @@
 	 * 
 	 * @return model element or <code>null</code>
 	 */
-	@Nullable ISourceUnit getSourceUnit();
+	@Nullable SourceUnit getSourceUnit();
 	
 	/**
 	 * Returns the part the editor belongs to
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/OutlineContentProvider.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/OutlineContentProvider.java
index b5523ad..5abad95 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/OutlineContentProvider.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/OutlineContentProvider.java
@@ -19,10 +19,10 @@
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.Viewer;
 
-import org.eclipse.statet.ltk.core.ISourceModelStamp;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement.Filter;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.core.SourceModelStamp;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElementFilter;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 
 
 public class OutlineContentProvider implements ITreeContentProvider {
@@ -30,9 +30,9 @@
 	
 	public interface IOutlineContent {
 		
-		ISourceUnitModelInfo getModelInfo(Object inputElement);
+		SourceUnitModelInfo getModelInfo(Object inputElement);
 		
-		Filter getContentFilter();
+		LtkModelElementFilter getContentFilter();
 		
 	}
 	
@@ -49,8 +49,8 @@
 		return this.content;
 	}
 	
-	public ISourceModelStamp getStamp(final Object inputElement) {
-		final ISourceUnitModelInfo modelInfo= getContent().getModelInfo(inputElement);
+	public SourceModelStamp getStamp(final Object inputElement) {
+		final SourceUnitModelInfo modelInfo= getContent().getModelInfo(inputElement);
 		return (modelInfo != null) ? modelInfo.getStamp() : null;
 	}
 	
@@ -60,12 +60,12 @@
 	
 	@Override
 	public Object[] getElements(final Object inputElement) {
-		final ISourceUnitModelInfo modelInfo= getContent().getModelInfo(inputElement);
+		final SourceUnitModelInfo modelInfo= getContent().getModelInfo(inputElement);
 		if (modelInfo != null) {
-			final List<? extends ISourceStructElement> children= modelInfo.getSourceElement().getSourceChildren(getContent().getContentFilter());
-			return children.toArray(new ISourceStructElement[children.size()]);
+			final List<? extends SourceStructElement> children= modelInfo.getSourceElement().getSourceChildren(getContent().getContentFilter());
+			return children.toArray(new SourceStructElement[children.size()]);
 		}
-		return new ISourceStructElement[0];
+		return new SourceStructElement[0];
 	}
 	
 	@Override
@@ -74,25 +74,25 @@
 	
 	@Override
 	public Object getParent(final Object element) {
-		final ISourceStructElement o= (ISourceStructElement) element;
+		final SourceStructElement o= (SourceStructElement) element;
 		return o.getSourceParent();
 	}
 	
 	@Override
 	public boolean hasChildren(final Object element) {
-		final ISourceStructElement o= (ISourceStructElement) element;
+		final SourceStructElement o= (SourceStructElement) element;
 		return o.hasSourceChildren(getContent().getContentFilter());
 	}
 	
 	@Override
 	public Object[] getChildren(final Object parentElement) {
 		// Check required for E bug #438919
-		if (parentElement instanceof ISourceStructElement) {
-			final ISourceStructElement o= (ISourceStructElement) parentElement;
-			final List<? extends ISourceStructElement> children= o.getSourceChildren(getContent().getContentFilter());
-			return children.toArray(new ISourceStructElement[children.size()]);
+		if (parentElement instanceof SourceStructElement) {
+			final SourceStructElement o= (SourceStructElement) parentElement;
+			final List<? extends SourceStructElement> children= o.getSourceChildren(getContent().getContentFilter());
+			return children.toArray(new SourceStructElement[children.size()]);
 		}
-		return new ISourceStructElement[0];
+		return new SourceStructElement[0];
 	}
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/QuickInformationProvider.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/QuickInformationProvider.java
index 234b90e..907e74b 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/QuickInformationProvider.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/QuickInformationProvider.java
@@ -25,10 +25,10 @@
 
 import org.eclipse.statet.ecommons.text.core.JFaceTextRegion;
 
-import org.eclipse.statet.ltk.core.LTKUtils;
-import org.eclipse.statet.ltk.model.core.IModelManager;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.LtkModelUtils;
+import org.eclipse.statet.ltk.model.core.ModelManager;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 import org.eclipse.statet.ltk.ui.LTKUI;
 
 
@@ -98,16 +98,16 @@
 	
 	@Override
 	public Object getInformation2(final ITextViewer textViewer, final IRegion subject) {
-		final ISourceUnit su= this.editor.getSourceUnit();
+		final SourceUnit su= this.editor.getSourceUnit();
 		if (su == null) {
 			return null;
 		}
-		final ISourceUnitModelInfo modelInfo= su.getModelInfo(getModelTypeId(), IModelManager.MODEL_FILE,
+		final SourceUnitModelInfo modelInfo= su.getModelInfo(getModelTypeId(), ModelManager.MODEL_FILE,
 				new NullProgressMonitor() ); // ?
 		if (modelInfo == null) {
 			return null;
 		}
-		return LTKUtils.getCoveringSourceElement(modelInfo.getSourceElement(),
+		return LtkModelUtils.getCoveringSourceElement(modelInfo.getSourceElement(),
 				JFaceTextRegion.toTextRegion(subject) );
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/QuickOutlineInformationControl.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/QuickOutlineInformationControl.java
index 32464f6..bd2f62e 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/QuickOutlineInformationControl.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/QuickOutlineInformationControl.java
@@ -25,11 +25,11 @@
 import org.eclipse.statet.ecommons.ui.dialogs.QuickTreeInformationControl;
 
 import org.eclipse.statet.internal.ltk.ui.LTKUIPlugin;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement.Filter;
-import org.eclipse.statet.ltk.model.core.elements.ISourceElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElementFilter;
+import org.eclipse.statet.ltk.model.core.element.SourceElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 import org.eclipse.statet.ltk.ui.LTKUI;
 import org.eclipse.statet.ltk.ui.sourceediting.actions.OpenDeclaration;
 
@@ -51,11 +51,11 @@
 		
 		
 		@Override
-		public ISourceUnitModelInfo getModelInfo(final Object input) {
+		public SourceUnitModelInfo getModelInfo(final Object input) {
 			return QuickOutlineInformationControl.this.getModelInfo(input);
 		}
 		@Override
-		public Filter getContentFilter() {
+		public LtkModelElementFilter getContentFilter() {
 			return QuickOutlineInformationControl.this.getContentFilter();
 		}
 		
@@ -112,8 +112,8 @@
 	
 	@Override
 	protected String getElementName(final IAdaptable element) {
-		if (element instanceof IModelElement && !this.requireFullName) {
-			return ((IModelElement) element).getElementName().getSegmentName();
+		if (element instanceof LtkModelElement && !this.requireFullName) {
+			return ((LtkModelElement) element).getElementName().getSegmentName();
 		}
 		return super.getElementName(element);
 	}
@@ -129,27 +129,27 @@
 		return new OutlineContentProvider(new OutlineContent());
 	}
 	
-	protected ISourceUnitModelInfo getModelInfo(final Object input) {
-		if (input instanceof ISourceUnit) {
-			return ((ISourceUnit) input).getModelInfo(getModelTypeId(), 0, null);
+	protected SourceUnitModelInfo getModelInfo(final Object input) {
+		if (input instanceof SourceUnit) {
+			return ((SourceUnit) input).getModelInfo(getModelTypeId(), 0, null);
 		}
 		return null;
 	}
 	
-	protected IModelElement.Filter getContentFilter() {
+	protected LtkModelElementFilter getContentFilter() {
 		return null;
 	}
 	
 	
-	protected int getInitialIterationPage(final ISourceElement element) {
+	protected int getInitialIterationPage(final SourceElement element) {
 		return 0;
 	}
 	
 	@Override
 	public void setInput(final Object information) {
-		if (information instanceof ISourceElement) {
-			final ISourceElement element= (ISourceElement) information;
-			final ISourceUnit su= element.getSourceUnit();
+		if (information instanceof SourceElement) {
+			final SourceElement element= (SourceElement) information;
+			final SourceUnit su= element.getSourceUnit();
 			if (su != null) {
 				inputChanged(getInitialIterationPage(element), su, element);
 				return;
@@ -161,8 +161,8 @@
 	
 	@Override
 	protected void openElement(final Object element) throws CoreException {
-		if (element instanceof ISourceElement) {
-			this.opener.open((ISourceElement) element, true);
+		if (element instanceof SourceElement) {
+			this.opener.open((SourceElement) element, true);
 		}
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceAnnotationModel.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceAnnotationModel.java
index 2fde916..4550f18 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceAnnotationModel.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceAnnotationModel.java
@@ -24,6 +24,9 @@
 import org.eclipse.jface.text.Position;
 import org.eclipse.ui.texteditor.ResourceMarkerAnnotationModel;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ltk.issues.core.Problem;
 import org.eclipse.statet.ltk.issues.core.ProblemRequestor;
 
@@ -32,6 +35,7 @@
  * Abstract annotation model dealing with marker annotations and temporary problems.
  * Also acts as problem requester for its source unit.
  */
+@NonNullByDefault
 public abstract class SourceAnnotationModel extends ResourceMarkerAnnotationModel {
 	
 	
@@ -111,7 +115,7 @@
 		return new SourceAnnotationProblemRequestor();
 	}
 	
-	public void clearProblems(final String category) {
+	public void clearProblems(final @Nullable String category) {
 		synchronized (getLockObject()) {
 			if (this.problemAnnotations.size() > 0) {
 				if (category == null) {
@@ -227,7 +231,7 @@
 		return new Position(start, end-start);
 	}
 	
-	protected SourceProblemAnnotation createAnnotation(final Problem problem) {
+	protected @Nullable SourceProblemAnnotation createAnnotation(final Problem problem) {
 		return null;
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceDocumentProvider.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceDocumentProvider.java
index b67cd5a..add7915 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceDocumentProvider.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceDocumentProvider.java
@@ -27,23 +27,28 @@
 import org.eclipse.ui.editors.text.TextFileDocumentProvider;
 import org.eclipse.ui.part.FileEditorInput;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.PartitionerDocumentSetupParticipant;
 
-import org.eclipse.statet.ltk.core.LTK;
+import org.eclipse.statet.ltk.core.Ltk;
 import org.eclipse.statet.ltk.issues.core.ProblemRequestor;
-import org.eclipse.statet.ltk.model.core.IDocumentModelProvider;
-import org.eclipse.statet.ltk.model.core.ISourceUnitManager;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.IWorkspaceSourceUnit;
+import org.eclipse.statet.ltk.model.core.DocumentModelProvider;
+import org.eclipse.statet.ltk.model.core.LtkModels;
+import org.eclipse.statet.ltk.model.core.SourceUnitManager;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.WorkspaceSourceUnit;
 
 
-public class SourceDocumentProvider<T extends ISourceUnit> extends TextFileDocumentProvider
-		implements IDocumentModelProvider {
+@NonNullByDefault
+public class SourceDocumentProvider<T extends SourceUnit> extends TextFileDocumentProvider
+		implements DocumentModelProvider {
 	
 	
 	public static class SourceFileInfo extends FileInfo {
 		
-		private ISourceUnit workingCopy;
+		private @Nullable SourceUnit workingCopy;
 		
 	}
 	
@@ -89,7 +94,7 @@
 	}
 	
 	@Override
-	protected FileInfo createFileInfo(final Object element) throws CoreException {
+	protected @Nullable FileInfo createFileInfo(final Object element) throws CoreException {
 		final FileInfo info= super.createFileInfo(element);
 		
 		if (!(info instanceof SourceFileInfo)) {
@@ -108,11 +113,13 @@
 		final SubMonitor m= SubMonitor.convert(getProgressMonitor());
 		try {
 			final Object ifile= adaptable.getAdapter(IFile.class);
-			final ISourceUnitManager suManager= LTK.getSourceUnitManager();
+			final SourceUnitManager suManager= LtkModels.getSourceUnitManager();
 			if (ifile != null) {
 				m.setWorkRemaining(2);
-				final ISourceUnit pUnit= suManager.getSourceUnit(this.modelTypeId, LTK.PERSISTENCE_CONTEXT, ifile, true, m.newChild(1));
-				sourceInfo.workingCopy= suManager.getSourceUnit(this.modelTypeId, LTK.EDITOR_CONTEXT, pUnit, true, m.newChild(1));
+				final SourceUnit pUnit= suManager.getSourceUnit(this.modelTypeId, Ltk.PERSISTENCE_CONTEXT,
+						ifile, true, m.newChild(1) );
+				sourceInfo.workingCopy= suManager.getSourceUnit(this.modelTypeId, Ltk.EDITOR_CONTEXT,
+						pUnit, true, m.newChild(1) );
 			}
 			else if (element instanceof IURIEditorInput) {
 				m.setWorkRemaining(1);
@@ -123,7 +130,8 @@
 				catch (final CoreException e) {
 					return sourceInfo;
 				}
-				sourceInfo.workingCopy= suManager.getSourceUnit(this.modelTypeId, LTK.EDITOR_CONTEXT, store, true, m.newChild(1));
+				sourceInfo.workingCopy= suManager.getSourceUnit(this.modelTypeId, Ltk.EDITOR_CONTEXT,
+						store, true, m.newChild(1) );
 			}
 		}
 		finally {
@@ -140,23 +148,23 @@
 	}
 	
 	@Override
-	public T getWorkingCopy(final Object element) {
+	public @Nullable T getWorkingCopy(final Object element) {
 		final FileInfo fileInfo= getFileInfo(element);
 		if (fileInfo instanceof SourceFileInfo) {
-			return (T) ((SourceFileInfo) fileInfo).workingCopy;
+			return (T)((SourceFileInfo)fileInfo).workingCopy;
 		}
 		return null;
 	}
 	
 	@Override
-	public IAnnotationModel getAnnotationModel(Object element) {
-		if (element instanceof IWorkspaceSourceUnit) {
-			element= new FileEditorInput((IFile) ((IWorkspaceSourceUnit) element).getResource());
+	public @Nullable IAnnotationModel getAnnotationModel(@Nullable Object element) {
+		if (element instanceof WorkspaceSourceUnit) {
+			element= new FileEditorInput((IFile)((WorkspaceSourceUnit)element).getResource());
 		}
 		return super.getAnnotationModel(element);
 	}
 	
-	public ProblemRequestor createProblemRequestor(final ISourceUnit element) {
+	public @Nullable ProblemRequestor createProblemRequestor(final SourceUnit element) {
 		final IAnnotationModel annotationModel= getAnnotationModel(element);
 		if (annotationModel instanceof SourceAnnotationModel) {
 			return ((SourceAnnotationModel) annotationModel).createProblemRequestor();
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditor1.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditor1.java
index ca720fc..14a4c86 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditor1.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditor1.java
@@ -97,14 +97,14 @@
 
 import org.eclipse.statet.internal.ltk.ui.EditingMessages;
 import org.eclipse.statet.ltk.ast.core.AstNode;
-import org.eclipse.statet.ltk.core.IModelTypeDescriptor;
-import org.eclipse.statet.ltk.core.LTK;
-import org.eclipse.statet.ltk.model.core.IDocumentModelProvider;
-import org.eclipse.statet.ltk.model.core.IModelManager;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.core.Ltk;
+import org.eclipse.statet.ltk.model.core.DocumentModelProvider;
+import org.eclipse.statet.ltk.model.core.ModelManager;
+import org.eclipse.statet.ltk.model.core.ModelTypeDescriptor;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 import org.eclipse.statet.ltk.ui.ElementInfoController;
 import org.eclipse.statet.ltk.ui.IModelElementInputProvider;
 import org.eclipse.statet.ltk.ui.ISelectionWithElementInfoListener;
@@ -241,11 +241,11 @@
 /*- Fields -----------------------------------------------------------------*/
 	
 	private final IContentType contentType;
-	private final IModelTypeDescriptor modelType;
+	private final ModelTypeDescriptor modelType;
 	
 	private SourceEditorViewerConfigurator configurator;
 	private boolean lazySetup;
-	private ISourceUnit sourceUnit;
+	private SourceUnit sourceUnit;
 	private ElementInfoController modelProvider;
 	private PostSelectionWithElementInfoController modelPostSelection;
 	protected volatile Point currentSelection;
@@ -281,7 +281,7 @@
 	public SourceEditor1(final IContentType contentType) {
 		super();
 		this.contentType= contentType;
-		this.modelType= LTK.getExtContentTypeManager().getModelTypeForContentType(contentType.getId());
+		this.modelType= Ltk.getExtContentTypeManager().getModelTypeForContentType(contentType.getId());
 	}
 	
 	
@@ -325,10 +325,10 @@
 	}
 	
 	
-	protected void enableStructuralFeatures(final IModelManager modelManager,
+	protected void enableStructuralFeatures(final ModelManager modelManager,
 			final Preference<Boolean> codeFoldingEnablement,
 			final Preference<Boolean> markOccurrencesEnablement) {
-		this.modelProvider= new ElementInfoController(modelManager, LTK.EDITOR_CONTEXT);
+		this.modelProvider= new ElementInfoController(modelManager, Ltk.EDITOR_CONTEXT);
 		this.foldingEnablement= codeFoldingEnablement;
 		this.markOccurrencesEnablement= markOccurrencesEnablement;
 	}
@@ -469,8 +469,10 @@
 	 */
 	protected void setupConfiguration(final IEditorInput newInput) {
 		final IDocumentProvider documentProvider= getDocumentProvider();
-		if (documentProvider instanceof IDocumentModelProvider) {
-			this.sourceUnit= ((IDocumentModelProvider) documentProvider).getWorkingCopy(newInput);
+		if (documentProvider instanceof DocumentModelProvider) {
+			this.sourceUnit= (newInput != null) ?
+					((DocumentModelProvider)documentProvider).getWorkingCopy(newInput) :
+					null;
 			if (this.modelProvider != null) {
 				this.modelProvider.setInput(this.sourceUnit);
 			}
@@ -485,7 +487,7 @@
 	}
 	
 	@Override
-	public ISourceUnit getSourceUnit() {
+	public SourceUnit getSourceUnit() {
 		return this.sourceUnit;
 	}
 	
@@ -630,12 +632,12 @@
 		return 0;
 	}
 	
-	protected IRegion getRangeToReveal(final ISourceUnitModelInfo modelInfo, final ISourceStructElement element) {
+	protected IRegion getRangeToReveal(final SourceUnitModelInfo modelInfo, final SourceStructElement element) {
 		return null;
 	}
 	
 	protected TextRegion getRangeToHighlight(final LTKInputData state) {
-		final ISourceUnitModelInfo info= state.getInputInfo();
+		final SourceUnitModelInfo info= state.getInputInfo();
 		if (info == null) {
 			return null;
 		}
@@ -664,19 +666,19 @@
 		return null;
 	}
 	
-	protected TextRegion getRangeToHighlight(final ISourceUnitModelInfo info, ISourceStructElement element) {
+	protected TextRegion getRangeToHighlight(final SourceUnitModelInfo info, SourceStructElement element) {
 		while (element != null) {
-			switch (element.getElementType() & IModelElement.MASK_C1) {
-			case IModelElement.C1_CLASS:
-			case IModelElement.C1_METHOD:
+			switch (element.getElementType() & LtkModelElement.MASK_C1) {
+			case LtkModelElement.C1_CLASS:
+			case LtkModelElement.C1_METHOD:
 				return expand(element.getSourceRange(), element.getDocumentationRange());
-			case IModelElement.C1_SOURCE:
-				if ((element.getElementType() & IModelElement.MASK_C2) == IModelElement.C2_SOURCE_CHUNK) {
+			case LtkModelElement.C1_SOURCE:
+				if ((element.getElementType() & LtkModelElement.MASK_C2) == LtkModelElement.C2_SOURCE_CHUNK) {
 					return expand(element.getSourceRange(), element.getDocumentationRange());
 				}
 				return null;
-			case IModelElement.C1_VARIABLE:
-				if ((element.getSourceParent().getElementType() & IModelElement.MASK_C2) == IModelElement.C2_SOURCE_FILE) {
+			case LtkModelElement.C1_VARIABLE:
+				if ((element.getSourceParent().getElementType() & LtkModelElement.MASK_C2) == LtkModelElement.C2_SOURCE_FILE) {
 					return expand(element.getSourceRange(), element.getDocumentationRange());
 				}
 				//$FALL-THROUGH$
@@ -1063,8 +1065,8 @@
 			if (!structured.isEmpty()) {
 				final Object first= structured.getFirstElement();
 				TextRegion region= null;
-				if (first instanceof ISourceStructElement) {
-					final ISourceStructElement sourceElement= (ISourceStructElement) first;
+				if (first instanceof SourceStructElement) {
+					final SourceStructElement sourceElement= (SourceStructElement) first;
 					region= sourceElement.getNameSourceRange();
 					if (region == null) {
 						region= sourceElement.getSourceRange();
@@ -1073,8 +1075,8 @@
 						}
 					}
 					
-					final ISourceUnit sourceUnit= sourceElement.getSourceUnit();
-					final ISourceUnitModelInfo modelInfo= sourceUnit.getModelInfo(getModelTypeId(), 0, null);
+					final SourceUnit sourceUnit= sourceElement.getSourceUnit();
+					final SourceUnitModelInfo modelInfo= sourceUnit.getModelInfo(getModelTypeId(), 0, null);
 					if (modelInfo != null) {
 						final IRegion toReveal= getRangeToReveal(modelInfo, sourceElement);
 						if (toReveal != null) {
@@ -1145,7 +1147,7 @@
 	public ShowInContext getShowInContext() {
 		final Point selectionPoint= this.currentSelection;
 		final ISourceViewer sourceViewer= getSourceViewer();
-		final ISourceUnit unit= getSourceUnit();
+		final SourceUnit unit= getSourceUnit();
 		ISelection selection= null;
 		if (selectionPoint != null && unit != null && sourceViewer != null) {
 			selection= new LTKInputData(unit, getSelectionProvider());
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditor1OutlinePage.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditor1OutlinePage.java
index 564116d..a0a344f 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditor1OutlinePage.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditor1OutlinePage.java
@@ -51,13 +51,13 @@
 
 import org.eclipse.statet.internal.ltk.ui.EditingMessages;
 import org.eclipse.statet.ltk.ast.core.AstInfo;
-import org.eclipse.statet.ltk.core.ISourceModelStamp;
-import org.eclipse.statet.ltk.model.core.IModelElementDelta;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement.Filter;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.core.SourceModelStamp;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElementDelta;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElementFilter;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 import org.eclipse.statet.ltk.ui.IModelElementInputListener;
 import org.eclipse.statet.ltk.ui.ISelectionWithElementInfoListener;
 import org.eclipse.statet.ltk.ui.LTKInputData;
@@ -80,11 +80,11 @@
 		
 		
 		@Override
-		public ISourceUnitModelInfo getModelInfo(final Object input) {
+		public SourceUnitModelInfo getModelInfo(final Object input) {
 			return SourceEditor1OutlinePage.this.getModelInfo(input);
 		}
 		@Override
-		public Filter getContentFilter() {
+		public LtkModelElementFilter getContentFilter() {
 			return SourceEditor1OutlinePage.this.getContentFilter();
 		}
 		
@@ -99,9 +99,9 @@
 		
 		
 		@Override
-		public ISourceModelStamp getStamp(final Object inputElement) {
-			if (inputElement instanceof ISourceUnit) {
-				final AstInfo ast= ((ISourceUnit) inputElement).getAstInfo(SourceEditor1OutlinePage.this.mainType, false, null);
+		public SourceModelStamp getStamp(final Object inputElement) {
+			if (inputElement instanceof SourceUnit) {
+				final AstInfo ast= ((SourceUnit) inputElement).getAstInfo(SourceEditor1OutlinePage.this.mainType, false, null);
 				if (ast != null) {
 					return ast.getStamp();
 				}
@@ -111,8 +111,8 @@
 		
 		@Override
 		public Object[] getElements(final Object inputElement) {
-			if (inputElement instanceof ISourceUnit) {
-				final AstInfo ast= ((ISourceUnit) inputElement).getAstInfo(SourceEditor1OutlinePage.this.mainType, false, null); 
+			if (inputElement instanceof SourceUnit) {
+				final AstInfo ast= ((SourceUnit) inputElement).getAstInfo(SourceEditor1OutlinePage.this.mainType, false, null); 
 				if (ast != null) {
 					SourceEditor1OutlinePage.this.currentModelStamp= ast.getStamp();
 					return new Object[] { ast.getRoot() };
@@ -219,9 +219,9 @@
 	private final String mainType;
 	private OutlineContentProvider contentProvider;
 	
-	private ISourceModelStamp currentModelStamp;
+	private SourceModelStamp currentModelStamp;
 	
-	private IModelElement inputUnit;
+	private LtkModelElement inputUnit;
 	
 	private SyncWithEditorAction syncWithEditorAction;
 	
@@ -245,12 +245,12 @@
 		pageSite.setSelectionProvider(this);
 	}
 	
-	protected boolean isUpToDate(final ISourceModelStamp stamp) {
-		final ISourceModelStamp current= this.currentModelStamp;
+	protected boolean isUpToDate(final SourceModelStamp stamp) {
+		final SourceModelStamp current= this.currentModelStamp;
 		return (current != null && current.equals(stamp));
 	}
 	
-	protected IModelElement.Filter getContentFilter() {
+	protected LtkModelElementFilter getContentFilter() {
 		return null;
 	}
 	
@@ -309,7 +309,7 @@
 	
 	
 	@Override
-	public void elementChanged(final IModelElement element) {
+	public void elementChanged(final LtkModelElement element) {
 		this.inputUnit= element;
 		this.currentModelStamp= null;
 		final TreeViewer viewer= getViewer();
@@ -319,12 +319,12 @@
 	}
 	
 	@Override
-	public void elementInitialInfo(final IModelElement element) {
+	public void elementInitialInfo(final LtkModelElement element) {
 		elementUpdatedInfo(element, null);
 	}
 	
 	@Override
-	public void elementUpdatedInfo(final IModelElement element, final IModelElementDelta delta) {
+	public void elementUpdatedInfo(final LtkModelElement element, final LtkModelElementDelta delta) {
 		if (element != this.inputUnit || (element == null && this.inputUnit == null)) {
 			return;
 		}
@@ -350,9 +350,9 @@
 		});
 	}
 	
-	protected ISourceUnitModelInfo getModelInfo(final Object input) {
-		if (input instanceof ISourceUnit) {
-			return ((ISourceUnit) input).getModelInfo(this.mainType, 0, null);
+	protected SourceUnitModelInfo getModelInfo(final Object input) {
+		if (input instanceof SourceUnit) {
+			return ((SourceUnit) input).getModelInfo(this.mainType, 0, null);
 		}
 		return null;
 	}
@@ -372,19 +372,19 @@
 		this.editor.setSelection(selection, this.syncWithEditorAction);
 	}
 	
-	protected void select(ISourceStructElement element) {
+	protected void select(SourceStructElement element) {
 		final TreeViewer viewer= getViewer();
 		if (UIAccess.isOkToUse(viewer)) {
 			beginIgnoreSelection();
 			try {
-				final Filter filter= getContentFilter();
+				final LtkModelElementFilter filter= getContentFilter();
 				Object selectedElement= null;
 				final IStructuredSelection currentSelection= ((IStructuredSelection) viewer.getSelection());
 				if (currentSelection.size() == 1) {
 					selectedElement= currentSelection.getFirstElement();
 				}
 				while (element != null 
-						&& (element.getElementType() & IModelElement.MASK_C2) != IModelElement.C2_SOURCE_FILE) {
+						&& (element.getElementType() & LtkModelElement.MASK_C2) != LtkModelElement.C2_SOURCE_FILE) {
 					if (selectedElement != null && element.equals(selectedElement)) {
 						return;
 					}
@@ -395,9 +395,9 @@
 							return;
 						}
 					}
-					final IModelElement parent= element.getSourceParent();
-					if (parent instanceof ISourceStructElement) {
-						element= (ISourceStructElement) parent;
+					final LtkModelElement parent= element.getSourceParent();
+					if (parent instanceof SourceStructElement) {
+						element= (SourceStructElement) parent;
 						continue;
 					}
 					else {
@@ -427,7 +427,7 @@
 	
 	@Override
 	public boolean show(final ShowInContext context) {
-		final IModelElement inputUnit= this.inputUnit;
+		final LtkModelElement inputUnit= this.inputUnit;
 		final ISelection selection= context.getSelection();
 		if (selection instanceof LTKInputData) {
 			final LTKInputData data= (LTKInputData) selection;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditor2OutlinePage.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditor2OutlinePage.java
index 31e6914..013a2c2 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditor2OutlinePage.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditor2OutlinePage.java
@@ -32,7 +32,7 @@
 import org.eclipse.statet.ecommons.ui.actions.HandlerCollection;
 
 import org.eclipse.statet.internal.ltk.ui.EditingMessages;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
 import org.eclipse.statet.ltk.refactoring.core.CommonRefactoringFactory;
 import org.eclipse.statet.ltk.refactoring.core.RefactoringAdapter;
 import org.eclipse.statet.ltk.ui.refactoring.AbstractElementsHandler;
@@ -59,7 +59,7 @@
 		
 		@Override
 		public void run() {
-			final ISourceStructElement[] elements= LTKSelectionUtils.getSelectedSourceStructElements(getSelection());
+			final SourceStructElement[] elements= LTKSelectionUtils.getSelectedSourceStructElements(getSelection());
 			if (elements != null) {
 				RefactoringAdapter adapter= SourceEditor2OutlinePage.this.refactoring.createAdapter(elements);
 				if (adapter == null) {
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorProgressHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorProgressHandler.java
index bb1e591..9cd0350 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorProgressHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorProgressHandler.java
@@ -30,7 +30,7 @@
 
 import org.eclipse.statet.internal.ltk.ui.EditingMessages;
 import org.eclipse.statet.internal.ltk.ui.LTKUIPlugin;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 public abstract class SourceEditorProgressHandler extends AbstractHandler {
@@ -69,7 +69,7 @@
 		if (!editor.isEditable(true)) {
 			return null;
 		}
-		final ISourceUnit su= editor.getSourceUnit();
+		final SourceUnit su= editor.getSourceUnit();
 		final ITextSelection selection= (ITextSelection) editor.getViewer().getSelection();
 		if (su == null || selection == null) {
 			return null;
@@ -98,7 +98,7 @@
 	}
 	
 	
-	protected abstract void doExecute(ISourceEditor editor, ISourceUnit su,
+	protected abstract void doExecute(ISourceEditor editor, SourceUnit su,
 			ITextSelection selection, IProgressMonitor monitor) throws Exception;
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceUnitReconcilingStrategy.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceUnitReconcilingStrategy.java
index 9ae4503..694bf9d 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceUnitReconcilingStrategy.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceUnitReconcilingStrategy.java
@@ -21,15 +21,15 @@
 import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
 import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
 
-import org.eclipse.statet.ltk.model.core.IModelManager;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.ModelManager;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 import org.eclipse.statet.ltk.ui.sourceediting.EcoReconciler2.ISourceUnitStrategy;
 
 
 public class SourceUnitReconcilingStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension, ISourceUnitStrategy {
 	
 	
-	private ISourceUnit input;
+	private SourceUnit input;
 	
 	private final int flags;
 	
@@ -37,7 +37,7 @@
 	
 	
 	public SourceUnitReconcilingStrategy() {
-		this(IModelManager.MODEL_DEPENDENCIES | IModelManager.RECONCILE);
+		this(ModelManager.MODEL_DEPENDENCIES | ModelManager.RECONCILE);
 	}
 	
 	public SourceUnitReconcilingStrategy(final int flags) {
@@ -55,7 +55,7 @@
 	}
 	
 	@Override
-	public void setInput(final ISourceUnit input) {
+	public void setInput(final SourceUnit input) {
 		this.input= input;
 	}
 	
@@ -76,7 +76,7 @@
 	
 	
 	protected void reconcile() {
-		final ISourceUnit su= this.input;
+		final SourceUnit su= this.input;
 		if (this.monitor.isCanceled()) {
 			return;
 		}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/StructureSelectHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/StructureSelectHandler.java
index 621c7fe..a195ba6 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/StructureSelectHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/StructureSelectHandler.java
@@ -25,7 +25,7 @@
 import org.eclipse.statet.ltk.ast.core.AstInfo;
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.util.AstSelection;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
@@ -106,7 +106,7 @@
 	
 	@Override
 	public Object execute(final ExecutionEvent event) throws ExecutionException {
-		final ISourceUnit su= this.sourceEditor.getSourceUnit();
+		final SourceUnit su= this.sourceEditor.getSourceUnit();
 		if (su == null) {
 			return null;
 		}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ViewerSourceEditorAdapter.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ViewerSourceEditorAdapter.java
index 12f56b7..99bda3a 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ViewerSourceEditorAdapter.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ViewerSourceEditorAdapter.java
@@ -22,7 +22,7 @@
 import org.eclipse.statet.ecommons.text.core.sections.DocContentSections;
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 /**
@@ -54,7 +54,7 @@
 	}
 	
 	@Override
-	public ISourceUnit getSourceUnit() {
+	public SourceUnit getSourceUnit() {
 		return null;
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/AbstractSourceDocumentHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/AbstractSourceDocumentHandler.java
index 818dc48..c2a7d17 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/AbstractSourceDocumentHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/AbstractSourceDocumentHandler.java
@@ -41,14 +41,14 @@
 
 import org.eclipse.statet.internal.ltk.ui.EditingMessages;
 import org.eclipse.statet.ltk.model.core.ElementSet;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditorAssociated;
 import org.eclipse.statet.ltk.ui.util.LTKSelectionUtils;
 
 
-public abstract class AbstractSourceDocumentHandler<TSourceUnit extends ISourceUnit>
+public abstract class AbstractSourceDocumentHandler<TSourceUnit extends SourceUnit>
 		extends AbstractHandler {
 	
 	
@@ -117,14 +117,14 @@
 		final ISourceEditor sourceEditor= getSourceEditor(activePart);
 		
 		if (sourceEditor != null && selection instanceof ITextSelection) {
-			final ISourceUnit sourceUnit= sourceEditor.getSourceUnit();
+			final SourceUnit sourceUnit= sourceEditor.getSourceUnit();
 			setBaseEnabled(sourceUnit != null &&
 					(!isEditTask() || sourceEditor.isEditable(false) ));
 			return;
 		}
 		
 		if (selection instanceof IStructuredSelection) {
-			final ISourceStructElement[] selectedElements= LTKSelectionUtils
+			final SourceStructElement[] selectedElements= LTKSelectionUtils
 					.getSelectedSourceStructElements((IStructuredSelection) selection);
 			setBaseEnabled(selectedElements != null && selectedElements.length > 0
 					&& checkSourceUnits(selectedElements) );
@@ -143,7 +143,7 @@
 		try {
 			final IProgressMonitor monitor= new NullProgressMonitor();
 			if (sourceEditor != null && selection instanceof ITextSelection) {
-				final ISourceUnit sourceUnit= sourceEditor.getSourceUnit();
+				final SourceUnit sourceUnit= sourceEditor.getSourceUnit();
 				if (sourceUnit != null && isSourceUnitSupported(sourceUnit)) {
 					if (!isEditTask() || sourceEditor.isEditable(true)) {
 						final ExecData data= createExecData(event, activePart, sourceEditor,
@@ -158,7 +158,7 @@
 				return null;
 			}
 			if (selection instanceof IStructuredSelection) {
-				final ISourceStructElement[] selectedElements= LTKSelectionUtils
+				final SourceStructElement[] selectedElements= LTKSelectionUtils
 						.getSelectedSourceStructElements((IStructuredSelection) selection);
 				if (selectedElements != null && selectedElements.length > 0) {
 					final ImList<TSourceUnit> sourceUnits= createSourceUnits(selectedElements, monitor);
@@ -200,11 +200,11 @@
 		return null;
 	}
 	
-	private boolean checkSourceUnits(final ISourceStructElement[] selectedElements) {
-		ISourceUnit lastSourceUnit= null;
-		List<ISourceUnit> sourceUnits= null;
+	private boolean checkSourceUnits(final SourceStructElement[] selectedElements) {
+		SourceUnit lastSourceUnit= null;
+		List<SourceUnit> sourceUnits= null;
 		for (int i= 0; i < selectedElements.length; i++) {
-			final ISourceUnit sourceUnit= selectedElements[i].getSourceUnit();
+			final SourceUnit sourceUnit= selectedElements[i].getSourceUnit();
 			if (sourceUnit == null) {
 				return false;
 			}
@@ -234,12 +234,12 @@
 		return true;
 	}
 	
-	private ImList<TSourceUnit> createSourceUnits(final ISourceStructElement[] selectedElements,
+	private ImList<TSourceUnit> createSourceUnits(final SourceStructElement[] selectedElements,
 			final IProgressMonitor monitor) {
 		TSourceUnit lastSourceUnit= null;
 		List<TSourceUnit> sourceUnits= null;
 		for (int i= 0; i < selectedElements.length; i++) {
-			final ISourceUnit sourceUnit= selectedElements[i].getSourceUnit();
+			final SourceUnit sourceUnit= selectedElements[i].getSourceUnit();
 			if (sourceUnit == null) {
 				return null;
 			}
@@ -318,7 +318,7 @@
 	}
 	
 	
-	protected abstract boolean isSourceUnitSupported(final ISourceUnit sourceUnit);
+	protected abstract boolean isSourceUnitSupported(final SourceUnit sourceUnit);
 	
 	protected boolean isMultiSourceUnitsSupported() {
 		return false;
@@ -326,7 +326,7 @@
 	
 	protected ExecData createExecData(final ExecutionEvent event, final IWorkbenchPart activePart,
 			final ISourceEditor sourceEditor, final ImList<? extends TSourceUnit> sourceUnits,
-			final ITextSelection textSelection, final ISourceStructElement[] selectedElements,
+			final ITextSelection textSelection, final SourceStructElement[] selectedElements,
 			final IProgressMonitor monitor) throws Exception {
 		return new ExecData(activePart, sourceEditor, sourceUnits, textSelection,
 				(selectedElements != null) ? new ElementSet(selectedElements) : null );
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/OpenDeclaration.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/OpenDeclaration.java
index fc978c1..c56d486 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/OpenDeclaration.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/OpenDeclaration.java
@@ -39,10 +39,10 @@
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
-import org.eclipse.statet.ltk.model.core.elements.ISourceElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.IWorkspaceSourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.NameAccess;
+import org.eclipse.statet.ltk.model.core.element.NameAccess;
+import org.eclipse.statet.ltk.model.core.element.SourceElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.WorkspaceSourceUnit;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 
 
@@ -93,10 +93,10 @@
 		return new LabelProvider();
 	}
 	
-	public void open(final ISourceElement element, final boolean activate) throws PartInitException  {
-		final ISourceUnit su= element.getSourceUnit();
-		if (su instanceof IWorkspaceSourceUnit) {
-			final IResource resource= ((IWorkspaceSourceUnit) su).getResource();
+	public void open(final SourceElement element, final boolean activate) throws PartInitException  {
+		final SourceUnit su= element.getSourceUnit();
+		if (su instanceof WorkspaceSourceUnit) {
+			final IResource resource= ((WorkspaceSourceUnit) su).getResource();
 			if (resource.getType() == IResource.FILE) {
 				open((IFile) resource, activate, element.getNameSourceRange());
 				return;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/AssistInvocationContext.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/AssistInvocationContext.java
index 10882e6..d8f3328 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/AssistInvocationContext.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/AssistInvocationContext.java
@@ -31,8 +31,8 @@
 
 import org.eclipse.statet.ltk.ast.core.AstInfo;
 import org.eclipse.statet.ltk.ast.core.util.AstSelection;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 
 
@@ -51,9 +51,9 @@
 	
 	private @Nullable String invocationPrefix;
 	
-	private final @Nullable ISourceUnit sourceUnit;
+	private final @Nullable SourceUnit sourceUnit;
 	private @Nullable AstInfo astInfo;
-	private @Nullable ISourceUnitModelInfo modelInfo;
+	private @Nullable SourceUnitModelInfo modelInfo;
 	
 	private @Nullable AstSelection invocationAstSelection;
 	private @Nullable AstSelection astSelection;
@@ -257,7 +257,7 @@
 	}
 	
 	
-	public @Nullable ISourceUnit getSourceUnit() {
+	public @Nullable SourceUnit getSourceUnit() {
 		return this.sourceUnit;
 	}
 	
@@ -265,7 +265,7 @@
 		return this.astInfo;
 	}
 	
-	public @Nullable ISourceUnitModelInfo getModelInfo() {
+	public @Nullable SourceUnitModelInfo getModelInfo() {
 		return this.modelInfo;
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistProcessor.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistProcessor.java
index 105b5d8..29586bf 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistProcessor.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistProcessor.java
@@ -50,7 +50,7 @@
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
 import org.eclipse.statet.internal.ltk.ui.EditingMessages;
-import org.eclipse.statet.ltk.core.LTK;
+import org.eclipse.statet.ltk.core.Ltk;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 
 
@@ -367,7 +367,7 @@
 					computer.computeCompletionProposals(context, mode, proposals, m1);
 				}
 				catch (final Exception e) {
-					StatusManager.getManager().handle(new Status(IStatus.ERROR, LTK.BUNDLE_ID,
+					StatusManager.getManager().handle(new Status(IStatus.ERROR, Ltk.BUNDLE_ID,
 							"An error occurred when computing content assistant completion proposals.",
 							e ));
 				}
@@ -492,7 +492,7 @@
 					computer.computeInformationProposals(context, proposals, m1);
 				}
 				catch (final Exception e) {
-					StatusManager.getManager().handle(new Status(IStatus.ERROR, LTK.BUNDLE_ID,
+					StatusManager.getManager().handle(new Status(IStatus.ERROR, Ltk.BUNDLE_ID,
 							"An error occurred when computing content assistant context information.",
 							e ));
 				}
@@ -751,7 +751,7 @@
 					computer.onSessionEnded();
 				}
 				catch (final Exception e) {
-					StatusManager.getManager().handle(new Status(IStatus.ERROR, LTK.BUNDLE_ID, 0,
+					StatusManager.getManager().handle(new Status(IStatus.ERROR, Ltk.BUNDLE_ID, 0,
 							"Error by contributed content assist computer.", e ));
 				}
 			}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ElementNameCompletionProposal.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ElementNameCompletionProposal.java
index 773dd58..a93ca55 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ElementNameCompletionProposal.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ElementNameCompletionProposal.java
@@ -28,7 +28,7 @@
 import org.eclipse.statet.ecommons.ui.viewers.ViewerLabelUtils;
 
 import org.eclipse.statet.ltk.core.ElementName;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
 import org.eclipse.statet.ltk.ui.ElementLabelProvider;
 
 
@@ -37,7 +37,7 @@
  */
 @NonNullByDefault
 public abstract class ElementNameCompletionProposal<
-				TContext extends AssistInvocationContext, TElement extends IModelElement>
+				TContext extends AssistInvocationContext, TElement extends LtkModelElement>
 		extends SourceProposal<TContext>
 		implements ICompletionProposalExtension3, ICompletionProposalExtension6 {
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/InsertEditorTemplateHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/InsertEditorTemplateHandler.java
index d2670bf..9befd32 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/InsertEditorTemplateHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/InsertEditorTemplateHandler.java
@@ -32,7 +32,7 @@
 import org.eclipse.statet.ecommons.text.core.util.TextUtils;
 import org.eclipse.statet.ecommons.ui.workbench.WorkbenchUIUtils;
 
-import org.eclipse.statet.ltk.model.core.IModelManager;
+import org.eclipse.statet.ltk.model.core.ModelManager;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 import org.eclipse.statet.ltk.ui.sourceediting.assist.TemplateProposal.TemplateProposalParameters;
 import org.eclipse.statet.ltk.ui.templates.SourceEditorTemplateContext;
@@ -57,7 +57,7 @@
 		final TextRegion region= editor.getSelectedRegion();
 		final String contentType= TextUtils.getContentType(editor.getViewer().getDocument(),
 				editor.getDocumentContentInfo(), region.getStartOffset(), true );
-		return new AssistInvocationContext(editor, region, contentType, IModelManager.NONE, null );
+		return new AssistInvocationContext(editor, region, contentType, ModelManager.NONE, null );
 	}
 	
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/QuickAssistProcessor.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/QuickAssistProcessor.java
index 48c5cd2..2a998bf 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/QuickAssistProcessor.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/QuickAssistProcessor.java
@@ -46,7 +46,7 @@
 
 import org.eclipse.statet.ecommons.text.core.util.TextUtils;
 
-import org.eclipse.statet.ltk.model.core.IModelManager;
+import org.eclipse.statet.ltk.model.core.ModelManager;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 
 
@@ -204,7 +204,7 @@
 			final IProgressMonitor monitor) {
 		return new AssistInvocationContext(getEditor(),
 				invocationContext.getOffset(), contentType,
-				IModelManager.MODEL_FILE, monitor );
+				ModelManager.MODEL_FILE, monitor );
 	}
 	
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ReshowCompletionsRunnable.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ReshowCompletionsRunnable.java
index 068b563..54b1043 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ReshowCompletionsRunnable.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ReshowCompletionsRunnable.java
@@ -27,7 +27,7 @@
 
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 
 
@@ -37,7 +37,7 @@
 	// Snapshot of current state
 	private final ISourceEditor editor;
 	private final ISourceViewer viewer;
-	private final ISourceUnit su;
+	private final SourceUnit su;
 	private final AbstractDocument document;
 	private final long documentStamp;
 	private final Point selection;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/FoldingEditorAddon.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/FoldingEditorAddon.java
index efe3eeb..5fa9e4d 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/FoldingEditorAddon.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/FoldingEditorAddon.java
@@ -45,13 +45,13 @@
 
 import org.eclipse.statet.internal.ltk.ui.LTKUIPlugin;
 import org.eclipse.statet.ltk.ast.core.AstInfo;
-import org.eclipse.statet.ltk.core.ISourceModelStamp;
-import org.eclipse.statet.ltk.model.core.IModelElementDelta;
-import org.eclipse.statet.ltk.model.core.IModelManager;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
-import org.eclipse.statet.ltk.model.core.elements.IWorkspaceSourceUnit;
+import org.eclipse.statet.ltk.core.SourceModelStamp;
+import org.eclipse.statet.ltk.model.core.ModelManager;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElementDelta;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.element.WorkspaceSourceUnit;
 import org.eclipse.statet.ltk.ui.IModelElementInputListener;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditorAddon;
@@ -64,7 +64,7 @@
 	public static final class FoldingStructureComputationContext {
 		
 		public final AbstractDocument document;
-		public final ISourceUnitModelInfo model;
+		public final SourceUnitModelInfo model;
 		public final AstInfo ast;
 		
 		public final boolean isInitial;
@@ -73,7 +73,7 @@
 		
 		
 		protected FoldingStructureComputationContext(final AbstractDocument document,
-				final ISourceUnitModelInfo model, final AstInfo ast, final boolean isInitial) {
+				final SourceUnitModelInfo model, final AstInfo ast, final boolean isInitial) {
 			this.document= document;
 			this.model= model;
 			this.ast= ast;
@@ -92,16 +92,16 @@
 	
 	private static final class Input {
 		
-		private final ISourceUnit unit;
+		private final SourceUnit unit;
 		
 		private boolean isInitilized;
-		private ISourceModelStamp updateStamp;
+		private SourceModelStamp updateStamp;
 		
 		private QualifiedName savePropertyName;
 		
 		public ProjectionAnnotationModel annotationModel;
 		
-		Input(final ISourceUnit unit) {
+		Input(final SourceUnit unit) {
 			this.unit= unit;
 			this.isInitilized= false;
 		}
@@ -130,8 +130,8 @@
 	}
 	
 	@Override
-	public void elementChanged(final IModelElement element) {
-		final Input input= (element != null) ? new Input((ISourceUnit) element) : null;
+	public void elementChanged(final LtkModelElement element) {
+		final Input input= (element != null) ? new Input((SourceUnit) element) : null;
 		synchronized (this) {
 			if (this.input != null) {
 				saveState(this.input);
@@ -141,7 +141,7 @@
 	}
 	
 	@Override
-	public void elementInitialInfo(final IModelElement element) {
+	public void elementInitialInfo(final LtkModelElement element) {
 		final Input input= this.input;
 		if (input != null && input.unit == element) {
 			update(input, null);
@@ -149,7 +149,7 @@
 	}
 	
 	@Override
-	public void elementUpdatedInfo(final IModelElement element, final IModelElementDelta delta) {
+	public void elementUpdatedInfo(final LtkModelElement element, final LtkModelElementDelta delta) {
 		final Input input= this.input;
 		if (input != null && input.unit == element) {
 			update(input, delta.getNewAst().getStamp());
@@ -185,10 +185,10 @@
 		}
 		final IProgressMonitor monitor= new NullProgressMonitor();
 		
-		final ISourceUnitModelInfo modelInfo;
+		final SourceUnitModelInfo modelInfo;
 		final AstInfo ast;
 		if (this.provider.requiresModel()) {
-			modelInfo= input.unit.getModelInfo(null, IModelManager.MODEL_FILE, monitor);
+			modelInfo= input.unit.getModelInfo(null, ModelManager.MODEL_FILE, monitor);
 			if (modelInfo == null) {
 				return null;
 			}
@@ -199,13 +199,13 @@
 			ast= input.unit.getAstInfo(null, false, monitor);
 		}
 		final AbstractDocument document= input.unit.getDocument(monitor);
-		if (ast == null || document == null || ast.getStamp().getSourceStamp() != document.getModificationStamp()) {
+		if (ast == null || document == null || ast.getStamp().getContentStamp() != document.getModificationStamp()) {
 			return null;
 		}
 		return new FoldingStructureComputationContext(document, modelInfo, ast, !input.isInitilized);
 	}
 	
-	private void update(final Input input, final ISourceModelStamp stamp) {
+	private void update(final Input input, final SourceModelStamp stamp) {
 		synchronized(input) {
 			final SourceEditor1 editor= this.editor;
 			if (editor == null) {
@@ -262,7 +262,7 @@
 					}
 				}
 				deletions= del.toArray(new FoldingAnnotation[del.size()]);
-				if (ctx.document.getModificationStamp() != ctx.ast.getStamp().getSourceStamp()
+				if (ctx.document.getModificationStamp() != ctx.ast.getStamp().getContentStamp()
 						|| input != this.input) {
 					return;
 				}
@@ -465,10 +465,10 @@
 	private void saveState(final Input input) {
 		final SourceEditor1 editor= this.editor;
 		if (editor == null || !input.isInitilized || !input.unit.isSynchronized()
-				|| !(input.unit instanceof IWorkspaceSourceUnit) ) {
+				|| !(input.unit instanceof WorkspaceSourceUnit) ) {
 			return;
 		}
-		final IResource resource= ((IWorkspaceSourceUnit) input.unit).getResource();
+		final IResource resource= ((WorkspaceSourceUnit) input.unit).getResource();
 		if (resource == null || !resource.exists()) {
 			return;
 		}
@@ -511,10 +511,10 @@
 	private void loadState(final Input input, final SortedMap<Position, FoldingAnnotation> table) {
 		final SourceEditor1 editor= this.editor;
 		if (editor == null || !input.isInitilized || !input.unit.isSynchronized()
-				|| !(input.unit instanceof IWorkspaceSourceUnit) ) {
+				|| !(input.unit instanceof WorkspaceSourceUnit) ) {
 			return;
 		}
-		final IResource resource= ((IWorkspaceSourceUnit) input.unit).getResource();
+		final IResource resource= ((WorkspaceSourceUnit) input.unit).getResource();
 		if (resource == null || !resource.exists()) {
 			return;
 		}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/CodeGenerationTemplateContext.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/CodeGenerationTemplateContext.java
index 44b6ed9..18a7da0 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/CodeGenerationTemplateContext.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/CodeGenerationTemplateContext.java
@@ -32,7 +32,7 @@
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor1;
 
 
@@ -42,7 +42,7 @@
 	
 	private final String lineDelimiter;
 	
-	private @Nullable ISourceUnit sourceUnit;
+	private @Nullable SourceUnit sourceUnit;
 	
 	
 	public CodeGenerationTemplateContext(final TemplateContextType contextType,
@@ -52,7 +52,7 @@
 	}
 	
 	public CodeGenerationTemplateContext(final TemplateContextType contextType,
-			final ISourceUnit su, final String lineDelim) {
+			final SourceUnit su, final String lineDelim) {
 		this(contextType, lineDelim);
 		this.sourceUnit= su;
 	}
@@ -64,7 +64,7 @@
 	}
 	
 	@Override
-	public @Nullable ISourceUnit getSourceUnit() {
+	public @Nullable SourceUnit getSourceUnit() {
 		return this.sourceUnit;
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/IWorkbenchTemplateContext.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/IWorkbenchTemplateContext.java
index e5466f9..9dd938d 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/IWorkbenchTemplateContext.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/IWorkbenchTemplateContext.java
@@ -21,7 +21,7 @@
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 
 
@@ -32,7 +32,7 @@
 public interface IWorkbenchTemplateContext {
 	
 	
-	public @Nullable ISourceUnit getSourceUnit();
+	public @Nullable SourceUnit getSourceUnit();
 	
 	public @Nullable ISourceEditor getEditor();
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/SourceEditorContextType.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/SourceEditorContextType.java
index 39237ed..71c65a4 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/SourceEditorContextType.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/SourceEditorContextType.java
@@ -42,8 +42,8 @@
 import org.eclipse.statet.internal.ltk.ui.TemplatesMessages;
 import org.eclipse.statet.ltk.core.ElementName;
 import org.eclipse.statet.ltk.core.util.UserInfo;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.IWorkspaceSourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.WorkspaceSourceUnit;
 
 
 @NonNullByDefault
@@ -131,7 +131,7 @@
 		@Override
 		protected String resolve(final TemplateContext context) {
 			if (context instanceof IWorkbenchTemplateContext) {
-				final ISourceUnit su= ((IWorkbenchTemplateContext) context).getSourceUnit();
+				final SourceUnit su= ((IWorkbenchTemplateContext) context).getSourceUnit();
 				if (su != null) {
 					final ElementName elementName= su.getElementName();
 					if (elementName != null) {
@@ -155,9 +155,9 @@
 		@Override
 		protected String resolve(final TemplateContext context) {
 			if (context instanceof IWorkbenchTemplateContext) {
-				final ISourceUnit su= ((IWorkbenchTemplateContext) context).getSourceUnit();
-				if (su instanceof IWorkspaceSourceUnit) {
-					return ((IWorkspaceSourceUnit) su).getResource().getProject().getName();
+				final SourceUnit su= ((IWorkbenchTemplateContext) context).getSourceUnit();
+				if (su instanceof WorkspaceSourceUnit) {
+					return ((WorkspaceSourceUnit) su).getResource().getProject().getName();
 				}
 			}
 			return ""; //$NON-NLS-1$
@@ -165,7 +165,7 @@
 	}
 	
 	/**
-	 * Resolver for ToDo-tags. Intend to extend and overwrite {@link #getTag(ISourceUnit)}
+	 * Resolver for ToDo-tags. Intend to extend and overwrite {@link #getTag(SourceUnit)}
 	 */
 	protected static class Todo extends SimpleTemplateVariableResolver {
 		
@@ -184,7 +184,7 @@
 			return "TODO"; //$NON-NLS-1$
 		}
 		
-		protected @Nullable String getTag(final @Nullable ISourceUnit su) {
+		protected @Nullable String getTag(final @Nullable SourceUnit su) {
 			return null;
 		}
 		
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/SourceEditorTemplateContext.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/SourceEditorTemplateContext.java
index 9050d35..01a2c39 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/SourceEditorTemplateContext.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/SourceEditorTemplateContext.java
@@ -38,7 +38,7 @@
 
 import org.eclipse.statet.ecommons.text.TextUtil;
 
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 
 
@@ -74,7 +74,7 @@
 	}
 	
 	@Override
-	public @Nullable ISourceUnit getSourceUnit() {
+	public @Nullable SourceUnit getSourceUnit() {
 		return this.editor.getSourceUnit();
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/SourceUnitVariableResolver.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/SourceUnitVariableResolver.java
index 795eec8..c4f7f04 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/SourceUnitVariableResolver.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/SourceUnitVariableResolver.java
@@ -18,7 +18,7 @@
 import org.eclipse.jface.text.templates.TemplateVariableResolver;
 
 import org.eclipse.statet.internal.ltk.ui.TemplatesMessages;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
 public abstract class SourceUnitVariableResolver extends TemplateVariableResolver {
@@ -35,7 +35,7 @@
 		
 		@Override
 		protected String resolve(final TemplateContext context) {
-			final ISourceUnit su= ((IWorkbenchTemplateContext) context).getSourceUnit();
+			final SourceUnit su= ((IWorkbenchTemplateContext) context).getSourceUnit();
 			if (su != null) {
 				return su.getElementName().getDisplayName();
 			}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractEditorTemplatesPage.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractEditorTemplatesPage.java
index 76e3dfb..6ccd6b5 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractEditorTemplatesPage.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractEditorTemplatesPage.java
@@ -52,7 +52,7 @@
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
 import org.eclipse.statet.internal.ltk.ui.LTKUIPlugin;
-import org.eclipse.statet.ltk.model.core.IModelManager;
+import org.eclipse.statet.ltk.model.core.ModelManager;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 import org.eclipse.statet.ltk.ui.sourceediting.SourceEditorViewerConfigurator;
 import org.eclipse.statet.ltk.ui.sourceediting.ViewerSourceEditorAdapter;
@@ -111,7 +111,7 @@
 			throws BadPartitioningException, BadLocationException {
 		final String contentType= TextUtils.getContentType(editor.getViewer().getDocument(),
 				editor.getDocumentContentInfo(), region.getStartOffset(), true );
-		return new AssistInvocationContext(editor, region, contentType, IModelManager.NONE, null );
+		return new AssistInvocationContext(editor, region, contentType, ModelManager.NONE, null );
 	}
 	
 	@Override
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/util/LTKSelectionUtils.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/util/LTKSelectionUtils.java
index 59684fa..508a176 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/util/LTKSelectionUtils.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/util/LTKSelectionUtils.java
@@ -37,12 +37,12 @@
 import org.eclipse.statet.ltk.ast.core.AstInfo;
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.util.AstSelection;
-import org.eclipse.statet.ltk.core.LTKUtils;
-import org.eclipse.statet.ltk.model.core.IModelManager;
-import org.eclipse.statet.ltk.model.core.elements.IModelElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
+import org.eclipse.statet.ltk.model.core.LtkModelUtils;
+import org.eclipse.statet.ltk.model.core.ModelManager;
+import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 
 
@@ -67,20 +67,20 @@
 	}
 	
 	
-	public static IModelElement @Nullable [] getSelectedElements(final @Nullable ISelection selection) {
+	public static LtkModelElement @Nullable [] getSelectedElements(final @Nullable ISelection selection) {
 		if (selection instanceof IStructuredSelection) {
 			return getSelectedElements((IStructuredSelection) selection);
 		}
 		return null;
 	}
 	
-	public static IModelElement @Nullable [] getSelectedElements(final IStructuredSelection selection) {
-		final IModelElement[] elements= new @NonNull IModelElement[selection.size()];
+	public static LtkModelElement @Nullable [] getSelectedElements(final IStructuredSelection selection) {
+		final LtkModelElement[] elements= new @NonNull LtkModelElement[selection.size()];
 		final Iterator<?> iter= selection.iterator();
 		for (int i= 0; i < elements.length; i++) {
 			final Object next= iter.next();
-			if (next instanceof IModelElement) {
-				elements[i]= (IModelElement) next;
+			if (next instanceof LtkModelElement) {
+				elements[i]= (LtkModelElement) next;
 			}
 			else {
 				return null;
@@ -89,7 +89,7 @@
 		return elements;
 	}
 	
-	public static @Nullable ISourceUnit getSingleSourceUnit(final IWorkbenchPart part) {
+	public static @Nullable SourceUnit getSingleSourceUnit(final IWorkbenchPart part) {
 		final ISourceEditor editor= part.getAdapter(ISourceEditor.class);
 		if (editor == null) {
 			return null;
@@ -97,11 +97,11 @@
 		return editor.getSourceUnit();
 	}
 	
-	public static @Nullable AstNode getSelectedAstNode(final ISourceUnit su, final String type,
+	public static @Nullable AstNode getSelectedAstNode(final SourceUnit su, final String type,
 			final @Nullable ISelection selection, final IProgressMonitor monitor) {
 		if (selection instanceof ITextSelection) {
 			final ITextSelection textSelection= (ITextSelection) selection;
-			final ISourceUnitModelInfo modelInfo= su.getModelInfo(type, IModelManager.MODEL_FILE, monitor);
+			final SourceUnitModelInfo modelInfo= su.getModelInfo(type, ModelManager.MODEL_FILE, monitor);
 			if (modelInfo == null) {
 				return null;
 			}
@@ -117,7 +117,7 @@
 		return null;
 	}
 	
-	public static ISourceStructElement @Nullable [] getSelectedSourceStructElements(
+	public static SourceStructElement @Nullable [] getSelectedSourceStructElements(
 			final @Nullable ISelection selection) {
 		if (selection instanceof IStructuredSelection) {
 			return getSelectedSourceStructElements((IStructuredSelection) selection);
@@ -125,14 +125,14 @@
 		return null;
 	}
 	
-	public static ISourceStructElement @Nullable [] getSelectedSourceStructElements(
+	public static SourceStructElement @Nullable [] getSelectedSourceStructElements(
 			final IStructuredSelection selection) {
-		final ISourceStructElement[] elements= new @NonNull ISourceStructElement[selection.size()];
+		final SourceStructElement[] elements= new @NonNull SourceStructElement[selection.size()];
 		final Iterator<?> iter= selection.iterator();
 		for (int i= 0; i < elements.length; i++) {
 			final Object next= iter.next();
-			if (next instanceof ISourceStructElement) {
-				elements[i]= (ISourceStructElement) next;
+			if (next instanceof SourceStructElement) {
+				elements[i]= (SourceStructElement) next;
 				continue;
 			}
 			return null;
@@ -167,16 +167,16 @@
 		return elements;
 	}
 	
-	public static ISourceStructElement @Nullable [] getSelectedSourceStructElement(
-			final @Nullable ISourceUnitModelInfo suModel, final ITextSelection selection) {
+	public static SourceStructElement @Nullable [] getSelectedSourceStructElement(
+			final @Nullable SourceUnitModelInfo suModel, final ITextSelection selection) {
 		if (suModel != null) {
-			final ISourceStructElement root= suModel.getSourceElement();
+			final SourceStructElement root= suModel.getSourceElement();
 			final int selectionStart= selection.getOffset();
 			final int selectionEnd= selectionStart + selection.getLength();
 			if (selectionStart >= root.getSourceRange().getStartOffset()
 					&& selectionEnd <= root.getSourceRange().getEndOffset()) {
-				return new ISourceStructElement[] {
-						LTKUtils.getCoveringSourceElement(root, selectionStart, selectionEnd),
+				return new SourceStructElement[] {
+						LtkModelUtils.getCoveringSourceElement(root, selectionStart, selectionEnd),
 				};
 			}
 		}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/util/ViewerSelectionTransferDropAdapter.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/util/ViewerSelectionTransferDropAdapter.java
index 7ee96ef..e8490a2 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/util/ViewerSelectionTransferDropAdapter.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/util/ViewerSelectionTransferDropAdapter.java
@@ -46,9 +46,9 @@
 
 import org.eclipse.statet.internal.ltk.ui.refactoring.Messages;
 import org.eclipse.statet.ltk.model.core.ElementSet;
-import org.eclipse.statet.ltk.model.core.elements.ISourceElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
-import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
+import org.eclipse.statet.ltk.model.core.element.SourceElement;
+import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
+import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 import org.eclipse.statet.ltk.refactoring.core.CommonRefactoringFactory;
 import org.eclipse.statet.ltk.refactoring.core.RefactoringAdapter;
 import org.eclipse.statet.ltk.refactoring.core.RefactoringDestination;
@@ -106,7 +106,7 @@
 		if (target == null) {
 			return false;
 		}
-		return (target instanceof ISourceStructElement);
+		return (target instanceof SourceStructElement);
 	}
 	
 	
@@ -152,7 +152,7 @@
 	}
 	
 	private int internalDetermineOperation(final Object target, final int operation, final int operations) {
-		if (!(target instanceof ISourceElement)) {
+		if (!(target instanceof SourceElement)) {
 			return DND.DROP_NONE;
 		}
 		
@@ -332,7 +332,7 @@
 			}
 		}
 		if (editor != null) {
-			final ISourceUnit su= editor.getSourceUnit();
+			final SourceUnit su= editor.getSourceUnit();
 			if (su != null) {
 				helper.enableInsertPosition(su);
 			}
diff --git a/ltk/pom.xml b/ltk/pom.xml
index c48cd66..5ad2f36 100644
--- a/ltk/pom.xml
+++ b/ltk/pom.xml
@@ -36,8 +36,8 @@
 		<module>org.eclipse.statet.ltk.core</module>
 		<module>org.eclipse.statet.ltk.ui</module>
 		
-		<module>org.eclipse.statet.ltk.buildpaths.core</module>
-		<module>org.eclipse.statet.ltk.buildpaths.ui</module>
+		<module>org.eclipse.statet.ltk.buildpath.core</module>
+		<module>org.eclipse.statet.ltk.buildpath.ui</module>
 		
 		<module>_assemblies</module>