Bug 539772: [SourceEditor, Templates] Revise some LTK editor assist
and templates code

  - Correct names
  - Add use of nullable annotations
  - Replace deprecated class of org.eclipse.jface.text.templates by
    org.eclipse.text.templates if possible
  - Fix potential NullPointerException in ElementNameCompletionProposal

Change-Id: Ie44aa5fbfa96bfbc1f4476ed31b81385abc5680a
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/util/AstSelection.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/util/AstSelection.java
index c377a2a..0733dce 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/util/AstSelection.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/ast/core/util/AstSelection.java
@@ -16,6 +16,9 @@
 
 import java.lang.reflect.InvocationTargetException;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ltk.ast.core.IAstNode;
 import org.eclipse.statet.ltk.ast.core.ICommonAstVisitor;
 
@@ -23,6 +26,7 @@
 /**
  * Converts source range to a selection of AST nodes.
  */
+@NonNullByDefault
 public class AstSelection {
 	
 	/** Selects the node, greater than the selected range */
@@ -40,11 +44,11 @@
 	
 	private int start;
 	private int stop;
-	private IAstNode lastCovering;
-	private IAstNode beforeChild;
-	private IAstNode firstChild;
-	private IAstNode lastChild;
-	private IAstNode afterChild;
+	private @Nullable IAstNode lastCovering;
+	private @Nullable IAstNode beforeChild;
+	private @Nullable IAstNode firstChild;
+	private @Nullable IAstNode lastChild;
+	private @Nullable IAstNode afterChild;
 	
 	
 	private class CoveringGreaterFinder implements ICommonAstVisitor {
@@ -165,7 +169,7 @@
 		final AstSelection selection= new AstSelection();
 		selection.start= start;
 		selection.stop= stop;
-		ICommonAstVisitor finder;
+		final ICommonAstVisitor finder;
 		switch (mode) {
 		case MODE_COVERING_GREATER:
 			finder= selection.new CoveringGreaterFinder();
@@ -195,23 +199,23 @@
 		return this.stop;
 	}
 	
-	public final IAstNode getCovering() {
+	public final @Nullable IAstNode getCovering() {
 		return this.lastCovering;
 	}
 	
-	public final IAstNode getChildBefore() {
+	public final @Nullable IAstNode getChildBefore() {
 		return this.beforeChild;
 	}
 	
-	public final IAstNode getChildFirstTouching() {
+	public final @Nullable IAstNode getChildFirstTouching() {
 		return this.firstChild;
 	}
 	
-	public final IAstNode getChildLastTouching() {
+	public final @Nullable IAstNode getChildLastTouching() {
 		return this.lastChild;
 	}
 	
-	public final IAstNode getChildAfter() {
+	public final @Nullable IAstNode getChildAfter() {
 		return this.afterChild;
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/AdvancedExtensionsInternal.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/AdvancedExtensionsInternal.java
index 7e99251..f5f43bb 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/AdvancedExtensionsInternal.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/AdvancedExtensionsInternal.java
@@ -29,11 +29,15 @@
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.ui.SharedUIResources;
 
 import org.eclipse.statet.ltk.ui.sourceediting.assist.ContentAssistComputerRegistry;
 
 
+@NonNullByDefault
 public class AdvancedExtensionsInternal {
 	
 	public static final String CONTENTASSIST_EXTENSIONPOINT_ID= "org.eclipse.statet.ltk.AdvancedContentAssist"; //$NON-NLS-1$
@@ -74,7 +78,7 @@
 		return s;
 	}
 	
-	public static final ImageDescriptor getImageDescriptor(final IConfigurationElement element, final String attrName) throws CoreException {
+	public static final @Nullable ImageDescriptor getImageDescriptor(final IConfigurationElement element, final String attrName) throws CoreException {
 		final String imagePath= element.getAttribute(attrName);
 		if (imagePath != null) {
 			final Bundle bundle= ContentAssistComputerRegistry.getBundle(element);
@@ -92,11 +96,11 @@
 	 * @param modifiers	the string with the modifiers, separated by '+'
 	 * @return the state mask or -1 if the input is invalid
 	 */
-	public static int computeStateMask(final String modifiers) {
+	public static int computeStateMask(final @Nullable String modifiers) {
 		if (modifiers == null) {
 			return -1;
 		}
-		if (modifiers.length() == 0) {
+		if (modifiers.isEmpty()) {
 			return SWT.NONE;
 		}
 		final String[] mods= MODIFIERS_PATTERN.split(modifiers);
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/TemplatesMessages.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/TemplatesMessages.java
index 1c772db..be02049 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/TemplatesMessages.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/TemplatesMessages.java
@@ -16,7 +16,11 @@
 
 import org.eclipse.osgi.util.NLS;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
+
+@NonNullByDefault
+@SuppressWarnings("null")
 public class TemplatesMessages extends NLS {
 	
 	
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 642d2c0..54d418d 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
@@ -20,6 +20,9 @@
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.services.IServiceLocator;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.core.sections.IDocContentSections;
 
 import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
@@ -28,6 +31,7 @@
 /**
  * A interface for source editors independent of IEditorPart
  */
+@NonNullByDefault
 public interface ISourceEditor extends IAdaptable {
 	
 	
@@ -36,28 +40,28 @@
 	 * 
 	 * @return the content type or <code>null</code>
 	 */
-	IContentType getContentType();
+	@Nullable IContentType getContentType();
 	
 	/**
 	 * Returns the source unit of editor input, if exists.
 	 * 
 	 * @return model element or <code>null</code>
 	 */
-	ISourceUnit getSourceUnit();
+	@Nullable ISourceUnit getSourceUnit();
 	
 	/**
 	 * Returns the part the editor belongs to
 	 * 
 	 * @return the part or <code>null</code>, if not in part
 	 */
-	IWorkbenchPart getWorkbenchPart();
+	@Nullable IWorkbenchPart getWorkbenchPart();
 	
 	/**
 	 * Returns the service locator for the editor
 	 * 
 	 * @return service locator responsible for editor
 	 */
-	IServiceLocator getServiceLocator();
+	@Nullable IServiceLocator getServiceLocator();
 	
 	/**
 	 * Allows access to the SourceViewer
@@ -83,13 +87,13 @@
 	boolean isEditable(boolean validate);
 	
 	/**
-	 * Selects and reveals the specified range in this text editor
+	 * Selects and reveals the specified region in this text editor
 	 *
 	 * @param offset the offset of the selection
 	 * @param length the length of the selection
 	 */
 	void selectAndReveal(int offset, int length);
 	
-	ITextEditToolSynchronizer getTextEditToolSynchronizer();
+	@Nullable ITextEditToolSynchronizer getTextEditToolSynchronizer();
 	
 }
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 95632d7..34ee65e 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
@@ -25,6 +25,9 @@
 import org.eclipse.jface.text.source.SourceViewer;
 import org.eclipse.swt.graphics.Point;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.core.ITextRegion;
 
 import org.eclipse.statet.ltk.ast.core.AstInfo;
@@ -34,6 +37,7 @@
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 
 
+@NonNullByDefault
 public class AssistInvocationContext implements IQuickAssistInvocationContext, ITextRegion {
 	
 	
@@ -46,14 +50,14 @@
 	
 	private final String invocationContentType;
 	
-	private String invocationPrefix;
+	private @Nullable String invocationPrefix;
 	
-	private final ISourceUnit sourceUnit;
-	private AstInfo astInfo;
-	private ISourceUnitModelInfo modelInfo;
+	private final @Nullable ISourceUnit sourceUnit;
+	private @Nullable AstInfo astInfo;
+	private @Nullable ISourceUnitModelInfo modelInfo;
 	
-	private AstSelection invocationAstSelection;
-	private AstSelection astSelection;
+	private @Nullable AstSelection invocationAstSelection;
+	private @Nullable AstSelection astSelection;
 	
 	int session;
 	
@@ -120,7 +124,7 @@
 	}
 	
 	
-	protected String getModelTypeId() {
+	protected @Nullable String getModelTypeId() {
 		return null;
 	}
 	
@@ -180,19 +184,23 @@
 	
 	
 	public String getIdentifierPrefix() {
-		if (this.invocationPrefix == null) {
+		String prefix= this.invocationPrefix;
+		if (prefix == null) {
 			try {
-				this.invocationPrefix= computeIdentifierPrefix(getInvocationOffset());
-				if (this.invocationPrefix == null) {
-					this.invocationPrefix= ""; // prevent recomputing //$NON-NLS-1$
+				prefix= computeIdentifierPrefix(getInvocationOffset());
+				if (prefix == null) {
+					prefix= ""; // prevent recomputing //$NON-NLS-1$
 				}
 			}
 			catch (final BadPartitioningException | BadLocationException e) {
-				this.invocationPrefix= ""; //$NON-NLS-1$
+				prefix= ""; //$NON-NLS-1$
 				throw new RuntimeException(e);
 			}
+			finally {
+				this.invocationPrefix= prefix;
+			}
 		}
-		return this.invocationPrefix;
+		return prefix;
 	}
 	
 	public int getIdentifierOffset() {
@@ -206,7 +214,7 @@
 	 * @return the prefix preceding the content assist invocation offset, <code>null</code> if
 	 *     there is no document
 	 */
-	protected String computeIdentifierPrefix(final int offset)
+	protected @Nullable String computeIdentifierPrefix(final int offset)
 			throws BadPartitioningException, BadLocationException {
 		final IDocument document= getDocument();
 		
@@ -224,32 +232,42 @@
 	}
 	
 	
-	public ISourceUnit getSourceUnit() {
+	public @Nullable ISourceUnit getSourceUnit() {
 		return this.sourceUnit;
 	}
 	
-	public AstInfo getAstInfo() {
+	public @Nullable AstInfo getAstInfo() {
 		return this.astInfo;
 	}
 	
-	public ISourceUnitModelInfo getModelInfo() {
+	public @Nullable ISourceUnitModelInfo getModelInfo() {
 		return this.modelInfo;
 	}
 	
 	public AstSelection getInvocationAstSelection() {
-		if (this.invocationAstSelection == null && this.astInfo != null && this.astInfo.root != null) {
-			this.invocationAstSelection= AstSelection.search(this.astInfo.root,
+		AstSelection selection= this.invocationAstSelection;
+		if (selection == null) {
+			if (this.astInfo == null || this.astInfo.root == null) {
+				throw new UnsupportedOperationException("AST is missing.");
+			}
+			selection= AstSelection.search(this.astInfo.root,
 					getInvocationOffset(), getInvocationOffset(), AstSelection.MODE_COVERING_SAME_LAST );
+			this.invocationAstSelection= selection;
 		}
-		return this.invocationAstSelection;
+		return selection;
 	}
 	
 	public AstSelection getAstSelection() {
-		if (this.astSelection == null && this.astInfo != null && this.astInfo.root != null) {
-			this.astSelection= AstSelection.search(this.astInfo.root,
+		AstSelection selection= this.astSelection;
+		if (selection == null) {
+			if (this.astInfo == null || this.astInfo.root == null) {
+				throw new UnsupportedOperationException("AST is missing.");
+			}
+			selection= AstSelection.search(this.astInfo.root,
 					getOffset(), getOffset() + getLength(), AstSelection.MODE_COVERING_SAME_LAST );
+			this.astSelection= selection;
 		}
-		return this.astSelection;
+		return selection;
 	}
 	
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistCategory.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistCategory.java
index c86cc46..b59b508 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistCategory.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistCategory.java
@@ -15,24 +15,27 @@
 package org.eclipse.statet.ltk.ui.sourceediting.assist;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import org.eclipse.jface.resource.ImageDescriptor;
 
-import org.eclipse.statet.ecommons.ui.util.MessageUtils;
+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.ui.util.MessageUtils;
 
 
 /**
  * Describes a category for {@link ContentAssistProcessor}s.
  */
+@NonNullByDefault
 public final class ContentAssistCategory {
 	
 	
-	private static final List<IContentAssistComputer> NO_COMPUTERS= Collections.emptyList();
+	private static final List<IContentAssistComputer> NO_COMPUTERS= ImCollections.emptyList();
 	
 	
 	private final String id;
@@ -40,7 +43,7 @@
 	private final String name;
 	
 	/** The image descriptor for this category, or <code>null</code> if none specified. */
-	private final ImageDescriptor image;
+	private final @Nullable ImageDescriptor image;
 	
 	boolean isEnabledAsSeparate= false;
 	
@@ -56,13 +59,13 @@
 		this.id= "explicite:" + partitionId; //$NON-NLS-1$
 		this.name= null;
 		this.image= null;
-		this.computerDescriptors= Collections.emptyList();
+		this.computerDescriptors= ImCollections.emptyList();
 		this.computersByPartition= new HashMap<>();
 		this.computersByPartition.put(partitionId, computers);
 		this.isIncludedInDefault= true;
 	}
 	
-	ContentAssistCategory(final String id, final String name, final ImageDescriptor imageDsrc,
+	ContentAssistCategory(final String id, final String name, final @Nullable ImageDescriptor imageDsrc,
 			final List<ContentAssistComputerRegistry.ComputerDescriptor> computers) {
 		this.id= id;
 		this.name= name;
@@ -79,6 +82,7 @@
 		this.computersByPartition= template.computersByPartition;
 	}
 	
+	
 	/**
 	 * Returns the identifier of the described extension.
 	 *
@@ -113,7 +117,7 @@
 	 * 
 	 * @return the image descriptor of the described category
 	 */
-	public ImageDescriptor getImageDescriptor() {
+	public @Nullable ImageDescriptor getImageDescriptor() {
 		return this.image;
 	}
 	
@@ -132,8 +136,8 @@
 	public boolean hasComputers(final String contentTypeId) {
 		final List<IContentAssistComputer> computers= this.computersByPartition.get(contentTypeId);
 		if (computers == null) {
-			for (final ContentAssistComputerRegistry.ComputerDescriptor dscr : this.computerDescriptors) {
-				if (dscr.getPartitions().contains(contentTypeId)) {
+			for (final ContentAssistComputerRegistry.ComputerDescriptor descr : this.computerDescriptors) {
+				if (descr.getPartitions().contains(contentTypeId)) {
 					return true;
 				}
 			}
@@ -149,21 +153,21 @@
 		List<IContentAssistComputer> computers= this.computersByPartition.get(contentTypeId);
 		if (computers == null) {
 			computers= initComputers(contentTypeId);
+			this.computersByPartition.put(contentTypeId, computers);
 		}
 		return computers;
 	}
 	
 	private List<IContentAssistComputer> initComputers(final String contentTypeId) {
 		final List<IContentAssistComputer> computers= new ArrayList<>();
-		for (final ContentAssistComputerRegistry.ComputerDescriptor dscr : this.computerDescriptors) {
-			if (dscr.getPartitions().contains(contentTypeId)) {
-				final IContentAssistComputer computer= dscr.getComputer();
+		for (final ContentAssistComputerRegistry.ComputerDescriptor descr : this.computerDescriptors) {
+			if (descr.getPartitions().contains(contentTypeId)) {
+				final IContentAssistComputer computer= descr.getComputer();
 				if (computer != null) {
 					computers.add(computer);
 				}
 			}
 		}
-		this.computersByPartition.put(contentTypeId, computers);
 		return computers;
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistComputerRegistry.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistComputerRegistry.java
index e5d2505..3b37a37 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistComputerRegistry.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistComputerRegistry.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting.assist;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -36,6 +38,9 @@
 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.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.ecommons.preferences.PreferencesUtil;
 import org.eclipse.statet.ecommons.preferences.SettingsChangeNotifier;
@@ -53,6 +58,7 @@
 /**
  * Registry of contributions for {@link ContentAssistProcessor}s for a single content type.
  */
+@NonNullByDefault
 public class ContentAssistComputerRegistry implements ManageListener, Disposable {
 	
 	
@@ -63,7 +69,7 @@
 	public static final Bundle getBundle(final IConfigurationElement element) {
 		final String namespace= element.getDeclaringExtension().getContributor().getName();
 		final Bundle bundle= Platform.getBundle(namespace);
-		return bundle;
+		return nonNullAssert(bundle);
 	}
 	
 	protected static final Map<String, ContentAssistCategory> createCategoryByIdMap(final List<ContentAssistCategory> categories) {
@@ -90,7 +96,7 @@
 		private final IConfigurationElement configurationElement;
 		
 		/** The computer, if instantiated, <code>null</code> otherwise. */
-		private IContentAssistComputer computer;
+		private @Nullable IContentAssistComputer computer;
 		
 		/** Tells whether we tried to load the computer. */
 		private boolean triedLoadingComputer= false;
@@ -127,7 +133,7 @@
 		/**
 		 * Returns a cached instance of the computer
 		 */
-		public IContentAssistComputer getComputer() {
+		public @Nullable IContentAssistComputer getComputer() {
 			if (this.computer == null && !this.triedLoadingComputer && this.configurationElement != null) {
 				this.triedLoadingComputer= true;
 				try {
@@ -137,7 +143,7 @@
 					StatusManager.getManager().handle(new Status(IStatus.ERROR, SharedUIResources.BUNDLE_ID, -1,
 							NLS.bind("Loading Content Assist Computer ''{0}'' failed (contributed by= '' {1}'').", //$NON-NLS-1$
 									this.id, this.configurationElement.getDeclaringExtension().getContributor().getName() ),
-							e )); 
+							e ));
 				}
 			}
 			return this.computer;
@@ -169,7 +175,8 @@
 	private final StringSetPref prefDisabledCategoryIds;
 	private final StringArrayPref prefOrderedCategoryIds;
 	
-	private ImList<ContentAssistCategory> categories;
+	private @Nullable ImList<ComputerDescriptor> computers;
+	private @Nullable ImList<ContentAssistCategory> categories;
 	
 	
 	public ContentAssistComputerRegistry(final String contentTypeId, final String prefQualifier) {
@@ -219,8 +226,9 @@
 	public void afterSettingsChangeNotification(final Set<String> groupIds) {
 	}
 	
-	private ImList<ContentAssistCategory> loadExtensions() {
+	private void loadExtensions() {
 		final ArrayList<IConfigurationElement> categoryConfigs= new ArrayList<>(); // categories of all content types!
+		final List<ComputerDescriptor> allComputers= new ArrayList<>();
 		final Map<String, List<ComputerDescriptor>> computersByCategoryId= new HashMap<>();
 		
 		final IExtensionRegistry extensionRegistry= Platform.getExtensionRegistry();
@@ -249,14 +257,15 @@
 					}
 					checkPartitions(partitions);
 					
-					final ComputerDescriptor comp= new ComputerDescriptor(id, partitions, element);
+					final ComputerDescriptor computer= new ComputerDescriptor(id, partitions, element);
+					allComputers.add(computer);
 					
 					List<ComputerDescriptor> list= computersByCategoryId.get(categoryId);
 					if (list == null) {
 						list= new ArrayList<>(4);
 						computersByCategoryId.put(categoryId, list);
 					}
-					list.add(comp);
+					list.add(computer);
 				}
 				catch (final CoreException e) {
 					StatusManager.getManager().handle(new Status(IStatus.ERROR, SharedUIResources.BUNDLE_ID, 0,
@@ -288,8 +297,9 @@
 						e ));
 			}
 		}
-		return (this.categories= ImCollections.toList(
-				applyPreferences(PreferenceUtils.getInstancePrefs(), categories) ));
+		this.computers= ImCollections.toList(allComputers);
+		this.categories= ImCollections.toList(
+				applyPreferences(PreferenceUtils.getInstancePrefs(), categories) );
 	}
 	
 	List<ContentAssistCategory> applyPreferences(final PreferenceAccess prefAccess,
@@ -329,21 +339,9 @@
 		return ordered;
 	}
 	
-	public synchronized List<ContentAssistCategory> getCopyOfCategories() {
-		ImList<ContentAssistCategory> categories= this.categories;
-		if (categories == null) {
-			categories= loadExtensions();
-		}
-		final List<ContentAssistCategory> copies= new ArrayList<>(categories.size());
-		for (final ContentAssistCategory category : categories) {
-			copies.add(new ContentAssistCategory(category));
-		}
-		return copies;
-	}
-	
 	Map<Preference<?>, Object> createPreferences(final List<ContentAssistCategory> orderedCategories) {
 		final Set<String> disabledIds= new HashSet<>();
-		final String[] orderedPref= new String[orderedCategories.size()];
+		final String[] orderedPref= new @NonNull String[orderedCategories.size()];
 		
 		for (int i= 0; i < orderedCategories.size(); i++) {
 			final ContentAssistCategory category= orderedCategories.get(i);
@@ -365,19 +363,27 @@
 	}
 	
 	
+	@SuppressWarnings("null")
 	public synchronized ImList<ContentAssistCategory> getCategories() {
 		ImList<ContentAssistCategory> categories= this.categories;
 		if (categories == null) {
-			categories= loadExtensions();
+			loadExtensions();
+			categories= this.categories;
 		}
 		return categories;
 	}
 	
-	public synchronized ImList<ContentAssistCategory> getCategory(final String categoryId) {
-		ImList<ContentAssistCategory> categories= this.categories;
-		if (categories == null) {
-			categories= loadExtensions();
+	public List<ContentAssistCategory> getCopyOfCategories() {
+		final ImList<ContentAssistCategory> categories= getCategories();
+		final List<ContentAssistCategory> copies= new ArrayList<>(categories.size());
+		for (final ContentAssistCategory category : categories) {
+			copies.add(new ContentAssistCategory(category));
 		}
+		return copies;
+	}
+	
+	public ImList<ContentAssistCategory> getCategory(final String categoryId) {
+		final ImList<ContentAssistCategory> categories= getCategories();
 		for (final ContentAssistCategory category : categories) {
 			if (category.getId().equals(categoryId)) {
 				final ContentAssistCategory copy= new ContentAssistCategory(category);
@@ -388,4 +394,24 @@
 		return ImCollections.emptyList();
 	}
 	
+	@SuppressWarnings("null")
+	private synchronized ImList<ComputerDescriptor> getComputers() {
+		ImList<ComputerDescriptor> computers= this.computers;
+		if (computers == null) {
+			loadExtensions();
+			computers= this.computers;
+		}
+		return computers;
+	}
+	
+	public @Nullable IContentAssistComputer getComputer(final String id) {
+		final ImList<ComputerDescriptor> computers= getComputers();
+		for (final ComputerDescriptor descr : computers) {
+			if (descr.getId().equals(id)) {
+				return descr.getComputer();
+			}
+		}
+		return null;
+	}
+	
 }
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 fddbd31..9796eca 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,6 +28,9 @@
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.Point;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ltk.core.IElementName;
 import org.eclipse.statet.ltk.model.core.elements.IModelElement;
 import org.eclipse.statet.ltk.ui.IElementLabelProvider;
@@ -36,6 +39,7 @@
 /**
  * Proposal completing a given {@link IElementName} of a element.
  */
+@NonNullByDefault
 public abstract class ElementNameCompletionProposal<E extends IModelElement>
 		extends CompletionProposalWithOverwrite
 		implements ICompletionProposalExtension3, ICompletionProposalExtension6 {
@@ -69,45 +73,30 @@
 		return this.element;
 	}
 	
-	protected IElementLabelProvider getLabelProvider() {
+	protected final IElementLabelProvider getLabelProvider() {
 		return this.labelProvider;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public Image getImage() {
 		return this.labelProvider.getImage(getElement());
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public String getDisplayString() {
 		return this.labelProvider.getText(getElement());
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public StyledString getStyledDisplayString() {
 		return this.labelProvider.getStyledText(getElement());
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public String getAdditionalProposalInfo() {
+	public @Nullable String getAdditionalProposalInfo() {
 		return null;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public int getRelevance() {
 		return this.relevance;
@@ -123,9 +112,6 @@
 		return getReplacementName().getSegmentName();
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public boolean validate(final IDocument document, final int offset, final DocumentEvent event) {
 		try {
@@ -140,9 +126,6 @@
 		return false;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
 	public boolean isAutoInsertable() {
 		return false;
@@ -171,15 +154,12 @@
 	 * This implementation returns <code>null</code>
 	 */
 	@Override
-	public IContextInformation getContextInformation() {
+	public @Nullable IContextInformation getContextInformation() {
 		return null;
 	}
 	
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	public Point getSelection(final IDocument document) {
+	public @Nullable Point getSelection(final IDocument document) {
 		if (this.cursorPosition >= 0) {
 			return new Point(this.cursorPosition, 0);
 		}
@@ -193,12 +173,12 @@
 	}
 	
 	@Override
-	public CharSequence getPrefixCompletionText(final IDocument document, final int offset) {
+	public @Nullable CharSequence getPrefixCompletionText(final IDocument document, final int offset) {
 		return null;
 	}
 	
 	@Override
-	public IInformationControlCreator getInformationControlCreator() {
+	public @Nullable IInformationControlCreator getInformationControlCreator() {
 		return null;
 	}
 	
@@ -209,11 +189,11 @@
 	}
 	
 	@Override
-	public boolean equals(final Object obj) {
+	public boolean equals(final @Nullable Object obj) {
 		if (this == obj) {
 			return true;
 		}
-		if (getClass() == obj.getClass()) {
+		if (obj != null && getClass() == obj.getClass()) {
 			final ElementNameCompletionProposal<?> other= (ElementNameCompletionProposal<?>) obj;
 			return (Objects.equals(getReplacementName(), other.getReplacementName())
 					&& Objects.equals(getElement(), other.getElement()) );
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/IContentAssistComputer.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/IContentAssistComputer.java
index 1d33026..67fbb3d 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/IContentAssistComputer.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/IContentAssistComputer.java
@@ -17,6 +17,9 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 
 
@@ -25,6 +28,7 @@
  * Contributions to the extension point <code>org.eclipse.statet.ltk.advancedContentAssist</code>
  * must implement this interface.
  */
+@NonNullByDefault
 public interface IContentAssistComputer {
 	
 	
@@ -62,7 +66,7 @@
 	 * @param monitor a progress monitor to report progress. The monitor is private to this
 	 *     invocation, i.e. there is no need for the receiver to spawn a sub monitor.
 	 */
-	IStatus computeCompletionProposals(AssistInvocationContext context, int mode,
+	@Nullable IStatus computeCompletionProposals(AssistInvocationContext context, int mode,
 			AssistProposalCollector proposals,
 			IProgressMonitor monitor);
 	
@@ -74,7 +78,7 @@
 	 * @param monitor a progress monitor to report progress. The monitor is private to this
 	 *     invocation, i.e. there is no need for the receiver to spawn a sub monitor.
 	 */
-	IStatus computeInformationProposals(AssistInvocationContext context,
+	@Nullable IStatus computeInformationProposals(AssistInvocationContext context,
 			AssistProposalCollector proposals,
 			IProgressMonitor monitor);
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/TemplateCompletionComputer.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/TemplateCompletionComputer.java
index d6f6901..77000c3 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/TemplateCompletionComputer.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/TemplateCompletionComputer.java
@@ -24,7 +24,6 @@
 import org.eclipse.jface.text.IRegion;
 import org.eclipse.jface.text.Region;
 import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jface.text.templates.ContextTypeRegistry;
 import org.eclipse.jface.text.templates.DocumentTemplateContext;
 import org.eclipse.jface.text.templates.GlobalTemplateVariables;
 import org.eclipse.jface.text.templates.GlobalTemplateVariables.LineSelection;
@@ -34,24 +33,25 @@
 import org.eclipse.jface.text.templates.TemplateException;
 import org.eclipse.jface.text.templates.persistence.TemplateStore;
 import org.eclipse.swt.graphics.Image;
+import org.eclipse.text.templates.ContextTypeRegistry;
 
 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.internal.ltk.ui.LTKUIPlugin;
 import org.eclipse.statet.ltk.ui.LTKUI;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
-import org.eclipse.statet.ltk.ui.sourceediting.assist.TemplateProposal.TemplateComparator;
 import org.eclipse.statet.ltk.ui.templates.SourceEditorTemplateContext;
 
 
 /**
  * Content assist computer for editor templates.
  */
+@NonNullByDefault
 public abstract class TemplateCompletionComputer implements IContentAssistComputer {
 	
 	
-	private static final TemplateComparator fgTemplateComparator= new TemplateProposal.TemplateComparator();
-	
 	private static final byte SELECTION_NONE= 0;
 	private static final byte SELECTION_INLINE= 1;
 	private static final byte SELECTION_MULTILINE= 2;
@@ -64,7 +64,7 @@
 	
 	protected final TemplateStore templateStore;
 	
-	protected final ContextTypeRegistry typeRegistry;
+	protected final org.eclipse.text.templates.ContextTypeRegistry typeRegistry;
 	
 	
 	public TemplateCompletionComputer(final TemplateStore templateStore, final ContextTypeRegistry contextTypes) {
@@ -103,8 +103,8 @@
 	
 	
 	@Override
-	public IStatus computeCompletionProposals(final AssistInvocationContext context, final int mode,
-			final AssistProposalCollector proposals, final IProgressMonitor monitor) {
+	public @Nullable IStatus computeCompletionProposals(final AssistInvocationContext context,
+			final int mode, final AssistProposalCollector proposals, final IProgressMonitor monitor) {
 		final ISourceViewer viewer= context.getSourceViewer();
 		
 		String prefix= extractPrefix(context);
@@ -116,7 +116,7 @@
 			region= new Region(context.getInvocationOffset() - prefix.length(), prefix.length());
 		}
 		else {
-			region= new Region(context.getOffset(), context.getLength());
+			region= context;
 		}
 		DocumentTemplateContext templateContext= createTemplateContext(context, region);
 		if (templateContext == null) {
@@ -131,6 +131,9 @@
 			prefix= ""; // wenn erfolglos, dann ohne prefix //$NON-NLS-1$
 			if (count != 0) {
 				templateContext= createTemplateContext(context, region);
+				if (templateContext == null) {
+					return null;
+				}
 			}
 		}
 		try {
@@ -154,7 +157,7 @@
 	}
 	
 	@Override
-	public IStatus computeInformationProposals(final AssistInvocationContext context,
+	public @Nullable IStatus computeInformationProposals(final AssistInvocationContext context,
 			final AssistProposalCollector tenders, final IProgressMonitor monitor) {
 		return null;
 	}
@@ -208,16 +211,16 @@
 		return ImCollections.newList(this.templateStore.getTemplates(contextTypeId));
 	}
 	
-	protected abstract TemplateContextType getContextType(AssistInvocationContext context,
-			IRegion region);
+	protected abstract @Nullable TemplateContextType getContextType(
+			AssistInvocationContext context, IRegion region);
 	
-	protected DocumentTemplateContext createTemplateContext(final AssistInvocationContext context,
-			final IRegion region) {
-		final ISourceViewer viewer= context.getSourceViewer();
+	protected @Nullable DocumentTemplateContext createTemplateContext(
+			final AssistInvocationContext context, final IRegion region) {
 		final TemplateContextType contextType= getContextType(context, region);
 		if (contextType != null) {
-			final IDocument document= viewer.getDocument();
-			return new SourceEditorTemplateContext(contextType, document, region.getOffset(), region.getLength(), context.getEditor());
+			return new SourceEditorTemplateContext(contextType, context.getDocument(),
+					region.getOffset(), region.getLength(),
+					context.getEditor() );
 		}
 		return null;
 	}
@@ -228,7 +231,7 @@
 		return new TemplateProposal(template, context, region, getImage(template), relevance);
 	}
 	
-	protected Image getImage(final Template template) {
+	protected @Nullable Image getImage(final Template template) {
 		return LTKUIPlugin.getInstance().getImageRegistry().get(LTKUI.OBJ_TEXT_TEMPLATE_IMAGE_ID);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/TemplateProposal.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/TemplateProposal.java
index 30ae7b2..2f89cf2 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/TemplateProposal.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/TemplateProposal.java
@@ -56,6 +56,9 @@
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.ui.statushandlers.StatusManager;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.ui.DefaultBrowserInformationInput;
 import org.eclipse.statet.ecommons.text.ui.PositionBasedCompletionProposal;
 import org.eclipse.statet.ecommons.ui.SharedUIResources;
@@ -71,6 +74,7 @@
  *   <li>supports {@link ITextEditToolSynchronizer}</li>
  * </ul>
  */
+@NonNullByDefault
 public class TemplateProposal implements IAssistCompletionProposal,
 		ICompletionProposalExtension, ICompletionProposalExtension3, ICompletionProposalExtension4,
 		ICompletionProposalExtension5, ICompletionProposalExtension6 {
@@ -96,16 +100,16 @@
 	
 	private final int relevance;
 	
-	private final Image image;
+	private final @Nullable Image image;
 	
 	private IRegion region;
 	
-	private IRegion selectionToSet; // initialized by apply()
-	private InclusivePositionUpdater updater;
+	private @Nullable IRegion selectionToSet; // initialized by apply()
+	private @Nullable InclusivePositionUpdater updater;
 	
 	
 	public TemplateProposal(final Template template, final TemplateContext context,
-			final IRegion region, final Image image, final int relevance) {
+			final IRegion region, final @Nullable Image image, final int relevance) {
 		assert (template != null);
 		assert (context != null);
 		assert (region != null);
@@ -184,46 +188,48 @@
 	@Override
 	public StyledString getStyledDisplayString() {
 		final StyledString s= new StyledString(this.template.getName());
-		s.append(QUALIFIER_SEPARATOR, StyledString.QUALIFIER_STYLER);
-		s.append(this.template.getDescription(), StyledString.QUALIFIER_STYLER);
+		if (!this.template.getDescription().isEmpty()) {
+			s.append(QUALIFIER_SEPARATOR, StyledString.QUALIFIER_STYLER);
+			s.append(this.template.getDescription(), StyledString.QUALIFIER_STYLER);
+		}
 		return s;
 	}
 	
 	@Override
-	public Image getImage() {
+	public @Nullable Image getImage() {
 		return this.image;
 	}
 	
 	@Override
-	public IInformationControlCreator getInformationControlCreator() {
+	public @Nullable IInformationControlCreator getInformationControlCreator() {
 		return null;
 	}
 	
 	@Override
-	public String getAdditionalProposalInfo() {
+	public @Nullable String getAdditionalProposalInfo() {
 		return null;
 	}
 	
 	@Override
-	public Object getAdditionalProposalInfo(final IProgressMonitor monitor) {
+	public @Nullable Object getAdditionalProposalInfo(final IProgressMonitor monitor) {
 		try {
 			final TemplateContext context= getContext();
 			context.setReadOnly(true);
 			if (context instanceof IWorkbenchTemplateContext) {
 				return new DefaultBrowserInformationInput(
-						null, getDisplayString(), ((IWorkbenchTemplateContext) context).evaluateInfo(getTemplate()), 
-						DefaultBrowserInformationInput.FORMAT_SOURCE_INPUT);
+						null, getDisplayString(), ((IWorkbenchTemplateContext) context).evaluateInfo(getTemplate()),
+						DefaultBrowserInformationInput.FORMAT_SOURCE_INPUT );
 			}
 			
 			final TemplateBuffer templateBuffer= context.evaluate(getTemplate());
 			if (templateBuffer != null) {
 				return new DefaultBrowserInformationInput(
-						null, getDisplayString(), templateBuffer.toString(), 
-						DefaultBrowserInformationInput.FORMAT_SOURCE_INPUT);
+						null, getDisplayString(), templateBuffer.toString(),
+						DefaultBrowserInformationInput.FORMAT_SOURCE_INPUT );
 			}
 		}
-		catch (final TemplateException e) { }
-		catch (final BadLocationException e) { }
+		catch (final TemplateException e) {}
+		catch (final BadLocationException e) {}
 		return null;
 	}
 	
@@ -291,7 +297,8 @@
 				for (int j= 0; j < offsets.length; j++) {
 					if (j == 0 && proposals.length > 1) {
 						group.addPosition(new ProposalPosition(document, offsets[j] + start, length, proposals));
-					} else {
+					}
+					else {
 						group.addPosition(new LinkedPosition(document, offsets[j] + start, length));
 					}
 				}
@@ -315,11 +322,11 @@
 				ui.enter();
 				
 				this.selectionToSet= ui.getSelectedRegion();
-			} else {
+			}
+			else {
 				ensurePositionCategoryRemoved(document);
 				this.selectionToSet= new Region(getCaretOffset(templateBuffer) + start, 0);
 			}
-			
 		}
 		catch (final BadLocationException e) {
 			handleError(e);
@@ -434,7 +441,7 @@
 	}
 	
 	@Override
-	public Point getSelection(final IDocument document) {
+	public @Nullable Point getSelection(final @Nullable IDocument document) {
 		if (this.selectionToSet != null) {
 			return new Point(this.selectionToSet.getOffset(), this.selectionToSet.getLength());
 		}
@@ -447,7 +454,7 @@
 	}
 	
 	@Override
-	public IContextInformation getContextInformation() {
+	public @Nullable IContextInformation getContextInformation() {
 		return null;
 	}
 	
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 fc01e83..3e08fbc 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
@@ -29,16 +29,20 @@
 import org.eclipse.jface.text.templates.TemplateTranslator;
 import org.eclipse.jface.text.templates.TemplateVariableResolver;
 
+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.ui.sourceediting.SourceEditor1;
 
 
+@NonNullByDefault
 public class CodeGenerationTemplateContext extends TemplateContext implements IWorkbenchTemplateContext {
 	
 	
 	private final String lineDelimiter;
 	
-	private ISourceUnit sourceUnit;
+	private @Nullable ISourceUnit sourceUnit;
 	
 	
 	public CodeGenerationTemplateContext(final TemplateContextType contextType,
@@ -55,17 +59,18 @@
 	
 	
 	@Override
-	public SourceEditor1 getEditor() {
+	public @Nullable SourceEditor1 getEditor() {
 		return null;
 	}
 	
 	@Override
-	public ISourceUnit getSourceUnit() {
+	public @Nullable ISourceUnit getSourceUnit() {
 		return this.sourceUnit;
 	}
 	
 	@Override
-	public String evaluateInfo(final Template template) throws BadLocationException, TemplateException {
+	public @Nullable String evaluateInfo(final Template template)
+			throws BadLocationException, TemplateException {
 		final TemplateBuffer buffer= evaluate(template);
 		if (buffer != null) {
 			buffer.getString();
@@ -74,11 +79,17 @@
 	}
 	
 	@Override
-	public TemplateBuffer evaluate(final Template template) throws BadLocationException, TemplateException {
+	public boolean canEvaluate(final Template template) {
+		return true;
+	}
+	
+	@Override
+	public @Nullable TemplateBuffer evaluate(final Template template)
+			throws BadLocationException, TemplateException {
 		// test that all variables are defined
-		final Iterator iterator= getContextType().resolvers();
+		final Iterator<TemplateVariableResolver> iterator= getContextType().resolvers();
 		while (iterator.hasNext()) {
-			final TemplateVariableResolver var= (TemplateVariableResolver) iterator.next();
+			final TemplateVariableResolver var= iterator.next();
 			if (var instanceof SourceEditorContextType.CodeTemplatesVariableResolver) {
 				Assert.isNotNull(getVariable(var.getType()), "Variable " + var.getType() + "not defined"); //$NON-NLS-1$ //$NON-NLS-2$
 			}
@@ -87,7 +98,7 @@
 		if (!canEvaluate(template)) {
 			return null;
 		}
-			
+		
 		final String pattern= changeLineDelimiter(template.getPattern(), this.lineDelimiter);
 		
 		final TemplateTranslator translator= new TemplateTranslator();
@@ -119,15 +130,11 @@
 				buf.append(line);
 			}
 			return buf.toString();
-		} catch (final BadLocationException e) {
+		}
+		catch (final BadLocationException e) {
 			// can not happen
 			return code;
 		}
 	}
 	
-	@Override
-	public boolean canEvaluate(final Template template) {
-		return true;
-	}
-	
 }
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 e926e49..b1c9214 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
@@ -18,6 +18,9 @@
 import org.eclipse.jface.text.templates.Template;
 import org.eclipse.jface.text.templates.TemplateException;
 
+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.ui.sourceediting.ISourceEditor;
 
@@ -25,13 +28,15 @@
 /**
  * Can extend {@link org.eclipse.jface.text.templates.TemplateContext} and similar contexts.
  */
+@NonNullByDefault
 public interface IWorkbenchTemplateContext {
 	
 	
-	public ISourceUnit getSourceUnit();
+	public @Nullable ISourceUnit getSourceUnit();
 	
-	public ISourceEditor getEditor();
+	public @Nullable ISourceEditor getEditor();
 	
-	public String evaluateInfo(Template template) throws BadLocationException, TemplateException;
+	public @Nullable String evaluateInfo(Template template)
+			throws BadLocationException, TemplateException;
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/NewDocTemplateGenerateWizardPage.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/NewDocTemplateGenerateWizardPage.java
index 3e7ee72..7d5cab8 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/NewDocTemplateGenerateWizardPage.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/NewDocTemplateGenerateWizardPage.java
@@ -17,14 +17,14 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.eclipse.jface.text.templates.ContextTypeRegistry;
 import org.eclipse.jface.text.templates.Template;
-import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
 import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Group;
+import org.eclipse.text.templates.ContextTypeRegistry;
+import org.eclipse.text.templates.TemplatePersistenceData;
 
 import org.eclipse.statet.ecommons.preferences.core.Preference;
 import org.eclipse.statet.ecommons.preferences.core.util.PreferenceUtils;
@@ -77,7 +77,7 @@
 	}
 	
 	protected List<Template> getAvailableTemplates() {
-		final List<TemplatePersistenceData> templateDatas= this.config.getTemplates().getTemplates(this.categoryId);
+		final List<? extends TemplatePersistenceData> templateDatas= this.config.getTemplates().getTemplates(this.categoryId);
 		final List<Template> templates= new ArrayList<>(templateDatas.size());
 		for (final TemplatePersistenceData templateData : templateDatas) {
 			final Template template= templateData.getTemplate();
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 ca9c080..c241da5 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
@@ -14,10 +14,11 @@
 
 package org.eclipse.statet.ltk.ui.templates;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import java.util.ArrayList;
 import java.util.List;
 
-import org.eclipse.core.runtime.Assert;
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.Document;
 import org.eclipse.jface.text.IDocument;
@@ -35,6 +36,9 @@
 import org.eclipse.text.edits.ReplaceEdit;
 import org.eclipse.text.edits.TextEdit;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.internal.ltk.ui.TemplatesMessages;
 import org.eclipse.statet.ltk.core.IElementName;
 import org.eclipse.statet.ltk.core.util.UserInfo;
@@ -42,6 +46,7 @@
 import org.eclipse.statet.ltk.model.core.elements.IWorkspaceSourceUnit;
 
 
+@NonNullByDefault
 public class SourceEditorContextType extends TemplateContextType {
 	
 	
@@ -52,7 +57,7 @@
 		}
 		
 		@Override
-		protected String resolve(TemplateContext context) {
+		protected String resolve(final TemplateContext context) {
 			return UserInfo.getAuthorInfo().getName();
 		}
 	}
@@ -64,7 +69,7 @@
 		}
 		
 		@Override
-		protected String resolve(TemplateContext context) {
+		protected String resolve(final TemplateContext context) {
 			return UserInfo.getAuthorInfo().getEmail();
 		}
 	}
@@ -80,7 +85,7 @@
 		}
 		
 		@Override
-		protected String resolve(final TemplateContext context) {
+		protected @Nullable String resolve(final TemplateContext context) {
 			return context.getVariable(getType());
 		}
 		
@@ -89,7 +94,7 @@
 	protected static class InitialSelectionStart extends TemplateVariableResolver {
 		
 		public InitialSelectionStart() {
-			super(SELECT_START_VARIABLE, TemplatesMessages.Templates_Variable_SelectionBegin_description);  
+			super(SELECT_START_VAR_NAME, TemplatesMessages.Templates_Variable_SelectionBegin_description);
 		}
 		
 		@Override
@@ -102,7 +107,7 @@
 	protected static class InitialSelectionEnd extends TemplateVariableResolver {
 		
 		public InitialSelectionEnd() {
-			super(SELECT_END_VARIABLE, TemplatesMessages.Templates_Variable_SelectionEnd_description);  
+			super(SELECT_END_VAR_NAME, TemplatesMessages.Templates_Variable_SelectionEnd_description);
 		}
 		
 		@Override
@@ -120,7 +125,7 @@
 	protected static class File extends SimpleTemplateVariableResolver {
 		
 		public File() {
-			super("file_name", TemplatesMessages.Templates_Variable_File_description);  //$NON-NLS-1$
+			super(FILE_NAME_VAR_NAME, TemplatesMessages.Templates_Variable_File_description);
 		}
 		
 		@Override
@@ -144,7 +149,7 @@
 	protected static class Project extends SimpleTemplateVariableResolver {
 		
 		public Project() {
-			super("enclosing_project", TemplatesMessages.Templates_Variable_EnclosingProject_description);  //$NON-NLS-1$
+			super("enclosing_project", TemplatesMessages.Templates_Variable_EnclosingProject_description); //$NON-NLS-1$
 		}
 		
 		@Override
@@ -179,7 +184,7 @@
 			return "TODO"; //$NON-NLS-1$
 		}
 		
-		protected String getTag(final ISourceUnit su) {
+		protected @Nullable String getTag(final @Nullable ISourceUnit su) {
 			return null;
 		}
 		
@@ -203,9 +208,9 @@
 	}
 	
 	
-	public static final String FILENAME_VARIABLE= "file_name"; //$NON-NLS-1$
-	public static final String SELECT_START_VARIABLE= "selection_begin"; //$NON-NLS-1$
-	public static final String SELECT_END_VARIABLE= "selection_end"; ////$NON-NLS-1$
+	public static final String FILE_NAME_VAR_NAME= "file_name"; //$NON-NLS-1$
+	public static final String SELECT_START_VAR_NAME= "selection_begin"; //$NON-NLS-1$
+	public static final String SELECT_END_VAR_NAME= "selection_end"; ////$NON-NLS-1$
 	
 	
 	public SourceEditorContextType(final String id, final String name) {
@@ -247,11 +252,11 @@
 	
 	@Override
 	public void resolve(final TemplateBuffer buffer, final TemplateContext context) throws MalformedTreeException, BadLocationException {
-		Assert.isNotNull(context);
+		nonNullAssert(context);
 		final TemplateVariable[] variables= buffer.getVariables();
 		
 		final IDocument document= new Document(buffer.getString());
-		final List<TextEdit> positions= TemplatesUtil.variablesToPositions(variables);
+		final List<TextEdit> positions= TemplateUtils.variablesToPositions(variables);
 		final List<TextEdit> edits= new ArrayList<>(5);
 		
 		
@@ -286,7 +291,7 @@
 				for (int k= 0; k != oldOffsets.length; k++) {
 					String thisValue= value;
 					if (multiLine) {
-						final String indent= TemplatesUtil.searchIndentation(document, oldOffsets[k]);
+						final String indent= TemplateUtils.searchIndentation(document, oldOffsets[k]);
 						if (indent.length() > 0) {
 							final StringBuilder temp= new StringBuilder(thisValue);
 							int offset= 0;
@@ -295,7 +300,7 @@
 								if (search[0] == -1) {
 									break;
 								}
-								offset= search[0]+ln[search[1]].length();
+								offset= search[0] + ln[search[1]].length();
 								temp.insert(offset, indent);
 								offset+= indent.length();
 							}
@@ -312,7 +317,7 @@
 		edit.addChildren(edits.toArray(new TextEdit[edits.size()]));
 		edit.apply(document, TextEdit.UPDATE_REGIONS);
 		
-		TemplatesUtil.positionsToVariables(positions, variables);
+		TemplateUtils.positionsToVariables(positions, variables);
 		
 		buffer.setContent(document.get(), variables);
 	}
@@ -324,12 +329,15 @@
 	}
 	
 	@Override
-	public boolean equals(final Object obj) {
-		if (!(obj instanceof SourceEditorContextType)) {
-			return false;
+	public boolean equals(final @Nullable Object obj) {
+		if (this == obj) {
+			return true;
 		}
-		final SourceEditorContextType other= (SourceEditorContextType) obj;
-		return getId().equals(other.getId());
+		if (obj instanceof SourceEditorContextType) {
+			final SourceEditorContextType other= (SourceEditorContextType) obj;
+			return getId().equals(other.getId());
+		}
+		return false;
 	}
 	
 }
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 6f18ea4..ab52a73 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
@@ -33,15 +33,23 @@
 import org.eclipse.text.edits.MultiTextEdit;
 import org.eclipse.text.edits.TextEdit;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.TextUtil;
 
 import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 
 
+@NonNullByDefault
 public class SourceEditorTemplateContext extends DocumentTemplateContext implements IWorkbenchTemplateContext {
 	
 	
+	protected static final String SELECTION_VAR_NAME= "selection"; //$NON-NLS-1$
+	protected static final String INDENTATION_VAR_NAME= "indentation"; //$NON-NLS-1$
+	
+	
 	private final ISourceEditor editor;
 	
 	
@@ -58,12 +66,13 @@
 	}
 	
 	@Override
-	public ISourceUnit getSourceUnit() {
+	public @Nullable ISourceUnit getSourceUnit() {
 		return this.editor.getSourceUnit();
 	}
 	
+	
 	@Override
-	public String evaluateInfo(final Template template) throws BadLocationException, TemplateException {
+	public @Nullable String evaluateInfo(final Template template) throws BadLocationException, TemplateException {
 		final TemplateBuffer buffer= super.evaluate(template);
 		if (buffer != null) {
 			return buffer.getString();
@@ -72,7 +81,7 @@
 	}
 	
 	@Override
-	public TemplateBuffer evaluate(final Template template) throws BadLocationException, TemplateException {
+	public @Nullable TemplateBuffer evaluate(final Template template) throws BadLocationException, TemplateException {
 		if (!canEvaluate(template)) {
 			return null;
 		}
@@ -101,7 +110,7 @@
 	
 	private void indent(final TemplateBuffer buffer) throws BadLocationException {
 		final TemplateVariable[] variables= buffer.getVariables();
-		final List<TextEdit> positions= TemplatesUtil.variablesToPositions(variables);
+		final List<TextEdit> positions= TemplateUtils.variablesToPositions(variables);
 		final IDocument baseDoc= getDocument();
 		
 		final IDocument templateDoc= new Document(buffer.getString());
@@ -119,7 +128,7 @@
 			root.removeChild(edit);
 		}
 		else {
-			indentation= TemplatesUtil.searchIndentation(baseDoc, getStart());
+			indentation= TemplateUtils.searchIndentation(baseDoc, getStart());
 		}
 		
 		// following lines
@@ -133,7 +142,7 @@
 			root.removeChild(edit);
 		}
 		
-		TemplatesUtil.positionsToVariables(positions, variables);
+		TemplateUtils.positionsToVariables(positions, variables);
 		buffer.setContent(templateDoc.get(), variables);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplatePreview.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplatePreview.java
index 3b6a596..3b598e6 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplatePreview.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplatePreview.java
@@ -21,11 +21,11 @@
 import org.eclipse.jface.text.Document;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jface.text.templates.ContextTypeRegistry;
 import org.eclipse.jface.text.templates.Template;
 import org.eclipse.jface.text.templates.TemplateContextType;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.text.templates.ContextTypeRegistry;
 import org.eclipse.ui.editors.text.EditorsUI;
 
 import org.eclipse.statet.ecommons.preferences.ui.SettingsUpdater;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplateSelectionComposite.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplateSelectionComposite.java
index b4ef7e9..f19ba33 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplateSelectionComposite.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplateSelectionComposite.java
@@ -18,7 +18,6 @@
 
 import org.eclipse.jface.layout.PixelConverter;
 import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jface.text.templates.ContextTypeRegistry;
 import org.eclipse.jface.text.templates.Template;
 import org.eclipse.jface.viewers.ArrayContentProvider;
 import org.eclipse.jface.viewers.ColumnWeightData;
@@ -33,6 +32,7 @@
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
+import org.eclipse.text.templates.ContextTypeRegistry;
 
 import org.eclipse.statet.jcommons.collections.ImCollections;
 import org.eclipse.statet.jcommons.collections.ImList;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplatesUtil.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplateUtils.java
similarity index 91%
rename from ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplatesUtil.java
rename to ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplateUtils.java
index 90ad28f..ac3544d 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplatesUtil.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplateUtils.java
@@ -30,25 +30,29 @@
 import org.eclipse.text.edits.RangeMarker;
 import org.eclipse.text.edits.TextEdit;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
-public class TemplatesUtil {
+
+@NonNullByDefault
+public class TemplateUtils {
 	
 	
 	public static class EvaluatedTemplate {
 		
 		private String content;
 		
-		private IRegion select;
+		private @Nullable IRegion select;
 		
 		private final String lineDelimiter;
-		private AbstractDocument postEditDocument;
-		private Position postEditSelectPosition;
+		private @Nullable AbstractDocument postEditDocument;
+		private @Nullable Position postEditSelectPosition;
 		
 		
 		public EvaluatedTemplate(final TemplateBuffer buffer, final String lineDelimiter) {
 			setContent(buffer.getString());
-			final TemplateVariable selectStartVariable= findVariable(buffer, SourceEditorContextType.SELECT_START_VARIABLE);
-			final TemplateVariable selectEndVariable= findVariable(buffer, SourceEditorContextType.SELECT_END_VARIABLE);
+			final TemplateVariable selectStartVariable= findVariable(buffer, SourceEditorContextType.SELECT_START_VAR_NAME);
+			final TemplateVariable selectEndVariable= findVariable(buffer, SourceEditorContextType.SELECT_END_VAR_NAME);
 			if (selectStartVariable != null && selectStartVariable.getOffsets().length == 1) {
 				this.select= new Region(selectStartVariable.getOffsets()[0],
 						(selectEndVariable != null && selectEndVariable.getOffsets().length == 1) ?
@@ -78,7 +82,7 @@
 		/**
 		 * Returns the region to select, if specified
 		 */
-		public IRegion getRegionToSelect() {
+		public @Nullable IRegion getRegionToSelect() {
 			return this.select;
 		}
 		
@@ -174,7 +178,7 @@
 		return positions;
 	}
 	
-	public static TemplateVariable findVariable(final TemplateBuffer buffer, final String variableType) {
+	public static @Nullable TemplateVariable findVariable(final TemplateBuffer buffer, final String variableType) {
 		final TemplateVariable[] variables= buffer.getVariables();
 		for (final TemplateVariable cand : variables) {
 			if (variableType.equals(cand.getType())) {
@@ -196,7 +200,7 @@
 	 * @param lineIndent string to use as line indentation
 	 * @throws BadLocationException
 	 */
-	public static void indentTemplateDocument(final AbstractDocument doc, final String lineIndent) 
+	public static void indentTemplateDocument(final AbstractDocument doc, final String lineIndent)
 			throws BadLocationException {
 		final int lastLine= doc.getNumberOfLines()-1;
 		for (int templateLine= 0; templateLine < lastLine; templateLine++) {
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractTemplatesPreferencePage.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractTemplatesPreferencePage.java
index 6841c00..ce0c930 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractTemplatesPreferencePage.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractTemplatesPreferencePage.java
@@ -21,11 +21,11 @@
 import org.eclipse.jface.text.source.SourceViewer;
 import org.eclipse.jface.text.templates.Template;
 import org.eclipse.jface.text.templates.TemplateContextType;
-import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.text.templates.TemplatePersistenceData;
 import org.eclipse.ui.texteditor.templates.TemplatePreferencePage;
 
 import org.eclipse.statet.ecommons.preferences.ui.SettingsUpdater;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/CodeTemplateConfigurationBlock.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/CodeTemplateConfigurationBlock.java
index dace699..0ed806a 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/CodeTemplateConfigurationBlock.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/CodeTemplateConfigurationBlock.java
@@ -39,10 +39,7 @@
 import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.jface.resource.LocalResourceManager;
 import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jface.text.templates.ContextTypeRegistry;
 import org.eclipse.jface.text.templates.Template;
-import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
-import org.eclipse.jface.text.templates.persistence.TemplateReaderWriter;
 import org.eclipse.jface.viewers.DecorationOverlayIcon;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITreeContentProvider;
@@ -63,10 +60,16 @@
 import org.eclipse.swt.widgets.FileDialog;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Shell;
+import org.eclipse.text.templates.ContextTypeRegistry;
+import org.eclipse.text.templates.TemplatePersistenceData;
+import org.eclipse.text.templates.TemplateReaderWriter;
 import org.eclipse.ui.statushandlers.StatusManager;
 
 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.ecommons.preferences.core.Preference;
 import org.eclipse.statet.ecommons.preferences.ui.ManagedConfigurationBlock;
@@ -100,6 +103,7 @@
 	public static final int DEFAULT_BY_CATEGORY=            0b0_00000010_00000000;
 	
 	
+	@NonNullByDefault
 	protected static class TemplateItem {
 		
 		private final TemplateCategory category;
@@ -132,13 +136,17 @@
 		}
 		
 		@Override
-		public boolean equals(final Object obj) {
-			if (!(obj instanceof TemplateItem)) {
-				return false;
+		public boolean equals(final @Nullable Object obj) {
+			if (this == obj) {
+				return true;
 			}
-			final TemplateItem other= (TemplateItem) obj;
-			return (this.contrib == other.contrib && this.category.equals(other.category)
-					&& this.data.equals(other.data) );
+			if (obj instanceof TemplateItem) {
+				final TemplateItem other= (TemplateItem) obj;
+				return (this.contrib == other.contrib
+						&& this.category.equals(other.category)
+						&& this.data.equals(other.data) );
+			}
+			return false;
 		}
 		
 	}
@@ -171,7 +179,7 @@
 		}
 		
 		@Override
-		public Object getParent(final Object element) {
+		public @Nullable Object getParent(final Object element) {
 			if (element instanceof TemplateItem) {
 				return ((TemplateItem) element).category;
 			}
@@ -199,14 +207,14 @@
 				else {
 					doGetChildren(category, items);
 				}
-				return items.toArray(new TemplateItem[items.size()]);
+				return items.toArray(new @NonNull TemplateItem[items.size()]);
 			}
 			return new Object[0];
 		}
 		
 		protected void doGetChildren(final TemplateCategory category, final List<TemplateItem> items) {
 			final ITemplateContribution contrib= category.getTemplateContrib(true);
-			final List<TemplatePersistenceData> templates= contrib.getTemplates(category.getId());
+			final List<? extends TemplatePersistenceData> templates= contrib.getTemplates(category.getId());
 			if (templates != null) {
 				for (final TemplatePersistenceData templateData : templates) {
 					final Template contribTemplate= templateData.getTemplate();
@@ -220,7 +228,7 @@
 		
 		public TemplateItem findItemByName(final TemplateCategory category, final String name) {
 			final ITemplateContribution contrib= category.getTemplateContrib(true);
-			final List<TemplatePersistenceData> templates= contrib.getTemplates(category.getId());
+			final List<? extends TemplatePersistenceData> templates= contrib.getTemplates(category.getId());
 			if (templates != null) {
 				for (final TemplatePersistenceData templateData : templates) {
 					final Template contribTemplate= templateData.getTemplate();
@@ -239,7 +247,7 @@
 		
 		public boolean containsItemContent(final TemplateCategory category, final Template template) {
 			final ITemplateContribution contrib= category.getTemplateContrib(true);
-			final List<TemplatePersistenceData> templates= contrib.getTemplates(category.getId());
+			final List<? extends TemplatePersistenceData> templates= contrib.getTemplates(category.getId());
 			if (templates != null) {
 				for (final TemplatePersistenceData templateData : templates) {
 					final Template contribTemplate= templateData.getTemplate();
@@ -257,8 +265,8 @@
 	private class TemplateDataAdapter extends DataAdapter.TreeAdapter<TemplateItem> {
 		
 		
-		private final Map<String, IObservableValue<String>> defaultValues;
-		private final Map<Preference<?>, String> prefs;
+		private final @Nullable Map<String, IObservableValue<String>> defaultValues;
+		private final @Nullable Map<Preference<?>, String> prefs;
 		
 		
 		public TemplateDataAdapter(final ITreeContentProvider treeProvider,
@@ -281,7 +289,7 @@
 		}
 		
 		@Override
-		protected ITemplateContribution getContainerFor(final Object element) {
+		protected @Nullable ITemplateContribution getContainerFor(final Object element) {
 			if (element instanceof TemplateItem) {
 				return ((TemplateItem) element).contrib;
 			}
@@ -654,7 +662,7 @@
 	
 	protected EditTemplateDialog createEditDialog(final Template template, final int command,
 			final SourceEditorViewerConfigurator configurator,
-			final  TemplateVariableProcessor processor, final ContextTypeRegistry registry) {
+			final TemplateVariableProcessor processor, final ContextTypeRegistry registry) {
 		return new EditTemplateDialog(
 				getShell(), template, ((command & ButtonGroup.ADD_ANY) != 0),
 				EditTemplateDialog.CUSTOM_TEMPLATE, configurator, processor, registry,
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/EditTemplateDialog.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/EditTemplateDialog.java
index ec4320c..ed75123 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/EditTemplateDialog.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/EditTemplateDialog.java
@@ -27,7 +27,6 @@
 import org.eclipse.jface.text.TextEvent;
 import org.eclipse.jface.text.source.ISourceViewer;
 import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jface.text.templates.ContextTypeRegistry;
 import org.eclipse.jface.text.templates.Template;
 import org.eclipse.jface.text.templates.TemplateContextType;
 import org.eclipse.jface.text.templates.TemplateException;
@@ -51,6 +50,7 @@
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
+import org.eclipse.text.templates.ContextTypeRegistry;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
 
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/ITemplateCategoryConfiguration.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/ITemplateCategoryConfiguration.java
index 7051da5..141dfd0 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/ITemplateCategoryConfiguration.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/ITemplateCategoryConfiguration.java
@@ -15,8 +15,8 @@
 package org.eclipse.statet.ltk.ui.templates.config;
 
 import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.text.templates.ContextTypeRegistry;
-import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
+import org.eclipse.text.templates.ContextTypeRegistry;
+import org.eclipse.text.templates.TemplatePersistenceData;
 
 import org.eclipse.statet.ecommons.preferences.core.Preference;
 import org.eclipse.statet.ecommons.templates.TemplateVariableProcessor;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/ITemplateContribution.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/ITemplateContribution.java
index 8a334eb..9652928 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/ITemplateContribution.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/ITemplateContribution.java
@@ -18,15 +18,19 @@
 import java.util.List;
 
 import org.eclipse.jface.text.templates.Template;
-import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
+import org.eclipse.text.templates.TemplatePersistenceData;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 
+@NonNullByDefault
 public interface ITemplateContribution {
 	
 	
-	List<TemplatePersistenceData> getTemplates(String categoryId);
+	List<? extends TemplatePersistenceData> getTemplates(String categoryId);
 	
-	Template findTemplate(String contextTypeId, String name);
+	@Nullable Template findTemplate(String contextTypeId, String name);
 	
 	void add(String categoryId, TemplatePersistenceData data);
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/TemplateCategory.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/TemplateCategory.java
index 2fdca43..2a8c81d 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/TemplateCategory.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/TemplateCategory.java
@@ -18,7 +18,9 @@
 import java.util.Set;
 
 import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.templates.ContextTypeRegistry;
+import org.eclipse.text.templates.ContextTypeRegistry;
+
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.ecommons.preferences.core.Preference;
 
@@ -38,7 +40,7 @@
 	private ContextTypeRegistry contextTypeRegistry;
 	private boolean defaultPrefCheck;
 	
-	private Set<String> templateNames;
+	private @Nullable Set<String> templateNames;
 	
 	
 	public TemplateCategory(final String id,
@@ -79,11 +81,11 @@
 		return this.label;
 	}
 	
-	public ImageDescriptor getImage() {
+	public @Nullable ImageDescriptor getImage() {
 		return this.image;
 	}
 	
-	public ImageDescriptor getItemImage() {
+	public @Nullable ImageDescriptor getItemImage() {
 		return this.itemImage;
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/TemplateStoreContribution.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/TemplateStoreContribution.java
index 7a39a79..a6d8818 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/TemplateStoreContribution.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/TemplateStoreContribution.java
@@ -18,12 +18,15 @@
 import java.util.List;
 
 import org.eclipse.jface.text.templates.Template;
-import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
 import org.eclipse.jface.text.templates.persistence.TemplateStore;
+import org.eclipse.text.templates.TemplatePersistenceData;
 
 import org.eclipse.statet.jcommons.collections.ImCollections;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 
+@NonNullByDefault
 public class TemplateStoreContribution implements ITemplateContribution {
 	
 	
@@ -41,7 +44,7 @@
 	}
 	
 	@Override
-	public Template findTemplate(final String contextTypeId, final String name) {
+	public @Nullable Template findTemplate(final String contextTypeId, final String name) {
 		return this.templateStore.findTemplate(name, contextTypeId);
 	}
 	
@@ -87,15 +90,15 @@
 	}
 	
 	@Override
-	public boolean equals(final Object obj) {
+	public boolean equals(final @Nullable Object obj) {
 		if (this == obj) {
 			return true;
 		}
-		if (obj == null || getClass() != obj.getClass()) {
-			return false;
+		if (obj != null && getClass() == obj.getClass()) {
+			final TemplateStoreContribution other= (TemplateStoreContribution) obj;
+			return (this.templateStore == other.templateStore);
 		}
-		final TemplateStoreContribution other= (TemplateStoreContribution) obj;
-		return (this.templateStore == other.templateStore);
+		return false;
 	}
 	
 }