diff --git a/ltk/org.eclipse.statet.ltk.buildpath.ui/META-INF/MANIFEST.MF b/ltk/org.eclipse.statet.ltk.buildpath.ui/META-INF/MANIFEST.MF
index 07f4935..5731b0e 100644
--- a/ltk/org.eclipse.statet.ltk.buildpath.ui/META-INF/MANIFEST.MF
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/META-INF/MANIFEST.MF
@@ -17,6 +17,7 @@
  org.eclipse.statet.ltk.buildpath.core;bundle-version="[4.5.0,4.6.0)";visibility:=reexport,
  org.eclipse.statet.ecommons.uimisc;bundle-version="[4.5.0,4.6.0)"
 Import-Package: org.eclipse.statet.jcommons.collections;version="4.5.0",
- org.eclipse.statet.jcommons.lang;version="4.5.0"
+ org.eclipse.statet.jcommons.lang;version="4.5.0",
+ org.eclipse.statet.ltk.ui.util
 Export-Package: org.eclipse.statet.ltk.buildpath.ui,
  org.eclipse.statet.ltk.buildpath.ui.wizards
diff --git a/ltk/org.eclipse.statet.ltk.buildpath.ui/icons/ovr_16/ignore_optional_problems.png b/ltk/org.eclipse.statet.ltk.buildpath.ui/icons/ovr_16/ignore_optional_problems.png
deleted file mode 100644
index 485e329..0000000
--- a/ltk/org.eclipse.statet.ltk.buildpath.ui/icons/ovr_16/ignore_optional_problems.png
+++ /dev/null
Binary files differ
diff --git a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathElementImageDescriptor.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathElementImageDescriptor.java
deleted file mode 100644
index d2f4a18..0000000
--- a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathElementImageDescriptor.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*=============================================================================#
- # Copyright (c) 2000, 2021 IBM Corporation 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.
- # 
- # SPDX-License-Identifier: EPL-2.0
- # 
- # Contributors:
- #     IBM Corporation - org.eclipse.jdt: initial API and implementation
- #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
- #=============================================================================*/
-
-package org.eclipse.statet.internal.ltk.buildpath.ui;
-
-import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
-
-import org.eclipse.jface.resource.CompositeImageDescriptor;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Point;
-
-import org.eclipse.statet.jcommons.lang.NonNullByDefault;
-import org.eclipse.statet.jcommons.lang.Nullable;
-
-import org.eclipse.statet.ecommons.ui.SharedUIResources;
-
-import org.eclipse.statet.ltk.buildpath.ui.BuildpathsUIResources;
-
-
-@NonNullByDefault
-public class BuildpathElementImageDescriptor extends CompositeImageDescriptor {
-	
-	
-	/** Flag to render the info adornment. */
-	public final static int INFO=                           0b0_0000_0000_0001;
-	
-	/** Flag to render the warning adornment. */
-	public final static int WARNING=                        0b0_0000_0000_0010;
-	
-	/** Flag to render the error adornment. */
-	public final static int ERROR=                          0b0_0000_0000_0100;
-	
-	
-	/**
-	 * Flag to render the 'deprecated' adornment.
-	 */
-	public final static int DEPRECATED=                     0b0_0000_0001_0000;
-	
-	/**
-	 * Flag to render the 'ignore optional compile problems' adornment.
-	 */
-	public final static int IGNORE_OPTIONAL_PROBLEMS=       0b0_0001_0000_0000;
-	
-	
-	private final ImageDescriptor baseImage;
-	private final int flags;
-	
-	private @Nullable Point size;
-	
-	
-	/**
-	 * Creates a new JavaElementImageDescriptor.
-	 *
-	 * @param baseImage an image descriptor used as the base image
-	 * @param flags flags indicating which adornments are to be rendered. See {@link #setAdornments(int)}
-	 * 	for valid values.
-	 * @param size the size of the resulting image
-	 */
-	public BuildpathElementImageDescriptor(final ImageDescriptor baseImage, final int flags) {
-		this.baseImage= nonNullAssert(baseImage);
-		this.flags= flags;
-	}
-	
-	
-	protected final ImageDescriptor getBaseImage() {
-		return this.baseImage;
-	}
-	
-	protected final int getFlags() {
-		return this.flags;
-	}
-	
-	@Override
-	protected final Point getSize() {
-		var size= this.size;
-		if (size == null) {
-			final var data= createCachedImageDataProvider(getBaseImage());
-			size= new Point(data.getWidth(), data.getHeight());
-			this.size= size;
-		}
-		return size;
-	}
-	
-	
-	@Override
-	protected void drawCompositeImage(final int width, final int height) {
-		if ((this.flags & DEPRECATED) != 0) { // draw *behind* the full image
-			final Point size= getSize();
-			final var data= createCachedImageDataProvider(SharedUIResources.INSTANCE.getImageDescriptor(
-					SharedUIResources.OVR_DEPRECATED_IMAGE_ID ));
-			drawImage(data, 0, size.y - data.getHeight());
-		}
-		
-		{	final var data= createCachedImageDataProvider(getBaseImage());
-			drawImage(data, 0, 0);
-		}
-		
-		drawTopRight();
-		drawBottomRight();
-		drawBottomLeft();
-	}
-	
-	private void addTopRightImage(final ImageDescriptor desc, final Point pos) {
-		final var data= createCachedImageDataProvider(desc);
-		final int x= pos.x - data.getWidth();
-		if (x >= 0) {
-			drawImage(data, x, pos.y);
-			pos.x= x;
-		}
-	}
-	
-	private void addBottomRightImage(final ImageDescriptor desc, final Point pos) {
-		final var data= createCachedImageDataProvider(desc);
-		final int x= pos.x - data.getWidth();
-		final int y= pos.y - data.getHeight();
-		if (x >= 0 && y >= 0) {
-			drawImage(data, x, y);
-			pos.x= x;
-		}
-	}
-	
-	private void addBottomLeftImage(final ImageDescriptor desc, final Point pos) {
-		final var data= createCachedImageDataProvider(desc);
-		final int x= pos.x;
-		final int y= pos.y - data.getHeight();
-		final int xEnd= x + data.getWidth();
-		if (xEnd < getSize().x && y >= 0) {
-			drawImage(data, x, y);
-			pos.x= xEnd;
-		}
-	}
-	
-	
-	private void drawTopRight() {
-	}
-	
-	private void drawBottomRight() {
-	}
-	
-	private void drawBottomLeft() {
-		final Point pos= new Point(0, getSize().y);
-		if ((this.flags & INFO) != 0) {
-			addBottomLeftImage(SharedUIResources.INSTANCE.getImageDescriptor(
-					SharedUIResources.OVR_INFO_IMAGE_ID ), pos );
-		}
-		if ((this.flags & WARNING) != 0) {
-			addBottomLeftImage(SharedUIResources.INSTANCE.getImageDescriptor(
-					SharedUIResources.OVR_WARNING_IMAGE_ID ), pos );
-		}
-		if ((this.flags & ERROR) != 0) {
-			addBottomLeftImage(SharedUIResources.INSTANCE.getImageDescriptor(
-					SharedUIResources.OVR_WARNING_IMAGE_ID ), pos );
-		}
-		if ((this.flags & IGNORE_OPTIONAL_PROBLEMS) != 0) {
-			addBottomLeftImage(BuildpathsUIResources.INSTANCE.getImageDescriptor(
-					BuildpathsUIPlugin.OVR_IGNORE_OPTIONAL_PROBLEMS_IMAGE_ID ), pos );
-		}
-	}
-	
-	
-	@Override
-	public int hashCode() {
-		return (this.baseImage.hashCode() ^ this.flags);
-	}
-	
-	@Override
-	public boolean equals(final @Nullable Object obj) {
-		if (this == obj) {
-			return true;
-		}
-		if (obj != null && getClass().equals(obj.getClass())) {
-			final BuildpathElementImageDescriptor other= (BuildpathElementImageDescriptor)obj;
-			return (this.baseImage.equals(other.baseImage)
-					&& this.flags == other.flags );
-		}
-		return false;
-	}
-	
-}
diff --git a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathsUIPlugin.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathsUIPlugin.java
index 8a6eb1d..7649f63 100644
--- a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathsUIPlugin.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/BuildpathsUIPlugin.java
@@ -29,12 +29,6 @@
 public class BuildpathsUIPlugin extends AbstractUIPlugin {
 	
 	
-	public static final String BUNDLE_ID= "org.eclipse.statet.ltk.buildpath.ui"; //$NON-NLS-1$
-	
-	
-	public static final String OVR_IGNORE_OPTIONAL_PROBLEMS_IMAGE_ID= BUNDLE_ID + "/image/ovr/ignore_optional_problems"; //$NON-NLS-1$
-	
-	
 	private static BuildpathsUIPlugin instance;
 	
 	/**
@@ -102,9 +96,6 @@
 				ImageRegistryUtil.T_OBJ, "exclusion_filter.png" ); //$NON-NLS-1$
 		util.register(BuildpathsUIResources.OBJ_OUTPUT_FOLDER_ATTRIBUTE_IMAGE_ID,
 				ImageRegistryUtil.T_OBJ, "output_folder.png" ); //$NON-NLS-1$
-		
-		util.register(OVR_IGNORE_OPTIONAL_PROBLEMS_IMAGE_ID,
-				ImageRegistryUtil.T_OVR, "ignore_optional_problems.png" ); //$NON-NLS-1$
 	}
 	
 }
diff --git a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/ExclusionInclusionComponent.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/ExclusionInclusionComponent.java
index fddf70c..1b8a3a1 100644
--- a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/ExclusionInclusionComponent.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/ExclusionInclusionComponent.java
@@ -55,6 +55,7 @@
 
 import org.eclipse.statet.ltk.buildpath.core.BuildpathAttribute;
 import org.eclipse.statet.ltk.buildpath.ui.BuildpathListElement;
+import org.eclipse.statet.ltk.buildpath.ui.BuildpathsUI;
 import org.eclipse.statet.ltk.buildpath.ui.BuildpathsUIDescription;
 import org.eclipse.statet.ltk.buildpath.ui.BuildpathsUIResources;
 
@@ -67,7 +68,7 @@
 		private final Image elementImage;
 		
 		public ExclusionInclusionLabelProvider(final String imgKey) {
-			this.elementImage= BuildpathsUIResources.INSTANCE.getImage(imgKey);
+			this.elementImage= BuildpathsUI.getUIResources().getImage(imgKey);
 		}
 		
 		@Override
diff --git a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/Messages.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/Messages.java
index af3e1a7..b77ad0f 100644
--- a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/Messages.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/internal/ltk/buildpath/ui/Messages.java
@@ -16,7 +16,11 @@
 
 import org.eclipse.osgi.util.NLS;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
+
+@NonNullByDefault
+@SuppressWarnings("null")
 public class Messages {
 	
 	
diff --git a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListElementComparator.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListElementComparator.java
index 99601e7..205f645 100644
--- a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListElementComparator.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListElementComparator.java
@@ -20,9 +20,13 @@
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerComparator;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ltk.buildpath.core.BuildpathElement;
 
 
+@NonNullByDefault
 public class BuildpathListElementComparator extends ViewerComparator {
 	
 	
@@ -77,7 +81,7 @@
 	}
 	
 	@Override
-	public int compare(final Viewer viewer, final Object e1, final Object e2) {
+	public int compare(final @Nullable Viewer viewer, final Object e1, final Object e2) {
 		final int cat1= category(e1);
 		final int cat2= category(e2);
 		
diff --git a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListLabelProvider.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListLabelProvider.java
index 9dcb3f3..81153e5 100644
--- a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListLabelProvider.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathListLabelProvider.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.ltk.buildpath.ui;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import java.util.List;
 
 import org.eclipse.core.resources.IResource;
@@ -26,61 +28,62 @@
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.ide.IDE;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.ecommons.ui.SharedUIResources;
-import org.eclipse.statet.ecommons.ui.jface.resource.ImageDescriptorRegistry;
 import org.eclipse.statet.ecommons.ui.util.MessageUtils;
 
-import org.eclipse.statet.internal.ltk.buildpath.ui.BuildpathElementImageDescriptor;
 import org.eclipse.statet.internal.ltk.buildpath.ui.Messages;
 import org.eclipse.statet.ltk.buildpath.core.BuildpathAttribute;
 import org.eclipse.statet.ltk.buildpath.core.BuildpathElement;
 import org.eclipse.statet.ltk.buildpath.core.BuildpathInitializer;
+import org.eclipse.statet.ltk.ui.util.DecoratedElementImageDescriptor;
 
 
+@NonNullByDefault
 public class BuildpathListLabelProvider extends LabelProvider {
 	
 	
-	private final BuildpathsUIResources uiResources;
+	private final BuildpathsUIResources buildpathsResources;
+	private final SharedUIResources sharedResources;
 	private final ISharedImages workbenchImages;
 	
-	private final ImageDescriptorRegistry imageDescriptorRegistry;
-	
 	
 	public BuildpathListLabelProvider() {
-		this.uiResources= BuildpathsUIResources.INSTANCE;
+		this.buildpathsResources= BuildpathsUI.getUIResources();
+		this.sharedResources= SharedUIResources.getInstance();
 		this.workbenchImages= PlatformUI.getWorkbench().getSharedImages();
-		
-		this.imageDescriptorRegistry= SharedUIResources.getInstance().getImageDescriptorRegistry();
 	}
 	
 	
 	@Override
-	public Image getImage(final Object element) {
+	public @Nullable Image getImage(final @Nullable Object element) {
 		if (element instanceof BuildpathListElement) {
-			final BuildpathListElement listElement= (BuildpathListElement) element;
+			final BuildpathListElement listElement= (BuildpathListElement)element;
 			ImageDescriptor imageDescriptor= getListElementBaseImage(listElement);
 			if (imageDescriptor != null) {
 				if (listElement.isMissing() || listElement.hasMissingChildren()) {
-					imageDescriptor= new BuildpathElementImageDescriptor(imageDescriptor,
-							BuildpathElementImageDescriptor.ERROR );
+					imageDescriptor= new DecoratedElementImageDescriptor(imageDescriptor,
+							DecoratedElementImageDescriptor.ERROR );
 				}
-				return this.imageDescriptorRegistry.get(imageDescriptor);
+				return this.sharedResources.getImageDescriptorRegistry().get(imageDescriptor);
 			}
 		}
 		else if (element instanceof BuildpathListElementAttribute) {
-			final BuildpathListElementAttribute attribute= (BuildpathListElementAttribute) element;
+			final BuildpathListElementAttribute attribute= (BuildpathListElementAttribute)element;
 			switch (attribute.getName()) {
 			case BuildpathAttribute.SOURCE_ATTACHMENT:
-				return this.uiResources.getImage(
+				return this.buildpathsResources.getImage(
 						BuildpathsUIResources.OBJ_SOURCE_ATTACHMENT_ATTRIBUTE_IMAGE_ID );
 			case BuildpathAttribute.FILTER_INCLUSIONS:
-				return this.uiResources.getImage(
+				return this.buildpathsResources.getImage(
 						BuildpathsUIResources.OBJ_INCLUSION_FILTER_ATTRIBUTE_IMAGE_ID );
 			case BuildpathAttribute.FILTER_EXCLUSIONS:
-				return this.uiResources.getImage(
+				return this.buildpathsResources.getImage(
 						BuildpathsUIResources.OBJ_EXCLUSION_FILTER_ATTRIBUTE_IMAGE_ID );
 			case BuildpathAttribute.OUTPUT:
-				return this.uiResources.getImage(
+				return this.buildpathsResources.getImage(
 						BuildpathsUIResources.OBJ_OUTPUT_FOLDER_ATTRIBUTE_IMAGE_ID );
 			default:
 				break;
@@ -90,12 +93,12 @@
 	}
 	
 	@Override
-	public String getText(final Object element) {
+	public String getText(final @Nullable Object element) {
 		if (element instanceof BuildpathListElement) {
-			return getListElementText((BuildpathListElement) element);
+			return getListElementText((BuildpathListElement)element);
 		}
 		if (element instanceof BuildpathListElementAttribute) {
-			final BuildpathListElementAttribute attribute= (BuildpathListElementAttribute) element;
+			final BuildpathListElementAttribute attribute= (BuildpathListElementAttribute)element;
 			final String text= getListElementAttributeText(attribute);
 			if (attribute.getStatus().getCode() == BuildpathInitializer.READ_ONLY) {
 				return NLS.bind(Messages.ListLabel_Attribute_NonModifiable_label, text);
@@ -106,7 +109,7 @@
 	}
 	
 	
-	private ImageDescriptor getListElementBaseImage(final BuildpathListElement listElement) {
+	private @Nullable ImageDescriptor getListElementBaseImage(final BuildpathListElement listElement) {
 		switch (listElement.getType().getName()) {
 		case BuildpathElement.PROJECT:
 			return this.workbenchImages.getImageDescriptor(
@@ -129,9 +132,9 @@
 		final IPath path= element.getPath();
 		switch (element.getType().getName()) {
 		case BuildpathElement.PROJECT:
-			String label= path.lastSegment();
+			String label= nonNullAssert(path.lastSegment());
 			if (element.isMissing()) {
-				label= label + ' ' + Messages.ListLabel_Deco_Missing_label;
+				label+= ' ' + Messages.ListLabel_Deco_Missing_label;
 			}
 			return label;
 		case BuildpathElement.SOURCE: {
@@ -169,7 +172,7 @@
 		switch (key) {
 		case BuildpathAttribute.SOURCE_ATTACHMENT: {
 				final String detail;
-				final IPath path= (IPath) attribute.getValue();
+				final IPath path= (IPath)attribute.getValue();
 				if (path != null && !path.isEmpty()) {
 					if (attribute.getParent().getType().getName() == BuildpathElement.VARIABLE) {
 						detail= getVariableString(path);
@@ -185,7 +188,7 @@
 			}
 		case BuildpathAttribute.FILTER_INCLUSIONS: {
 				final String detail;
-				final List<? extends IPath> patterns= (List<? extends IPath>) attribute.getValue();
+				final var patterns= (List<? extends IPath>)attribute.getValue();
 				if (patterns != null && !patterns.isEmpty()) {
 					final StringBuilder sb= new StringBuilder();
 					final int patternsCount= appendPatternList(patterns, sb);
@@ -203,7 +206,7 @@
 			}
 		case BuildpathAttribute.FILTER_EXCLUSIONS: {
 				final String detail;
-				final List<? extends IPath> patterns= (List<? extends IPath>) attribute.getValue();
+				final var patterns= (List<? extends IPath>)attribute.getValue();
 				if (patterns != null && !patterns.isEmpty()) {
 					final StringBuilder sb= new StringBuilder();
 					final int patternsCount= appendPatternList(patterns, sb);
@@ -221,7 +224,7 @@
 			}
 		case BuildpathAttribute.OUTPUT: {
 				final String detail;
-				final IPath path= (IPath) attribute.getValue();
+				final IPath path= (IPath)attribute.getValue();
 				if (path != null) {
 					detail= MessageUtils.processPath(path.toString());
 				}
@@ -238,7 +241,7 @@
 //					final String valueLabel= config.getValueLabel(access); // should be LTR marked
 //					return Messages.format(Messages.ListLabel_Provider_attribute_label, new String[] { nameLabel, valueLabel });
 //				}
-				String value= (String) attribute.getValue();
+				String value= (String)attribute.getValue();
 				if (value == null) {
 					value= Messages.ListLabel_Value_None_label;
 				}
diff --git a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathsUI.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathsUI.java
new file mode 100644
index 0000000..f6a5967
--- /dev/null
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathsUI.java
@@ -0,0 +1,35 @@
+/*=============================================================================#
+ # 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 <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.ltk.buildpath.ui;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+
+@NonNullByDefault
+public class BuildpathsUI {
+	
+	
+	public static final String BUNDLE_ID= "org.eclipse.statet.ltk.buildpath.ui"; //$NON-NLS-1$
+	
+	
+	public static BuildpathsUIResources getUIResources() {
+		return BuildpathsUIResources.INSTANCE;
+	}
+	
+	
+	private BuildpathsUI() {
+	}
+	
+}
diff --git a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathsUIResources.java b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathsUIResources.java
index b39d07f..784c4d2 100644
--- a/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathsUIResources.java
+++ b/ltk/org.eclipse.statet.ltk.buildpath.ui/src/org/eclipse/statet/ltk/buildpath/ui/BuildpathsUIResources.java
@@ -34,7 +34,7 @@
 	public static final String OBJ_OUTPUT_FOLDER_ATTRIBUTE_IMAGE_ID= NS + "/image/obj/attribute-output_folder"; //$NON-NLS-1$
 	
 	
-	public static final BuildpathsUIResources INSTANCE= new BuildpathsUIResources();
+	static final BuildpathsUIResources INSTANCE= new BuildpathsUIResources();
 	
 	
 	private BuildpathsUIResources() {
