Add more nullable annotations
diff --git a/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/io/FileValidator.java b/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/io/FileValidator.java
index e399bd9..c8e2900 100644
--- a/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/io/FileValidator.java
+++ b/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/io/FileValidator.java
@@ -39,6 +39,8 @@
 import org.eclipse.core.variables.VariablesPlugin;
 import org.eclipse.osgi.util.NLS;
 
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.io.internal.Messages;
 import org.eclipse.statet.ecommons.runtime.core.util.StatusUtils;
 import org.eclipse.statet.ecommons.variables.core.VariableText2;
@@ -83,7 +85,7 @@
 	private boolean asWorkspacePath;
 	private Map<Pattern, Integer> onPattern;
 	
-	private IValidator fileStoreValidator;
+	private IValidator<? super IFileStore> fileStoreValidator;
 	
 	private int currentMax;
 	
@@ -262,7 +264,7 @@
 		return -1;
 	}
 	
-	public void setFileStoreValidator(final IValidator validator) {
+	public void setFileStoreValidator(final IValidator<? super IFileStore> validator) {
 		this.fileStoreValidator= validator;
 	}
 	
@@ -290,7 +292,7 @@
 		setStatus(null);
 	}
 	
-	protected void setStatus(final IStatus status) {
+	protected void setStatus(final @Nullable IStatus status) {
 		this.status= status;
 	}
 	
@@ -580,7 +582,7 @@
 	}
 	
 	
-	public IFileStore getFileStore() {
+	public @Nullable IFileStore getFileStore() {
 		checkExplicit();
 		if (this.fileStore == null && this.workspaceResource != null) {
 			try {
diff --git a/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/io/ObservableFileValidator.java b/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/io/ObservableFileValidator.java
index b6d9715..6f635f9 100644
--- a/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/io/ObservableFileValidator.java
+++ b/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/io/ObservableFileValidator.java
@@ -25,16 +25,20 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.variables.IStringVariable;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.variables.core.ObservableVariable;
 
 
+@NonNullByDefault
 public class ObservableFileValidator extends FileValidator {
 	
 	
-	private class ResourceObservableValue extends AbstractObservableValue<IResource> {
+	private class ResourceObservableValue extends AbstractObservableValue<@Nullable IResource> {
 		
 		
-		private IResource value;
+		private @Nullable IResource value;
 		
 		
 		public ResourceObservableValue(final Realm realm) {
@@ -48,17 +52,17 @@
 		}
 		
 		@Override
-		protected IResource doGetValue() {
+		protected @Nullable IResource doGetValue() {
 			return this.value;
 		}
 		
 		@Override
-		protected void doSetValue(final IResource value) {
+		protected void doSetValue(final @Nullable IResource value) {
 			setExplicit(value);
 			checkExplicit();
 		}
 		
-		void update(final IResource newValue) {
+		void update(final @Nullable IResource newValue) {
 			if ((newValue != null) ? !newValue.equals(this.value) : null != this.value) {
 				fireValueChange(Diffs.createValueDiff(this.value, this.value= newValue));
 			}
@@ -66,10 +70,10 @@
 		
 	}
 	
-	private class FileStoreObservableValue extends AbstractObservableValue<IFileStore> {
+	private class FileStoreObservableValue extends AbstractObservableValue<@Nullable IFileStore> {
 		
 		
-		private IFileStore value;
+		private @Nullable IFileStore value;
 		
 		
 		public FileStoreObservableValue(final Realm realm) {
@@ -83,17 +87,17 @@
 		}
 		
 		@Override
-		protected IFileStore doGetValue() {
+		protected @Nullable IFileStore doGetValue() {
 			return this.value;
 		}
 		
 		@Override
-		protected void doSetValue(final IFileStore value) {
+		protected void doSetValue(final @Nullable IFileStore value) {
 			setExplicit(value);
 			checkExplicit();
 		}
 		
-		void update(final IFileStore newValue) {
+		void update(final @Nullable IFileStore newValue) {
 			if ((newValue != null) ? !newValue.equals(this.value) : null != this.value) {
 				fireValueChange(Diffs.createValueDiff(this.value, this.value= newValue));
 			}
@@ -104,10 +108,10 @@
 	
 	private final Realm realm;
 	
-	private IChangeListener observableListener;
+	private @Nullable IChangeListener observableListener;
 	
-	private ResourceObservableValue resourceObservable;
-	private FileStoreObservableValue fileStoreObservable;
+	private @Nullable ResourceObservableValue resourceObservable;
+	private @Nullable FileStoreObservableValue fileStoreObservable;
 	
 	
 	public ObservableFileValidator(final Realm realm) {
@@ -118,44 +122,54 @@
 	@Override
 	void checkVariable(final IStringVariable variable) {
 		if (variable instanceof ObservableVariable) {
-			if (this.observableListener == null) {
-				this.observableListener= new IChangeListener() {
+			IChangeListener listener= this.observableListener;
+			if (listener == null) {
+				listener= new IChangeListener() {
 					@Override
 					public void handleChange(final ChangeEvent event) {
 						updateVariableResolution();
 					}
 				};
+				this.observableListener= listener;
 			}
-			((ObservableVariable) variable).addChangeListener(this.observableListener);
+			((ObservableVariable) variable).addChangeListener(listener);
 		}
 	}
 	
 	@Override
-	protected void setStatus(final IStatus status) {
+	protected void setStatus(final @Nullable IStatus status) {
 		super.setStatus(status);
 		
-		if (this.resourceObservable != null) {
-			this.resourceObservable.update(getWorkspaceResource());
+		{	final ResourceObservableValue observable= this.resourceObservable;
+			if (observable != null) {
+				observable.update(getWorkspaceResource());
+			}
 		}
-		if (this.fileStoreObservable != null) {
-			this.fileStoreObservable.update(getFileStore());
+		{	final FileStoreObservableValue observable= this.fileStoreObservable;
+			if (observable != null) {
+				observable.update(getFileStore());
+			}
 		}
 	}
 	
-	public IObservableValue<IResource> getWorkspaceResourceObservable() {
-		if (this.resourceObservable == null) {
-			this.resourceObservable= new ResourceObservableValue(this.realm);
-			this.resourceObservable.update(getWorkspaceResource());
+	public IObservableValue<@Nullable IResource> getWorkspaceResourceObservable() {
+		ResourceObservableValue observable= this.resourceObservable;
+		if (observable == null) {
+			observable= new ResourceObservableValue(this.realm);
+			observable.update(getWorkspaceResource());
+			this.resourceObservable= observable;
 		}
-		return this.resourceObservable;
+		return observable;
 	}
 	
-	public IObservableValue<IFileStore> getFileStoreObservable() {
-		if (this.resourceObservable == null) {
-			this.fileStoreObservable= new FileStoreObservableValue(this.realm);
-			this.fileStoreObservable.update(getFileStore());
+	public IObservableValue<@Nullable IFileStore> getFileStoreObservable() {
+		FileStoreObservableValue observable= this.fileStoreObservable;
+		if (observable == null) {
+			observable= new FileStoreObservableValue(this.realm);
+			observable.update(getFileStore());
+			this.fileStoreObservable= observable;
 		}
-		return this.fileStoreObservable;
+		return observable;
 	}
 	
 }
diff --git a/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/variables/core/DynamicVariable.java b/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/variables/core/DynamicVariable.java
index 2645011..2d5fa80 100644
--- a/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/variables/core/DynamicVariable.java
+++ b/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/variables/core/DynamicVariable.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ecommons.variables.core;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
@@ -48,26 +50,18 @@
 		private final IDynamicVariableResolver resolver;
 		
 		
-		public ResolverVariable(final String name, final String description,
+		public ResolverVariable(final String name, final @Nullable String description,
 				final boolean supportsArgument, final IDynamicVariableResolver resolver) {
 			super(name, description, supportsArgument);
 			
-			if (resolver == null) {
-				throw new NullPointerException("resolver"); //$NON-NLS-1$
-			}
-			
-			this.resolver= resolver;
+			this.resolver= nonNullAssert(resolver);
 		}
 		
 		public ResolverVariable(final IStringVariable variable,
 				final IDynamicVariableResolver resolver) {
 			super(variable);
 			
-			if (resolver == null) {
-				throw new NullPointerException("resolver"); //$NON-NLS-1$
-			}
-			
-			this.resolver= resolver;
+			this.resolver= nonNullAssert(resolver);
 		}
 		
 		
diff --git a/ecommons/org.eclipse.statet.ecommons.databinding.core/src/org/eclipse/statet/ecommons/databinding/core/observable/WritableEqualityValue.java b/ecommons/org.eclipse.statet.ecommons.databinding.core/src/org/eclipse/statet/ecommons/databinding/core/observable/WritableEqualityValue.java
index bc4b14f..7f5e06b 100644
--- a/ecommons/org.eclipse.statet.ecommons.databinding.core/src/org/eclipse/statet/ecommons/databinding/core/observable/WritableEqualityValue.java
+++ b/ecommons/org.eclipse.statet.ecommons.databinding.core/src/org/eclipse/statet/ecommons/databinding/core/observable/WritableEqualityValue.java
@@ -18,46 +18,19 @@
 import org.eclipse.core.databinding.observable.Realm;
 import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
 
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 
 public class WritableEqualityValue<TValue> extends AbstractObservableValue<TValue> {
 	
 	
-	private final Object valueType;
+	private final @Nullable Object valueType;
 	
 	private TValue value= null;
 	
 	
 	/**
-	 * Constructs a new instance with the default realm, a <code>null</code>
-	 * value type, and a <code>null</code> value.
-	 */
-	public WritableEqualityValue() {
-		this(null, null);
-	}
-	
-	/**
-	 * Constructs a new instance with the default realm.
-	 *
-	 * @param initialValue
-	 *            can be <code>null</code>
-	 * @param valueType
-	 *            can be <code>null</code>
-	 */
-	public WritableEqualityValue(final TValue initialValue, final Object valueType) {
-		this(Realm.getDefault(), initialValue, valueType);
-	}
-	
-	/**
-	 * Constructs a new instance with the provided <code>realm</code>, a
-	 * <code>null</code> value type, and a <code>null</code> initial value.
-	 *
-	 * @param realm
-	 */
-	public WritableEqualityValue(final Realm realm) {
-		this(realm, null, null);
-	}
-	
-	/**
 	 * Constructs a new instance.
 	 *
 	 * @param realm
@@ -66,12 +39,43 @@
 	 * @param valueType
 	 *            can be <code>null</code>
 	 */
-	public WritableEqualityValue(final Realm realm, final TValue initialValue, final Object valueType) {
+	public WritableEqualityValue(final @NonNull Realm realm,
+			final @Nullable TValue initialValue, final @Nullable Object valueType) {
 		super(realm);
 		this.valueType= valueType;
 		this.value= initialValue;
 	}
 	
+	/**
+	 * Constructs a new instance with the default realm.
+	 *
+	 * @param initialValue
+	 *            can be <code>null</code>
+	 * @param valueType
+	 *            can be <code>null</code>
+	 */
+	public WritableEqualityValue(final @Nullable TValue initialValue, final @Nullable Object valueType) {
+		this(Realm.getDefault(), initialValue, valueType);
+	}
+	
+	/**
+	 * Constructs a new instance with the default realm, a <code>null</code>
+	 * value type, and a <code>null</code> value.
+	 */
+	public WritableEqualityValue() {
+		this(null, null);
+	}
+	
+	/**
+	 * Constructs a new instance with the provided <code>realm</code>, a
+	 * <code>null</code> value type, and a <code>null</code> initial value.
+	 *
+	 * @param realm
+	 */
+	public WritableEqualityValue(final @NonNull Realm realm) {
+		this(realm, null, null);
+	}
+	
 	
 	@Override
 	public Object getValueType() {
diff --git a/ecommons/org.eclipse.statet.ecommons.databinding.core/src/org/eclipse/statet/internal/ecommons/databinding/core/ECommonsDatabindingCorePlugin.java b/ecommons/org.eclipse.statet.ecommons.databinding.core/src/org/eclipse/statet/internal/ecommons/databinding/core/ECommonsDatabindingCorePlugin.java
index 079284c..d37f38b 100644
--- a/ecommons/org.eclipse.statet.ecommons.databinding.core/src/org/eclipse/statet/internal/ecommons/databinding/core/ECommonsDatabindingCorePlugin.java
+++ b/ecommons/org.eclipse.statet.ecommons.databinding.core/src/org/eclipse/statet/internal/ecommons/databinding/core/ECommonsDatabindingCorePlugin.java
@@ -19,21 +19,25 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Plugin;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
+
+@NonNullByDefault
 public class ECommonsDatabindingCorePlugin extends Plugin {
 	
 	
 	public static final String BUNDLE_ID= "org.eclipse.statet.ecommons.databinding.core"; //$NON-NLS-1$
 	
 	
-	private static ECommonsDatabindingCorePlugin instance;
+	private static @Nullable ECommonsDatabindingCorePlugin instance;
 	
 	/**
 	 * Returns the shared plug-in instance
 	 *
 	 * @return the shared instance
 	 */
-	public static ECommonsDatabindingCorePlugin getInstance() {
+	public static @Nullable ECommonsDatabindingCorePlugin getInstance() {
 		return instance;
 	}
 	
@@ -49,6 +53,9 @@
 	private boolean started;
 	
 	
+	public ECommonsDatabindingCorePlugin() {
+	}
+	
 	@Override
 	public void start(final BundleContext context) throws Exception {
 		super.start(context);
diff --git a/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/ecommons/debug/core/util/LaunchUtils.java b/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/ecommons/debug/core/util/LaunchUtils.java
index 328d42a..bbd9506 100644
--- a/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/ecommons/debug/core/util/LaunchUtils.java
+++ b/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/ecommons/debug/core/util/LaunchUtils.java
@@ -44,6 +44,8 @@
 import org.eclipse.osgi.util.NLS;
 
 import org.eclipse.statet.jcommons.collections.CaseInsensitiveMap;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.ecommons.debug.core.ECommonsDebugCore;
 import org.eclipse.statet.internal.ecommons.debug.core.Messages;
@@ -125,7 +127,9 @@
 	 * @param environment
 	 * @throws CoreException
 	 */
-	public static Map<String, String> createEnvironment(final ILaunchConfiguration configuration, final Map<String, String>[] add)
+	@NonNullByDefault
+	public static Map<String, String> createEnvironment(final ILaunchConfiguration configuration,
+			final @Nullable Map<String, String> @Nullable [] additionals)
 			throws CoreException {
 		final Map<String, String> envp= (Platform.getOS().startsWith("win")) ? //$NON-NLS-1$
 				new CaseInsensitiveMap<>(64) : new HashMap<>(64);
@@ -134,10 +138,10 @@
 		}
 		
 		Map<String, String> custom= (configuration != null) ? configuration.getAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, (Map<String, String>) null) : null;
-		if (add != null) {
-			for (int i= 0; i < add.length; i++) {
-				if (add[i] != null) {
-					envp.putAll(check(envp, add[i]));
+		if (additionals != null) {
+			for (final Map<String, String> additional : additionals) {
+				if (additional != null) {
+					envp.putAll(check(envp, additional));
 				}
 				else if (custom != null) {
 					envp.putAll(check(envp, custom));
@@ -155,12 +159,14 @@
 	
 	private static Pattern ENV_PATTERN= Pattern.compile("\\Q${env_var:\\E([^\\}]*)\\}"); //$NON-NLS-1$
 	
-	private static Map<String, String> check(final Map<String,String> current, final Map<String,String> add) throws CoreException {
+	@NonNullByDefault
+	private static Map<String, String> check(final Map<String, String> current,
+			final Map<String, String> add) throws CoreException {
 		final Map<String, String> resolved= new HashMap<>();
 		final Set<Entry<String, String>> entries= add.entrySet();
 		for (final Entry<String, String> entry : entries) {
 			String value= entry.getValue();
-			if (value != null && value.length() > 0) {
+			if (value != null && !value.isEmpty()) {
 				if (value.contains("${env_var:")) { //$NON-NLS-1$
 					final StringBuffer sb= new StringBuffer(value.length()+32);
 					final Matcher matcher= ENV_PATTERN.matcher(value);
diff --git a/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/ecommons/resources/core/variables/ResourceVariableResolver.java b/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/ecommons/resources/core/variables/ResourceVariableResolver.java
index d1ca0a9..854dc6e 100644
--- a/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/ecommons/resources/core/variables/ResourceVariableResolver.java
+++ b/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/ecommons/resources/core/variables/ResourceVariableResolver.java
@@ -49,17 +49,21 @@
 import org.eclipse.core.variables.VariablesPlugin;
 import org.eclipse.osgi.util.NLS;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.debug.core.ECommonsDebugCore;
 import org.eclipse.statet.internal.ecommons.debug.core.Messages;
 
 
+@NonNullByDefault
 public class ResourceVariableResolver implements IDynamicVariableResolver {
 	
 	
 	public static interface Context {
 		
 		
-		IResource getResource();
+		@Nullable IResource getResource();
 		
 	}
 	
@@ -70,7 +74,7 @@
 		}
 		
 		@Override
-		public IResource getResource() {
+		public @Nullable IResource getResource() {
 			final IStringVariableManager manager= VariablesPlugin.getDefault().getStringVariableManager();
 			try {
 				final String path= manager.performStringSubstitution("${selected_resource_path}"); //$NON-NLS-1$
@@ -108,7 +112,7 @@
 		this(context, EXISTS_SELECTED);
 	}
 	
-	public ResourceVariableResolver(final Context context, final byte flags) {
+	public ResourceVariableResolver(final @Nullable Context context, final byte flags) {
 		this.context= (context != null) ? context : DEFAULT_CONTEXT;
 		this.flags= flags;
 	}
@@ -119,7 +123,7 @@
 	}
 	
 	@Override
-	public String resolveValue(final IDynamicVariable variable, final String argument)
+	public @Nullable String resolveValue(final IDynamicVariable variable, final @Nullable String argument)
 			throws CoreException {
 		switch (variable.getName()) {
 		case RESOURCE_LOC_VAR_NAME:
@@ -160,7 +164,7 @@
 	}
 	
 	
-	protected boolean requireExists(final IDynamicVariable variable, final String argument) {
+	protected boolean requireExists(final IDynamicVariable variable, final @Nullable String argument) {
 		switch (this.flags & EXISTS_MASK) {
 		case EXISTS_NEVER:
 			return false;
@@ -174,7 +178,7 @@
 	}
 	
 	protected IResource getResource(final IDynamicVariable variable, final byte resourceType,
-			final String argument) throws CoreException {
+			final @Nullable String argument) throws CoreException {
 		IResource resource;
 		if (argument == null) {
 			resource= this.context.getResource();
@@ -217,7 +221,7 @@
 		return resource;
 	}
 	
-	protected IPath getResourcePath(final IDynamicVariable variable, final String argument)
+	protected IPath getResourcePath(final IDynamicVariable variable, final @Nullable String argument)
 			throws CoreException {
 		if (argument == null) {
 			return getResource(variable, RESOURCE, argument).getFullPath();
@@ -227,6 +231,7 @@
 		}
 	}
 	
+	@SuppressWarnings("null")
 	protected IResource toVariableResource(final IDynamicVariable variable, final byte resourceType,
 			final IResource resource) {
 		switch (resourceType) {
@@ -265,7 +270,7 @@
 		return resource.getName();
 	}
 	
-	protected String toEncValue(final IDynamicVariable variable, final IResource resource)
+	protected @Nullable String toEncValue(final IDynamicVariable variable, final IResource resource)
 			throws CoreException {
 		String charset;
 		if (resource instanceof IFile) {
@@ -280,15 +285,18 @@
 		return charset;
 	}
 	
-	protected String toNameBaseValue(final IDynamicVariable variable, final IPath path) {
+	protected @Nullable String toNameBaseValue(final IDynamicVariable variable, final IPath path) {
 		final String lastSegment= path.lastSegment();
+		if (lastSegment == null) {
+			return null;
+		}
 		final String extension= path.getFileExtension();
 		return (extension != null) ?
 				lastSegment.substring(0, lastSegment.length() - (extension.length() + 1)) :
 				lastSegment;
 	}
 	
-	protected String toNameExtValue(final IDynamicVariable variable, final IPath path) {
+	protected @Nullable String toNameExtValue(final IDynamicVariable variable, final IPath path) {
 		return path.getFileExtension();
 	}
 	
diff --git a/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/ecommons/resources/core/variables/ResourceVariables.java b/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/ecommons/resources/core/variables/ResourceVariables.java
index 3d33cf7..e5bde0a 100644
--- a/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/ecommons/resources/core/variables/ResourceVariables.java
+++ b/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/ecommons/resources/core/variables/ResourceVariables.java
@@ -23,10 +23,14 @@
 
 import org.eclipse.statet.jcommons.collections.ImCollections;
 import org.eclipse.statet.jcommons.collections.ImList;
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.ecommons.variables.core.DynamicVariable;
 
 
+@NonNullByDefault
 public class ResourceVariables {
 	
 	
@@ -57,22 +61,24 @@
 			PROJECT_LOC_VAR_NAME, PROJECT_PATH_VAR_NAME, PROJECT_NAME_VAR_NAME, PROJECT_ENC_VAR_NAME,
 			FILE_NAME_BASE_VAR_NAME, FILE_NAME_EXT_VAR_NAME );
 	
-	private static volatile ImList<IDynamicVariable> singleResourceVariables;
+	private static volatile @Nullable ImList<IDynamicVariable> singleResourceVariables;
 	
 	public static final ImList<IDynamicVariable> getSingleResourceVariables() {
-		if (singleResourceVariables == null) {
+		ImList<IDynamicVariable> variables= singleResourceVariables;
+		if (variables == null) {
 			synchronized (SINGLE_RESOURCE_VAR_NAMES) {
-				if (singleResourceVariables == null) {
-					singleResourceVariables= createSingleResourceVars();
+				variables= singleResourceVariables;
+				if (variables == null) {
+					variables= createSingleResourceVars();
 				}
 			}
 		}
-		return singleResourceVariables;
+		return variables;
 	}
 	
 	private static final ImList<IDynamicVariable> createSingleResourceVars() {
 		final ImList<String> names= ResourceVariables.SINGLE_RESOURCE_VAR_NAMES;
-		final IDynamicVariable[] variables= new IDynamicVariable[names.size()];
+		final IDynamicVariable[] variables= new @NonNull IDynamicVariable[names.size()];
 		final IStringVariableManager manager= VariablesPlugin.getDefault().getStringVariableManager();
 		for (int i= 0; i < variables.length; i++) {
 			final String name= names.get(i);
@@ -90,7 +96,7 @@
 	
 	public static final ImList<IDynamicVariable> createSingleResourceVarDefs(final String selectedResourceTerm) {
 		final ImList<IDynamicVariable> globalVariables= getSingleResourceVariables();
-		final IDynamicVariable[] variables= new IDynamicVariable[globalVariables.size()];
+		final IDynamicVariable[] variables= new @NonNull IDynamicVariable[globalVariables.size()];
 		
 		final Matcher selResMatcher= Pattern.compile("selected resource", Pattern.LITERAL).matcher(""); //$NON-NLS-1$ 
 		final String selResReplacement= Matcher.quoteReplacement(selectedResourceTerm);
diff --git a/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/internal/ecommons/debug/core/ECommonsDebugCorePlugin.java b/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/internal/ecommons/debug/core/ECommonsDebugCorePlugin.java
index 3ab6bd2..1f69e07 100644
--- a/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/internal/ecommons/debug/core/ECommonsDebugCorePlugin.java
+++ b/ecommons/org.eclipse.statet.ecommons.debug.core/src/org/eclipse/statet/internal/ecommons/debug/core/ECommonsDebugCorePlugin.java
@@ -19,18 +19,22 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Plugin;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
+
+@NonNullByDefault
 public class ECommonsDebugCorePlugin extends Plugin {
 	
 	
-	private static ECommonsDebugCorePlugin instance;
+	private static @Nullable ECommonsDebugCorePlugin instance;
 	
 	/**
 	 * Returns the shared plug-in instance
 	 *
 	 * @return the shared instance
 	 */
-	public static ECommonsDebugCorePlugin getInstance() {
+	public static @Nullable ECommonsDebugCorePlugin getInstance() {
 		return instance;
 	}
 	
@@ -46,6 +50,9 @@
 	private boolean started;
 	
 	
+	public ECommonsDebugCorePlugin() {
+	}
+	
 	@Override
 	public void start(final BundleContext context) throws Exception {
 		super.start(context);
diff --git a/ecommons/org.eclipse.statet.ecommons.debug.ui/src/org/eclipse/statet/ecommons/debug/ui/config/LaunchConfigTabWithDbc.java b/ecommons/org.eclipse.statet.ecommons.debug.ui/src/org/eclipse/statet/ecommons/debug/ui/config/LaunchConfigTabWithDbc.java
index 1ec6bb1..721dc86 100644
--- a/ecommons/org.eclipse.statet.ecommons.debug.ui/src/org/eclipse/statet/ecommons/debug/ui/config/LaunchConfigTabWithDbc.java
+++ b/ecommons/org.eclipse.statet.ecommons.debug.ui/src/org/eclipse/statet/ecommons/debug/ui/config/LaunchConfigTabWithDbc.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ecommons.debug.ui.config;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import org.eclipse.core.databinding.Binding;
 import org.eclipse.core.databinding.DataBindingContext;
 import org.eclipse.core.databinding.observable.ObservableEvent;
@@ -31,6 +33,9 @@
 import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.ui.statushandlers.StatusManager;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.databinding.core.AggregateValidationStatus;
 import org.eclipse.statet.ecommons.databinding.core.DataStatus;
 import org.eclipse.statet.ecommons.databinding.core.util.DirtyTracker;
@@ -48,13 +53,14 @@
  * <p>Validation status with severity WARNING are handled like errors, but can be saved.
  * </p>
  */
+@NonNullByDefault
 public abstract class LaunchConfigTabWithDbc extends AbstractLaunchConfigurationTab {
 	
 	
 	private DataBindingContext dbc;
 	
 	private AggregateValidationStatus aggregateStatus;
-	private IStatus currentStatus;
+	private @Nullable IStatus currentStatus;
 	
 	private boolean initializing;
 	
@@ -165,6 +171,44 @@
 		disposeBindings();
 	}
 	
+	
+	@SuppressWarnings("null")
+	protected String readAttribute(final ILaunchConfiguration configuration,
+			final String attributeName, final String defaultValue) {
+		String value= nonNullAssert(defaultValue);
+		try {
+			value= configuration.getAttribute(attributeName, defaultValue);
+		}
+		catch (final CoreException e) {
+			logReadingError(e);
+		}
+		return value;
+	}
+	
+	protected boolean readAttribute(final ILaunchConfiguration configuration,
+			final String attributeName, final boolean defaultValue) {
+		boolean value= defaultValue;
+		try {
+			value= configuration.getAttribute(attributeName, defaultValue);
+		}
+		catch (final CoreException e) {
+			logReadingError(e);
+		}
+		return value;
+	}
+	
+	protected int readAttribute(final ILaunchConfiguration configuration,
+			final String attributeName, final int defaultValue) {
+		int value= defaultValue;
+		try {
+			value= configuration.getAttribute(attributeName, defaultValue);
+		}
+		catch (final CoreException e) {
+			logReadingError(e);
+		}
+		return value;
+	}
+	
 	protected void logReadingError(final CoreException e) {
 		StatusManager.getManager().handle(new Status(IStatus.ERROR, ECommonsDebugUI.BUNDLE_ID, 0,
 				NLS.bind("An error occurred while reading launch configuration (name: ''{0}'', id: ''{1}'')", //$NON-NLS-1$
@@ -172,6 +216,7 @@
 				e ));
 	}
 	
+	
 	@Override
 	public void initializeFrom(final ILaunchConfiguration configuration) {
 		this.initializing= true;
diff --git a/ecommons/org.eclipse.statet.ecommons.debug.ui/src/org/eclipse/statet/ecommons/debug/ui/config/LaunchConfigTabWithPresets.java b/ecommons/org.eclipse.statet.ecommons.debug.ui/src/org/eclipse/statet/ecommons/debug/ui/config/LaunchConfigTabWithPresets.java
index 5f77e02..a33d925 100644
--- a/ecommons/org.eclipse.statet.ecommons.debug.ui/src/org/eclipse/statet/ecommons/debug/ui/config/LaunchConfigTabWithPresets.java
+++ b/ecommons/org.eclipse.statet.ecommons.debug.ui/src/org/eclipse/statet/ecommons/debug/ui/config/LaunchConfigTabWithPresets.java
@@ -35,19 +35,22 @@
 
 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.debug.ui.ECommonsDebugUI;
 import org.eclipse.statet.ecommons.ui.components.DropDownButton;
 import org.eclipse.statet.internal.ecommons.debug.ui.Messages;
 
 
+@NonNullByDefault
 public abstract class LaunchConfigTabWithPresets extends LaunchConfigTabWithDbc {
 	
 	
-	private ImList<ILaunchConfiguration> presets;
+	private ImList<ILaunchConfiguration> presets= ImCollections.emptyList();
 	
-	private Map<String, Object> presetToLoad;
-	private ILaunchConfiguration presetLoaded;
+	private @Nullable Map<String, Object> presetToLoad;
+	private @Nullable ILaunchConfiguration presetLoaded;
 	
 	
 	protected LaunchConfigTabWithPresets() {
@@ -69,7 +72,7 @@
 		final SelectionListener selectionListener= new SelectionAdapter() {
 			@Override
 			public void widgetSelected(final SelectionEvent e) {
-				loadPreset((ILaunchConfiguration) e.widget.getData());
+				loadPreset((ILaunchConfiguration)e.widget.getData());
 			}
 		};
 		for (final ILaunchConfiguration preset : this.presets) {
@@ -79,7 +82,7 @@
 			item.addSelectionListener(selectionListener);
 		}
 		
-		if (this.presets == null || this.presets.isEmpty()) {
+		if (this.presets.isEmpty()) {
 			button.setEnabled(false);
 		}
 		
@@ -89,7 +92,7 @@
 	
 	protected ImList<ILaunchConfigurationTab> getPresetTabs(final ILaunchConfiguration config) {
 		final ILaunchConfigurationTab[] tabs= getLaunchConfigurationDialog().getTabs();
-		if (tabs[tabs.length - 1] instanceof CommonTab) {
+		if (tabs != null && tabs[tabs.length - 1] instanceof CommonTab) {
 			return ImCollections.newList(tabs, 0, tabs.length - 1);
 		}
 		else {
@@ -103,8 +106,8 @@
 			setDirty(true);
 			updateLaunchConfigurationDialog();
 			
-			if (this.presetLoaded != null) {
-				final ILaunchConfiguration config= this.presetLoaded;
+			final ILaunchConfiguration config= this.presetLoaded;
+			if (config != null) {
 				final List<ILaunchConfigurationTab> tabs= getPresetTabs(config);
 				
 				for (final ILaunchConfigurationTab tab : tabs) {
@@ -130,17 +133,16 @@
 	
 	@Override
 	public void performApply(final ILaunchConfigurationWorkingCopy configuration) {
-		if (this.presetToLoad != null) {
-			try {
-				configuration.removeAttribute(getValidationErrorAttr());
-				
-				LaunchConfigPresets.apply(this.presetToLoad, configuration);
-				this.presetLoaded= configuration;
-				return;
-			}
-			finally {
-				this.presetToLoad= null;
-			}
+		final Map<String, Object> presetToLoad= this.presetToLoad;
+		if (presetToLoad != null) {
+			this.presetToLoad= null;
+			
+			configuration.removeAttribute(getValidationErrorAttr());
+			
+			LaunchConfigPresets.apply(presetToLoad, configuration);
+			
+			this.presetLoaded= configuration;
+			return;
 		}
 		
 		super.performApply(configuration);
diff --git a/ecommons/org.eclipse.statet.ecommons.debug.ui/src/org/eclipse/statet/internal/ecommons/debug/ui/ECommonsDebugUIPlugin.java b/ecommons/org.eclipse.statet.ecommons.debug.ui/src/org/eclipse/statet/internal/ecommons/debug/ui/ECommonsDebugUIPlugin.java
index 0336574..517775a 100644
--- a/ecommons/org.eclipse.statet.ecommons.debug.ui/src/org/eclipse/statet/internal/ecommons/debug/ui/ECommonsDebugUIPlugin.java
+++ b/ecommons/org.eclipse.statet.ecommons.debug.ui/src/org/eclipse/statet/internal/ecommons/debug/ui/ECommonsDebugUIPlugin.java
@@ -21,21 +21,25 @@
 import org.eclipse.jface.resource.ImageRegistry;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.debug.ui.ECommonsDebugUIResources;
 import org.eclipse.statet.ecommons.ui.util.ImageRegistryUtil;
 
 
+@NonNullByDefault
 public class ECommonsDebugUIPlugin extends AbstractUIPlugin {
 	
 	
-	private static ECommonsDebugUIPlugin instance;
+	private static @Nullable ECommonsDebugUIPlugin instance;
 	
 	/**
 	 * Returns the shared plug-in instance
 	 *
 	 * @return the shared instance
 	 */
-	public static ECommonsDebugUIPlugin getInstance() {
+	public static @Nullable ECommonsDebugUIPlugin getInstance() {
 		return instance;
 	}
 	
@@ -51,6 +55,9 @@
 	private boolean started;
 	
 	
+	public ECommonsDebugUIPlugin() {
+	}
+	
 	@Override
 	public void start(final BundleContext context) throws Exception {
 		super.start(context);
diff --git a/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/internal/ecommons/preferences/core/ECommonsPreferencesCorePlugin.java b/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/internal/ecommons/preferences/core/ECommonsPreferencesCorePlugin.java
index 30d1a6e..ee5cc0d 100644
--- a/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/internal/ecommons/preferences/core/ECommonsPreferencesCorePlugin.java
+++ b/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/internal/ecommons/preferences/core/ECommonsPreferencesCorePlugin.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.internal.ecommons.preferences.core;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -23,24 +25,27 @@
 import org.eclipse.core.runtime.Plugin;
 
 import org.eclipse.statet.jcommons.lang.Disposable;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.ecommons.preferences.core.PreferenceSetService;
 
 
+@NonNullByDefault
 public final class ECommonsPreferencesCorePlugin extends Plugin {
 	
 	
 	public static final String BUNDLE_ID= "org.eclipse.statet.ecommons.preferences.core"; //$NON-NLS-1$
 	
 	
-	private static ECommonsPreferencesCorePlugin instance;
+	private static @Nullable ECommonsPreferencesCorePlugin instance;
 	
 	/**
 	 * Returns the shared plug-in instance
 	 *
 	 * @return the shared instance
 	 */
-	public static ECommonsPreferencesCorePlugin getInstance() {
+	public static @Nullable ECommonsPreferencesCorePlugin getInstance() {
 		return instance;
 	}
 	
@@ -60,12 +65,12 @@
 	
 	
 	public ECommonsPreferencesCorePlugin() {
-		instance= this;
 	}
 	
 	@Override
 	public void start(final BundleContext context) throws Exception {
 		super.start(context);
+		instance= this;
 		
 		synchronized (this) {
 			this.started= true;
@@ -90,7 +95,6 @@
 			finally {
 				this.disposables.clear();
 			}
-			
 		}
 		finally {
 			instance= null;
@@ -100,9 +104,7 @@
 	
 	
 	public void addStoppingListener(final Disposable listener) {
-		if (listener == null) {
-			throw new NullPointerException();
-		}
+		nonNullAssert(listener);
 		synchronized (this) {
 			if (!this.started) {
 				throw new IllegalStateException("Plug-in is not started.");
diff --git a/ecommons/org.eclipse.statet.ecommons.runtime.core/src/org/eclipse/statet/internal/ecommons/runtime/core/RuntimeCorePlugin.java b/ecommons/org.eclipse.statet.ecommons.runtime.core/src/org/eclipse/statet/internal/ecommons/runtime/core/RuntimeCorePlugin.java
index 61d8572..d902429 100644
--- a/ecommons/org.eclipse.statet.ecommons.runtime.core/src/org/eclipse/statet/internal/ecommons/runtime/core/RuntimeCorePlugin.java
+++ b/ecommons/org.eclipse.statet.ecommons.runtime.core/src/org/eclipse/statet/internal/ecommons/runtime/core/RuntimeCorePlugin.java
@@ -25,6 +25,7 @@
 
 import org.eclipse.statet.jcommons.lang.Disposable;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.runtime.AppEnvironment;
 import org.eclipse.statet.jcommons.runtime.CommonsRuntime;
 import org.eclipse.statet.jcommons.status.Status;
@@ -39,7 +40,7 @@
 	public static final String BUNDLE_ID= "org.eclipse.statet.ecommons.runtime.core"; //$NON-NLS-1$
 	
 	
-	private static RuntimeCorePlugin instance;
+	private static @Nullable RuntimeCorePlugin instance;
 	
 	
 	/**
@@ -47,7 +48,7 @@
 	 *
 	 * @return the shared instance
 	 */
-	public static RuntimeCorePlugin getInstance() {
+	public static @Nullable RuntimeCorePlugin getInstance() {
 		return instance;
 	}
 	
@@ -58,13 +59,12 @@
 	
 	
 	public RuntimeCorePlugin() {
-		instance= this;
 	}
 	
-	
 	@Override
 	public void start(final BundleContext context) throws Exception {
 		super.start(context);
+		instance= this;
 		
 		synchronized (this) {
 			this.started= true;
diff --git a/ecommons/org.eclipse.statet.ecommons.text.core/src/org/eclipse/statet/internal/ecommons/text/core/ECommonsTextCorePlugin.java b/ecommons/org.eclipse.statet.ecommons.text.core/src/org/eclipse/statet/internal/ecommons/text/core/ECommonsTextCorePlugin.java
index 9b54780..0d8125e 100644
--- a/ecommons/org.eclipse.statet.ecommons.text.core/src/org/eclipse/statet/internal/ecommons/text/core/ECommonsTextCorePlugin.java
+++ b/ecommons/org.eclipse.statet.ecommons.text.core/src/org/eclipse/statet/internal/ecommons/text/core/ECommonsTextCorePlugin.java
@@ -19,21 +19,25 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Plugin;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
+
+@NonNullByDefault
 public class ECommonsTextCorePlugin extends Plugin {
 	
 	
 	public static final String BUNDLE_ID= "org.eclipse.statet.ecommons.text.core"; //$NON-NLS-1$
 	
 	
-	private static ECommonsTextCorePlugin instance;
+	private static @Nullable ECommonsTextCorePlugin instance;
 	
 	/**
 	 * Returns the shared plug-in instance
 	 *
 	 * @return the shared instance
 	 */
-	public static ECommonsTextCorePlugin getInstance() {
+	public static @Nullable ECommonsTextCorePlugin getInstance() {
 		return instance;
 	}
 	
@@ -49,6 +53,9 @@
 	private boolean started;
 	
 	
+	public ECommonsTextCorePlugin() {
+	}
+	
 	@Override
 	public void start(final BundleContext context) throws Exception {
 		super.start(context);
diff --git a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/workbench/ResourceInputComposite.java b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/workbench/ResourceInputComposite.java
index 6cdf8a5..371208c 100644
--- a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/workbench/ResourceInputComposite.java
+++ b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/workbench/ResourceInputComposite.java
@@ -34,7 +34,7 @@
 import org.eclipse.core.variables.IStringVariableManager;
 import org.eclipse.core.variables.VariablesPlugin;
 import org.eclipse.debug.ui.StringVariableSelectionDialog.VariableFilter;
-import org.eclipse.jface.databinding.swt.WidgetProperties;
+import org.eclipse.jface.databinding.swt.typed.WidgetProperties;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
diff --git a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/workbench/workspace/ResourceVariableUtil.java b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/workbench/workspace/ResourceVariableUtil.java
index b7bfc55..7be4334 100644
--- a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/workbench/workspace/ResourceVariableUtil.java
+++ b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/workbench/workspace/ResourceVariableUtil.java
@@ -28,10 +28,14 @@
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.IWorkbenchPartSite;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.resources.core.variables.ResourceVariableResolver;
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
 
+@NonNullByDefault
 public class ResourceVariableUtil implements ResourceVariableResolver.Context {
 	
 	
@@ -42,11 +46,11 @@
 	 * 
 	 * @return selected resource or <code>null</code>
 	 */
-	public static IResource fetchSelectedResource() {
+	public static @Nullable IResource fetchSelectedResource() {
 		return fetchSelectedResource(null);
 	}
 	
-	private static IResource fetchSelectedResource(final IWorkbenchPart part) {
+	private static @Nullable IResource fetchSelectedResource(final @Nullable IWorkbenchPart part) {
 		// Compatible with DebugUITools.getSelectedResource
 		final Display display= UIAccess.getDisplay();
 		if (Thread.currentThread() == display.getThread()) {
@@ -55,7 +59,7 @@
 		else {
 			class DisplayRunnable implements Runnable {
 				
-				IResource resource;
+				@Nullable IResource resource;
 				
 				@Override
 				public void run() {
@@ -69,7 +73,7 @@
 		}
 	}
 	
-	private static IResource getSelectedResource0(IWorkbenchPart part) {
+	private static @Nullable IResource getSelectedResource0(@Nullable IWorkbenchPart part) {
 		IResource resource= null;
 		if (part == null) {
 			final IWorkbenchPage page= UIAccess.getActiveWorkbenchPage(true);
@@ -112,11 +116,11 @@
 	
 	private final IWorkbenchPage workbenchPage;
 	
-	private final IWorkbenchPart part;
+	private final @Nullable IWorkbenchPart part;
 	
 	private byte state;
 	
-	private IResource resource;
+	private @Nullable IResource resource;
 	
 	
 	
@@ -134,13 +138,13 @@
 		this.part= part;
 	}
 	
-	public ResourceVariableUtil(final IResource resource) {
+	public ResourceVariableUtil(final @Nullable IResource resource) {
 		this();
 		this.state|= S_RESOURCE_FETCHED;
 		this.resource= resource;
 	}
 	
-	public ResourceVariableUtil(final ResourceVariableUtil location, final IResource resource) {
+	public ResourceVariableUtil(final ResourceVariableUtil location, final @Nullable IResource resource) {
 		this.workbenchPage= location.getWorkbenchPage();
 		this.part= location.getWorkbenchPart();
 		this.state|= S_RESOURCE_FETCHED;
@@ -152,12 +156,12 @@
 		return this.workbenchPage;
 	}
 	
-	public IWorkbenchPart getWorkbenchPart() {
+	public @Nullable IWorkbenchPart getWorkbenchPart() {
 		return this.part;
 	}
 	
 	@Override
-	public IResource getResource() {
+	public @Nullable IResource getResource() {
 		if ((this.state & S_RESOURCE_FETCHED) == 0) {
 			this.state|= S_RESOURCE_FETCHED;
 			this.resource= fetchResource();
@@ -170,7 +174,7 @@
 		this.resource= null;
 	}
 	
-	protected IResource fetchResource() {
+	protected @Nullable IResource fetchResource() {
 		return fetchSelectedResource(getWorkbenchPart());
 	}