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>
 		
