diff --git a/extide/gradle/src/org/netbeans/modules/gradle/nodes/SubProjectsNode.java b/extide/gradle/src/org/netbeans/modules/gradle/nodes/SubProjectsNode.java
index 662284b..54b0fe0 100644
--- a/extide/gradle/src/org/netbeans/modules/gradle/nodes/SubProjectsNode.java
+++ b/extide/gradle/src/org/netbeans/modules/gradle/nodes/SubProjectsNode.java
@@ -26,8 +26,8 @@
 import java.awt.event.ActionEvent;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import javax.swing.AbstractAction;
 import javax.swing.Action;
@@ -48,6 +48,8 @@
 
 import static org.netbeans.modules.gradle.nodes.Bundle.*;
 import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import org.netbeans.api.project.ProjectUtils;
 import org.netbeans.modules.gradle.api.GradleBaseProject;
 import org.netbeans.modules.gradle.spi.Utils;
@@ -59,6 +61,8 @@
  */
 public class SubProjectsNode extends AbstractNode {
 
+    private static final Logger LOG = Logger.getLogger(SubProjectsNode.class.getName());
+    
     @StaticResource
     private static final String SP_BADGE
             = "org/netbeans/modules/gradle/resources/gradle-large-badge.png";
@@ -122,13 +126,21 @@
         protected boolean createKeys(final List<Project> projects) {
 
             Set<Project> containedProjects = ProjectUtils.getContainedProjects(project, false);
-            projects.addAll(containedProjects);
+            if (containedProjects != null) {
+                projects.addAll(containedProjects);
+            } else {
+                LOG.log(Level.FINE, "No ProjectContainerProvider in the lookup of: {0}", project);
+            }
             return true;
         }
 
         @Override
         protected Node createNodeForKey(Project key) {
             Set<Project> containedProjects = ProjectUtils.getContainedProjects(key, false);
+            if (containedProjects == null) {
+                containedProjects = Collections.emptySet();
+                LOG.log(Level.FINE, "No ProjectContainerProvider in the lookup of: {0}", project);                
+            }
             GradleBaseProject gbp = GradleBaseProject.get(project);
             String prefix = (gbp != null && !gbp.isRoot() ? gbp.getPath() : "") + ':';
             Children ch = containedProjects.isEmpty() ? Children.LEAF : Children.create(new SubProjectsChildFactory(key), true);
@@ -182,9 +194,7 @@
 
         @Override
         public Action[] getActions(boolean b) {
-            ArrayList<Action> lst = new ArrayList<Action>();
-            lst.add(OpenProjectAction.SINGLETON);
-            return lst.toArray(new Action[lst.size()]);
+            return new Action[]{OpenProjectAction.SINGLETON};
         }
 
         @Override
diff --git a/ide/csl.api/src/org/netbeans/modules/csl/navigation/ElementNode.java b/ide/csl.api/src/org/netbeans/modules/csl/navigation/ElementNode.java
index 077d3f6..0649d3b 100644
--- a/ide/csl.api/src/org/netbeans/modules/csl/navigation/ElementNode.java
+++ b/ide/csl.api/src/org/netbeans/modules/csl/navigation/ElementNode.java
@@ -29,6 +29,7 @@
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 import javax.swing.Action;
 import javax.swing.Icon;
@@ -242,7 +243,15 @@
             Node[] children = ch.getNodes();
             for (int i = 0; i < children.length; i++) {
                 ElementNode c = (ElementNode) children[i];
-                if (this.getFileObject() != c.getDescription().getElementHandle().getFileObject()) {
+                // The promise of the API is broken at several places in the
+                // codebase and thus this needs to be guarded. The assert is in
+                // place to find the violating places.
+                assert c.getDescription().getElementHandle() != null;
+                @SuppressWarnings("null")
+                FileObject childFileObject = c.getDescription().getElementHandle() != null
+                        ? c.getDescription().getElementHandle().getFileObject()
+                        : null;
+                if (! Objects.equals(this.getFileObject(), childFileObject)) {
                     // e.g. inherited items may be in another file
                     // in such a case, incorrect item is highlighted on the navigator window if the FileObjects are not checked
                     continue;
diff --git a/ide/css.editor/src/org/netbeans/modules/css/editor/module/main/TopLevelStructureItem.java b/ide/css.editor/src/org/netbeans/modules/css/editor/module/main/TopLevelStructureItem.java
index 4452e15..4897b90 100644
--- a/ide/css.editor/src/org/netbeans/modules/css/editor/module/main/TopLevelStructureItem.java
+++ b/ide/css.editor/src/org/netbeans/modules/css/editor/module/main/TopLevelStructureItem.java
@@ -24,13 +24,18 @@
 import java.util.List;
 import java.util.Set;
 import javax.swing.ImageIcon;
+import org.netbeans.lib.editor.util.StringEscapeUtils;
 import org.netbeans.modules.csl.api.ElementHandle;
 import org.netbeans.modules.csl.api.ElementKind;
 import org.netbeans.modules.csl.api.HtmlFormatter;
 import org.netbeans.modules.csl.api.Modifier;
+import org.netbeans.modules.csl.api.OffsetRange;
 import org.netbeans.modules.csl.api.StructureItem;
+import org.netbeans.modules.csl.spi.ParserResult;
+import org.netbeans.modules.css.editor.csl.CssLanguage;
 import org.netbeans.modules.css.editor.module.spi.FeatureContext;
 import org.netbeans.modules.parsing.api.Snapshot;
+import org.openide.filesystems.FileObject;
 import org.openide.util.NbBundle;
 
 /**
@@ -39,29 +44,40 @@
  */
 public abstract class TopLevelStructureItem implements StructureItem {
 
+    private final ElementHandle elementHandle;
+
+    public TopLevelStructureItem(String name, FileObject fileObject) {
+        this.elementHandle = new TopElementHandle(fileObject, name);
+    }
+
+    @Override
+    public String getName() {
+        return elementHandle.getName();
+    }
+
     @Override
     public String getSortText() {
-        return getName();
+        return this.elementHandle.getName();
     }
 
     @Override
     public String getHtml(HtmlFormatter formatter) {
-        return getName();
+        return StringEscapeUtils.escapeHtml(this.elementHandle.getName());
     }
 
     @Override
     public ElementHandle getElementHandle() {
-        return null;
+        return elementHandle;
     }
 
     @Override
     public ElementKind getKind() {
-        return ElementKind.PACKAGE; //xxx fix - add mode categories to csl
+        return elementHandle.getKind();
     }
 
     @Override
     public Set<Modifier> getModifiers() {
-        return Collections.emptySet();
+        return elementHandle.getModifiers();
     }
 
     @Override
@@ -102,9 +118,10 @@
 
     public abstract static class ChildrenSetStructureItem extends TopLevelStructureItem {
 
-        private Collection<StructureItem> items;
+        private final Collection<StructureItem> items;
 
-        public ChildrenSetStructureItem(Collection<StructureItem> items) {
+        public ChildrenSetStructureItem(String name, FileObject fileObject, Collection<StructureItem> items) {
+            super(name, fileObject);
             this.items = items;
         }
 
@@ -116,15 +133,17 @@
 
     public abstract static class ChildrenListStructureItem extends TopLevelStructureItem {
 
-        private List<StructureItem> items;
+        private final List<StructureItem> items;
 
-        public ChildrenListStructureItem(List<StructureItem> items) {
+        public ChildrenListStructureItem(String name, FileObject fileObject, List<StructureItem> items) {
+            super(name, fileObject);
             this.items = items;
         }
 
         @Override
+        @SuppressWarnings("ReturnOfCollectionOrArrayField")
         public List<? extends StructureItem> getNestedItems() {
-            return items;
+            return new ArrayList<>(items);
         }
     }
 
@@ -133,15 +152,12 @@
         private final Snapshot snapshot;
 
         public Rules(List<StructureItem> children, FeatureContext context) {
-            super(children);
+            super(NbBundle.getMessage(TopLevelStructureItem.class, "Rules"),  //NOI18N
+                    context.getSnapshot().getSource().getFileObject(),
+                    children);
             this.snapshot = context.getSnapshot();
         }
 
-        @Override
-        public String getName() {
-            return NbBundle.getMessage(TopLevelStructureItem.class, "Rules"); //NOI18N
-        }
-
         //return the element range 0 - source lenght to ensure the recursive
         //leaf node search mechanism in CSL navigator will try to match
         //the rule children
@@ -157,75 +173,91 @@
     }
 
     public static class Elements extends ChildrenSetStructureItem {
-
         public Elements(Collection<StructureItem> items) {
-            super(items);
-        }
-
-        @Override
-        public String getName() {
-            return NbBundle.getMessage(TopLevelStructureItem.class, "Elements"); //NOI18N
+            super(NbBundle.getMessage(TopLevelStructureItem.class, "Elements"), null, items); //NOI18N
         }
     }
 
     public static class Classes extends ChildrenSetStructureItem {
-
         public Classes(Collection<StructureItem> children) {
-            super(children);
-        }
-
-        @Override
-        public String getName() {
-            return NbBundle.getMessage(TopLevelStructureItem.class, "Classes"); //NOI18N
+            super(NbBundle.getMessage(TopLevelStructureItem.class, "Classes"), null, children);
         }
     }
 
     public static class Ids extends ChildrenSetStructureItem {
-
         public Ids(Collection<StructureItem> children) {
-            super(children);
-        }
-
-        @Override
-        public String getName() {
-            return NbBundle.getMessage(TopLevelStructureItem.class, "Ids"); //NOI18N
+            super(NbBundle.getMessage(TopLevelStructureItem.class, "Ids"), null, children); //NOI18N
         }
     }
 
     public static class Namespaces extends ChildrenListStructureItem {
 
         public Namespaces(List<StructureItem> children) {
-            super(children);
+            super(NbBundle.getMessage(TopLevelStructureItem.class, "Namespaces"), null, children);  //NOI18N
         }
 
-        @Override
-        public String getName() {
-            return NbBundle.getMessage(TopLevelStructureItem.class, "Namespaces"); //NOI18N
-        }
     }
 
     public static class AtRules extends ChildrenListStructureItem {
-
         public AtRules(List<StructureItem> children) {
-            super(children);
-        }
-
-        @Override
-        public String getName() {
-            return NbBundle.getMessage(TopLevelStructureItem.class, "AtRules"); //NOI18N
+            super(NbBundle.getMessage(TopLevelStructureItem.class, "AtRules"), null, children); //NOI18N
         }
     }
 
     @NbBundle.Messages("imports=Imports")
     public static class Imports extends ChildrenSetStructureItem {
-
         public Imports(Collection<StructureItem> children) {
-            super(children);
+            super(Bundle.imports(), null, children);
+        }
+    }
+
+    private static class TopElementHandle implements ElementHandle {
+        private final FileObject fileObject;
+        private final String name;
+
+        public TopElementHandle(FileObject fileObject, String name) {
+            this.fileObject = fileObject;
+            this.name = name;
+        }
+
+        @Override
+        public FileObject getFileObject() {
+            return fileObject;
+        }
+
+        @Override
+        public String getMimeType() {
+            return CssLanguage.CSS_MIME_TYPE;
         }
 
         @Override
         public String getName() {
-            return Bundle.imports();
+            return name;
+        }
+
+        @Override
+        public String getIn() {
+            return null;
+        }
+
+        @Override
+        public ElementKind getKind() {
+            return ElementKind.PACKAGE; //xxx fix - add mode categories to csl
+        }
+
+        @Override
+        public Set<Modifier> getModifiers() {
+            return Collections.emptySet();
+        }
+
+        @Override
+        public boolean signatureEquals(ElementHandle handle) {
+            return false;
+        }
+
+        @Override
+        public OffsetRange getOffsetRange(ParserResult result) {
+            return new OffsetRange(-1, -1);
         }
     }
 }
diff --git a/ide/css.prep/src/org/netbeans/modules/css/prep/editor/CPCategoryStructureItem.java b/ide/css.prep/src/org/netbeans/modules/css/prep/editor/CPCategoryStructureItem.java
index e403a24..e231a1d 100644
--- a/ide/css.prep/src/org/netbeans/modules/css/prep/editor/CPCategoryStructureItem.java
+++ b/ide/css.prep/src/org/netbeans/modules/css/prep/editor/CPCategoryStructureItem.java
@@ -28,9 +28,12 @@
 import org.netbeans.modules.csl.api.ElementKind;
 import org.netbeans.modules.csl.api.HtmlFormatter;
 import org.netbeans.modules.csl.api.Modifier;
+import org.netbeans.modules.csl.api.OffsetRange;
 import org.netbeans.modules.csl.api.StructureItem;
+import org.netbeans.modules.csl.spi.ParserResult;
 import org.netbeans.modules.css.editor.module.spi.FeatureContext;
 import org.netbeans.modules.parsing.api.Snapshot;
+import org.openide.filesystems.FileObject;
 import org.openide.util.ImageUtilities;
 import org.openide.util.NbBundle;
 
@@ -42,7 +45,18 @@
 
     //let the CP items to be at the top of the navigator
     private static final String SORT_TEXT_PREFIX = "0_"; //NOI18N
-    
+
+    private final ElementHandle elementHandle;
+
+    public CPCategoryStructureItem(ElementHandle elementHandle) {
+        this.elementHandle = elementHandle;
+    }
+
+    @Override
+    public String getName() {
+        return this.elementHandle.getName();
+    }
+
     @Override
     public String getSortText() {
         return new StringBuilder().append(SORT_TEXT_PREFIX).append(getName()).toString();
@@ -55,17 +69,17 @@
 
     @Override
     public ElementHandle getElementHandle() {
-        return null;
+        return elementHandle;
     }
 
     @Override
     public ElementKind getKind() {
-        return ElementKind.PACKAGE; //xxx fix - add mode categories to csl
+        return elementHandle.getKind();
     }
 
     @Override
     public Set<Modifier> getModifiers() {
-        return Collections.emptySet();
+        return elementHandle.getModifiers();
     }
 
     @Override
@@ -104,12 +118,12 @@
         return true;
     }
 
-
     public abstract static class ChildrenSetStructureItem extends CPCategoryStructureItem {
 
-        private Collection<StructureItem> items;
+        private final Collection<StructureItem> items;
 
-        public ChildrenSetStructureItem(Collection<StructureItem> items) {
+        public ChildrenSetStructureItem(ElementHandle elementHandle, Collection<StructureItem> items) {
+            super(elementHandle);
             this.items = items;
         }
 
@@ -123,31 +137,26 @@
     public static class Variables extends ChildrenSetStructureItem {
 
         private static final ImageIcon ICON = new ImageIcon(ImageUtilities.loadImage("org/netbeans/modules/css/prep/editor/resources/variables.gif")); //NOI18N
-        
-        public Variables(Set<StructureItem> children) {
-            super(children);
+
+        public Variables(Set<StructureItem> children, FeatureContext context) {
+            super(new DummyElementHandle(context.getFileObject(), Bundle.navigator_item_name_variables()), children);
         }
 
         @Override
         public ImageIcon getCustomIcon() {
             return ICON;
         }
-        
-        @Override
-        public String getName() {
-            return Bundle.navigator_item_name_variables();
-        }
     }
 
     @NbBundle.Messages("navigator.item.name.mixins=Mixins")
     public static class Mixins extends ChildrenSetStructureItem {
 
         private static final ImageIcon ICON = new ImageIcon(ImageUtilities.loadImage("org/netbeans/modules/css/prep/editor/resources/methods.gif")); //NOI18N
-        
-        private FeatureContext context;
+
+        private final FeatureContext context;
 
         public Mixins(Collection<StructureItem> items, FeatureContext context) {
-            super(items);
+            super(new DummyElementHandle(context.getFileObject(), Bundle.navigator_item_name_mixins()), items);
             this.context = context;
         }
 
@@ -156,11 +165,6 @@
             return ICON;
         }
 
-        @Override
-        public String getName() {
-            return Bundle.navigator_item_name_mixins();
-        }
-
         //return the element range 0 - source lenght to ensure the recursive
         //leaf node search mechanism in CSL navigator will try to match
         //the rule children
@@ -175,4 +179,54 @@
             return s.getOriginalOffset(s.getText().length());
         }
     }
+
+    private static class DummyElementHandle implements ElementHandle {
+        private final FileObject fileObject;
+        private final String name;
+
+        public DummyElementHandle(FileObject fileObject, String name) {
+            this.fileObject = fileObject;
+            this.name = name;
+        }
+
+        @Override
+        public FileObject getFileObject() {
+            return fileObject;
+        }
+
+        @Override
+        public String getMimeType() {
+            return "text/css";
+        }
+
+        @Override
+        public String getName() {
+            return name;
+        }
+
+        @Override
+        public String getIn() {
+            return null;
+        }
+
+        @Override
+        public ElementKind getKind() {
+            return ElementKind.PACKAGE;  //xxx fix - add mode categories to csl
+        }
+
+        @Override
+        public Set<Modifier> getModifiers() {
+            return Collections.emptySet();
+        }
+
+        @Override
+        public boolean signatureEquals(ElementHandle handle) {
+            return false;
+        }
+
+        @Override
+        public OffsetRange getOffsetRange(ParserResult result) {
+            return new OffsetRange(-1, -1);
+        }
+    }
 }
diff --git a/ide/css.prep/src/org/netbeans/modules/css/prep/editor/CPCssEditorModule.java b/ide/css.prep/src/org/netbeans/modules/css/prep/editor/CPCssEditorModule.java
index 4e6b456..e1e5539 100644
--- a/ide/css.prep/src/org/netbeans/modules/css/prep/editor/CPCssEditorModule.java
+++ b/ide/css.prep/src/org/netbeans/modules/css/prep/editor/CPCssEditorModule.java
@@ -712,7 +712,7 @@
         }
 
         if (!vars.isEmpty()) {
-            result.add(new CPCategoryStructureItem.Variables(vars));
+            result.add(new CPCategoryStructureItem.Variables(vars, context));
         }
         if (!mixins.isEmpty()) {
             result.add(new CPCategoryStructureItem.Mixins(mixins, context));
diff --git a/java/java.j2semodule/src/org/netbeans/modules/java/j2semodule/ui/customizer/Bundle.properties b/java/java.j2semodule/src/org/netbeans/modules/java/j2semodule/ui/customizer/Bundle.properties
index aa60c2c..078a809 100644
--- a/java/java.j2semodule/src/org/netbeans/modules/java/j2semodule/ui/customizer/Bundle.properties
+++ b/java/java.j2semodule/src/org/netbeans/modules/java/j2semodule/ui/customizer/Bundle.properties
@@ -601,7 +601,7 @@
 ACSD_jButtonEdit=Edit classpath items
 ACSD_BuildJarAfterCompile=Build JAR after compiling option
 LBL_CustomizeRun_Enable_Quick_Run=Enable Quick Run
-CustomizerCompile.CompileOnSave=Compile on &Save (requires nb-javac plugin)
+CustomizerCompile.CompileOnSave=Compile on &Save
 AD_CustomizerCompile.CompileOnSave=If selected, files are compiled when you save them. This option saves you time when you run or debug your application in the IDE.
 LBL_CompileOnSaveDescription=<html>If selected, files are compiled when you save them.<br>\
     This option saves you time when you run or debug your application in the IDE.<br>\
diff --git a/java/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/Bundle.properties b/java/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/Bundle.properties
index 9cb2102..acf0a8a 100644
--- a/java/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/Bundle.properties
+++ b/java/java.j2seproject/src/org/netbeans/modules/java/j2seproject/ui/customizer/Bundle.properties
@@ -601,7 +601,7 @@
 ACSD_jButtonEdit=Edit classpath items
 ACSD_BuildJarAfterCompile=Build JAR after compiling option
 LBL_CustomizeRun_Enable_Quick_Run=Enable Quick Run
-CustomizerCompile.CompileOnSave=Compile on &Save (requires nb-javac plugin)
+CustomizerCompile.CompileOnSave=Compile on &Save
 AD_CustomizerCompile.CompileOnSave=If selected, files are compiled when you save them. This option saves you time when you run or debug your application in the IDE.
 LBL_CompileOnSaveDescription=<html>If selected, files are compiled when you save them.<br>\
     This option saves you time when you run or debug your application in the IDE.<br>\
diff --git a/java/java.source/src/org/netbeans/modules/java/source/JBrowseModule.java b/java/java.source/src/org/netbeans/modules/java/source/JBrowseModule.java
index 9776a42..f6410ab 100644
--- a/java/java.source/src/org/netbeans/modules/java/source/JBrowseModule.java
+++ b/java/java.source/src/org/netbeans/modules/java/source/JBrowseModule.java
@@ -83,7 +83,7 @@
                         Dialog[] d = new Dialog[1];
                         DialogDescriptor dd = new DialogDescriptor(Bundle.DESC_FeaturesLimited(), Bundle.TITLE_FeaturesLimited(), true, new Object[] {install, DialogDescriptor.CANCEL_OPTION}, install, DialogDescriptor.DEFAULT_ALIGN, HelpCtx.DEFAULT_HELP, evt -> {
                             if (install.equals(evt.getActionCommand())) {
-                                PluginManager.installSingle("org.netbeans.lib.nbjavac", Bundle.DN_nbjavac());
+                                PluginManager.installSingle("org.netbeans.libs.nbjavacapi", Bundle.DN_nbjavac());
                             }
                             d[0].setVisible(false);
                         });
@@ -92,7 +92,7 @@
                     } catch (HeadlessException ex) {
                         Exceptions.printStackTrace(Exceptions.attachSeverity(ex, Level.FINE));
                     }
-                    prefs.putBoolean(KEY_WARNING_SHOWN, true);
+//                    prefs.putBoolean(KEY_WARNING_SHOWN, true); // show warning on every boot until fixed
                 }
             });
         });
diff --git a/java/maven/src/org/netbeans/modules/maven/customizer/Bundle.properties b/java/maven/src/org/netbeans/modules/maven/customizer/Bundle.properties
index 510cca1..c1a962a 100644
--- a/java/maven/src/org/netbeans/modules/maven/customizer/Bundle.properties
+++ b/java/maven/src/org/netbeans/modules/maven/customizer/Bundle.properties
@@ -142,7 +142,7 @@
 RunJarPanel.lblConfiguration.text=&Configuration:
 ActionMappings.txtPackagings.text=
 ActionMappings.lblPackagings.text=Supported Packagings:
-CompilePanel.cbCompileOnSave.text=Compile on &Save (requires nb-javac plugin)
+CompilePanel.cbCompileOnSave.text=Compile on &Save
 CompilePanel.btnLearnMore.text=<html><a href="">Learn More about Compile On Save feature in Maven projects</a></html>
 ActionMappings.jButton1.text=Show in Toolbar
 RunJarPanel.txtVMOptions.AccessibleContext.accessibleDescription=VM options
