[SourceEditor] Revise SourceEditor and related classes
  - Correct namings
  - Add more nullable annotations
  - CleanUp

Change-Id: I8b435f3ecfd0edd18a745cb65fd90c66b3782da8
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 e778af2..0f7e8b6 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
@@ -69,6 +69,7 @@
 import org.eclipse.text.edits.MultiTextEdit;
 
 import org.eclipse.statet.jcommons.collections.ImCollections;
+import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.text.core.BasicTextRegion;
 import org.eclipse.statet.jcommons.text.core.TextRegion;
 
@@ -162,11 +163,12 @@
 		return checked.toArray(new SourceStructElement[checked.size()]);
 	}
 	
-	public IRegion getContinuousSourceRange(final SourceStructElement[] elements) {
-		if (elements == null || elements.length == 0) {
+	public @Nullable IRegion getContinuousSourceRange(final List<SourceStructElement<?, ?>> elements) {
+		if (elements == null || elements.isEmpty()) {
 			return null;
 		}
-		final SourceUnit su= elements[0].getSourceUnit();
+		final var element0= elements.get(0);
+		final SourceUnit su= element0.getSourceUnit();
 		if (su == null) {
 			return null;
 		}
@@ -180,15 +182,16 @@
 		try {
 			final BasicHeuristicTokenScanner scanner= getScanner(su);
 			scanner.configure(doc);
-			final int start= elements[0].getSourceRange().getStartOffset();
-			int end= elements[0].getSourceRange().getEndOffset();
+			final int start= element0.getSourceRange().getStartOffset();
+			int end= element0.getSourceRange().getEndOffset();
 			
-			for (int i= 1; i < elements.length; i++) {
-				if (elements[i].getSourceUnit() != su) {
+			for (int i= 1; i < elements.size(); i++) {
+				final var element= elements.get(i);
+				if (element.getSourceUnit() != su) {
 					return null;
 				}
-				final int elementStart= elements[i].getSourceRange().getStartOffset();
-				final int elementEnd= elementStart + elements[i].getSourceRange().getLength();
+				final int elementStart= element.getSourceRange().getStartOffset();
+				final int elementEnd= elementStart + element.getSourceRange().getLength();
 				if (elementEnd <= end) {
 					continue;
 				}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ecommons/templates/TemplateVariableProcessor.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ecommons/templates/TemplateVariableProcessor.java
index 7f5de50..bfb8fc5 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ecommons/templates/TemplateVariableProcessor.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ecommons/templates/TemplateVariableProcessor.java
@@ -35,7 +35,7 @@
 public final class TemplateVariableProcessor implements IContentAssistProcessor {
 	
 	private static Comparator<TemplateVariableProposal> fgTemplateVariableProposalComparator= 
-				new Comparator<TemplateVariableProposal>() {
+			new Comparator<>() {
 		
 		@Override
 		public int compare(final TemplateVariableProposal proposal0, final TemplateVariableProposal proposal1) {
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 371ad8d..a7af2d4 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
@@ -86,7 +86,7 @@
 			catch (final CoreException e) {}
 		}
 		else {
-			// get content type by ISourceEditor
+			// get content type by SourceEditor
 			if (receiver instanceof IAdaptable) {
 				contentType= ((IAdaptable) receiver).getAdapter(IContentType.class);
 			}
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 a71dc52..afb67a8 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
@@ -53,7 +53,7 @@
 	
 	private final Object inputLock= new Object();
 	private volatile SourceUnit input;
-	private SourceUnit newInput;
+	private @Nullable SourceUnit newInput;
 	private final NewInputUpdater newInputJob= new NewInputUpdater();
 	
 	private class NewInputUpdater extends Job implements ISchedulingRule {
@@ -158,7 +158,7 @@
 	}
 	
 	
-	public void setInput(final SourceUnit input) {
+	public void setInput(final @Nullable SourceUnit input) {
 		synchronized (this.inputLock) {
 			this.input= null;
 			this.newInput= input;
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 9d09c03..1ace628 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
@@ -35,7 +35,7 @@
 /**
  * Data/state of LTK based input of a view/editor.
  * 
- * E.g. used for {@link ISelectionWithElementInfoListener} or {@link ShowInContext}
+ * E.g. used for {@link SelectionWithElementInfoListener} or {@link ShowInContext}
  */
 @NonNullByDefault
 public class LTKInputData implements ISelection {
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 b90248e..0c1a922 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
@@ -38,7 +38,7 @@
 /**
  * Controller implementation combining {@link IPostSelectionProvider} and 
  * {@link ModelElementInputProvider} to provide support for
- * {@link ISelectionWithElementInfoListener}.
+ * {@link SelectionWithElementInfoListener}.
  */
 public class PostSelectionWithElementInfoController {
 	
@@ -113,12 +113,12 @@
 					return Status.OK_STATUS;
 				}
 				
-				ImIdentityList<ISelectionWithElementInfoListener> listeners= PostSelectionWithElementInfoController.this.newListeners.clearToList();
+				ImIdentityList<SelectionWithElementInfoListener> listeners= PostSelectionWithElementInfoController.this.newListeners.clearToList();
 				if (run.stateNr != this.lastNr) {
 					listeners= PostSelectionWithElementInfoController.this.listeners.toList();
 					this.lastNr= run.stateNr;
 				}
-				ITER_LISTENER: for (final ISelectionWithElementInfoListener listener : listeners) {
+				ITER_LISTENER: for (final SelectionWithElementInfoListener listener : listeners) {
 					if (ignore != null) {
 						for (int j= 0; j < ignore.length; j++) {
 							if (ignore[j] != null && ignore[j].listener == listener) {
@@ -151,8 +151,8 @@
 				synchronized (PostSelectionWithElementInfoController.this.inputLock) {
 					PostSelectionWithElementInfoController.this.inputChanged= false;
 				}
-				final ImIdentityList<ISelectionWithElementInfoListener> listeners= PostSelectionWithElementInfoController.this.listeners.toList();
-				for (final ISelectionWithElementInfoListener listener : listeners) {
+				final ImIdentityList<SelectionWithElementInfoListener> listeners= PostSelectionWithElementInfoController.this.listeners.toList();
+				for (final SelectionWithElementInfoListener listener : listeners) {
 					try {
 						listener.inputChanged();
 					}
@@ -186,11 +186,11 @@
 	
 	public class IgnoreActivation {
 		
-		private final ISelectionWithElementInfoListener listener;
+		private final SelectionWithElementInfoListener listener;
 		private boolean marked;
 		private int nr;
 		
-		private IgnoreActivation(final ISelectionWithElementInfoListener listener) {
+		private IgnoreActivation(final SelectionWithElementInfoListener listener) {
 			this.listener= listener;
 		}
 		
@@ -211,8 +211,8 @@
 	
 	private final IPostSelectionProvider selectionProvider;
 	private final ModelElementInputProvider modelProvider;
-	private final CopyOnWriteIdentityListSet<ISelectionWithElementInfoListener> listeners= new CopyOnWriteIdentityListSet<>();
-	private final CopyOnWriteIdentityListSet<ISelectionWithElementInfoListener> newListeners= new CopyOnWriteIdentityListSet<>();
+	private final CopyOnWriteIdentityListSet<SelectionWithElementInfoListener> listeners= new CopyOnWriteIdentityListSet<>();
+	private final CopyOnWriteIdentityListSet<SelectionWithElementInfoListener> newListeners= new CopyOnWriteIdentityListSet<>();
 	private final Object inputLock= new Object();
 	
 	private final ModelElementInputListener elementChangeListener;
@@ -313,18 +313,18 @@
 	}
 	
 	
-	public void addListener(final ISelectionWithElementInfoListener listener) {
+	public void addListener(final SelectionWithElementInfoListener listener) {
 		this.listeners.add(listener);
 		this.newListeners.add(listener);
 		this.updateJob.schedule();
 	}
 	
-	public void removeListener(final ISelectionWithElementInfoListener listener) {
+	public void removeListener(final SelectionWithElementInfoListener listener) {
 		this.newListeners.remove(listener);
 		this.listeners.remove(listener);
 	}
 	
-	public IgnoreActivation ignoreNext(final ISelectionWithElementInfoListener listener) {
+	public IgnoreActivation ignoreNext(final SelectionWithElementInfoListener listener) {
 		final IgnoreActivation control= new IgnoreActivation(listener);
 		this.ignoreList.add(control);
 		return control;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ISelectionWithElementInfoListener.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/SelectionWithElementInfoListener.java
similarity index 82%
rename from ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ISelectionWithElementInfoListener.java
rename to ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/SelectionWithElementInfoListener.java
index 2c4ed35..0d3a114 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/ISelectionWithElementInfoListener.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/SelectionWithElementInfoListener.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ltk.ui;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 
 /**
  * Interface to listen to {@link LTKInputData} state changes providing selection and model
@@ -21,12 +23,13 @@
  * 
  * @see {@link PostSelectionWithElementInfoController}
  */
-public interface ISelectionWithElementInfoListener {
+@NonNullByDefault
+public interface SelectionWithElementInfoListener {
 	
 	
-	public void inputChanged();
+	void inputChanged();
 	
-	public void stateChanged(LTKInputData state);
+	void stateChanged(LTKInputData state);
 	
 	
 }
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 94db120..8bff5da 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
@@ -45,7 +45,7 @@
 import org.eclipse.statet.ltk.refactoring.core.CommonRefactoringFactory;
 import org.eclipse.statet.ltk.refactoring.core.RefactoringAdapter;
 import org.eclipse.statet.ltk.refactoring.core.RefactoringDestination;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
 /**
@@ -54,10 +54,10 @@
 public class PasteElementsHandler extends AbstractElementsHandler {
 	
 	
-	private final ISourceEditor editor;
+	private final SourceEditor editor;
 	
 	
-	public PasteElementsHandler(final ISourceEditor editor,
+	public PasteElementsHandler(final SourceEditor editor,
 			final CommonRefactoringFactory refactoring) {
 		super(refactoring);
 		this.editor= editor;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/AbstractAutoEditStrategy.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/AbstractAutoEditStrategy.java
index c00eccb..0c35ae5 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/AbstractAutoEditStrategy.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/AbstractAutoEditStrategy.java
@@ -51,10 +51,10 @@
  * Auto edit strategy for Wikitext markup
  */
 public abstract class AbstractAutoEditStrategy extends DefaultIndentLineAutoEditStrategy
-		implements ISourceEditorAddon, VerifyKeyListener {
+		implements SourceEditorAddon, VerifyKeyListener {
 	
 	
-	private final ISourceEditor editor;
+	private final SourceEditor editor;
 	private final ITextEditorExtension3 editor3;
 	private final DocContentSections documentContentInfo;
 	private final SourceViewer viewer;
@@ -65,7 +65,7 @@
 	private boolean ignoreCommands= false;
 	
 	
-	public AbstractAutoEditStrategy(final ISourceEditor editor) {
+	public AbstractAutoEditStrategy(final SourceEditor editor) {
 		assert (editor != null);
 		
 		this.editor= editor;
@@ -76,7 +76,7 @@
 	}
 	
 	
-	public final ISourceEditor getEditor() {
+	public final SourceEditor getEditor() {
 		return this.editor;
 	}
 	
@@ -92,13 +92,13 @@
 		return this.viewer;
 	}
 	
-	protected abstract ISmartInsertSettings getSettings();
+	protected abstract SmartInsertSettings getSettings();
 	
 	protected abstract IIndentSettings getCodeStyleSettings();
 	
 	
 	@Override
-	public void install(final ISourceEditor editor) {
+	public void install(final SourceEditor editor) {
 		assert (editor.getViewer() == this.viewer);
 		this.viewer.prependVerifyKeyListener(this);
 	}
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 c790279..5361998 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
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import java.util.Map;
 
 import org.eclipse.core.runtime.NullProgressMonitor;
@@ -30,6 +32,10 @@
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.ui.texteditor.IDocumentProvider;
 
+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.text.core.PartitionConstraint;
 
 import org.eclipse.statet.ltk.ast.core.util.AstSelection;
@@ -37,12 +43,13 @@
 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;
+import org.eclipse.statet.ltk.ui.SelectionWithElementInfoListener;
 
 
-public abstract class AbstractMarkOccurrencesProvider implements ISourceEditorAddon,
-		ISelectionWithElementInfoListener {
+@NonNullByDefault
+public abstract class AbstractMarkOccurrencesProvider implements SourceEditorAddon,
+		SelectionWithElementInfoListener {
 	
 	
 	private static final int CLEAR= -1;
@@ -55,11 +62,11 @@
 		public final AbstractDocument doc;
 		public SourceModelStamp stamp;
 		
-		private Annotation[] annotations;
-		private Point range;
+		private @NonNull Annotation[] annotations;
+		private @Nullable Point range;
 		
 		private int set= 0;
-		private Map<Annotation, Position> todo;
+		private @Nullable Map<Annotation, Position> todo;
 		
 		
 		RunData(final AbstractDocument doc, final SourceModelStamp stamp) {
@@ -70,8 +77,9 @@
 		
 		public boolean isValid() {
 			final Point currentSelection= AbstractMarkOccurrencesProvider.this.editor.currentSelection;
-			return (this.range != null && currentSelection.x >= this.range.x
-					&& currentSelection.x+currentSelection.y <= this.range.y
+			final var range= this.range;
+			return (range != null && currentSelection.x >= range.x
+					&& currentSelection.x + currentSelection.y <= range.y
 					&& this.doc.getModificationStamp() == this.stamp.getContentStamp() );
 		}
 		
@@ -106,24 +114,18 @@
 	private final PartitionConstraint toleratePartitions;
 	
 	private boolean isMarkEnabled;
-	private RunData lastRun;
+	private @Nullable RunData lastRun;
 	
 	
 	public AbstractMarkOccurrencesProvider(final SourceEditor1 editor,
 			final PartitionConstraint toleratePartitions) {
-		if (editor == null) {
-			throw new NullPointerException("editor");
-		}
-		if (toleratePartitions == null) {
-			throw new NullPointerException("validPartitions");
-		}
-		this.editor= editor;
+		this.editor= nonNullAssert(editor);
 		this.partitioning= this.editor.getDocumentContentInfo().getPartitioning();
-		this.toleratePartitions= toleratePartitions;
+		this.toleratePartitions= nonNullAssert(toleratePartitions);
 	}
 	
 	@Override
-	public void install(final ISourceEditor editor) {
+	public void install(final SourceEditor editor) {
 		this.isMarkEnabled= true;
 		this.editor.addPostSelectionWithElementInfoListener(this);
 	}
@@ -144,8 +146,8 @@
 	@Override
 	public void stateChanged(final LTKInputData state) {
 		final ISelection selection= state.getSelection();
-		final boolean ok= update((SourceUnit) state.getInputElement(), state.getAstSelection(),
-				(selection instanceof ITextSelection) ? (ITextSelection) selection : null );
+		final boolean ok= update((SourceUnit)state.getInputElement(), state.getAstSelection(),
+				(selection instanceof ITextSelection) ? (ITextSelection)selection : null );
 		if (!ok && state.isStillValid()) {
 			removeAnnotations();
 		}
@@ -154,11 +156,11 @@
 	/**
 	 * Updates the occurrences annotations based on the current selection.
 	 * 
-	 * @return <code>true</code> if the annotation is ok (still valid or updated), 
+	 * @return <code>true</code> if the annotation is ok (still valid or updated),
 	 *     otherwise <code>false</code>
 	 */
-	protected boolean update(final SourceUnit inputElement, final AstSelection astSelection,
-			final ITextSelection orgSelection) {
+	protected boolean update(final SourceUnit inputElement,
+			final @Nullable AstSelection astSelection, final @Nullable ITextSelection orgSelection) {
 		if (!this.isMarkEnabled) {
 			return false;
 		}
@@ -172,7 +174,8 @@
 			if (run.doc == null) {
 				return false;
 			}
-			if (this.lastRun != null && this.lastRun.isValid() && this.lastRun.stamp.equals(run.stamp)) {
+			final var lastRun= this.lastRun;
+			if (lastRun != null && lastRun.isValid() && lastRun.stamp.equals(run.stamp)) {
 				return true;
 			}
 			
@@ -205,13 +208,14 @@
 	}
 	
 	protected abstract void doUpdate(RunData run, SourceUnitModelInfo info,
-			AstSelection astSelection, ITextSelection orgSelection) 
+			AstSelection astSelection, @Nullable ITextSelection orgSelection)
 			throws BadLocationException, BadPartitioningException, UnsupportedOperationException;
 	
 	
-	protected void checkKeep(final RunData run, final ITextSelection selection)
+	protected void checkKeep(final RunData run, final @Nullable ITextSelection selection)
 			throws BadLocationException, BadPartitioningException {
-		if (this.lastRun == null || !this.lastRun.stamp.equals(run.stamp)) {
+		final var lastRun= this.lastRun;
+		if (lastRun == null || !lastRun.stamp.equals(run.stamp)) {
 			run.clear();
 			return;
 		}
@@ -242,7 +246,7 @@
 			throw new UnsupportedOperationException();
 		}
 		final IAnnotationModel annotationModel= documentProvider.getAnnotationModel(
-				this.editor.getEditorInput());
+				this.editor.getEditorInput() );
 		if (annotationModel == null || !(annotationModel instanceof IAnnotationModelExtension)) {
 			throw new UnsupportedOperationException();
 		}
@@ -256,17 +260,20 @@
 		
 		// Add occurrence annotations
 		final IAnnotationModel annotationModel= getAnnotationModel();
-//			create diff ?
-//			if (this.lastRun != null && Arrays.equals(run.name, this.lastRun.name)) {
-//			}
-		final Annotation[] lastAnnotations= (this.lastRun != null) ? this.lastRun.annotations : null;
+		
+		final var lastRun= this.lastRun;
+		final Map<Annotation, Position> annotationMap= nonNullAssert(run.todo);
+//		create diff ?
+//		if (lastRun != null && Arrays.equals(run.name, lastRun.name)) {
+//		}
+		run.annotations= annotationMap.keySet().toArray(new @NonNull Annotation[annotationMap.keySet().size()]);
+		run.todo= null;
 		synchronized (SourceEditor1.getLockObject(annotationModel)) {
 			if (!run.isValid()) {
 				return;
 			}
-			((IAnnotationModelExtension) annotationModel).replaceAnnotations(lastAnnotations, run.todo);
-			run.annotations= run.todo.keySet().toArray(new Annotation[run.todo.keySet().size()]);
-			run.todo= null;
+			((IAnnotationModelExtension)annotationModel).replaceAnnotations(
+					(lastRun != null) ? lastRun.annotations : null, annotationMap );
 			this.lastRun= run;
 		}
 	}
@@ -274,11 +281,12 @@
 	protected void removeAnnotations() {
 		final IAnnotationModel annotationModel= getAnnotationModel();
 		synchronized (SourceEditor1.getLockObject(annotationModel)) {
-			if (this.lastRun == null) {
+			final var lastRun= this.lastRun;
+			if (lastRun == null) {
 				return;
 			}
-			((IAnnotationModelExtension) annotationModel).replaceAnnotations(this.lastRun.annotations, null);
 			this.lastRun= null;
+			((IAnnotationModelExtension)annotationModel).replaceAnnotations(lastRun.annotations, null);
 		}
 	}
 	
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 660f220..78a12d5 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
@@ -42,7 +42,7 @@
 
 
 /**
- * Reconciler for {@link ISourceEditor}s using Eclipse Job API.
+ * Reconciler for {@link SourceEditor}s using Eclipse Job API.
  */
 public class EcoReconciler2 implements IReconciler {
 	
@@ -168,7 +168,7 @@
 	/** The text viewer */
 	private ITextViewer viewer;
 	/** optional editor */
-	private ISourceEditor editor;
+	private SourceEditor editor;
 	
 	/** Tells whether this reconciler's editor is active. */
 	private volatile boolean isEditorVisible;
@@ -189,7 +189,7 @@
 	/**
 	 * Creates a new reconciler without configuring it.
 	 */
-	public EcoReconciler2(final ISourceEditor editor) {
+	public EcoReconciler2(final SourceEditor editor) {
 		super();
 		this.editor= editor;
 	}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EditorInformationProvider.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EditorInformationProvider.java
index d718efd..d403dd1 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EditorInformationProvider.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EditorInformationProvider.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import java.lang.reflect.InvocationTargetException;
 import java.util.concurrent.atomic.AtomicReference;
 
@@ -53,21 +55,21 @@
 		implements IInformationProvider, IInformationProviderExtension, IInformationProviderExtension2 {
 	
 	
-	private final ISourceEditor editor;
+	private final SourceEditor editor;
 	
 	private final ImList<? extends InfoHover> hovers;
 	
 	private volatile @Nullable InfoHover bestHover;
 	
 	
-	public EditorInformationProvider(final ISourceEditor editor,
+	public EditorInformationProvider(final SourceEditor editor,
 			final ImList<? extends InfoHover> hovers) {
 		this.editor= editor;
 		this.hovers= hovers;
 	}
 	
 	
-	public ISourceEditor getEditor() {
+	public SourceEditor getEditor() {
 		return this.editor;
 	}
 	
@@ -93,7 +95,8 @@
 					final AtomicReference<Object> info= new AtomicReference<>();
 					if (Display.getCurrent() != null) {
 						try {
-							final IProgressService progressService= this.editor.getServiceLocator().getService(IProgressService.class);
+							final IProgressService progressService= nonNullAssert(this.editor
+									.getServiceLocator().getService(IProgressService.class) );
 							progressService.run(true, true, new IRunnableWithProgress() {
 								@Override
 								public void run(final IProgressMonitor monitor)
@@ -132,7 +135,8 @@
 		return null;
 	}
 	
-	protected abstract @Nullable AssistInvocationContext createContext(IRegion region, String contentType,
+	protected abstract @Nullable AssistInvocationContext createContext(IRegion region,
+			String contentType,
 			IProgressMonitor monitor );
 	
 	private void getInfo0(final AssistInvocationContext context,
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 8cc79a0..87cfc28 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
@@ -69,11 +69,10 @@
 	}
 	
 	
-	protected ISourceEditor getEditor() {
+	protected SourceEditor getEditor() {
 		return this.sourceEditorConfig.getSourceEditor();
 	}
 	
-	@SuppressWarnings("null")
 	protected boolean ensureHover() {
 		InfoHover hover= this.hover;
 		if (hover == null) {
@@ -111,11 +110,11 @@
 	
 	@Override
 	public @Nullable Object getHoverInfo2(final ITextViewer textViewer, final IRegion hoverRegion) {
-		final ISourceEditor editor= getEditor();
+		final SourceEditor editor= getEditor();
 		if (editor != null && ensureHover()) {
 			try {
 				final String contentType= (hoverRegion instanceof TypedRegion) ?
-						((TypedRegion) hoverRegion).getType() :
+						((TypedRegion)hoverRegion).getType() :
 						TextUtils.getContentType(editor.getViewer().getDocument(),
 								editor.getDocumentContentInfo(), hoverRegion.getOffset(),
 								hoverRegion.getLength() == 0 );
@@ -142,7 +141,8 @@
 		return null;
 	}
 	
-	protected abstract @Nullable AssistInvocationContext createContext(IRegion region, String contentType,
+	protected abstract @Nullable AssistInvocationContext createContext(IRegion region,
+			String contentType,
 			IProgressMonitor monitor );
 	
 	private void getInfo0(final AssistInvocationContext context,
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/FoldingActionGroup.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/FoldingActionGroup.java
index 6d4dba0..e503bc6 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/FoldingActionGroup.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/FoldingActionGroup.java
@@ -132,20 +132,28 @@
 	public void fillMenu(final IMenuManager menuManager) {
 		if (this.viewer != null) {
 			update();
-			menuManager.add(new CommandContributionItem(new CommandContributionItemParameter(
-					this.editor.getSite(), null, IFoldingCommandIds.FOLDING_TOGGLE, null, 
-					null, null, null,
-					EditingMessages.CodeFolding_Enable_label, EditingMessages.CodeFolding_Enable_mnemonic, null, SWT.CHECK, null, false) ));
+			final var site= this.editor.getSite();
+			
+			menuManager.add(new CommandContributionItem(
+					new CommandContributionItemParameter(site,
+							null, IFoldingCommandIds.FOLDING_TOGGLE, null,
+							null, null, null,
+							EditingMessages.CodeFolding_Enable_label, EditingMessages.CodeFolding_Enable_mnemonic, null,
+							SWT.CHECK, null, false )));
 			menuManager.add(new Separator());
-			menuManager.add(new HandlerContributionItem(new CommandContributionItemParameter(
-					this.editor.getSite(), null, IFoldingCommandIds.FOLDING_EXPAND_ALL, null, 
-					null, null, null,
-					EditingMessages.CodeFolding_ExpandAll_label, EditingMessages.CodeFolding_ExpandAll_mnemonic, null, SWT.CHECK, null, false),
+			menuManager.add(new HandlerContributionItem(
+					new CommandContributionItemParameter(site,
+							null, IFoldingCommandIds.FOLDING_EXPAND_ALL, null,
+							null, null, null,
+							EditingMessages.CodeFolding_ExpandAll_label, EditingMessages.CodeFolding_ExpandAll_mnemonic, null,
+							SWT.CHECK, null, false ),
 					this.expandAll ));
-			menuManager.add(new HandlerContributionItem(new CommandContributionItemParameter(
-					this.editor.getSite(), null, IFoldingCommandIds.FOLDING_COLLAPSE_ALL, null, 
-					null, null, null,
-					EditingMessages.CodeFolding_CollapseAll_label, EditingMessages.CodeFolding_CollapseAll_mnemonic, null, SWT.CHECK, null, false),
+			menuManager.add(new HandlerContributionItem(
+					new CommandContributionItemParameter(site,
+							null, IFoldingCommandIds.FOLDING_COLLAPSE_ALL, null,
+							null, null, null,
+							EditingMessages.CodeFolding_CollapseAll_label, EditingMessages.CodeFolding_CollapseAll_mnemonic, null,
+							SWT.CHECK, null, false ),
 					this.collapseAll ));
 		}
 	}
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 949a53b..d78a6a6 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
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import org.eclipse.core.filebuffers.IDocumentSetupParticipant;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -60,10 +62,7 @@
 	
 	public FragmentDocumentProvider(final String modelTypeId,
 			final PartitionerDocumentSetupParticipant documentSetupParticipant) {
-		if (modelTypeId == null) {
-			throw new NullPointerException("modelTypeId"); //$NON-NLS-1$
-		}
-		this.modelTypeId= modelTypeId;
+		this.modelTypeId= nonNullAssert(modelTypeId);
 		this.documentSetupParticipant= documentSetupParticipant;
 	}
 	
@@ -72,8 +71,8 @@
 	protected @Nullable ElementInfo createElementInfo(final Object element) throws CoreException {
 		SourceUnit su= null;
 		AbstractDocument document= null;
-		if (element instanceof ISourceFragmentEditorInput) {
-			final ISourceFragmentEditorInput fragmentInput= ((ISourceFragmentEditorInput) element);
+		if (element instanceof SourceFragmentEditorInput) {
+			final SourceFragmentEditorInput fragmentInput= (SourceFragmentEditorInput)element;
 			
 			final SubMonitor m= SubMonitor.convert(getProgressMonitor(), 2);
 			try {
@@ -100,8 +99,8 @@
 	
 	@Override
 	protected @Nullable AbstractDocument createDocument(final Object element) throws CoreException {
-		if (element instanceof ISourceFragmentEditorInput) {
-			final SourceFragment fragment= ((ISourceFragmentEditorInput) element).getSourceFragment();
+		if (element instanceof SourceFragmentEditorInput) {
+			final SourceFragment fragment= ((SourceFragmentEditorInput)element).getSourceFragment();
 			return fragment.getDocument();
 		}
 		return null;
@@ -130,7 +129,7 @@
 	
 	@Override
 	protected void disposeElementInfo(final Object element, final ElementInfo elementInfo) {
-		final SourceElementInfo info= (SourceElementInfo) elementInfo;
+		final SourceElementInfo info= (SourceElementInfo)elementInfo;
 		if (info.workingCopy != null) {
 			final SubMonitor m= SubMonitor.convert(getProgressMonitor(), 1);
 			try {
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/MultiContentSectionSourceViewerConfiguration.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/MultiContentSectionSourceViewerConfiguration.java
index c684cc2..907120d 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/MultiContentSectionSourceViewerConfiguration.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/MultiContentSectionSourceViewerConfiguration.java
@@ -139,7 +139,7 @@
 	
 	
 	public MultiContentSectionSourceViewerConfiguration(final DocContentSections sections, final int flags,
-			final ISourceEditor sourceEditor) {
+			final SourceEditor sourceEditor) {
 		super(sections, flags, sourceEditor);
 		
 		this.sections= sections;
@@ -202,8 +202,8 @@
 	
 	
 	@Override
-	public List<ISourceEditorAddon> getAddOns() {
-		final List<ISourceEditorAddon> addOns= super.getAddOns();
+	public List<SourceEditorAddon> getAddOns() {
+		final List<SourceEditorAddon> addOns= super.getAddOns();
 		
 		addOns.addAll(this.primaryConfig.getAddOns());
 		for (final SourceEditorViewerConfiguration config : this.secondaryConfigs.values()) {
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 725f75a..4eaa350 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
@@ -33,7 +33,7 @@
 public class OutlineContentProvider implements ITreeContentProvider {
 	
 	
-	private static final SourceStructElement[] NO_CHILDREN= new SourceStructElement[0];
+	private static final @NonNull SourceStructElement<?, ?>[] NO_CHILDREN= new @NonNull SourceStructElement[0];
 	
 	
 	public interface OutlineContent {
@@ -73,7 +73,7 @@
 	
 	protected SourceStructElement[] getElements(final @Nullable SourceUnitModelInfo modelInfo) {
 		if (modelInfo != null) {
-			final List<? extends SourceStructElement> children= modelInfo.getSourceElement()
+			final List<? extends SourceStructElement<?, ?>> children= modelInfo.getSourceElement()
 					.getSourceChildren(getContent().getContentFilter());
 			return children.toArray(new @NonNull SourceStructElement[children.size()]);
 		}
@@ -100,7 +100,7 @@
 	
 	
 	@Override
-	public Object[] getElements(final Object inputElement) {
+	public @NonNull Object[] getElements(final Object inputElement) {
 		return getElements(getContent().getModelInfo(inputElement));
 	}
 	
@@ -115,7 +115,7 @@
 	}
 	
 	@Override
-	public Object[] getChildren(final Object element) {
+	public @NonNull Object[] getChildren(final Object element) {
 		return getChildren((SourceStructElement<?, ?>)element);
 	}
 	
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 54bb7e1..3eb46ef 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
@@ -23,6 +23,9 @@
 import org.eclipse.jface.text.information.IInformationProviderExtension;
 import org.eclipse.jface.text.information.IInformationProviderExtension2;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.core.JFaceTextRegion;
 
 import org.eclipse.statet.ltk.model.core.LtkModelUtils;
@@ -32,12 +35,13 @@
 import org.eclipse.statet.ltk.ui.LTKUI;
 
 
+@NonNullByDefault
 public abstract class QuickInformationProvider implements IInformationProvider,
 		IInformationProviderExtension, IInformationProviderExtension2 {
 	
 	// see IJavaEditorActionDefinitionIds
 	
-	public static String viewerOperation2commandId(final int operation) {
+	private static String textOperation2commandId(final int operation) {
 		switch (operation) {
 		case SourceEditorViewer.SHOW_SOURCE_OUTLINE:
 			return LTKUI.SHOW_QUICK_SOURCE_OUTLINE_COMMAND_ID;
@@ -51,21 +55,21 @@
 	}
 	
 	
-	private final ISourceEditor editor;
+	private final SourceEditor editor;
 	
 	private final String modelTypeId;
 	
 	private final String commandId;
 	
-	private IInformationControlCreator creator;
+	private @Nullable IInformationControlCreator creator;
 	
 	
-	public QuickInformationProvider(final ISourceEditor editor, final String modelType,
-			final int viewerOperation) {
-		this(editor, modelType, viewerOperation2commandId(viewerOperation));
+	public QuickInformationProvider(final SourceEditor editor, final String modelType,
+			final int textOperation) {
+		this(editor, modelType, textOperation2commandId(textOperation));
 	}
 	
-	public QuickInformationProvider(final ISourceEditor editor, final String modelType,
+	public QuickInformationProvider(final SourceEditor editor, final String modelType,
 			final String commandId) {
 		this.editor= editor;
 		this.modelTypeId= modelType;
@@ -73,7 +77,7 @@
 	}
 	
 	
-	public ISourceEditor getEditor() {
+	public SourceEditor getEditor() {
 		return this.editor;
 	}
 	
@@ -92,12 +96,12 @@
 	}
 	
 	@Override
-	public String getInformation(final ITextViewer textViewer, final IRegion subject) {
+	public @Nullable String getInformation(final ITextViewer textViewer, final IRegion subject) {
 		return null;
 	}
 	
 	@Override
-	public Object getInformation2(final ITextViewer textViewer, final IRegion subject) {
+	public @Nullable Object getInformation2(final ITextViewer textViewer, final IRegion subject) {
 		final SourceUnit su= this.editor.getSourceUnit();
 		if (su == null) {
 			return null;
@@ -113,10 +117,12 @@
 	
 	@Override
 	public IInformationControlCreator getInformationPresenterControlCreator() {
-		if (this.creator == null) {
-			this.creator= createInformationPresenterControlCreator();
+		var creator= this.creator;
+		if (creator == null) {
+			creator= createInformationPresenterControlCreator();
+			this.creator= creator;
 		}
-		return this.creator;
+		return creator;
 	}
 	
 	protected abstract IInformationControlCreator createInformationPresenterControlCreator();
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISmartInsertSettings.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SmartInsertSettings.java
similarity index 86%
rename from ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISmartInsertSettings.java
rename to ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SmartInsertSettings.java
index 2ee4a20..cb5cf02 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISmartInsertSettings.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SmartInsertSettings.java
@@ -14,20 +14,23 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
-public interface ISmartInsertSettings {
+
+@NonNullByDefault
+public interface SmartInsertSettings {
 	
 	
 	enum TabAction {
 		INSERT_TAB_CHAR,
 		INSERT_TAB_LEVEL,
 		INSERT_INDENT_LEVEL,
-		CORRECT_INDENT,
+		CORRECT_INDENT;
 	}
 	
 	enum HardWrapMode {
 		UPTO_CURSOR,
-		MERGE
+		MERGE;
 	}
 	
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SmartInsertSettingsUI.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SmartInsertSettingsUI.java
index 613a85d..4801e2a 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SmartInsertSettingsUI.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SmartInsertSettingsUI.java
@@ -16,16 +16,20 @@
 
 import org.eclipse.jface.viewers.LabelProvider;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
+
+@NonNullByDefault
 public class SmartInsertSettingsUI {
 	
 	
 	public static class SettingsLabelProvider extends LabelProvider {
 		
 		@Override
-		public String getText(final Object element) {
-			if (element instanceof ISmartInsertSettings.TabAction) {
-				switch ((ISmartInsertSettings.TabAction) element) {
+		public String getText(final @Nullable Object element) {
+			if (element instanceof SmartInsertSettings.TabAction) {
+				switch ((SmartInsertSettings.TabAction) element) {
 				case INSERT_TAB_CHAR:
 					return "Insert Tab Char";
 				case INSERT_TAB_LEVEL:
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SnippetEditor.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SnippetEditor.java
index b4a2d82..f2dfb00 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SnippetEditor.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SnippetEditor.java
@@ -45,6 +45,9 @@
 import org.eclipse.ui.texteditor.ITextEditorActionConstants;
 import org.eclipse.ui.texteditor.IUpdate;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.preferences.ui.SettingsUpdater;
 import org.eclipse.statet.ecommons.text.ui.TextViewerAction;
 import org.eclipse.statet.ecommons.text.ui.TextViewerEditorColorUpdater;
@@ -59,6 +62,7 @@
 /**
  * Text snippet editor (no Eclipse editor) supporting {@link SourceEditorViewerConfigurator}.
  */
+@NonNullByDefault
 public class SnippetEditor extends Object {
 	
 	public static final int DEFAULT_SINGLE_LINE_STYLE= SWT.BORDER | SWT.SINGLE | SWT.LEFT_TO_RIGHT;
@@ -68,7 +72,7 @@
 	private static class ExtStyledText extends StyledText {
 		
 		
-		private Color savedColor;
+		private @Nullable Color savedColor;
 		
 		
 		public ExtStyledText(final Composite parent, final int style) {
@@ -77,7 +81,7 @@
 		
 		
 		@Override
-		public void setBackground(final Color color) {
+		public void setBackground(final @Nullable Color color) {
 			this.savedColor= color;
 			if (isEnabled()) {
 				super.setBackground(color);
@@ -153,15 +157,16 @@
 	private Updater updater;
 	
 	private final HandlerCollection handlers;
-	private final IServiceLocator serviceLocator;
+	private final @Nullable IServiceLocator serviceLocator;
 	private ControlServicesUtil serviceUtil;
 	
 	
 	/**
 	 * Creates snippet editor with initial content.
 	 */
-	public SnippetEditor(final SourceEditorViewerConfigurator configurator, final String initialContent,
-			final IServiceLocator serviceParent, final boolean withToolButton) {
+	public SnippetEditor(final SourceEditorViewerConfigurator configurator,
+			final @Nullable String initialContent,
+			final @Nullable IServiceLocator serviceParent, final boolean withToolButton) {
 		this.configurator= configurator;
 		this.document= (initialContent != null) ? new Document(initialContent) : new Document();
 		this.configurator.getDocumentSetupParticipant().setup(this.document);
@@ -186,7 +191,7 @@
 	}
 	
 	
-	protected final IServiceLocator getServiceLocator() {
+	protected final @Nullable IServiceLocator getServiceLocator() {
 		return this.serviceLocator;
 	}
 	
@@ -282,7 +287,8 @@
 		this.globalActions= new HashMap<>(10);
 		
 		if (this.serviceLocator != null) {
-			this.serviceUtil= new ControlServicesUtil(this.serviceLocator, getClass().getName()+'#'+hashCode(), getSourceViewer().getControl());
+			this.serviceUtil= new ControlServicesUtil(this.serviceLocator,
+					getClass().getName() + '#'+hashCode(), getSourceViewer().getControl() );
 			this.serviceUtil.addControl(getSourceViewer().getControl());
 			if (this.toolButton != null) {
 				this.serviceUtil.addControl(this.toolButton.getButton());
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 bdcf27d..5476856 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
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import org.eclipse.core.filesystem.EFS;
 import org.eclipse.core.filesystem.IFileStore;
 import org.eclipse.core.resources.IFile;
@@ -54,14 +56,12 @@
 	
 	
 	private final String modelTypeId;
-	private final PartitionerDocumentSetupParticipant documentSetupParticipant;
+	private final @Nullable PartitionerDocumentSetupParticipant documentSetupParticipant;
 	
 	
-	public SourceDocumentProvider(final String modelTypeId, final PartitionerDocumentSetupParticipant documentSetupParticipant) {
-		if (modelTypeId == null) {
-			throw new NullPointerException("modelTypeId"); //$NON-NLS-1$
-		}
-		this.modelTypeId= modelTypeId;
+	public SourceDocumentProvider(final String modelTypeId,
+			final @Nullable PartitionerDocumentSetupParticipant documentSetupParticipant) {
+		this.modelTypeId= nonNullAssert(modelTypeId);
 		this.documentSetupParticipant= documentSetupParticipant;
 //		final IDocumentProvider provider= new ForwardingDocumentProvider(documentSetupParticipant.getPartitioningId(),
 //				this.documentSetupParticipant, new TextFileDocumentProvider());
@@ -148,6 +148,7 @@
 	}
 	
 	@Override
+	@SuppressWarnings("unchecked")
 	public @Nullable T getWorkingCopy(final Object element) {
 		final FileInfo fileInfo= getFileInfo(element);
 		if (fileInfo instanceof SourceFileInfo) {
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/SourceEditor.java
similarity index 96%
rename from ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISourceEditor.java
rename to ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditor.java
index 9de8640..5bf9d28 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/SourceEditor.java
@@ -35,7 +35,7 @@
  * A interface for source editors independent of IEditorPart
  */
 @NonNullByDefault
-public interface ISourceEditor extends IAdaptable {
+public interface SourceEditor extends IAdaptable {
 	
 	
 	/**
@@ -107,6 +107,6 @@
 	 */
 	void selectAndReveal(int offset, int length);
 	
-	@Nullable ITextEditToolSynchronizer getTextEditToolSynchronizer();
+	@Nullable TextEditToolSynchronizer getTextEditToolSynchronizer();
 	
 }
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 bf38193..60bb4f8 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
@@ -14,8 +14,9 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -78,10 +79,10 @@
 
 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.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.text.core.BasicTextRegion;
 import org.eclipse.statet.jcommons.text.core.TextRegion;
 
 import org.eclipse.statet.ecommons.preferences.PreferencesUtil;
@@ -106,13 +107,13 @@
 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.ISelectionWithElementInfoListener;
 import org.eclipse.statet.ltk.ui.LTKInputData;
 import org.eclipse.statet.ltk.ui.LTKUI;
 import org.eclipse.statet.ltk.ui.ModelElementInputProvider;
 import org.eclipse.statet.ltk.ui.PostSelectionCancelExtension;
 import org.eclipse.statet.ltk.ui.PostSelectionWithElementInfoController;
 import org.eclipse.statet.ltk.ui.PostSelectionWithElementInfoController.IgnoreActivation;
+import org.eclipse.statet.ltk.ui.SelectionWithElementInfoListener;
 import org.eclipse.statet.ltk.ui.sourceediting.actions.DeleteNextWordHandler;
 import org.eclipse.statet.ltk.ui.sourceediting.actions.DeletePreviousWordHandler;
 import org.eclipse.statet.ltk.ui.sourceediting.actions.GotoMatchingBracketHandler;
@@ -122,12 +123,14 @@
 import org.eclipse.statet.ltk.ui.sourceediting.actions.SelectPreviousWordHandler;
 import org.eclipse.statet.ltk.ui.sourceediting.actions.SpecificContentAssistHandler;
 import org.eclipse.statet.ltk.ui.sourceediting.actions.ToggleCommentHandler;
+import org.eclipse.statet.ltk.ui.util.LTKSelectionUtils;
 
 
 /**
  * Abstract LTK based source editor.
  */
-public abstract class SourceEditor1 extends TextEditor implements ISourceEditor,
+@NonNullByDefault
+public abstract class SourceEditor1 extends TextEditor implements SourceEditor,
 			SettingsChangeNotifier.ChangeListener, IPreferenceChangeListener,
 			IShowInSource, IShowInTargetList {
 	
@@ -146,7 +149,7 @@
 	@Deprecated
 	protected static IProjectNature getProject(final IEditorInput input, final String projectNatureId) {
 		if (input != null && input instanceof IFileEditorInput) {
-			final IProject project= ((IFileEditorInput) input).getFile().getProject();
+			final IProject project= ((IFileEditorInput)input).getFile().getProject();
 			try {
 				if (project != null && project.hasNature(projectNatureId)) {
 					return project.getNature(projectNatureId);
@@ -165,7 +168,7 @@
 	 */
 	protected static final Object getLockObject(final IAnnotationModel annotationModel) {
 		if (annotationModel instanceof ISynchronizable) {
-			final Object lock= ((ISynchronizable) annotationModel).getLockObject();
+			final Object lock= ((ISynchronizable)annotationModel).getLockObject();
 			if (lock != null) {
 				return lock;
 			}
@@ -207,7 +210,7 @@
 		}
 	}
 	
-	private class EffectSynchonizer implements ITextEditToolSynchronizer, ILinkedModeListener {
+	private class EffectSynchonizer implements TextEditToolSynchronizer, ILinkedModeListener {
 		
 		private EffectSynchonizer() {
 		}
@@ -215,15 +218,19 @@
 		@Override
 		public void install(final LinkedModeModel model) {
 			SourceEditor1.this.effectSynchonizerCounter++;
-			if (SourceEditor1.this.markOccurrencesProvider != null) {
-				SourceEditor1.this.markOccurrencesProvider.uninstall();
+			
+			final var markOccurrencesProvider= SourceEditor1.this.markOccurrencesProvider;
+			if (markOccurrencesProvider != null) {
+				markOccurrencesProvider.uninstall();
 			}
+			
 			model.addLinkingListener(this);
 		}
 		
 		@Override
 		public void left(final LinkedModeModel model, final int flags) {
 			SourceEditor1.this.effectSynchonizerCounter--;
+			
 			updateMarkOccurrencesEnablement();
 		}
 		
@@ -245,26 +252,26 @@
 	
 	private SourceEditorViewerConfigurator configurator;
 	private boolean lazySetup;
-	private SourceUnit sourceUnit;
+	private @Nullable SourceUnit sourceUnit;
 	private ElementInfoController modelProvider;
-	private PostSelectionWithElementInfoController modelPostSelection;
+	private @Nullable PostSelectionWithElementInfoController modelPostSelection;
 	protected volatile Point currentSelection;
 	
 	/** The outline page of this editor */
-	private SourceEditor1OutlinePage outlinePage;
+	private @Nullable SourceEditor1OutlinePage outlinePage;
 	
 	/** The templates page of this editor */
-	private ITemplatesPage templatesPage;
+	private @Nullable ITemplatesPage templatesPage;
 	
 	private StructureSelectionHistory selectionHistory;
-	private Preference<Boolean> foldingEnablement;
+	private @Nullable Preference<Boolean> foldingEnablement;
 	private ProjectionSupport foldingSupport;
-	private ISourceEditorAddon foldingProvider;
-	private FoldingActionGroup foldingActionGroup;
-	private Preference<Boolean> markOccurrencesEnablement;
-	private ISourceEditorAddon markOccurrencesProvider;
+	private @Nullable SourceEditorAddon foldingProvider;
+	private @Nullable FoldingActionGroup foldingActionGroup;
+	private @Nullable Preference<Boolean> markOccurrencesEnablement;
+	private @Nullable SourceEditorAddon markOccurrencesProvider;
 	
-	private EffectSynchonizer effectSynchronizer;
+	private @Nullable EffectSynchonizer effectSynchronizer;
 	private int effectSynchonizerCounter;
 	
 	private final CopyOnWriteIdentityListSet<IUpdate> contentUpdateables= new CopyOnWriteIdentityListSet<>();
@@ -273,7 +280,7 @@
 	private boolean inputChange;
 	private int inputUpdate= Integer.MAX_VALUE;
 	
-	private ImageDescriptor imageDescriptor;
+	private @Nullable ImageDescriptor imageDescriptor;
 	
 	
 /*- Contructors ------------------------------------------------------------*/
@@ -320,14 +327,14 @@
 	
 	protected abstract SourceEditorViewerConfigurator createConfiguration();
 	
-	protected SourceEditorViewerConfigurator createInfoConfigurator() {
+	protected @Nullable SourceEditorViewerConfigurator createInfoConfigurator() {
 		return null;
 	}
 	
 	
 	protected void enableStructuralFeatures(final ModelManager modelManager,
-			final Preference<Boolean> codeFoldingEnablement,
-			final Preference<Boolean> markOccurrencesEnablement) {
+			final @Nullable Preference<Boolean> codeFoldingEnablement,
+			final @Nullable Preference<Boolean> markOccurrencesEnablement) {
 		this.modelProvider= new ElementInfoController(modelManager, Ltk.EDITOR_CONTEXT);
 		this.foldingEnablement= codeFoldingEnablement;
 		this.markOccurrencesEnablement= markOccurrencesEnablement;
@@ -344,21 +351,22 @@
 	 * 
 	 * @param descriptor the image description of the icon or <code>null</code>
 	 */
-	protected void overwriteTitleImage(final ImageDescriptor descriptor) {
-		if (this.imageDescriptor == descriptor || (this.imageDescriptor == null && descriptor == null) ) {
+	protected void overwriteTitleImage(final @Nullable ImageDescriptor descriptor) {
+		final var oldDescriptor= this.imageDescriptor;
+		if (oldDescriptor == descriptor) {
 			return;
 		}
-		if (this.imageDescriptor != null) {
-			JFaceResources.getResources().destroyImage(this.imageDescriptor);
+		if (oldDescriptor != null) {
+			JFaceResources.getResources().destroyImage(oldDescriptor);
 		}
 		this.imageDescriptor= descriptor;
-		if (this.imageDescriptor != null) {
+		if (descriptor != null) {
 			super.setTitleImage(JFaceResources.getResources().createImage(descriptor));
 		}
 	}
 	
 	@Override
-	protected void setTitleImage(final Image titleImage) {
+	protected void setTitleImage(final @Nullable Image titleImage) {
 		if (this.imageDescriptor == null) {
 			super.setTitleImage(titleImage);
 		}
@@ -375,11 +383,11 @@
 	}
 	
 	@Override
-	protected String[] collectContextMenuPreferencePages() {
+	protected @NonNull String[] collectContextMenuPreferencePages() {
 		final List<String> list= new ArrayList<>();
 		collectContextMenuPreferencePages(list);
-		list.addAll(Arrays.asList(super.collectContextMenuPreferencePages()));
-		return list.toArray(new String[list.size()]);
+		list.addAll(ImCollections.newList(super.collectContextMenuPreferencePages()));
+		return list.toArray(new @NonNull String[list.size()]);
 	}
 	
 	protected void collectContextMenuPreferencePages(final List<String> pageIds) {
@@ -387,7 +395,7 @@
 	
 	
 	@Override
-	protected void doSetInput(final IEditorInput input) throws CoreException {
+	protected void doSetInput(final @Nullable IEditorInput input) throws CoreException {
 		if (this.modelProvider != null && this.sourceUnit != null) {
 			this.modelProvider.setInput(null);
 		}
@@ -412,8 +420,11 @@
 		
 		initSmartInsert();
 		
-		if (input != null && this.outlinePage != null) {
-			updateOutlinePageInput(this.outlinePage);
+		if (input != null) {
+			final var outlinePage= this.outlinePage;
+			if (outlinePage != null) {
+				updateOutlinePageInput(outlinePage);
+			}
 		}
 	}
 	
@@ -467,7 +478,7 @@
 	/**
 	 * Subclasses should setup the SourceViewerConfiguration.
 	 */
-	protected void setupConfiguration(final IEditorInput newInput) {
+	protected void setupConfiguration(final @Nullable IEditorInput newInput) {
 		final IDocumentProvider documentProvider= getDocumentProvider();
 		if (documentProvider instanceof DocumentModelProvider) {
 			this.sourceUnit= (newInput != null) ?
@@ -487,14 +498,14 @@
 	}
 	
 	@Override
-	public SourceUnit getSourceUnit() {
+	public @Nullable SourceUnit getSourceUnit() {
 		return this.sourceUnit;
 	}
 	
 	
 	@Override
 	public SourceViewer getViewer() {
-		return (SourceViewer) super.getSourceViewer();
+		return (SourceViewer)super.getSourceViewer();
 	}
 	
 	@Override
@@ -524,15 +535,17 @@
 		return this.modelProvider;
 	}
 	
-	public void addPostSelectionWithElementInfoListener(final ISelectionWithElementInfoListener listener) {
-		if (this.modelPostSelection != null) {
-			this.modelPostSelection.addListener(listener);
+	public void addPostSelectionWithElementInfoListener(final SelectionWithElementInfoListener listener) {
+		final var modelPostSelection= this.modelPostSelection;
+		if (modelPostSelection != null) {
+			modelPostSelection.addListener(listener);
 		}
 	}
 	
-	public void removePostSelectionWithElementInfoListener(final ISelectionWithElementInfoListener listener) {
-		if (this.modelPostSelection != null) {
-			this.modelPostSelection.removeListener(listener);
+	public void removePostSelectionWithElementInfoListener(final SelectionWithElementInfoListener listener) {
+		final var modelPostSelection= this.modelPostSelection;
+		if (modelPostSelection != null) {
+			modelPostSelection.removeListener(listener);
 		}
 	}
 	
@@ -542,9 +555,10 @@
 		super.createPartControl(parent);
 		
 		if (this.modelProvider != null) {
-			this.modelPostSelection= new PostSelectionWithElementInfoController(this.modelProvider,
-					(IPostSelectionProvider) getSelectionProvider(), new PostSelectionEditorCancel());
-			this.modelPostSelection.addListener(new ISelectionWithElementInfoListener() {
+			final var modelPostSelection= new PostSelectionWithElementInfoController(
+					this.modelProvider, (IPostSelectionProvider)getSelectionProvider(),
+					new PostSelectionEditorCancel() );
+			modelPostSelection.addListener(new SelectionWithElementInfoListener() {
 				@Override
 				public void inputChanged() {
 				}
@@ -559,9 +573,10 @@
 					}
 				}
 			});
+			this.modelPostSelection= modelPostSelection;
 		}
 		if (this.foldingEnablement != null) {
-			final ProjectionViewer viewer= (ProjectionViewer) getSourceViewer();
+			final ProjectionViewer viewer= (ProjectionViewer)getSourceViewer();
 			
 			this.foldingSupport= new ProjectionSupport(viewer, getAnnotationAccess(), getSharedColors());
 			final SourceEditorViewerConfigurator config= createInfoConfigurator();
@@ -569,13 +584,15 @@
 				final IInformationControlCreator presentationCreator= new IInformationControlCreator() {
 					@Override
 					public IInformationControl createInformationControl(final Shell parent) {
-						return new SourceViewerInformationControl(parent, createInfoConfigurator(), getOrientation());
+						return new SourceViewerInformationControl(parent,
+								createInfoConfigurator(), getOrientation() );
 					}
 				};
 				this.foldingSupport.setHoverControlCreator(new IInformationControlCreator() {
 					@Override
 					public IInformationControl createInformationControl(final Shell parent) {
-						return new SourceViewerInformationControl(parent, createInfoConfigurator(), getOrientation(), presentationCreator);
+						return new SourceViewerInformationControl(parent,
+								createInfoConfigurator(), getOrientation(), presentationCreator );
 					}
 				});
 				this.foldingSupport.setInformationPresenterControlCreator(presentationCreator);
@@ -607,7 +624,8 @@
 			this.configurator.setTarget(this);
 		}
 		
-		{	final IContextService contextService= getServiceLocator().getService(IContextService.class);
+		{	final IContextService contextService= nonNullAssert(
+					getServiceLocator().getService(IContextService.class) );
 			for (final String id : getContextIds()) {
 				contextService.activateContext(id);
 			}
@@ -632,11 +650,12 @@
 		return 0;
 	}
 	
-	protected IRegion getRangeToReveal(final SourceUnitModelInfo modelInfo, final SourceStructElement element) {
+	protected @Nullable IRegion getRangeToReveal(final SourceUnitModelInfo modelInfo,
+			final SourceStructElement<?, ?> element) {
 		return null;
 	}
 	
-	protected TextRegion getRangeToHighlight(final LTKInputData state) {
+	protected @Nullable TextRegion getRangeToHighlight(final LTKInputData state) {
 		final SourceUnitModelInfo info= state.getInputInfo();
 		if (info == null) {
 			return null;
@@ -649,7 +668,7 @@
 		
 		final AstNode root= info.getAst().getRoot();
 		TRY_AST: if (root != null) {
-			final ITextSelection selection= (ITextSelection) state.getSelection();
+			final ITextSelection selection= (ITextSelection)state.getSelection();
 			final int n= root.getChildCount();
 			for (int i= 0; i < n; i++) {
 				final AstNode child= root.getChild(i);
@@ -666,7 +685,8 @@
 		return null;
 	}
 	
-	protected TextRegion getRangeToHighlight(final SourceUnitModelInfo info, SourceStructElement element) {
+	protected @Nullable TextRegion getRangeToHighlight(final SourceUnitModelInfo info,
+			@Nullable SourceStructElement element) {
 		while (element != null) {
 			switch (element.getElementType() & LtkModelElement.MASK_C1) {
 			case LtkModelElement.C1_CLASS:
@@ -691,22 +711,24 @@
 	}
 	
 	
-	protected ISourceEditorAddon createCodeFoldingProvider() {
+	protected @Nullable SourceEditorAddon createCodeFoldingProvider() {
 		return null;
 	}
 	
 	private void installFoldingProvider() {
 		uninstallFoldingProvider();
-		this.foldingProvider= createCodeFoldingProvider();
-		if (this.foldingProvider != null) {
-			this.foldingProvider.install(this);
+		final var foldingProvider= createCodeFoldingProvider();
+		if (foldingProvider != null) {
+			foldingProvider.install(this);
+			this.foldingProvider= foldingProvider;
 		}
 	}
 	
 	private void uninstallFoldingProvider() {
-		if (this.foldingProvider != null) {
-			this.foldingProvider.uninstall();
+		final var foldingProvider= this.foldingProvider;
+		if (foldingProvider != null) {
 			this.foldingProvider= null;
+			foldingProvider.uninstall();
 		}
 	}
 	
@@ -715,8 +737,9 @@
 			UIAccess.getDisplay().asyncExec(new Runnable() {
 				@Override
 				public void run() {
-					final Boolean enable= PreferenceUtils.getInstancePrefs().getPreferenceValue(SourceEditor1.this.foldingEnablement);
-					final ProjectionViewer viewer= (ProjectionViewer) getSourceViewer();
+					final Boolean enable= PreferenceUtils.getInstancePrefs().getPreferenceValue(
+							SourceEditor1.this.foldingEnablement );
+					final ProjectionViewer viewer= (ProjectionViewer)getSourceViewer();
 					if (enable != null && UIAccess.isOkToUse(viewer)) {
 						if (enable != viewer.isProjectionMode()) {
 							viewer.doOperation(ProjectionViewer.TOGGLE);
@@ -728,14 +751,15 @@
 	}
 	
 	
-	protected ISourceEditorAddon createMarkOccurrencesProvider() {
+	protected @Nullable SourceEditorAddon createMarkOccurrencesProvider() {
 		return null;
 	}
 	
 	private void uninstallMarkOccurrencesProvider() {
-		if (this.markOccurrencesProvider != null) {
-			this.markOccurrencesProvider.uninstall();
+		final var markOccurrencesProvider= this.markOccurrencesProvider;
+		if (markOccurrencesProvider != null) {
 			this.markOccurrencesProvider= null;
+			markOccurrencesProvider.uninstall();
 		}
 	}
 	
@@ -744,13 +768,16 @@
 			UIAccess.getDisplay().asyncExec(new Runnable() {
 				@Override
 				public void run() {
-					final Boolean enable= PreferenceUtils.getInstancePrefs().getPreferenceValue(SourceEditor1.this.markOccurrencesEnablement);
+					final Boolean enable= PreferenceUtils.getInstancePrefs().getPreferenceValue(
+							SourceEditor1.this.markOccurrencesEnablement );
 					if (enable) {
-						if (SourceEditor1.this.markOccurrencesProvider == null) {
-							SourceEditor1.this.markOccurrencesProvider= createMarkOccurrencesProvider();
+						var provider= SourceEditor1.this.markOccurrencesProvider;
+						if (provider == null) {
+							provider= createMarkOccurrencesProvider();
+							SourceEditor1.this.markOccurrencesProvider= provider;
 						}
-						if (SourceEditor1.this.markOccurrencesProvider != null && SourceEditor1.this.effectSynchonizerCounter == 0) {
-							SourceEditor1.this.markOccurrencesProvider.install(SourceEditor1.this);
+						if (provider != null && SourceEditor1.this.effectSynchonizerCounter == 0) {
+							provider.install(SourceEditor1.this);
 						}
 					}
 					else {
@@ -771,7 +798,8 @@
 	@Override
 	protected void createActions() {
 		super.createActions();
-		final IHandlerService handlerService= getServiceLocator().getService(IHandlerService.class);
+		final IHandlerService handlerService= nonNullAssert(
+				getServiceLocator().getService(IHandlerService.class) );
 		final StyledText textWidget= getViewer().getTextWidget();
 		
 		{	final IHandler2 handler= new GotoNextWordHandler(this);
@@ -848,16 +876,16 @@
 	}
 	
 	protected FoldingActionGroup createFoldingActionGroup() {
-		return new FoldingActionGroup(this, (ProjectionViewer) getSourceViewer());
+		return new FoldingActionGroup(this, (ProjectionViewer)getSourceViewer());
 	}
 	
-	protected IHandler2 createToggleCommentHandler() {
+	protected @Nullable IHandler2 createToggleCommentHandler() {
 		final IHandler2 commentHandler= new ToggleCommentHandler(this);
 		markAsStateDependentHandler(commentHandler, true);
 		return commentHandler;
 	}
 	
-	protected IHandler2 createCorrectIndentHandler() {
+	protected @Nullable IHandler2 createCorrectIndentHandler() {
 		return null;
 	}
 	
@@ -882,7 +910,7 @@
 	@Override
 	protected void updateContentDependentActions() {
 		super.updateContentDependentActions();
-		for (final IUpdate handler : this.contentUpdateables.toList()) {
+		for (final IUpdate handler : this.contentUpdateables) {
 			handler.update();
 		}
 	}
@@ -890,8 +918,7 @@
 	@Override
 	protected void updateStateDependentActions() {
 		super.updateStateDependentActions();
-		final ImIdentityList<IHandler2> listeners= this.stateUpdateables.toList();
-		for (final IHandler2 handler : listeners) {
+		for (final IHandler2 handler : this.stateUpdateables) {
 			handler.setEnabled(this);
 		}
 	}
@@ -899,55 +926,63 @@
 	@Override
 	protected void rulerContextMenuAboutToShow(final IMenuManager menu) {
 		super.rulerContextMenuAboutToShow(menu);
-		if (this.foldingActionGroup != null) {
+		
+		final var foldingActionGroup= this.foldingActionGroup;
+		if (foldingActionGroup != null) {
 			final IMenuManager foldingMenu= new MenuManager(EditingMessages.CodeFolding_label, "projection"); //$NON-NLS-1$
 			menu.appendToGroup(ITextEditorActionConstants.GROUP_RULERS, foldingMenu);
-			this.foldingActionGroup.fillMenu(foldingMenu);
+			foldingActionGroup.fillMenu(foldingMenu);
 		}
 	}
 	
 	
 	@Override
-	public ITextEditToolSynchronizer getTextEditToolSynchronizer() {
-		if (this.effectSynchronizer == null) {
-			this.effectSynchronizer= new EffectSynchonizer();
+	public TextEditToolSynchronizer getTextEditToolSynchronizer() {
+		var effectSynchronizer= this.effectSynchronizer;
+		if (effectSynchronizer == null) {
+			effectSynchronizer= new EffectSynchonizer();
+			this.effectSynchronizer= effectSynchronizer;
 		}
-		return this.effectSynchronizer;
+		return effectSynchronizer;
 	}
 	
 	@Override
 	@SuppressWarnings("unchecked")
 	public <T> @Nullable T getAdapter(final Class<T> adapterType) {
-		if (adapterType == ISourceEditor.class) {
-			return (T) this;
+		if (adapterType == SourceEditor.class) {
+			return (T)this;
 		}
 		if (adapterType == ISourceViewer.class) {
-			return (T) getSourceViewer();
+			return (T)getSourceViewer();
 		}
 		
 		if (adapterType == IContentType.class) {
-			return (T) this.contentType;
+			return (T)this.contentType;
 		}
 		
 		if (adapterType == IContentOutlinePage.class) {
-			if (this.outlinePage == null) {
-				this.outlinePage= createOutlinePage();
-				if (this.outlinePage != null) {
-					updateOutlinePageInput(this.outlinePage);
+			var outlinePage= this.outlinePage;
+			if (outlinePage == null) {
+				outlinePage= createOutlinePage();
+				if (outlinePage != null) {
+					updateOutlinePageInput(outlinePage);
 				}
+				this.outlinePage= outlinePage;
 			}
-			return (T) this.outlinePage;
+			return (T)outlinePage;
 		}
 		if (adapterType == ITemplatesPage.class) {
-			if (this.templatesPage == null) {
-				this.templatesPage= createTemplatesPage();
+			var templatesPage= this.templatesPage;
+			if (templatesPage == null) {
+				templatesPage= createTemplatesPage();
+				this.templatesPage= templatesPage;
 			}
-			return (T) this.templatesPage;
+			return (T)templatesPage;
 		}
 		if (this.foldingSupport != null) {
 			final Object adapter= this.foldingSupport.getAdapter(getSourceViewer(), adapterType);
 			if (adapter != null) {
-				return (T) adapter;
+				return (T)adapter;
 			}
 		}
 		
@@ -997,7 +1032,7 @@
 	}
 	
 	
-	protected SourceEditor1OutlinePage createOutlinePage() {
+	protected @Nullable SourceEditor1OutlinePage createOutlinePage() {
 		return null;
 	}
 	
@@ -1005,25 +1040,29 @@
 	}
 	
 	void handleOutlinePageClosed() {
-		if (this.outlinePage != null) {
+		final var outlinePage= this.outlinePage;
+		if (outlinePage != null) {
 			this.outlinePage= null;
 			resetHighlightRange();
 		}
 	}
 	
-	protected ITemplatesPage createTemplatesPage() {
+	protected @Nullable ITemplatesPage createTemplatesPage() {
 		return null;
 	}
 	
 	
-	@Override
 	// inject annotation painter workaround
+	@Override
 	protected SourceViewerDecorationSupport getSourceViewerDecorationSupport(final ISourceViewer viewer) {
-		if (this.fSourceViewerDecorationSupport == null) {
-			this.fSourceViewerDecorationSupport= new org.eclipse.statet.ltk.ui.sourceediting.SourceViewerDecorationSupport(viewer, getOverviewRuler(), getAnnotationAccess(), getSharedColors());
-			configureSourceViewerDecorationSupport(this.fSourceViewerDecorationSupport);
+		var decorationSupport= this.fSourceViewerDecorationSupport;
+		if (decorationSupport == null) {
+			decorationSupport= new org.eclipse.statet.ltk.ui.sourceediting.SourceViewerDecorationSupport(
+					viewer, getOverviewRuler(), getAnnotationAccess(), getSharedColors() );
+			configureSourceViewerDecorationSupport(decorationSupport);
+			this.fSourceViewerDecorationSupport= decorationSupport;
 		}
-		return this.fSourceViewerDecorationSupport;
+		return decorationSupport;
 	}
 	
 	@Override
@@ -1032,14 +1071,16 @@
 	}
 	
 	@Override
-	protected void selectAndReveal(final int selectionStart, final int selectionLength, final int revealStart, final int revealLength) {
-		if (this.modelPostSelection != null) {
-			this.modelPostSelection.setUpdateOnSelection(true);
+	protected void selectAndReveal(final int selectionStart, final int selectionLength,
+			final int revealStart, final int revealLength) {
+		final var modelPostSelection= this.modelPostSelection;
+		if (modelPostSelection != null) {
+			modelPostSelection.setUpdateOnSelection(true);
 			try {
 				super.selectAndReveal(selectionStart, selectionLength, revealStart, revealLength);
 			}
 			finally {
-				this.modelPostSelection.setUpdateOnSelection(false);
+				modelPostSelection.setUpdateOnSelection(false);
 			}
 		}
 		else {
@@ -1047,9 +1088,10 @@
 		}
 	}
 	
-	public void setSelection(final ISelection selection, final ISelectionWithElementInfoListener listener) {
-		if (this.modelPostSelection != null && listener != null) {
-			final IgnoreActivation activation= this.modelPostSelection.ignoreNext(listener);
+	public void setSelection(final ISelection selection, final SelectionWithElementInfoListener listener) {
+		final var modelPostSelection= this.modelPostSelection;
+		if (modelPostSelection != null && listener != null) {
+			final IgnoreActivation activation= modelPostSelection.ignoreNext(listener);
 			doSetSelection(selection);
 			activation.deleteNext();
 		}
@@ -1061,28 +1103,22 @@
 	@Override
 	protected void doSetSelection(final ISelection selection) {
 		if (selection instanceof IStructuredSelection) {
-			final IStructuredSelection structured= (IStructuredSelection) selection;
+			final IStructuredSelection structured= (IStructuredSelection)selection;
 			if (!structured.isEmpty()) {
 				final Object first= structured.getFirstElement();
 				TextRegion region= null;
 				if (first instanceof SourceStructElement) {
-					final SourceStructElement sourceElement= (SourceStructElement) first;
-					region= sourceElement.getNameSourceRange();
-					if (region == null) {
-						region= sourceElement.getSourceRange();
-						if (region != null) {
-							region= new BasicTextRegion(region.getStartOffset());
-						}
-					}
+					final var sourceElement= (SourceStructElement<?, ?>)first;
+					region= LTKSelectionUtils.getRegionToSelect(sourceElement);
 					
-					final SourceUnit sourceUnit= sourceElement.getSourceUnit();
-					final SourceUnitModelInfo modelInfo= sourceUnit.getModelInfo(getModelTypeId(), 0, null);
+					final var sourceUnit= sourceElement.getSourceUnit();
+					final var modelInfo= sourceUnit.getModelInfo(getModelTypeId(), 0, null);
 					if (modelInfo != null) {
 						final IRegion toReveal= getRangeToReveal(modelInfo, sourceElement);
 						if (toReveal != null) {
 							final SourceViewer viewer= getViewer();
 							if (viewer instanceof ITextViewerExtension5) {
-								((ITextViewerExtension5) viewer).exposeModelRange(toReveal);
+								((ITextViewerExtension5)viewer).exposeModelRange(toReveal);
 							}
 							getViewer().revealRange(toReveal.getOffset(), toReveal.getLength());
 						}
@@ -1093,10 +1129,10 @@
 					}
 				}
 				if (region == null && first instanceof TextRegion) {
-					region= (TextRegion) first;
+					region= (TextRegion)first;
 				}
 				else if (region == null && first instanceof IRegion) {
-					region= JFaceTextRegion.toTextRegion((IRegion) first);
+					region= JFaceTextRegion.toTextRegion((IRegion)first);
 				}
 				
 				if (region != null) {
@@ -1117,18 +1153,25 @@
 		}
 		
 		PreferencesUtil.getSettingsChangeNotifier().removeChangeListener(this);
-		if (this.modelPostSelection != null) {
-			this.modelPostSelection.dispose();
+		{	final var modelPostSelection= this.modelPostSelection;
+			if (modelPostSelection != null) {
+				this.modelPostSelection= null;
+				modelPostSelection.dispose();
+			}
 		}
-		if (this.foldingEnablement != null) {
-			PreferenceUtils.getInstancePrefs().removePreferenceNodeListener(
-					this.foldingEnablement.getQualifier(), this);
-			uninstallFoldingProvider();
+		{	final var foldingEnablement= this.foldingEnablement;
+			if (foldingEnablement != null) {
+				PreferenceUtils.getInstancePrefs().removePreferenceNodeListener(
+						foldingEnablement.getQualifier(), this );
+				uninstallFoldingProvider();
 		}
-		if (this.markOccurrencesEnablement != null) {
-			PreferenceUtils.getInstancePrefs().removePreferenceNodeListener(
-					this.markOccurrencesEnablement.getQualifier(), this);
-			uninstallMarkOccurrencesProvider();
+		}
+		{	final var markOccurrencesEnablement= this.markOccurrencesEnablement;
+			if (markOccurrencesEnablement != null) {
+				PreferenceUtils.getInstancePrefs().removePreferenceNodeListener(
+						markOccurrencesEnablement.getQualifier(), this );
+				uninstallMarkOccurrencesProvider();
+			}
 		}
 		
 		super.dispose();
@@ -1140,7 +1183,6 @@
 		
 		this.sourceUnit= null;
 		this.modelProvider= null;
-		this.modelPostSelection= null;
 	}
 	
 	@Override
@@ -1156,8 +1198,9 @@
 	}
 	
 	@Override
-	public String[] getShowInTargetIds() {
-		return new String[] { IPageLayout.ID_PROJECT_EXPLORER };
+	public @NonNull String[] getShowInTargetIds() {
+		return new @NonNull String[] {
+			IPageLayout.ID_PROJECT_EXPLORER };
 	}
 	
 }
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 685ed75..3048d2c 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
@@ -46,6 +46,7 @@
 import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
 import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
 
+import org.eclipse.statet.jcommons.lang.NonNull;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
@@ -64,9 +65,9 @@
 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.ISelectionWithElementInfoListener;
 import org.eclipse.statet.ltk.ui.LTKInputData;
 import org.eclipse.statet.ltk.ui.ModelElementInputListener;
+import org.eclipse.statet.ltk.ui.SelectionWithElementInfoListener;
 
 
 /**
@@ -74,7 +75,7 @@
  */
 @NonNullByDefault
 public abstract class SourceEditor1OutlinePage extends BasicEditorOutlinePage
-		implements IContentOutlinePage, IAdaptable, ISourceEditorAssociated,
+		implements IContentOutlinePage, IAdaptable, SourceEditorAssociated,
 				IShowInSource, IShowInTargetList, IShowInTarget,
 				IPostSelectionProvider, ModelElementInputListener<LtkModelElement<?>> {
 	
@@ -109,7 +110,8 @@
 		@Override
 		public @Nullable SourceModelStamp getStamp(final Object inputElement) {
 			if (inputElement instanceof SourceUnit) {
-				final AstInfo ast= ((SourceUnit)inputElement).getAstInfo(SourceEditor1OutlinePage.this.mainType, false, null);
+				final AstInfo ast= ((SourceUnit)inputElement).getAstInfo(
+						SourceEditor1OutlinePage.this.mainType, false, null );
 				if (ast != null) {
 					return ast.getStamp();
 				}
@@ -118,15 +120,16 @@
 		}
 		
 		@Override
-		public Object[] getElements(final Object inputElement) {
+		public @NonNull Object[] getElements(final Object inputElement) {
 			if (inputElement instanceof SourceUnit) {
-				final AstInfo ast= ((SourceUnit)inputElement).getAstInfo(SourceEditor1OutlinePage.this.mainType, false, null); 
+				final AstInfo ast= ((SourceUnit)inputElement).getAstInfo(
+						SourceEditor1OutlinePage.this.mainType, false, null );
 				if (ast != null) {
 					SourceEditor1OutlinePage.this.currentModelStamp= ast.getStamp();
-					return new Object[] { ast.getRoot() };
+					return new @NonNull Object[] { ast.getRoot() };
 				}
 			}
-			return new Object[0];
+			return new @NonNull Object[0];
 		}
 		
 	}
@@ -180,7 +183,7 @@
 		
 	}
 	
-	private class SyncWithEditorAction extends ToggleAction implements ISelectionWithElementInfoListener {
+	private class SyncWithEditorAction extends ToggleAction implements SelectionWithElementInfoListener {
 		
 		public SyncWithEditorAction() {
 			super("sync.editor", true, 0); //$NON-NLS-1$
@@ -312,8 +315,8 @@
 		
 		menuManager.add(this.syncWithEditorAction);
 		
-		final IContextService service= serviceLocator.getService(IContextService.class);
-		service.activateContext("org.eclipse.statet.ltk.contexts.EditSource1MenuSet"); //$NON-NLS-1$
+		final IContextService contextService= nonNullAssert(serviceLocator.getService(IContextService.class));
+		contextService.activateContext("org.eclipse.statet.ltk.contexts.EditSource1MenuSet"); //$NON-NLS-1$
 	}
 	
 	@Override
@@ -436,8 +439,8 @@
 	}
 	
 	@Override
-	public String[] getShowInTargetIds() {
-		return new String[] { IPageLayout.ID_PROJECT_EXPLORER };
+	public @NonNull String[] getShowInTargetIds() {
+		return new @NonNull String[] { IPageLayout.ID_PROJECT_EXPLORER };
 	}
 	
 	@Override
@@ -457,14 +460,14 @@
 	
 	
 	@Override
-	public ISourceEditor getSourceEditor() {
+	public SourceEditor getSourceEditor() {
 		return this.editor;
 	}
 	
 	@Override
 	@SuppressWarnings("unchecked")
 	public <T> @Nullable T getAdapter(final Class<T> adapterType) {
-		if (adapterType == ISourceEditorAssociated.class) {
+		if (adapterType == SourceEditorAssociated.class) {
 			return (T)this;
 		}
 		if (adapterType == IEncodingSupport.class) {
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 d2829c4..eb4743e 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
@@ -14,8 +14,6 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting;
 
-import java.util.Arrays;
-
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.Separator;
@@ -24,9 +22,10 @@
 import org.eclipse.ui.IWorkbenchCommandConstants;
 import org.eclipse.ui.menus.CommandContributionItem;
 import org.eclipse.ui.menus.CommandContributionItemParameter;
-import org.eclipse.ui.part.IPageSite;
 import org.eclipse.ui.services.IServiceLocator;
 
+import org.eclipse.statet.jcommons.collections.ImCollections;
+import org.eclipse.statet.jcommons.lang.NonNull;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
 import org.eclipse.statet.ecommons.ui.SharedUIResources;
@@ -61,13 +60,15 @@
 		
 		@Override
 		public void run() {
-			final SourceStructElement[] elements= LTKSelectionUtils.getSelectedSourceStructElements(getSelection());
-			if (elements != null) {
-				RefactoringAdapter adapter= SourceEditor2OutlinePage.this.refactoring.createAdapter(elements);
+			final @NonNull SourceStructElement<?, ?>[] elementArray= LTKSelectionUtils
+					.getSelectedSourceStructElements(getSelection());
+			if (elementArray != null) {
+				RefactoringAdapter adapter= SourceEditor2OutlinePage.this.refactoring.createAdapter(elementArray);
 				if (adapter == null) {
 					adapter= SourceEditor2OutlinePage.this.refactoring.createAdapter(null);
 				}
-				Arrays.sort(elements, adapter.getModelElementComparator());
+				final var elements= ImCollections.newList(elementArray,
+						adapter.getModelElementComparator() );
 				final IRegion range= adapter.getContinuousSourceRange(elements);
 				if (range != null) {
 					selectInEditor(new TextSelection(range.getOffset(), range.getLength()));
@@ -118,22 +119,30 @@
 	}
 	
 	@Override
-	protected void contextMenuAboutToShow(final IMenuManager m) {
-		final IPageSite site= getSite();
+	protected void contextMenuAboutToShow(final IMenuManager menuManager) {
+		final var site= getSite();
 		
-		m.add(new SelectCodeRangeAction(this.refactoring));
+		menuManager.add(new SelectCodeRangeAction(this.refactoring));
 		
-		m.add(new Separator(SharedUIResources.EDIT_COPYPASTE_MENU_ID));
-		m.add(new CommandContributionItem(new CommandContributionItemParameter(
-				site, null, IWorkbenchCommandConstants.EDIT_CUT, CommandContributionItem.STYLE_PUSH)));
-		m.add(new CommandContributionItem(new CommandContributionItemParameter(
-				site, null, IWorkbenchCommandConstants.EDIT_COPY, CommandContributionItem.STYLE_PUSH)));
-		m.add(new CommandContributionItem(new CommandContributionItemParameter(
-				site, null, ISourceEditorCommandIds.COPY_ELEMENT_NAME, CommandContributionItem.STYLE_PUSH)));
-		m.add(new CommandContributionItem(new CommandContributionItemParameter(
-				site, null, IWorkbenchCommandConstants.EDIT_PASTE, CommandContributionItem.STYLE_PUSH)));
+		menuManager.add(new Separator(SharedUIResources.EDIT_COPYPASTE_MENU_ID));
+		menuManager.add(new CommandContributionItem(
+				new CommandContributionItemParameter(site,
+						null, IWorkbenchCommandConstants.EDIT_CUT,
+						CommandContributionItem.STYLE_PUSH )));
+		menuManager.add(new CommandContributionItem(
+				new CommandContributionItemParameter(site,
+						null, IWorkbenchCommandConstants.EDIT_COPY,
+						CommandContributionItem.STYLE_PUSH )));
+		menuManager.add(new CommandContributionItem(
+				new CommandContributionItemParameter(site,
+						null, ISourceEditorCommandIds.COPY_ELEMENT_NAME,
+						CommandContributionItem.STYLE_PUSH )));
+		menuManager.add(new CommandContributionItem(
+				new CommandContributionItemParameter(site,
+						null, IWorkbenchCommandConstants.EDIT_PASTE,
+						CommandContributionItem.STYLE_PUSH )));
 		
-		super.contextMenuAboutToShow(m);
+		super.contextMenuAboutToShow(menuManager);
 	}
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISourceEditorAddon.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorAddon.java
similarity index 77%
rename from ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISourceEditorAddon.java
rename to ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorAddon.java
index 623b82a..5d41aa8 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISourceEditorAddon.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorAddon.java
@@ -14,15 +14,18 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 
 /**
- * Interface for {@link ISourceEditor} add-ons.
+ * Interface for {@link SourceEditor} add-ons.
  */
-public interface ISourceEditorAddon {
+@NonNullByDefault
+public interface SourceEditorAddon {
 	
 	
-	public void install(ISourceEditor editor);
+	void install(SourceEditor editor);
 	
-	public void uninstall();
+	void uninstall();
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISourceEditorAssociated.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorAssociated.java
similarity index 81%
rename from ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISourceEditorAssociated.java
rename to ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorAssociated.java
index 2b31d08..9f95b5b 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISourceEditorAssociated.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorAssociated.java
@@ -14,14 +14,16 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 
 /**
- * Interface for a part which belongs to an editor but is not the editor itself or
- * its containers.
+ * Interface for a part which belongs to an editor but is not the editor itself or its containers.
  */
-public interface ISourceEditorAssociated {
+@NonNullByDefault
+public interface SourceEditorAssociated {
 	
 	
-	public ISourceEditor getSourceEditor();
+	SourceEditor getSourceEditor();
 	
 }
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 f9e93af..c8f8ac6 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
@@ -28,18 +28,22 @@
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.statushandlers.StatusManager;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.internal.ltk.ui.EditingMessages;
 import org.eclipse.statet.internal.ltk.ui.LTKUIPlugin;
 import org.eclipse.statet.ltk.model.core.element.SourceUnit;
 
 
+@NonNullByDefault
 public abstract class SourceEditorProgressHandler extends AbstractHandler {
 	
 	
-	private final ISourceEditor editor;
+	private final SourceEditor editor;
 	
 	
-	public SourceEditorProgressHandler(final ISourceEditor editor) {
+	public SourceEditorProgressHandler(final SourceEditor editor) {
 		this.editor= editor;
 	}
 	
@@ -49,20 +53,20 @@
 	protected abstract boolean isEditTask();
 	
 	
-	protected ISourceEditor getEditor(final Object context) {
+	protected @Nullable SourceEditor getEditor(final @Nullable Object context) {
 		return this.editor;
 	}
 	
 	@Override
-	public void setEnabled(final Object evaluationContext) {
-		final ISourceEditor editor= getEditor(evaluationContext);
+	public void setEnabled(final @Nullable Object evaluationContext) {
+		final SourceEditor editor= getEditor(evaluationContext);
 		setBaseEnabled(editor != null
 				&& (!isEditTask() || editor.isEditable(false)) );
 	}
 	
 	@Override
-	public Object execute(final ExecutionEvent event) throws ExecutionException {
-		final ISourceEditor editor= getEditor(event.getApplicationContext());
+	public @Nullable Object execute(final ExecutionEvent event) throws ExecutionException {
+		final SourceEditor editor= getEditor(event.getApplicationContext());
 		if (editor == null) {
 			return null;
 		}
@@ -98,7 +102,7 @@
 	}
 	
 	
-	protected abstract void doExecute(ISourceEditor editor, SourceUnit su,
+	protected abstract void doExecute(SourceEditor 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/SourceEditorViewerConfiguration.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorViewerConfiguration.java
index fc9796f..6aa572f 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorViewerConfiguration.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorViewerConfiguration.java
@@ -85,7 +85,7 @@
 
 
 /**
- * Abstract configuration for {@link ISourceEditor}s.
+ * Abstract configuration for {@link SourceEditor}s.
  */
 public abstract class SourceEditorViewerConfiguration extends TextSourceViewerConfiguration
 		implements ISettingsChangedHandler {
@@ -169,7 +169,7 @@
 	
 	private final int flags;
 	
-	private final ISourceEditor editor;
+	private final SourceEditor editor;
 	
 	private TextStyleManager textStyles;
 	private final CopyOnWriteIdentityListSet<ISettingsChangedHandler> settingsHandler= new CopyOnWriteIdentityListSet<>();
@@ -189,7 +189,7 @@
 	
 	
 	public SourceEditorViewerConfiguration(final DocContentSections documentContentInfo, final int flags,
-			final ISourceEditor sourceEditor) {
+			final SourceEditor sourceEditor) {
 		if (documentContentInfo == null) {
 			throw new NullPointerException("documentContentInfo"); //$NON-NLS-1$
 		}
@@ -253,7 +253,7 @@
 	}
 	
 	
-	protected ISourceEditor getSourceEditor() {
+	protected SourceEditor getSourceEditor() {
 		return this.editor;
 	}
 	
@@ -333,7 +333,7 @@
 	}
 	
 	
-	public List<ISourceEditorAddon> getAddOns() {
+	public List<SourceEditorAddon> getAddOns() {
 		return new ArrayList<>();
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorViewerConfigurator.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorViewerConfigurator.java
index 446904a..23c41bf 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorViewerConfigurator.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorViewerConfigurator.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.util.ArrayList;
@@ -36,6 +38,9 @@
 import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
 import org.eclipse.ui.texteditor.spelling.SpellingProblem;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.IIndentSettings;
 import org.eclipse.statet.ecommons.text.core.sections.DocContentSections;
 import org.eclipse.statet.ecommons.text.ui.presentation.ITextPresentationConstants;
@@ -44,18 +49,19 @@
 
 
 /**
- * Controls the configuration of an {@link ISourceEditor}.
+ * Controls the configuration of an {@link SourceEditor}.
  */
+@NonNullByDefault
 public abstract class SourceEditorViewerConfigurator implements ISettingsChangedHandler,
 		PropertyChangeListener {
 	
 	
 	private final SourceEditorViewerConfiguration configuration;
 	
-	private ISourceEditor sourceEditor;
+	private @Nullable SourceEditor sourceEditor;
 	
-	private final List<ISourceEditorAddon> addons= new ArrayList<>();
-	private List<ISourceEditorAddon> configurationAddons;
+	private final List<SourceEditorAddon> addons= new ArrayList<>();
+	private @Nullable List<SourceEditorAddon> configurationAddons;
 	
 	protected boolean isConfigured;
 	
@@ -67,10 +73,7 @@
 	
 	
 	protected SourceEditorViewerConfigurator(final SourceEditorViewerConfiguration config) {
-		if (config == null) {
-			throw new NullPointerException("config");
-		}
-		this.configuration= config;
+		this.configuration= nonNullAssert(config);
 	}
 	
 	
@@ -103,11 +106,10 @@
 	}
 	
 	
-	public void setTarget(final ISourceEditor sourceEditor) {
-		assert (sourceEditor != null);
-		this.sourceEditor= sourceEditor;
-		if (!(this.sourceEditor instanceof AbstractDecoratedTextEditor)) {
-			this.sourceEditor.getViewer().getControl().addDisposeListener(new DisposeListener() {
+	public void setTarget(final SourceEditor sourceEditor) {
+		this.sourceEditor= nonNullAssert(sourceEditor);
+		if (!(sourceEditor instanceof AbstractDecoratedTextEditor)) {
+			sourceEditor.getViewer().getControl().addDisposeListener(new DisposeListener() {
 				@Override
 				public void widgetDisposed(final DisposeEvent e) {
 					if (SourceEditorViewerConfigurator.this.isConfigured) {
@@ -119,60 +121,67 @@
 		}
 		else {
 			this.isConfigured= true;
-			installCurrentAddons();
+			installCurrentAddons(sourceEditor);
 		}
 		handleSettingsChanged(null, null);
 	}
 	
-	protected ISourceViewer getSourceViewer() {
-		if (this.sourceEditor != null) {
-			return this.sourceEditor.getViewer();
+	protected @Nullable ISourceViewer getSourceViewer() {
+		final var sourceEditor= this.sourceEditor;
+		if (sourceEditor != null) {
+			return sourceEditor.getViewer();
 		}
 		return null;
 	}
 	
 	public final void unconfigureTarget() {
-		if (this.sourceEditor != null) {
+		final var sourceEditor= this.sourceEditor;
+		if (sourceEditor != null) {
 			this.isConfigured= false;
 			uninstallCurrentAddons();
-			this.sourceEditor.getViewer().unconfigure();
+			sourceEditor.getViewer().unconfigure();
 		}
 	}
 	
 	public final void configureTarget() {
-		if (this.sourceEditor != null) {
+		final var sourceEditor= this.sourceEditor;
+		if (sourceEditor != null) {
 			this.isConfigured= true;
-			this.sourceEditor.getViewer().configure(this.configuration);
-			installCurrentAddons();
+			sourceEditor.getViewer().configure(this.configuration);
+			installCurrentAddons(sourceEditor);
 		}
 	}
 	
-	private void installCurrentAddons() {
-		this.configurationAddons= getSourceViewerConfiguration().getAddOns();
-		for (final ISourceEditorAddon addon : this.configurationAddons) {
-			addon.install(this.sourceEditor);
+	private void installCurrentAddons(final SourceEditor sourceEditor) {
+		final var configurationAddons= getSourceViewerConfiguration().getAddOns();
+		this.configurationAddons= configurationAddons;
+		for (final SourceEditorAddon addon : configurationAddons) {
+			addon.install(sourceEditor);
 		}
-		for (final ISourceEditorAddon addon : this.addons) {
-			addon.install(this.sourceEditor);
+		for (final SourceEditorAddon addon : this.addons) {
+			addon.install(sourceEditor);
 		}
 	}
 	
 	private void uninstallCurrentAddons() {
-		for (final ISourceEditorAddon addon : this.addons) {
+		for (final SourceEditorAddon addon : this.addons) {
 			addon.uninstall();
 		}
-		if (this.configurationAddons != null) {
-			for (final ISourceEditorAddon addon : this.configurationAddons) {
-				addon.uninstall();
+		{	final var configurationAddons= this.configurationAddons;
+			if (configurationAddons != null) {
+				this.configurationAddons= null;
+				for (final SourceEditorAddon addon : configurationAddons) {
+					addon.uninstall();
+				}
 			}
-			this.configurationAddons= null;
 		}
 	}
 	
-	public final void installAddon(final ISourceEditorAddon installable) {
+	public final void installAddon(final SourceEditorAddon installable) {
 		this.addons.add(installable);
 		if (this.isConfigured) {
-			installable.install(this.sourceEditor);
+			final var sourceEditor= nonNullAssert(this.sourceEditor);
+			installable.install(sourceEditor);
 		}
 	}
 	
@@ -192,9 +201,11 @@
 	}
 	
 	@Override
-	public void handleSettingsChanged(Set<String> groupIds, Map<String, Object> options) {
+	public void handleSettingsChanged(@Nullable Set<String> groupIds,
+			@Nullable Map<String, Object> options) {
+		final var sourceEditor= this.sourceEditor;
 		final SourceViewer viewer;
-		if (this.sourceEditor == null || (viewer= this.sourceEditor.getViewer()) == null) {
+		if (sourceEditor == null || (viewer= sourceEditor.getViewer()) == null) {
 			return;
 		}
 		final Point selectedRange= viewer.getSelectedRange();
@@ -225,11 +236,13 @@
 		if (!this.isConfigured) {
 			return;
 		}
+		final var sourceEditor= nonNullAssert(this.sourceEditor);
+		
 		if (this.updateCompleteConfig) {
-			if (this.sourceEditor instanceof ITextEditor) {
-				SpellingProblem.removeAllInActiveEditor((ITextEditor) this.sourceEditor, null);
+			if (sourceEditor instanceof ITextEditor) {
+				SpellingProblem.removeAllInActiveEditor((ITextEditor)sourceEditor, null);
 			}
-			reconfigureSourceViewer();
+			reconfigureSourceViewer(sourceEditor.getViewer());
 		}
 		else {
 			if (this.updateTabSize) {
@@ -238,11 +251,11 @@
 			if (this.updateTextPresentation) {
 				viewer.invalidateTextPresentation();
 			}
-			if (this.updateIndent && this.sourceEditor instanceof SourceEditor1) {
-				((SourceEditor1) this.sourceEditor).updateIndentSettings();
+			if (this.updateIndent && sourceEditor instanceof SourceEditor1) {
+				((SourceEditor1)sourceEditor).updateIndentSettings();
 			}
 			if (this.updateInfoHovers) {
-				updateConfiguredInfoHovers();
+				updateConfiguredInfoHovers(sourceEditor.getViewer());
 			}
 		}
 		
@@ -252,17 +265,14 @@
 		this.updateIndent= false;
 	}
 	
-	private final void reconfigureSourceViewer() {
-		if (this.isConfigured) {
-			this.isConfigured= false;
-			this.sourceEditor.getViewer().unconfigure();
-			this.isConfigured= true;
-			this.sourceEditor.getViewer().configure(this.configuration);
-		}
+	private final void reconfigureSourceViewer(final SourceViewer viewer) {
+		this.isConfigured= false;
+		viewer.unconfigure();
+		this.isConfigured= true;
+		viewer.configure(this.configuration);
 	}
 	
-	private void updateConfiguredInfoHovers() {
-		final SourceViewer viewer= this.sourceEditor.getViewer();
+	private void updateConfiguredInfoHovers(final SourceViewer viewer) {
 		final String[] contentTypes= this.configuration.getConfiguredContentTypes(viewer);
 		for (final String contentType : contentTypes) {
 			((ITextViewerExtension2)viewer).removeTextHovers(contentType);
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISourceFragmentEditorInput.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceFragmentEditorInput.java
similarity index 85%
rename from ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISourceFragmentEditorInput.java
rename to ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceFragmentEditorInput.java
index facf8bb..cbd0c4c 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ISourceFragmentEditorInput.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceFragmentEditorInput.java
@@ -16,10 +16,13 @@
 
 import org.eclipse.ui.IEditorInput;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 import org.eclipse.statet.ltk.core.input.SourceFragment;
 
 
-public interface ISourceFragmentEditorInput extends IEditorInput {
+@NonNullByDefault
+public interface SourceFragmentEditorInput extends IEditorInput {
 	
 	
 	SourceFragment getSourceFragment();
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 a47c92d..ff6e01f 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
@@ -36,7 +36,7 @@
 	
 	public static class Enclosing extends StructureSelectHandler {
 		
-		public Enclosing(final ISourceEditor editor, final StructureSelectionHistory history) {
+		public Enclosing(final SourceEditor editor, final StructureSelectionHistory history) {
 			super(editor, history);
 		}
 		
@@ -50,7 +50,7 @@
 	
 	public static class Next extends StructureSelectHandler {
 		
-		public Next(final ISourceEditor editor, final StructureSelectionHistory history) {
+		public Next(final SourceEditor editor, final StructureSelectionHistory history) {
 			super(editor, history);
 		}
 		
@@ -71,7 +71,7 @@
 	
 	public static class Previous extends StructureSelectHandler {
 		
-		public Previous(final ISourceEditor editor, final StructureSelectionHistory history) {
+		public Previous(final SourceEditor editor, final StructureSelectionHistory history) {
 			super(editor, history);
 		}
 		
@@ -91,11 +91,11 @@
 	}
 	
 	
-	private final ISourceEditor sourceEditor;
+	private final SourceEditor sourceEditor;
 	private final StructureSelectionHistory selectionHistory;
 	
 	
-	protected StructureSelectHandler(final ISourceEditor editor, final StructureSelectionHistory history) {
+	protected StructureSelectHandler(final SourceEditor editor, final StructureSelectionHistory history) {
 		super();
 		assert (editor != null);
 		assert (history != null);
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/StructureSelectionHistory.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/StructureSelectionHistory.java
index 69f02fa..736a1f2 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/StructureSelectionHistory.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/StructureSelectionHistory.java
@@ -33,7 +33,7 @@
 public class StructureSelectionHistory {
 	
 	
-	private final ISourceEditor sourceEditor;
+	private final SourceEditor sourceEditor;
 	
 	private final List<IRegion> history;
 	
@@ -43,7 +43,7 @@
 	private final CopyOnWriteIdentityListSet<IUpdate> updateActions= new CopyOnWriteIdentityListSet<>();
 	
 	
-	public StructureSelectionHistory(final ISourceEditor editor) {
+	public StructureSelectionHistory(final SourceEditor editor) {
 		this.sourceEditor= editor;
 		this.history= new ArrayList<>();
 		this.selectionListener= new ISelectionChangedListener() {
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/StructureSelectionHistoryBackHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/StructureSelectionHistoryBackHandler.java
index 02b67b0..a16332d 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/StructureSelectionHistoryBackHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/StructureSelectionHistoryBackHandler.java
@@ -29,12 +29,12 @@
 public class StructureSelectionHistoryBackHandler extends AbstractHandler implements IUpdate {
 	
 	
-	private final ISourceEditor sourceEditor;
+	private final SourceEditor sourceEditor;
 	
 	private final StructureSelectionHistory history;
 	
 	
-	public StructureSelectionHistoryBackHandler(final ISourceEditor editor, final StructureSelectionHistory history) {
+	public StructureSelectionHistoryBackHandler(final SourceEditor editor, final StructureSelectionHistory history) {
 		super();
 		assert (editor != null);
 		assert (history != null);
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ITextEditToolSynchronizer.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/TextEditToolSynchronizer.java
similarity index 84%
rename from ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ITextEditToolSynchronizer.java
rename to ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/TextEditToolSynchronizer.java
index 59a1769..d406cf2 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ITextEditToolSynchronizer.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/TextEditToolSynchronizer.java
@@ -16,15 +16,18 @@
 
 import org.eclipse.jface.text.link.LinkedModeModel;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 
 /**
  * Ensures that not too much effects are enabled.
  * <p>
  * Must used in UI thread only.</p>
  */
-public interface ITextEditToolSynchronizer {
+@NonNullByDefault
+public interface TextEditToolSynchronizer {
 	
 	
-	public void install(final LinkedModeModel model);
+	void install(LinkedModeModel model);
 	
 }
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 1aa9c18..6c9a62d 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
@@ -19,6 +19,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.DocContentSections;
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
@@ -26,9 +29,10 @@
 
 
 /**
- * Simple {@link ISourceEditor} for snippet editors or previewers.
+ * Simple {@link SourceEditor} for snippet editors or previewers.
  */
-public class ViewerSourceEditorAdapter implements ISourceEditor {
+@NonNullByDefault
+public class ViewerSourceEditorAdapter implements SourceEditor {
 	
 	
 	private final SourceViewer sourceViewer;
@@ -40,7 +44,7 @@
 	 * Creates a new adapter for the given viewer.
 	 * 
 	 * @param viewer the viewer
-	 * @param configurator a configurator used for {@link ISourceEditorAddon}, may be <code>null</code> (disables modules)
+	 * @param configurator a configurator used for {@link SourceEditorAddon}, may be <code>null</code> (disables modules)
 	 */
 	public ViewerSourceEditorAdapter(final SourceViewer viewer, final SourceEditorViewerConfigurator configurator) {
 		this.sourceViewer= viewer;
@@ -49,22 +53,22 @@
 	
 	
 	@Override
-	public IContentType getContentType() {
+	public @Nullable IContentType getContentType() {
 		return null;
 	}
 	
 	@Override
-	public SourceUnit getSourceUnit() {
+	public @Nullable SourceUnit getSourceUnit() {
 		return null;
 	}
 	
 	@Override
-	public IWorkbenchPart getWorkbenchPart() {
+	public @Nullable IWorkbenchPart getWorkbenchPart() {
 		return null;
 	}
 	
 	@Override
-	public IServiceLocator getServiceLocator() {
+	public @Nullable IServiceLocator getServiceLocator() {
 		return null;
 	}
 	
@@ -80,7 +84,7 @@
 	
 	
 	@Override
-	public ITextEditToolSynchronizer getTextEditToolSynchronizer() {
+	public @Nullable TextEditToolSynchronizer getTextEditToolSynchronizer() {
 		return null;
 	}
 	
@@ -99,7 +103,7 @@
 	
 	
 	@Override
-	public <T> T getAdapter(final Class<T> adapterType) {
+	public <T> @Nullable T getAdapter(final Class<T> adapterType) {
 		return null;
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/AbstractOpenDeclarationHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/AbstractOpenDeclarationHandler.java
index 1b14546..2826f8b 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/AbstractOpenDeclarationHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/AbstractOpenDeclarationHandler.java
@@ -14,26 +14,27 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting.actions;
 
-import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.text.IRegion;
 import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.Region;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.statushandlers.StatusManager;
 
+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.ecommons.text.core.JFaceTextRegion;
 import org.eclipse.statet.ecommons.ui.SharedUIResources;
-import org.eclipse.statet.ecommons.ui.workbench.WorkbenchUIUtils;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
-public abstract class AbstractOpenDeclarationHandler extends AbstractHandler {
+@NonNullByDefault
+public abstract class AbstractOpenDeclarationHandler extends AbstractSourceEditorHandler {
 	
 	
 	public AbstractOpenDeclarationHandler() {
@@ -41,20 +42,22 @@
 	
 	
 	@Override
-	public Object execute(final ExecutionEvent event) throws ExecutionException {
-		final IWorkbenchPart activePart= WorkbenchUIUtils.getActivePart(event.getApplicationContext());
-		final ISourceEditor editor= activePart.getAdapter(ISourceEditor.class);
-		if (editor != null) {
-			final ITextSelection selection= (ITextSelection) editor.getViewer().getSelection();
-			if (execute(editor, new Region(selection.getOffset(), selection.getLength()))) {
-				return null;
-			}
+	public @Nullable Object execute(final ExecutionEvent event) throws ExecutionException {
+		final SourceEditor editor= getSourceEditor(event.getApplicationContext());
+		if (editor == null || !isSupported(editor)) {
+			return null;
+		}
+		
+		final ITextSelection selection= (ITextSelection)editor.getViewer().getSelection();
+		if (execute(editor,
+				JFaceTextRegion.newByStartLength(selection.getOffset(), selection.getLength())) ) {
+			return null;
 		}
 		Display.getCurrent().beep();
 		return null;
 	}
 	
-	public abstract boolean execute(final ISourceEditor editor, final IRegion selection);
+	protected abstract boolean execute(SourceEditor editor, TextRegion selection);
 	
 	
 	protected void logError(final Exception e, final String name) {
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 a57c13b..ffcc56e 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
@@ -36,6 +36,8 @@
 
 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.ecommons.ui.workbench.WorkbenchUIUtils;
 
@@ -43,11 +45,12 @@
 import org.eclipse.statet.ltk.model.core.ElementSet;
 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.sourceediting.SourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditorAssociated;
 import org.eclipse.statet.ltk.ui.util.LTKSelectionUtils;
 
 
+@NonNullByDefault
 public abstract class AbstractSourceDocumentHandler<TSourceUnit extends SourceUnit>
 		extends AbstractHandler {
 	
@@ -55,17 +58,18 @@
 	protected class ExecData {
 		
 		private final IWorkbenchPart activePart;
-		private final ISourceEditor sourceEditor;
+		private final @Nullable SourceEditor sourceEditor;
 		private final ImList<? extends TSourceUnit> sourceUnits;
 		
-		final ITextSelection textSelection;
+		final @Nullable ITextSelection textSelection;
 		
-		final ElementSet elementSelection;
+		final @Nullable ElementSet elementSelection;
 		
 		
-		public ExecData(final IWorkbenchPart activePart, final ISourceEditor sourceEditor,
+		public ExecData(final IWorkbenchPart activePart, final @Nullable SourceEditor sourceEditor,
 				final ImList<? extends TSourceUnit> sourceUnits,
-				final ITextSelection textSelection, final ElementSet elementSet) {
+				final @Nullable ITextSelection textSelection,
+				final @Nullable ElementSet elementSet) {
 			this.activePart= activePart;
 			this.sourceEditor= sourceEditor;
 			this.sourceUnits= sourceUnits;
@@ -78,7 +82,7 @@
 			return this.activePart;
 		}
 		
-		public ISourceEditor getSourceEditor() {
+		public @Nullable SourceEditor getSourceEditor() {
 			return this.sourceEditor;
 		}
 		
@@ -86,11 +90,11 @@
 			return this.sourceUnits;
 		}
 		
-		public ITextSelection getTextSelection() {
+		public @Nullable ITextSelection getTextSelection() {
 			return this.textSelection;
 		}
 		
-		public ElementSet getElementSelection() {
+		public @Nullable ElementSet getElementSelection() {
 			return this.elementSelection;
 		}
 		
@@ -111,10 +115,13 @@
 	
 	
 	@Override
-	public void setEnabled(final Object evaluationContext) {
+	public void setEnabled(final @Nullable Object evaluationContext) {
 		final IWorkbenchPart activePart= WorkbenchUIUtils.getActivePart(evaluationContext);
 		final ISelection selection= WorkbenchUIUtils.getCurrentSelection(evaluationContext);
-		final ISourceEditor sourceEditor= getSourceEditor(activePart);
+		if (activePart == null) {
+			return;
+		}
+		final SourceEditor sourceEditor= getSourceEditor(activePart);
 		
 		if (sourceEditor != null && selection instanceof ITextSelection) {
 			final SourceUnit sourceUnit= sourceEditor.getSourceUnit();
@@ -125,7 +132,7 @@
 		
 		if (selection instanceof IStructuredSelection) {
 			final SourceStructElement[] selectedElements= LTKSelectionUtils
-					.getSelectedSourceStructElements((IStructuredSelection) selection);
+					.getSelectedSourceStructElements((IStructuredSelection)selection);
 			setBaseEnabled(selectedElements != null && selectedElements.length > 0
 					&& checkSourceUnits(selectedElements) );
 			return;
@@ -135,10 +142,13 @@
 	}
 	
 	@Override
-	public Object execute(final ExecutionEvent event) throws ExecutionException {
+	public @Nullable Object execute(final ExecutionEvent event) throws ExecutionException {
 		final IWorkbenchPart activePart= WorkbenchUIUtils.getActivePart(event.getApplicationContext());
 		final ISelection selection= WorkbenchUIUtils.getCurrentSelection(event.getApplicationContext());
-		final ISourceEditor sourceEditor= getSourceEditor(activePart);
+		if (activePart == null) {
+			return null;
+		}
+		final SourceEditor sourceEditor= getSourceEditor(activePart);
 		
 		try {
 			final IProgressMonitor monitor= new NullProgressMonitor();
@@ -147,8 +157,8 @@
 				if (sourceUnit != null && isSourceUnitSupported(sourceUnit)) {
 					if (!isEditTask() || sourceEditor.isEditable(true)) {
 						final ExecData data= createExecData(event, activePart, sourceEditor,
-								ImCollections.newList((TSourceUnit) sourceUnit),
-								(ITextSelection) selection, null, monitor );
+								ImCollections.newList((TSourceUnit)sourceUnit),
+								(ITextSelection)selection, null, monitor );
 						if (data != null) {
 							execute(data);
 							return null;
@@ -159,12 +169,13 @@
 			}
 			if (selection instanceof IStructuredSelection) {
 				final SourceStructElement[] selectedElements= LTKSelectionUtils
-						.getSelectedSourceStructElements((IStructuredSelection) selection);
+						.getSelectedSourceStructElements((IStructuredSelection)selection);
 				if (selectedElements != null && selectedElements.length > 0) {
 					final ImList<TSourceUnit> sourceUnits= createSourceUnits(selectedElements, monitor);
 					if (sourceUnits != null) {
 						final ExecData data= createExecData(event, activePart, sourceEditor,
-								sourceUnits, null, selectedElements, monitor );
+								sourceUnits,
+								null, ImCollections.newList(selectedElements), monitor );
 						if (data != null) {
 							execute(data);
 							return null;
@@ -182,17 +193,17 @@
 		}
 	}
 	
-	private ISourceEditor getSourceEditor(final IWorkbenchPart part) {
-		if (part instanceof ISourceEditor) {
-			return (ISourceEditor) part;
+	private @Nullable SourceEditor getSourceEditor(final IWorkbenchPart part) {
+		if (part instanceof SourceEditor) {
+			return (SourceEditor)part;
 		}
-		{	final ISourceEditor editor= part.getAdapter(ISourceEditor.class);
+		{	final SourceEditor editor= part.getAdapter(SourceEditor.class);
 			if (editor != null) {
 				return editor;
 			}
 		}
-		{	final ISourceEditorAssociated editorAssociated= part
-					.getAdapter(ISourceEditorAssociated.class);
+		{	final SourceEditorAssociated editorAssociated= part
+					.getAdapter(SourceEditorAssociated.class);
 			if (editorAssociated != null) {
 				return editorAssociated.getSourceEditor();
 			}
@@ -234,7 +245,7 @@
 		return true;
 	}
 	
-	private ImList<TSourceUnit> createSourceUnits(final SourceStructElement[] selectedElements,
+	private @Nullable ImList<TSourceUnit> createSourceUnits(final SourceStructElement[] selectedElements,
 			final IProgressMonitor monitor) {
 		TSourceUnit lastSourceUnit= null;
 		List<TSourceUnit> sourceUnits= null;
@@ -252,7 +263,7 @@
 				return null;
 			}
 			if (lastSourceUnit == null) {
-				lastSourceUnit= (TSourceUnit) sourceUnit;
+				lastSourceUnit= (TSourceUnit)sourceUnit;
 			}
 			else {
 				if (sourceUnits == null) {
@@ -262,8 +273,8 @@
 					sourceUnits= new ArrayList<>();
 					sourceUnits.add(lastSourceUnit);
 				}
-				sourceUnits.add((TSourceUnit) sourceUnit);
-				lastSourceUnit= (TSourceUnit) sourceUnit;
+				sourceUnits.add((TSourceUnit)sourceUnit);
+				lastSourceUnit= (TSourceUnit)sourceUnit;
 			}
 		}
 		return (sourceUnits == null) ?
@@ -290,7 +301,7 @@
 				});
 			}
 			catch (final InvocationTargetException e) {
-				error.set((Exception) e.getTargetException());
+				error.set((Exception)e.getTargetException());
 			}
 			catch (final InterruptedException e) {}
 			break;
@@ -324,11 +335,14 @@
 		return false;
 	}
 	
-	protected ExecData createExecData(final ExecutionEvent event, final IWorkbenchPart activePart,
-			final ISourceEditor sourceEditor, final ImList<? extends TSourceUnit> sourceUnits,
-			final ITextSelection textSelection, final SourceStructElement[] selectedElements,
+	protected ExecData createExecData(final ExecutionEvent event,
+			final IWorkbenchPart activePart, final @Nullable SourceEditor sourceEditor,
+			final ImList<? extends TSourceUnit> sourceUnits,
+			final @Nullable ITextSelection textSelection,
+			final @Nullable List<SourceStructElement> selectedElements,
 			final IProgressMonitor monitor) throws Exception {
-		return new ExecData(activePart, sourceEditor, sourceUnits, textSelection,
+		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/AbstractSourceEditorHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/AbstractSourceEditorHandler.java
new file mode 100644
index 0000000..099a331
--- /dev/null
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/AbstractSourceEditorHandler.java
@@ -0,0 +1,84 @@
+/*=============================================================================#
+ # Copyright (c) 2021 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 - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.ltk.ui.sourceediting.actions;
+
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.ui.IWorkbenchPart;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.ecommons.ui.util.UIAccess;
+import org.eclipse.statet.ecommons.ui.workbench.WorkbenchUIUtils;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
+
+
+@NonNullByDefault
+public abstract class AbstractSourceEditorHandler extends AbstractHandler {
+	
+	
+	private final @Nullable SourceEditor editor;
+	
+	
+	public AbstractSourceEditorHandler() {
+		this.editor= null;
+	}
+	
+	public AbstractSourceEditorHandler(final SourceEditor editor) {
+		this.editor= nonNullAssert(editor);
+	}
+	
+	
+	protected @Nullable SourceEditor getSourceEditor(final @Nullable Object context) {
+		SourceEditor editor= this.editor;
+		if (editor != null) {
+			return editor;
+		}
+		final IWorkbenchPart part= WorkbenchUIUtils.getActivePart(context);
+		if (part != null) {
+			if (part instanceof SourceEditor) {
+				return (SourceEditor)part;
+			}
+			editor= part.getAdapter(SourceEditor.class);
+			if (editor != null) {
+				return editor;
+			}
+		}
+		return null;
+	}
+	
+	protected boolean isSupported(final SourceEditor sourceEditor) {
+		final SourceViewer viewer= sourceEditor.getViewer();
+		return (UIAccess.isOkToUse(viewer) && viewer.getDocument() != null);
+	}
+	
+	
+	@Override
+	public void setEnabled(@Nullable final Object evaluationContext) {
+		final SourceEditor editor= getSourceEditor(evaluationContext);
+		if (editor == null || !isSupported(editor)) {
+			setBaseEnabled(false);
+			return;
+		}
+		
+		setBaseEnabled(true);
+	}
+	
+	
+}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/CutLineHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/CutLineHandler.java
index 7e0c200..67e3637 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/CutLineHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/CutLineHandler.java
@@ -17,13 +17,16 @@
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IRegion;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class CutLineHandler extends SourceEditorTextHandler {
 	
 	
-	public CutLineHandler(final ISourceEditor editor) {
+	public CutLineHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/CutToLineBeginHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/CutToLineBeginHandler.java
index 78aec69..79f2e2c 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/CutToLineBeginHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/CutToLineBeginHandler.java
@@ -17,13 +17,16 @@
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IRegion;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class CutToLineBeginHandler extends SourceEditorTextHandler {
 	
 	
-	public CutToLineBeginHandler(final ISourceEditor editor) {
+	public CutToLineBeginHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/CutToLineEndHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/CutToLineEndHandler.java
index a4203ad..866b36a 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/CutToLineEndHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/CutToLineEndHandler.java
@@ -17,13 +17,16 @@
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IRegion;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class CutToLineEndHandler extends SourceEditorTextHandler {
 	
 	
-	public CutToLineEndHandler(final ISourceEditor editor) {
+	public CutToLineEndHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteLineHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteLineHandler.java
index 47c96cd..d46ffb1 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteLineHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteLineHandler.java
@@ -17,13 +17,16 @@
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IRegion;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class DeleteLineHandler extends SourceEditorTextHandler {
 	
 	
-	public DeleteLineHandler(final ISourceEditor editor) {
+	public DeleteLineHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteNextWordHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteNextWordHandler.java
index 8897e6a..d97bccf 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteNextWordHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteNextWordHandler.java
@@ -20,13 +20,16 @@
 import org.eclipse.jface.text.Region;
 import org.eclipse.swt.custom.ST;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class DeleteNextWordHandler extends SourceEditorTextHandler {
 	
 	
-	public DeleteNextWordHandler(final ISourceEditor editor) {
+	public DeleteNextWordHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeletePreviousWordHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeletePreviousWordHandler.java
index abd4863..eb1141e 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeletePreviousWordHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeletePreviousWordHandler.java
@@ -20,13 +20,16 @@
 import org.eclipse.jface.text.Region;
 import org.eclipse.swt.custom.ST;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class DeletePreviousWordHandler extends SourceEditorTextHandler {
 	
 	
-	public DeletePreviousWordHandler(final ISourceEditor editor) {
+	public DeletePreviousWordHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteToLineBeginHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteToLineBeginHandler.java
index 4c0c288..0c004c3 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteToLineBeginHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteToLineBeginHandler.java
@@ -17,13 +17,16 @@
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IRegion;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class DeleteToLineBeginHandler extends SourceEditorTextHandler {
 	
 	
-	public DeleteToLineBeginHandler(final ISourceEditor editor) {
+	public DeleteToLineBeginHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteToLineEndHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteToLineEndHandler.java
index 73a043c..0930d76 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteToLineEndHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/DeleteToLineEndHandler.java
@@ -17,13 +17,16 @@
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IRegion;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class DeleteToLineEndHandler extends SourceEditorTextHandler {
 	
 	
-	public DeleteToLineEndHandler(final ISourceEditor editor) {
+	public DeleteToLineEndHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoLineBeginHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoLineBeginHandler.java
index ae2b13f..d37f028 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoLineBeginHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoLineBeginHandler.java
@@ -17,13 +17,16 @@
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.swt.custom.ST;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class GotoLineBeginHandler extends SourceEditorTextHandler {
 	
 	
-	public GotoLineBeginHandler(final ISourceEditor editor) {
+	public GotoLineBeginHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoLineEndHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoLineEndHandler.java
index df225ea..9c25de7 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoLineEndHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoLineEndHandler.java
@@ -17,13 +17,16 @@
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.swt.custom.ST;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class GotoLineEndHandler extends SourceEditorTextHandler {
 	
 	
-	public GotoLineEndHandler(final ISourceEditor editor) {
+	public GotoLineEndHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoMatchingBracketHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoMatchingBracketHandler.java
index 18f6387..bf7c130 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoMatchingBracketHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoMatchingBracketHandler.java
@@ -29,18 +29,18 @@
 import org.eclipse.statet.ecommons.text.ICharPairMatcher;
 
 import org.eclipse.statet.internal.ltk.ui.EditingMessages;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
 public class GotoMatchingBracketHandler extends AbstractHandler {
 	
 	
-	private final ISourceEditor sourceEditor;
+	private final SourceEditor sourceEditor;
 	
 	private final ICharPairMatcher pairMatcher;
 	
 	
-	public GotoMatchingBracketHandler(final ICharPairMatcher pairMatcher, final ISourceEditor editor) {
+	public GotoMatchingBracketHandler(final ICharPairMatcher pairMatcher, final SourceEditor editor) {
 		assert (pairMatcher != null);
 		assert (editor != null);
 		this.sourceEditor= editor;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoNextWordHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoNextWordHandler.java
index 42f0cc7..bda1910 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoNextWordHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoNextWordHandler.java
@@ -17,13 +17,16 @@
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.swt.custom.ST;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class GotoNextWordHandler extends SourceEditorTextHandler {
 	
 	
-	public GotoNextWordHandler(final ISourceEditor editor) {
+	public GotoNextWordHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoPreviousWordHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoPreviousWordHandler.java
index ee0cb76..1a28dbc 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoPreviousWordHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/GotoPreviousWordHandler.java
@@ -17,13 +17,16 @@
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.swt.custom.ST;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class GotoPreviousWordHandler extends SourceEditorTextHandler {
 	
 	
-	public GotoPreviousWordHandler(final ISourceEditor editor) {
+	public GotoPreviousWordHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/MultiContentSectionElementSearchContributionItem.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/MultiContentSectionElementSearchContributionItem.java
index 67c4a0f..0f65816 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/MultiContentSectionElementSearchContributionItem.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/MultiContentSectionElementSearchContributionItem.java
@@ -31,7 +31,7 @@
 import org.eclipse.statet.ecommons.ui.actions.ListContributionItem;
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
 /**
@@ -170,8 +170,8 @@
 	@Override
 	public void createContributionItems(final List<IContributionItem> items) {
 		final IWorkbenchPart part= UIAccess.getActiveWorkbenchPart(true);
-		if (part instanceof ISourceEditor) {
-			final ISourceEditor editor= (ISourceEditor) part;
+		if (part instanceof SourceEditor) {
+			final SourceEditor editor= (SourceEditor) part;
 			final SourceViewer viewer= editor.getViewer();
 			final ListContributionItem item= getItem(
 					this.sections.getType(viewer.getDocument(), viewer.getSelectedRange().x) );
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/MultiContentSectionHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/MultiContentSectionHandler.java
index 55d05c9..8d860ac 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/MultiContentSectionHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/MultiContentSectionHandler.java
@@ -14,6 +14,9 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting.actions;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullElse;
+
 import java.util.IdentityHashMap;
 import java.util.Map;
 
@@ -22,12 +25,13 @@
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.IHandler2;
 import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.ui.IWorkbenchPart;
+
+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.ecommons.ui.workbench.WorkbenchUIUtils;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
 /**
@@ -38,24 +42,25 @@
  * 
  * @see DocContentSections
  */
-public class MultiContentSectionHandler extends AbstractHandler {
+@NonNullByDefault
+public class MultiContentSectionHandler extends AbstractSourceEditorHandler {
 	
 	
-	private static final Object NULL= new Object();
+	private static final IHandler2 NULL= new AbstractHandler() {
+		@Override
+		public @Nullable Object execute(final ExecutionEvent event) throws ExecutionException {
+			return null;
+		}
+	};
 	
 	
 	private final DocContentSections sections;
 	
-	private final Map<String, Object> handlers= new IdentityHashMap<>(8);
-	
-	private ISourceEditor expliciteEditor;
+	private final Map<String, IHandler2> handlers= new IdentityHashMap<>(8);
 	
 	
 	public MultiContentSectionHandler(final DocContentSections sections) {
-		if (sections == null) {
-			throw new NullPointerException("sections"); //$NON-NLS-1$
-		}
-		this.sections= sections;
+		this.sections= nonNullAssert(sections);
 	}
 	
 	public MultiContentSectionHandler(final DocContentSections sections,
@@ -64,8 +69,8 @@
 	}
 	
 	public MultiContentSectionHandler(final DocContentSections sections,
-			final String sectionType1, final IHandler2 handler1,
-			final String sectionType2, final IHandler2 handler2) {
+			final @Nullable String sectionType1, final @Nullable IHandler2 handler1,
+			final @Nullable String sectionType2, final @Nullable IHandler2 handler2) {
 		this(sections);
 		
 		if (sectionType1 != null) {
@@ -77,10 +82,6 @@
 	}
 	
 	
-	protected void setEditor(final ISourceEditor editor) {
-		this.expliciteEditor= editor;
-	}
-	
 	protected final DocContentSections getSections() {
 		return this.sections;
 	}
@@ -92,68 +93,47 @@
 		
 		for (final Object handler : this.handlers.values()) {
 			if (handler != NULL) {
-				((IHandler2) handler).dispose();
+				((IHandler2)handler).dispose();
 			}
 		}
 		this.handlers.clear();
 	}
 	
 	
-	protected ISourceEditor getEditor(final Object applicationContext) {
-		if (this.expliciteEditor != null) {
-			return this.expliciteEditor;
-		}
-		final IWorkbenchPart activePart= WorkbenchUIUtils.getActivePart(applicationContext);
-		if (activePart instanceof ISourceEditor) {
-			return (ISourceEditor) activePart;
-		}
-		return activePart.getAdapter(ISourceEditor.class);
+	public void registerHandler(final String sectionType, final @Nullable IHandler2 handler) {
+		this.handlers.put(nonNullAssert(sectionType), nonNullElse(handler, NULL));
 	}
 	
-	
-	public void registerHandler(final String sectionType, final IHandler2 handler) {
-		if (sectionType == null) {
-			throw new NullPointerException("sectionType");
-		}
-		this.handlers.put(sectionType, handler);
-	}
-	
-	protected final IHandler2 getHandler(final String sectionType) {
+	protected final @Nullable IHandler2 getHandler(final String sectionType) {
 		if (sectionType == DocContentSections.ERROR) {
 			return null;
 		}
-		Object handler= this.handlers.get(sectionType);
+		IHandler2 handler= this.handlers.get(sectionType);
 		if (handler == null) {
-			handler= NULL;
 			try {
-				final IHandler2 newHandler= createHandler(sectionType);
-				if (newHandler != null) {
-					handler= newHandler;
-				}
+				handler= createHandler(sectionType);
 			}
 			finally {
-				this.handlers.put(sectionType, handler);
+				registerHandler(sectionType, handler);
 			}
 		}
-		return (handler != NULL) ? (IHandler2) handler : null;
+		return (handler != NULL) ? handler : null;
 	}
 	
-	protected IHandler2 createHandler(final String sectionType) {
+	protected @Nullable IHandler2 createHandler(final String sectionType) {
 		return null;
 	}
 	
 	@Override
-	public Object execute(final ExecutionEvent event) throws ExecutionException {
-		final ISourceEditor editor= getEditor(event.getApplicationContext());
-		if (editor == null) {
+	public @Nullable Object execute(final ExecutionEvent event) throws ExecutionException {
+		final SourceEditor editor= getSourceEditor(event.getApplicationContext());
+		if (editor == null || !isSupported(editor)) {
 			return null;
 		}
+		
 		final SourceViewer viewer= editor.getViewer();
-		if (viewer == null) {
-			return null;
-		}
-		final IHandler2 handler= getHandler(
-				this.sections.getType(viewer.getDocument(), viewer.getSelectedRange().x) );
+		final IHandler2 handler= getHandler(this.sections.getType(
+				nonNullAssert(viewer.getDocument()), viewer.getSelectedRange().x ));
 		if (handler != null) {
 			return handler.execute(event);
 		}
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 0773283..de0d615 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
@@ -34,7 +34,8 @@
 import org.eclipse.ui.part.FileEditorInput;
 import org.eclipse.ui.texteditor.ITextEditor;
 
-import org.eclipse.statet.jcommons.text.core.TextRegion;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
@@ -43,9 +44,11 @@
 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;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
+import org.eclipse.statet.ltk.ui.util.LTKSelectionUtils;
 
 
+@NonNullByDefault
 public class OpenDeclaration {
 	
 	
@@ -53,7 +56,7 @@
 	}
 	
 	
-	public <T> T selectElement(final List<? extends T> list, final IWorkbenchPart part)
+	public <T> @Nullable T selectElement(final List<? extends T> list, final IWorkbenchPart part)
 			throws CoreException {
 		if (list.isEmpty()) {
 			return null;
@@ -62,17 +65,19 @@
 			return list.get(0);
 		}
 		else {
-			final ListDialog dialog= new ListDialog(part != null ? part.getSite().getShell() : UIAccess.getActiveWorkbenchShell(true));
+			final ListDialog dialog= new ListDialog(part != null ?
+					part.getSite().getShell() :
+					UIAccess.getActiveWorkbenchShell(true) );
 			dialog.setTitle("Open Declaration");
 			dialog.setMessage("Select the appropriate declaration:");
 			dialog.setHelpAvailable(false);
 			dialog.setContentProvider(new ArrayContentProvider());
 			dialog.setLabelProvider(createLabelProvider());
 			dialog.setInput(list);
-			dialog.setInitialSelections(new Object[] { list.get(0) });
+			dialog.setInitialSelections(list.get(0));
 			
 			if (dialog.open() == Window.OK) {
-				return (T) dialog.getResult()[0];
+				return (T)dialog.getResult()[0];
 			}
 			else {
 				throw new CoreException(Status.CANCEL_STATUS);
@@ -80,7 +85,8 @@
 		}
 	}
 	
-	public <TNameAccess extends NameAccess<?, ?>> TNameAccess selectAccess(final List<? extends TNameAccess> accessList) {
+	public <TNameAccess extends NameAccess<?, ?>> @Nullable TNameAccess selectAccess(
+			final List<? extends TNameAccess> accessList) {
 		for (final TNameAccess candidate : accessList) {
 			if (candidate.isWriteAccess()) {
 				return candidate;
@@ -93,20 +99,23 @@
 		return new LabelProvider();
 	}
 	
-	public void open(final SourceElement element, final boolean activate) throws PartInitException  {
+	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();
+			final IResource resource= ((WorkspaceSourceUnit)su).getResource();
 			if (resource.getType() == IResource.FILE) {
-				open((IFile) resource, activate, element.getNameSourceRange());
+				open((IFile)resource, activate, element);
 				return;
 			}
 		}
 	}
 	
-	public void open(final IFile file, final boolean activate, final TextRegion region) throws PartInitException  {
+	public void open(final IFile file, final boolean activate,
+			final @Nullable SourceElement<?> element)
+			throws PartInitException  {
 		final IWorkbenchPage page= UIAccess.getActiveWorkbenchPage(true);
-		final IEditorDescriptor editorDescriptor= IDE.getEditorDescriptor(file, true);
+		final IEditorDescriptor editorDescriptor= IDE.getEditorDescriptor(file, true, true);
 		final FileEditorInput input= new FileEditorInput(file);
 		IEditorPart editorPart= page.findEditor(input);
 		if (editorPart == null || !(editorPart instanceof ITextEditor)) {
@@ -115,12 +124,18 @@
 		else if (activate) {
 			page.activate(editorPart);
 		}
-		if (editorPart instanceof ITextEditor) {
-			((ITextEditor) editorPart).selectAndReveal(region.getStartOffset(), region.getLength());
+		
+		if (element != null) {
+			if (editorPart instanceof ITextEditor) {
+				final var region= LTKSelectionUtils.getRegionToSelect(element);
+				if (region != null) {
+					((ITextEditor)editorPart).selectAndReveal(region.getStartOffset(), region.getLength());
+				}
+			}
 		}
 	}
 	
-	public void open(final ISourceEditor editor, final NameAccess<?, ?> access) {
+	public void open(final SourceEditor editor, final NameAccess<?, ?> access) {
 		AstNode node= access.getNameNode();
 		if (node != null) {
 			editor.selectAndReveal(node.getStartOffset(), node.getLength());
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectLineBeginHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectLineBeginHandler.java
index 3ae09b9..23fcec7 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectLineBeginHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectLineBeginHandler.java
@@ -17,13 +17,16 @@
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.swt.custom.ST;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class SelectLineBeginHandler extends SourceEditorTextHandler {
 	
 	
-	public SelectLineBeginHandler(final ISourceEditor editor) {
+	public SelectLineBeginHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectLineEndHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectLineEndHandler.java
index 095dd51..dd5cb5b 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectLineEndHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectLineEndHandler.java
@@ -17,13 +17,16 @@
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.swt.custom.ST;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class SelectLineEndHandler extends SourceEditorTextHandler {
 	
 	
-	public SelectLineEndHandler(final ISourceEditor editor) {
+	public SelectLineEndHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectNextWordHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectNextWordHandler.java
index 47728ed..b2abdcf 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectNextWordHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectNextWordHandler.java
@@ -18,13 +18,16 @@
 import org.eclipse.jface.text.BlockTextSelection;
 import org.eclipse.swt.custom.ST;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class SelectNextWordHandler extends SourceEditorTextHandler {
 	
 	
-	public SelectNextWordHandler(final ISourceEditor editor) {
+	public SelectNextWordHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectPreviousWordHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectPreviousWordHandler.java
index 952ce04..432c08a 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectPreviousWordHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SelectPreviousWordHandler.java
@@ -18,13 +18,16 @@
 import org.eclipse.jface.text.BlockTextSelection;
 import org.eclipse.swt.custom.ST;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public class SelectPreviousWordHandler extends SourceEditorTextHandler {
 	
 	
-	public SelectPreviousWordHandler(final ISourceEditor editor) {
+	public SelectPreviousWordHandler(final SourceEditor editor) {
 		super(editor);
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SourceEditorOperationHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SourceEditorOperationHandler.java
index 7d9c17d..56ba3ba 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SourceEditorOperationHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SourceEditorOperationHandler.java
@@ -14,59 +14,40 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting.actions;
 
-import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
-
-import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.jface.text.ITextOperationTarget;
-import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.swt.widgets.Display;
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
-import org.eclipse.statet.ecommons.ui.util.UIAccess;
-import org.eclipse.statet.ecommons.ui.workbench.WorkbenchUIUtils;
-
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
 @NonNullByDefault
-public class SourceEditorOperationHandler extends AbstractHandler {
+public class SourceEditorOperationHandler extends AbstractSourceEditorHandler {
 	
 	
-	private final @Nullable ISourceEditor editor;
-	
 	private final int textOperation;
 	
 	
-	public SourceEditorOperationHandler(final ISourceEditor editor, final int textOperation) {
-		this.editor= nonNullAssert(editor);
-		this.textOperation= textOperation;
-	}
-	
 	public SourceEditorOperationHandler(final int textOperation) {
-		this.editor= null;
+		super();
+		this.textOperation= textOperation;
+	}
+	
+	public SourceEditorOperationHandler(final SourceEditor editor, final int textOperation) {
+		super(editor);
 		this.textOperation= textOperation;
 	}
 	
 	
-	protected int getTextOperation() {
+	protected final int getTextOperation() {
 		return this.textOperation;
 	}
 	
-	protected @Nullable ISourceEditor getSourceEditor(final @Nullable Object context) {
-		if (this.editor != null) {
-			return this.editor;
-		}
-		final IWorkbenchPart part= WorkbenchUIUtils.getActivePart(context);
-		if (part == null) {
-			return null;
-		}
-		return part.getAdapter(ISourceEditor.class);
-	}
-	
-	protected @Nullable ITextOperationTarget getOperationTarget(final ISourceEditor editor) {
+	protected @Nullable ITextOperationTarget getOperationTarget(final SourceEditor editor) {
 		ITextOperationTarget target= editor.getAdapter(ITextOperationTarget.class);
 		if (target == null) {
 			target= editor.getViewer().getTextOperationTarget();
@@ -76,8 +57,8 @@
 	
 	@Override
 	public void setEnabled(final @Nullable Object evaluationContext) {
-		final ISourceEditor editor= getSourceEditor(evaluationContext);
-		if (editor == null || !UIAccess.isOkToUse(editor.getViewer())) {
+		final SourceEditor editor= getSourceEditor(evaluationContext);
+		if (editor == null || !isSupported(editor)) {
 			setBaseEnabled(false);
 			return;
 		}
@@ -89,15 +70,17 @@
 	
 	@Override
 	public @Nullable Object execute(final ExecutionEvent event) throws ExecutionException {
-		final ISourceEditor editor= getSourceEditor(event.getApplicationContext());
-		if (editor == null || !UIAccess.isOkToUse(editor.getViewer())) {
+		final SourceEditor editor= getSourceEditor(event.getApplicationContext());
+		if (editor == null || !isSupported(editor)) {
 			return null;
 		}
 		
 		final ITextOperationTarget operationTarget= getOperationTarget(editor);
 		if (operationTarget != null && operationTarget.canDoOperation(this.textOperation)) {
 			operationTarget.doOperation(this.textOperation);
+			return null;
 		}
+		Display.getCurrent().beep();
 		return null;
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SourceEditorTextHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SourceEditorTextHandler.java
index aabbf88..b899b88 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SourceEditorTextHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SourceEditorTextHandler.java
@@ -37,14 +37,18 @@
 import org.eclipse.ui.editors.text.EditorsUI;
 import org.eclipse.ui.texteditor.AbstractTextEditor;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.text.DocumentCodepointIterator;
 import org.eclipse.statet.ecommons.text.ICodepointIterator;
 import org.eclipse.statet.ecommons.text.TextUtil;
 import org.eclipse.statet.ecommons.ui.util.DNDUtils;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
+@NonNullByDefault
 public abstract class SourceEditorTextHandler extends AbstractHandler {
 	// TODO Add CamelCase support
 	
@@ -57,7 +61,7 @@
 	
 	protected static class ExecData {
 		
-		private final ISourceEditor editor;
+		private final SourceEditor editor;
 		private final SourceViewer viewer;
 		private final StyledText widget;
 		
@@ -67,16 +71,16 @@
 		private final int caretDocOffset;
 		
 		private int caretDocLine= Integer.MIN_VALUE;
-		private IRegion caretDocLineInfo;
+		private @Nullable IRegion caretDocLineInfo;
 		
-		private LinkedModeModel linkedModel;
+		private @Nullable LinkedModeModel linkedModel;
 		
 		
-		public ExecData(final ISourceEditor editor) throws BadLocationException {
+		public ExecData(final SourceEditor editor) throws BadLocationException {
 			this.editor= editor;
 			this.viewer= editor.getViewer();
 			this.widget= getViewer().getTextWidget();
-			this.document= (AbstractDocument) getViewer().getDocument();
+			this.document= (AbstractDocument)getViewer().getDocument();
 			this.caretWidgetOffset= getWidget().getCaretOffset();
 			this.caretDocOffset= getViewer().widgetOffset2ModelOffset(getCaretWidgetOffset());
 			if (this.caretDocOffset < 0) {
@@ -91,7 +95,7 @@
 					&& store.getBoolean(AbstractTextEditor.PREFERENCE_NAVIGATION_SMART_HOME_END) );
 		}
 		
-		public ISourceEditor getEditor() {
+		public SourceEditor getEditor() {
 			return this.editor;
 		}
 		
@@ -125,17 +129,21 @@
 		}
 		
 		public int getCaretDocLine() throws BadLocationException {
-			if (this.caretDocLine == Integer.MIN_VALUE) {
-				this.caretDocLine= getDocument().getLineOfOffset(getCaretDocOffset());
+			var line= this.caretDocLine;
+			if (line == Integer.MIN_VALUE) {
+				line= getDocument().getLineOfOffset(getCaretDocOffset());
+				this.caretDocLine= line;
 			}
-			return this.caretDocLine;
+			return line;
 		}
 		
 		public IRegion getCaretDocLineInformation() throws BadLocationException {
-			if (this.caretDocLineInfo == null) {
-				this.caretDocLineInfo= getDocument().getLineInformation(getCaretDocLine());
+			var lineInfo= this.caretDocLineInfo;
+			if (lineInfo == null) {
+				lineInfo= getDocument().getLineInformation(getCaretDocLine());
+				this.caretDocLineInfo= lineInfo;
 			}
-			return this.caretDocLineInfo;
+			return lineInfo;
 		}
 		
 		public int getCaretDocLineStartOffset() throws BadLocationException {
@@ -151,25 +159,27 @@
 			return getCaretDocOffset() - getCaretDocLineStartOffset();
 		}
 		
-		public LinkedModeModel getLinkedModel() {
-			if (this.linkedModel == null) {
-				this.linkedModel= LinkedModeModel.getModel(getDocument(), getCaretDocOffset());
+		public @Nullable LinkedModeModel getLinkedModel() {
+			var linkedModel= this.linkedModel;
+			if (linkedModel == null) {
+				linkedModel= LinkedModeModel.getModel(getDocument(), getCaretDocOffset());
+				this.linkedModel= linkedModel;
 			}
-			return this.linkedModel;
+			return linkedModel;
 		}
 		
 	}
 	
 	
-	private final ISourceEditor editor;
+	private final SourceEditor editor;
 	
 	
-	public SourceEditorTextHandler(final ISourceEditor editor) {
+	public SourceEditorTextHandler(final SourceEditor editor) {
 		this.editor= editor;
 	}
 	
 	
-	private ISourceEditor getEditor(final Object context) {
+	private @Nullable SourceEditor getEditor(final @Nullable Object context) {
 		return this.editor;
 	}
 	
@@ -190,15 +200,15 @@
 	}
 	
 	@Override
-	public void setEnabled(final Object evaluationContext) {
-		final ISourceEditor editor= getEditor(evaluationContext);
+	public void setEnabled(final @Nullable Object evaluationContext) {
+		final SourceEditor editor= getEditor(evaluationContext);
 		setBaseEnabled(editor != null
 				&& (!isEditAction() || editor.isEditable(false)) );
 	}
 	
 	@Override
-	public Object execute(final ExecutionEvent event) throws ExecutionException {
-		final ISourceEditor editor= getEditor(event.getApplicationContext());
+	public @Nullable Object execute(final ExecutionEvent event) throws ExecutionException {
+		final SourceEditor editor= getEditor(event.getApplicationContext());
 		if (editor == null) {
 			return null;
 		}
@@ -243,13 +253,15 @@
 	protected int findPreviousWordOffset(final ExecData data, final int offset,
 			final boolean sameLine) throws BadLocationException {
 		int bound= 0;
-		if (data.getLinkedModel() != null) {
-			final LinkedPosition linkedPosition= data.getLinkedModel().findPosition(
-					new LinkedPosition(data.getDocument(), offset, 0) );
-			if (linkedPosition != null) {
-				final int begin= linkedPosition.getOffset();
-				if (begin < offset) {
-					bound= begin;
+		{	final var linkedModel= data.getLinkedModel();
+			if (linkedModel != null) {
+				final LinkedPosition linkedPosition= linkedModel.findPosition(
+						new LinkedPosition(data.getDocument(), offset, 0) );
+				if (linkedPosition != null) {
+					final int begin= linkedPosition.getOffset();
+					if (begin < offset) {
+						bound= begin;
+					}
 				}
 			}
 		}
@@ -298,13 +310,15 @@
 	protected int findNextWordOffset(final ExecData data, final int offset,
 			final boolean sameLine) throws BadLocationException {
 		int bound= data.getDocument().getLength();
-		if (data.getLinkedModel() != null) {
-			final LinkedPosition linkedPosition= data.getLinkedModel().findPosition(
-					new LinkedPosition(data.getDocument(), offset, 0) );
-			if (linkedPosition != null) {
-				final int end= linkedPosition.getOffset() + linkedPosition.getLength();
-				if (end > offset) {
-					bound= end;
+		{	final var linkedModel= data.getLinkedModel();
+			if (linkedModel != null) {
+				final LinkedPosition linkedPosition= linkedModel.findPosition(
+						new LinkedPosition(data.getDocument(), offset, 0) );
+				if (linkedPosition != null) {
+					final int end= linkedPosition.getOffset() + linkedPosition.getLength();
+					if (end > offset) {
+						bound= end;
+					}
 				}
 			}
 		}
@@ -424,7 +438,7 @@
 					widgetSelection.y : widgetSelection.x);
 		}
 		if (data.toWidgetOffset(newDocOffset) < 0 && data.getViewer() instanceof ProjectionViewer) {
-			((ProjectionViewer) data.getViewer()).exposeModelRange(new Region(newDocOffset, 0));
+			((ProjectionViewer)data.getViewer()).exposeModelRange(new Region(newDocOffset, 0));
 		}
 		selectAndReveal(data, otherDocOffset, newDocOffset - otherDocOffset);
 	}
@@ -446,7 +460,7 @@
 	protected void delete(final ExecData data, final IRegion docRegion)
 			throws BadLocationException {
 		if (data.getViewer() instanceof ProjectionViewer) {
-			((ProjectionViewer) data.getViewer()).exposeModelRange(docRegion);
+			((ProjectionViewer)data.getViewer()).exposeModelRange(docRegion);
 		}
 		data.getViewer().setSelectedRange(docRegion.getOffset(), 0);
 		if (docRegion.getLength() > 0) {
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SpecificContentAssistHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SpecificContentAssistHandler.java
index 5685938..f97528a 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SpecificContentAssistHandler.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/actions/SpecificContentAssistHandler.java
@@ -24,8 +24,8 @@
 
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
 import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditorCommandIds;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 import org.eclipse.statet.ltk.ui.sourceediting.assist.ContentAssist;
 
 
@@ -44,7 +44,7 @@
 	 *
 	 * @param registry the computer registry to use for the enablement of proposal categories
 	 */
-	public SpecificContentAssistHandler(final ISourceEditor editor, final ContentAssist contentAssist) {
+	public SpecificContentAssistHandler(final SourceEditor editor, final ContentAssist contentAssist) {
 		super(editor, ISourceViewer.CONTENTASSIST_PROPOSALS);
 		this.contentAssist= contentAssist;
 	}
@@ -63,7 +63,7 @@
 		if (par == null) {
 			return null;
 		}
-		final ISourceEditor editor= getSourceEditor(event.getApplicationContext());
+		final SourceEditor editor= getSourceEditor(event.getApplicationContext());
 		if (editor == null || !UIAccess.isOkToUse(editor.getViewer())) {
 			return null;
 		}
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 4a61244..3e41612 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
@@ -33,14 +33,14 @@
 import org.eclipse.statet.ltk.ast.core.util.AstSelection;
 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;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
 @NonNullByDefault
 public class AssistInvocationContext implements IQuickAssistInvocationContext, TextRegion {
 	
 	
-	private final ISourceEditor editor;
+	private final SourceEditor editor;
 	private final SourceViewer sourceViewer;
 	
 	private final int invocationOffset;
@@ -61,7 +61,7 @@
 	int session;
 	
 	
-	public AssistInvocationContext(final ISourceEditor editor,
+	public AssistInvocationContext(final SourceEditor editor,
 			final int offset, final String contentType,
 			final int synch, final IProgressMonitor monitor) {
 		this.editor= editor;
@@ -80,7 +80,7 @@
 		init(synch, monitor);
 	}
 	
-	public AssistInvocationContext(final ISourceEditor editor,
+	public AssistInvocationContext(final SourceEditor editor,
 			final IRegion region, final String contentType,
 			final int synch, final IProgressMonitor monitor) {
 		if (region.getOffset() < 0 || region.getLength() < 0) {
@@ -101,7 +101,7 @@
 		init(synch, monitor);
 	}
 	
-	public AssistInvocationContext(final ISourceEditor editor,
+	public AssistInvocationContext(final SourceEditor editor,
 			final TextRegion region, final String contentType,
 			final int synch, final IProgressMonitor monitor) {
 		if (region.getStartOffset() < 0 || region.getLength() < 0) {
@@ -137,7 +137,7 @@
 		return (selectedRange.x == getOffset() && selectedRange.y == getLength());
 	}
 	
-	protected boolean reuse(final ISourceEditor editor, final int offset) {
+	protected boolean reuse(final SourceEditor editor, final int offset) {
 		return (this.editor == editor
 				&& this.invocationOffset == offset
 				&& isInitialState() );
@@ -149,7 +149,7 @@
 	}
 	
 	
-	public ISourceEditor getEditor() {
+	public SourceEditor getEditor() {
 		return this.editor;
 	}
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistComputer.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistComputer.java
index 506aee6..aa8b7f4 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistComputer.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/ContentAssistComputer.java
@@ -18,7 +18,7 @@
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
 /**
@@ -44,7 +44,7 @@
 	 * @param editor the source editor the session belong to
 	 * @param assist the content assistant of the editor starting the session
 	 */
-	void onSessionStarted(ISourceEditor editor, ContentAssist assist);
+	void onSessionStarted(SourceEditor editor, ContentAssist assist);
 	
 	/**
 	 * Informs the computer that a content assist session has ended. This call will always be after
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 7a29e3f..1acad62 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
@@ -51,7 +51,7 @@
 
 import org.eclipse.statet.internal.ltk.ui.EditingMessages;
 import org.eclipse.statet.ltk.core.Ltk;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
 /**
@@ -77,7 +77,7 @@
 	
 	private static final Collator NAME_COLLATOR= Collator.getInstance();
 	
-	static final Comparator<AssistProposal> PROPOSAL_COMPARATOR= new Comparator<AssistProposal>() {
+	static final Comparator<AssistProposal> PROPOSAL_COMPARATOR= new Comparator<>() {
 		
 		@Override
 		public int compare(final AssistProposal proposal1, final AssistProposal proposal2) {
@@ -136,7 +136,7 @@
 	 */
 	private final ContentAssistComputerRegistry computerRegistry;
 	
-	private final ISourceEditor editor;
+	private final SourceEditor editor;
 	
 	private char[] completionProposalsAutoActivationCharacters;
 	private char[] contextInformationAutoActivationCharacters;
@@ -164,7 +164,7 @@
 	
 	
 	public ContentAssistProcessor(final ContentAssist assistant, final String contentType,
-			final ContentAssistComputerRegistry registry, final ISourceEditor editor) {
+			final ContentAssistComputerRegistry registry, final SourceEditor editor) {
 		super(assistant, contentType);
 		assert(registry != null);
 		assert(editor != null);
@@ -177,7 +177,7 @@
 	}
 	
 	
-	protected ISourceEditor getEditor() {
+	protected SourceEditor getEditor() {
 		return this.editor;
 	}
 	
@@ -713,7 +713,7 @@
 				included.add(category);
 			}
 		}
-		for (final ContentAssistCategory category : this.expliciteCategories.toList()) {
+		for (final ContentAssistCategory category : this.expliciteCategories) {
 			if (category.isEnabledInDefault() && category.hasComputers(getContentType())) {
 				included.add(category);
 			}
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 165411c..6aeee45 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
@@ -33,7 +33,7 @@
 import org.eclipse.statet.ecommons.ui.workbench.WorkbenchUIUtils;
 
 import org.eclipse.statet.ltk.model.core.ModelManager;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 import org.eclipse.statet.ltk.ui.sourceediting.assist.TemplateProposal.TemplateProposalParameters;
 import org.eclipse.statet.ltk.ui.templates.SourceEditorTemplateContext;
 
@@ -52,7 +52,7 @@
 	
 	protected abstract @Nullable TemplateCompletionComputer getComputer();
 	
-	protected AssistInvocationContext createContext(final ISourceEditor editor)
+	protected AssistInvocationContext createContext(final SourceEditor editor)
 			throws BadPartitioningException, BadLocationException {
 		final TextRegion region= editor.getSelectedRegion();
 		final String contentType= TextUtils.getContentType(editor.getViewer().getDocument(),
@@ -76,11 +76,9 @@
 		if (template == null) {
 			return null;
 		}
-		final ISourceEditor editor;
+		final SourceEditor editor;
 		{	final IWorkbenchPart activePart= WorkbenchUIUtils.getActivePart(event.getApplicationContext());
-			editor= (activePart != null) ?
-					activePart.getAdapter(ISourceEditor.class) :
-					null;
+			editor= (activePart != null) ? activePart.getAdapter(SourceEditor.class) : null;
 		}
 		if (editor == null) {
 			return null;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/LinkedNamesAssistProposal.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/LinkedNamesAssistProposal.java
index bc75abd..639e408 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/LinkedNamesAssistProposal.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/LinkedNamesAssistProposal.java
@@ -47,8 +47,8 @@
 
 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.ITextEditToolSynchronizer;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.TextEditToolSynchronizer;
 
 
 @NonNullByDefault
@@ -143,8 +143,8 @@
 			model.addGroup(group);
 			
 			model.forceInstall();
-			{	final ISourceEditor editor= this.context.getEditor();
-				final ITextEditToolSynchronizer synchronizer;
+			{	final SourceEditor editor= this.context.getEditor();
+				final TextEditToolSynchronizer synchronizer;
 				if (editor != null && (synchronizer= editor.getTextEditToolSynchronizer()) != null) {
 					synchronizer.install(model);
 				}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/PathCompletionComputor.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/PathCompletionComputor.java
index 8c9fc5f..b60049c 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/PathCompletionComputor.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/PathCompletionComputor.java
@@ -51,7 +51,7 @@
 import org.eclipse.statet.ecommons.ui.SharedUIResources;
 
 import org.eclipse.statet.internal.ltk.ui.LTKUIPlugin;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 import org.eclipse.statet.ltk.ui.sourceediting.assist.SourceProposal.ProposalParameters;
 
 
@@ -211,7 +211,7 @@
 	
 	
 	@Override
-	public void onSessionStarted(final ISourceEditor editor, final ContentAssist assist) {
+	public void onSessionStarted(final SourceEditor editor, final ContentAssist assist) {
 		int matchRules= SearchPattern.PREFIX_MATCH;
 		if (assist.getShowSubstringMatches()) {
 			matchRules |= SearchPattern.SUBSTRING_MATCH;
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 418adb7..dd0a8b3 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
@@ -47,7 +47,7 @@
 import org.eclipse.statet.ecommons.text.core.util.TextUtils;
 
 import org.eclipse.statet.ltk.model.core.ModelManager;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
 /**
@@ -156,12 +156,12 @@
 	}
 	
 	
-	private final ISourceEditor editor;
+	private final SourceEditor editor;
 	
 	private @Nullable String errorMessage;
 	
 	
-	public QuickAssistProcessor(final ISourceEditor editor) {
+	public QuickAssistProcessor(final SourceEditor editor) {
 		this.editor= nonNullAssert(editor);
 	}
 	
@@ -169,7 +169,7 @@
 	/**
 	 * @return the editor
 	 */
-	public final ISourceEditor getEditor() {
+	public final SourceEditor getEditor() {
 		return this.editor;
 	}
 	
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 8b271f8..595f273 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
@@ -28,14 +28,14 @@
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
 import org.eclipse.statet.ltk.model.core.element.SourceUnit;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
 public class ReshowCompletionsRunnable implements Runnable, Listener, ICompletionListener {
 	
 	
 	// Snapshot of current state
-	private final ISourceEditor editor;
+	private final SourceEditor editor;
 	private final ISourceViewer viewer;
 	private final SourceUnit su;
 	private final AbstractDocument document;
@@ -48,7 +48,7 @@
 	private boolean assistSelection;
 	
 	
-	public ReshowCompletionsRunnable(final ISourceEditor editor, final ContentAssist assist) {
+	public ReshowCompletionsRunnable(final SourceEditor editor, final ContentAssist assist) {
 		this.editor= editor;
 		this.viewer= editor.getViewer();
 		this.su= editor.getSourceUnit();
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 b82f5ed..2f1d781 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
@@ -42,7 +42,7 @@
 
 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.SourceEditor;
 import org.eclipse.statet.ltk.ui.sourceediting.assist.SourceProposal.ProposalParameters;
 import org.eclipse.statet.ltk.ui.sourceediting.assist.TemplateProposal.TemplateProposalParameters;
 import org.eclipse.statet.ltk.ui.templates.SourceEditorTemplateContext;
@@ -90,7 +90,7 @@
 	
 	
 	@Override
-	public void onSessionStarted(final ISourceEditor editor, final ContentAssist assist) {
+	public void onSessionStarted(final SourceEditor editor, final ContentAssist assist) {
 		int matchRules= SearchPattern.PREFIX_MATCH;
 		if (assist.getShowSubstringMatches()) {
 			matchRules |= SearchPattern.SUBSTRING_MATCH;
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 0ef0c12..f88d933 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
@@ -59,7 +59,7 @@
 
 import org.eclipse.statet.internal.ltk.ui.LTKUIPlugin;
 import org.eclipse.statet.ltk.ui.LTKUI;
-import org.eclipse.statet.ltk.ui.sourceediting.ITextEditToolSynchronizer;
+import org.eclipse.statet.ltk.ui.sourceediting.TextEditToolSynchronizer;
 import org.eclipse.statet.ltk.ui.templates.IWorkbenchTemplateContext;
 import org.eclipse.statet.ltk.ui.util.LTKSelectionUtils;
 
@@ -68,7 +68,7 @@
  * Like default {@link org.eclipse.jface.text.templates.TemplateProposal}, but
  * <ul>
  *   <li>supports substring matching
- *   <li>supports {@link ITextEditToolSynchronizer}</li>
+ *   <li>supports {@link TextEditToolSynchronizer}</li>
  * </ul>
  */
 @NonNullByDefault
@@ -320,7 +320,7 @@
 			if (hasPositions) {
 				model.forceInstall();
 				
-				final ITextEditToolSynchronizer toolSynchronizer= getInvocationContext().getEditor()
+				final TextEditToolSynchronizer toolSynchronizer= getInvocationContext().getEditor()
 						.getTextEditToolSynchronizer();
 				if (toolSynchronizer != null) {
 					toolSynchronizer.install(model);
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/AbstractFoldingPosition.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/AbstractFoldingPosition.java
index 473f41f..090ddab 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/AbstractFoldingPosition.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/AbstractFoldingPosition.java
@@ -16,7 +16,11 @@
 
 import org.eclipse.jface.text.Position;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
+
+@NonNullByDefault
 public abstract class AbstractFoldingPosition<E extends AbstractFoldingPosition<E>> extends Position {
 	
 	
@@ -29,11 +33,14 @@
 	
 	
 	@Override
-	public boolean equals(final Object obj) {
+	public boolean equals(final @Nullable Object obj) {
+		if (this == obj) {
+			return true;
+		}
 		if (obj instanceof AbstractFoldingPosition<?>
 				&& this.getClass() == obj.getClass() ) {
-			final AbstractFoldingPosition<?> other= (AbstractFoldingPosition<?>) obj;
-			return ((this.offset == other.offset) && (this.length == other.length));
+			final AbstractFoldingPosition<?> other= (AbstractFoldingPosition<?>)obj;
+			return (this.offset == other.offset && this.length == other.length);
 		}
 		return false;
 	}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/FoldingAnnotation.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/FoldingAnnotation.java
index c35b412..76548e3 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/FoldingAnnotation.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/FoldingAnnotation.java
@@ -16,7 +16,10 @@
 
 import org.eclipse.jface.text.source.projection.ProjectionAnnotation;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
+
+@NonNullByDefault
 public final class FoldingAnnotation extends ProjectionAnnotation {
 	
 	
@@ -65,10 +68,11 @@
 		return this.position;
 	}
 	
+	@SuppressWarnings({ "rawtypes", "unchecked" })
 	protected boolean update(final FoldingAnnotation newAnn) {
 		if (this.type == newAnn.type && newAnn.getClass() == FoldingAnnotation.class
 				&& this.position.getClass() == newAnn.position.getClass()
-				&& ((AbstractFoldingPosition) this.position).update(newAnn.position) ) {
+				&& ((AbstractFoldingPosition)this.position).update(newAnn.position) ) {
 			this.initialState= newAnn.initialState;
 			return true;
 		}
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 90a1699..c83cbf2 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
@@ -53,12 +53,13 @@
 import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 import org.eclipse.statet.ltk.model.core.element.WorkspaceSourceUnit;
 import org.eclipse.statet.ltk.ui.ModelElementInputListener;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditorAddon;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor1;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditorAddon;
 
 
-public class FoldingEditorAddon implements ISourceEditorAddon, ModelElementInputListener, ChangeListener {
+public class FoldingEditorAddon implements SourceEditorAddon, ModelElementInputListener,
+		ChangeListener {
 	
 	
 	public static final class FoldingStructureComputationContext {
@@ -122,8 +123,8 @@
 	
 	
 	@Override
-	public void install(final ISourceEditor editor) {
-		this.editor= (SourceEditor1) editor;
+	public void install(final SourceEditor editor) {
+		this.editor= (SourceEditor1)editor;
 		PreferencesUtil.getSettingsChangeNotifier().addChangeListener(this);
 		this.provider.checkConfig(null);
 		this.editor.getModelInputProvider().addListener(this);
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/FoldingProvider.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/FoldingProvider.java
index a3d8141..7af95ef 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/FoldingProvider.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/FoldingProvider.java
@@ -17,9 +17,12 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Set;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 import org.eclipse.statet.ltk.ui.sourceediting.folding.FoldingEditorAddon.FoldingStructureComputationContext;
 
 
+@NonNullByDefault
 public interface FoldingProvider {
 	
 	
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/NodeFoldingProvider.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/NodeFoldingProvider.java
index ef27100..d7b8319 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/NodeFoldingProvider.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/NodeFoldingProvider.java
@@ -18,14 +18,19 @@
 import java.util.IdentityHashMap;
 import java.util.Map;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
 import org.eclipse.statet.ltk.ui.sourceediting.folding.FoldingEditorAddon.FoldingStructureComputationContext;
 
 
+@NonNullByDefault
 public interface NodeFoldingProvider extends FoldingProvider {
 	
 	
+	@SuppressWarnings("serial")
 	class VisitorMap extends IdentityHashMap<String, AstVisitor> {
 		
 		
@@ -45,7 +50,7 @@
 		}
 		
 		
-		public AstVisitor getOrCreate(final String type,
+		public @Nullable AstVisitor getOrCreate(final String type,
 				final FoldingStructureComputationContext context) {
 			AstVisitor visitor= super.get(type);
 			if (visitor == null) {
@@ -62,7 +67,7 @@
 		}
 		
 		@Override
-		public AstVisitor get(final Object key) {
+		public @Nullable AstVisitor get(@SuppressWarnings("null") final Object key) {
 			final AstVisitor visitor= super.get(key);
 			return (visitor != NONE) ? visitor : null;
 		}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/SimpleFoldingPosition.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/SimpleFoldingPosition.java
index 6c2fddd..1c306ec 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/SimpleFoldingPosition.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/folding/SimpleFoldingPosition.java
@@ -14,7 +14,10 @@
 
 package org.eclipse.statet.ltk.ui.sourceediting.folding;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
+
+@NonNullByDefault
 public final class SimpleFoldingPosition extends AbstractFoldingPosition<SimpleFoldingPosition> {
 	
 	
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 127d4c9..8b6dfd0 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
@@ -22,7 +22,7 @@
 import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.ltk.model.core.element.SourceUnit;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
 /**
@@ -34,7 +34,7 @@
 	
 	public @Nullable SourceUnit getSourceUnit();
 	
-	public @Nullable ISourceEditor getEditor();
+	public @Nullable SourceEditor getEditor();
 	
 	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/SourceEditorTemplateContext.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/SourceEditorTemplateContext.java
index 84a3a87..0d75221 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
@@ -39,7 +39,7 @@
 import org.eclipse.statet.ecommons.text.TextUtil;
 
 import org.eclipse.statet.ltk.model.core.element.SourceUnit;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
 @NonNullByDefault
@@ -54,14 +54,14 @@
 	protected static final String INDENTATION_VAR_NAME= "indentation"; //$NON-NLS-1$
 	
 	
-	private final ISourceEditor editor;
+	private final SourceEditor editor;
 	
 	private final int flags;
 	
 	
 	public SourceEditorTemplateContext(final TemplateContextType type, final IDocument document,
 			final TextRegion region,
-			final ISourceEditor editor, final int flags) {
+			final SourceEditor editor, final int flags) {
 		super(type, document, region.getStartOffset(), region.getLength());
 		this.editor= editor;
 		this.flags= flags;
@@ -69,7 +69,7 @@
 	
 	
 	@Override
-	public ISourceEditor getEditor() {
+	public SourceEditor getEditor() {
 		return this.editor;
 	}
 	
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 944e978..6593053 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
@@ -35,7 +35,7 @@
 import org.eclipse.statet.ecommons.ui.ISettingsChangedHandler;
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 import org.eclipse.statet.ltk.ui.sourceediting.SourceEditorViewerConfigurator;
 import org.eclipse.statet.ltk.ui.sourceediting.ViewerSourceEditorAdapter;
 
@@ -49,7 +49,7 @@
 	
 	private TextViewerJFaceUpdater viewerUpdater= null;
 	private SourceEditorViewerConfigurator configurator;
-	private ISourceEditor editor;
+	private SourceEditor editor;
 	
 	
 	public TemplatePreview() {
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 4d002cb..d22346a 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
@@ -53,7 +53,7 @@
 
 import org.eclipse.statet.internal.ltk.ui.LTKUIPlugin;
 import org.eclipse.statet.ltk.model.core.ModelManager;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 import org.eclipse.statet.ltk.ui.sourceediting.SourceEditorViewerConfigurator;
 import org.eclipse.statet.ltk.ui.sourceediting.ViewerSourceEditorAdapter;
 import org.eclipse.statet.ltk.ui.sourceediting.assist.AssistInvocationContext;
@@ -77,9 +77,9 @@
 	private @Nullable Runnable templateStoreListener;
 	
 	private final ITextEditor editorPart;
-	private final ISourceEditor sourceEditor;
+	private final SourceEditor sourceEditor;
 	
-	private ISourceEditor previewEditor;
+	private SourceEditor previewEditor;
 	private final TemplateVariableProcessor previewTemplateProcessor;
 	private final TemplateVariableProcessor editTemplateProcessor;
 	
@@ -88,7 +88,7 @@
 	
 	
 	protected AbstractEditorTemplatesPage(final EnhTemplateStore templateStore,
-			final ITextEditor editorPart, final ISourceEditor sourceEditor) {
+			final ITextEditor editorPart, final SourceEditor sourceEditor) {
 		super(editorPart, sourceEditor.getViewer());
 		
 		this.templateStore= templateStore;
@@ -102,12 +102,12 @@
 	}
 	
 	
-	protected ISourceEditor getSourceEditor() {
+	protected SourceEditor getSourceEditor() {
 		return this.sourceEditor;
 	}
 	
 	protected AssistInvocationContext createContext(
-			final ISourceEditor editor, final TextRegion region)
+			final SourceEditor editor, final TextRegion region)
 			throws BadPartitioningException, BadLocationException {
 		final String contentType= TextUtils.getContentType(editor.getViewer().getDocument(),
 				editor.getDocumentContentInfo(), region.getStartOffset(), true );
@@ -131,7 +131,7 @@
 	@Override
 	protected boolean isValidTemplate(final IDocument document, final Template template,
 			final int offset, final int length) {
-		final ISourceEditor sourceEditor= getSourceEditor();
+		final SourceEditor sourceEditor= getSourceEditor();
 		if (sourceEditor == null) {
 			return false;
 		}
@@ -158,7 +158,7 @@
 	
 	@Override
 	protected void insertTemplate(final Template template, final IDocument document) {
-		final ISourceEditor sourceEditor= getSourceEditor();
+		final SourceEditor sourceEditor= getSourceEditor();
 		if (sourceEditor == null || !sourceEditor.isEditable(true)) {
 			return;
 		}
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 30cd7ae..d7d3bd6 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
@@ -30,6 +30,7 @@
 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.BasicTextRegion;
 import org.eclipse.statet.jcommons.text.core.TextRegion;
 
 import org.eclipse.statet.ecommons.text.core.JFaceTextRegion;
@@ -40,10 +41,11 @@
 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.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.SourceUnitModelInfo;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
 @NonNullByDefault
@@ -67,6 +69,26 @@
 	}
 	
 	
+	public static @Nullable TextRegion getRegionToSelect(final SourceElement<?> element) {
+		{	final var region= element.getNameSourceRange();
+			if (region != null) {
+				return region;
+			}
+		}
+		{	final var region= element.getSourceRange();
+			if (region != null) {
+				return new BasicTextRegion(region.getStartOffset());
+			}
+		}
+		{	final var region= element.getDocumentationRange();
+			if (region != null) {
+				return new BasicTextRegion(region.getStartOffset());
+			}
+		}
+		return null;
+	}
+	
+	
 	public static LtkModelElement @Nullable [] getSelectedElements(final @Nullable ISelection selection) {
 		if (selection instanceof IStructuredSelection) {
 			return getSelectedElements((IStructuredSelection) selection);
@@ -90,7 +112,7 @@
 	}
 	
 	public static @Nullable SourceUnit getSingleSourceUnit(final IWorkbenchPart part) {
-		final ISourceEditor editor= part.getAdapter(ISourceEditor.class);
+		final SourceEditor editor= part.getAdapter(SourceEditor.class);
 		if (editor == null) {
 			return null;
 		}
@@ -117,7 +139,7 @@
 		return null;
 	}
 	
-	public static SourceStructElement @Nullable [] getSelectedSourceStructElements(
+	public static @NonNull SourceStructElement @Nullable [] getSelectedSourceStructElements(
 			final @Nullable ISelection selection) {
 		if (selection instanceof IStructuredSelection) {
 			return getSelectedSourceStructElements((IStructuredSelection) selection);
@@ -125,9 +147,9 @@
 		return null;
 	}
 	
-	public static SourceStructElement @Nullable [] getSelectedSourceStructElements(
+	public static @NonNull SourceStructElement @Nullable [] getSelectedSourceStructElements(
 			final IStructuredSelection selection) {
-		final SourceStructElement[] elements= new @NonNull SourceStructElement[selection.size()];
+		final @NonNull 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();
@@ -140,7 +162,7 @@
 		return elements;
 	}
 	
-	public static IFile @Nullable [] getSelectedFiles(final @Nullable ISelection selection) {
+	public static @NonNull IFile @Nullable [] getSelectedFiles(final @Nullable ISelection selection) {
 		if (selection instanceof IStructuredSelection) {
 			return getSelectedFiles((IStructuredSelection) selection);
 		}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/util/LTKWorkbenchUIUtil.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/util/LTKWorkbenchUIUtil.java
index 154886a..44f5a11 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/util/LTKWorkbenchUIUtil.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/util/LTKWorkbenchUIUtil.java
@@ -44,7 +44,7 @@
 
 import org.eclipse.statet.ecommons.ui.SharedUIResources;
 
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
 
 
 /**
@@ -54,7 +54,7 @@
 	
 	
 	public static AbstractDocument getDocument(final IWorkbenchPart part) {
-		{	final ISourceEditor editor= part.getAdapter(ISourceEditor.class);
+		{	final SourceEditor editor= part.getAdapter(SourceEditor.class);
 			if (editor != null) {
 				return (AbstractDocument) editor.getViewer().getDocument();
 			}
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 27819ac..4eb6239 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
@@ -53,8 +53,8 @@
 import org.eclipse.statet.ltk.refactoring.core.RefactoringAdapter;
 import org.eclipse.statet.ltk.refactoring.core.RefactoringDestination;
 import org.eclipse.statet.ltk.ui.refactoring.RefactoringExecutionHelper;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditor;
-import org.eclipse.statet.ltk.ui.sourceediting.ISourceEditorAssociated;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
+import org.eclipse.statet.ltk.ui.sourceediting.SourceEditorAssociated;
 
 
 public class ViewerSelectionTransferDropAdapter extends ViewerDropAdapter implements TransferDropTargetListener {
@@ -320,12 +320,12 @@
 				RefactoringCore.getConditionCheckingFailedSeverity(), 
 				getShell(), context );
 		
-		ISourceEditor editor= null;
+		SourceEditor editor= null;
 		if (this.part != null) {
-			editor= this.part.getAdapter(ISourceEditor.class);
+			editor= this.part.getAdapter(SourceEditor.class);
 			if (editor == null) {
-				final ISourceEditorAssociated associated= this.part
-						.getAdapter(ISourceEditorAssociated.class);
+				final SourceEditorAssociated associated= this.part
+						.getAdapter(SourceEditorAssociated.class);
 				if (associated != null) {
 					editor= associated.getSourceEditor();
 				}