Merge pull request #3473 from apache/delivery

Sync delivery to release130 for 13-rc1
diff --git a/ide/code.analysis/src/org/netbeans/modules/analysis/RunAnalysisPanel.form b/ide/code.analysis/src/org/netbeans/modules/analysis/RunAnalysisPanel.form
index a24ca0d..314cddf 100644
--- a/ide/code.analysis/src/org/netbeans/modules/analysis/RunAnalysisPanel.form
+++ b/ide/code.analysis/src/org/netbeans/modules/analysis/RunAnalysisPanel.form
@@ -36,7 +36,7 @@
     <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
     <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
     <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
-    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,-109,0,0,2,71"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,-125,0,0,1,-96"/>
   </AuxValues>
 
   <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
@@ -47,6 +47,10 @@
           <ResourceString bundle="org/netbeans/modules/analysis/Bundle.properties" key="RunAnalysisPanel.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
+      <AuxValues>
+        <AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
+        <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
+      </AuxValues>
       <Constraints>
         <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
           <GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="1280" weightX="0.0" weightY="0.0"/>
@@ -61,7 +65,7 @@
       </Properties>
       <Constraints>
         <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
-          <GridBagConstraints gridX="1" gridY="0" gridWidth="3" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="12" insetsBottom="0" insetsRight="0" anchor="1280" weightX="0.0" weightY="0.0"/>
+          <GridBagConstraints gridX="1" gridY="0" gridWidth="3" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="12" insetsBottom="0" insetsRight="0" anchor="1280" weightX="1.0" weightY="0.0"/>
         </Constraint>
       </Constraints>
     </Component>
@@ -71,6 +75,10 @@
           <ResourceString bundle="org/netbeans/modules/analysis/Bundle.properties" key="RunAnalysisPanel.jLabel2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
+      <AuxValues>
+        <AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
+        <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
+      </AuxValues>
       <Constraints>
         <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
           <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="12" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="1280" weightX="0.0" weightY="0.0"/>
@@ -88,7 +96,7 @@
       </Events>
       <Constraints>
         <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
-          <GridBagConstraints gridX="2" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="12" insetsLeft="12" insetsBottom="0" insetsRight="0" anchor="1280" weightX="0.0" weightY="0.0"/>
+          <GridBagConstraints gridX="2" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="12" insetsLeft="12" insetsBottom="0" insetsRight="0" anchor="1280" weightX="1.0" weightY="0.0"/>
         </Constraint>
       </Constraints>
     </Component>
@@ -154,7 +162,7 @@
       </Properties>
       <Constraints>
         <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
-          <GridBagConstraints gridX="2" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="12" insetsLeft="12" insetsBottom="0" insetsRight="0" anchor="256" weightX="0.0" weightY="0.0"/>
+          <GridBagConstraints gridX="2" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="12" insetsLeft="12" insetsBottom="0" insetsRight="0" anchor="256" weightX="1.0" weightY="0.0"/>
         </Constraint>
       </Constraints>
     </Component>
@@ -173,5 +181,18 @@
         </Constraint>
       </Constraints>
     </Component>
+    <Container class="javax.swing.JPanel" name="emptyPanel">
+      <AuxValues>
+        <AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
+        <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
+      </AuxValues>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+          <GridBagConstraints gridX="-1" gridY="3" gridWidth="4" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="1.0"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
+    </Container>
   </SubComponents>
 </Form>
diff --git a/ide/code.analysis/src/org/netbeans/modules/analysis/RunAnalysisPanel.java b/ide/code.analysis/src/org/netbeans/modules/analysis/RunAnalysisPanel.java
index 95c9c22..ef13e49 100644
--- a/ide/code.analysis/src/org/netbeans/modules/analysis/RunAnalysisPanel.java
+++ b/ide/code.analysis/src/org/netbeans/modules/analysis/RunAnalysisPanel.java
@@ -21,6 +21,7 @@
 import java.awt.CardLayout;
 import java.awt.Color;
 import java.awt.Component;
+import java.awt.Dimension;
 import java.awt.Font;
 import java.awt.Graphics;
 import java.awt.GridBagConstraints;
@@ -101,7 +102,7 @@
  */
 public final class RunAnalysisPanel extends javax.swing.JPanel implements LookupListener {
 
-    private static final String COMBO_PROTOTYPE = "999999999999999999999999999999999999999999999999999999999999";
+    private static final String COMBO_PROTOTYPE = "999999999999999999999999999999999999";
     private static final RequestProcessor WORKER = new RequestProcessor(RunAnalysisPanel.class.getName(), 1, false, false);
     private final JPanel progress;
     private final RequiredPluginsPanel requiredPlugins;
@@ -543,15 +544,16 @@
         java.awt.GridBagConstraints gridBagConstraints;
 
         radioButtons = new javax.swing.ButtonGroup();
-        jLabel1 = new javax.swing.JLabel();
+        javax.swing.JLabel jLabel1 = new javax.swing.JLabel();
         scopeCombo = new javax.swing.JComboBox();
-        jLabel2 = new javax.swing.JLabel();
+        javax.swing.JLabel jLabel2 = new javax.swing.JLabel();
         configurationCombo = new javax.swing.JComboBox();
         manage = new javax.swing.JButton();
         configurationRadio = new javax.swing.JRadioButton();
         singleInspectionRadio = new javax.swing.JRadioButton();
         inspectionCombo = new javax.swing.JComboBox();
         browse = new javax.swing.JButton();
+        javax.swing.JPanel emptyPanel = new javax.swing.JPanel();
 
         setLayout(new java.awt.GridBagLayout());
 
@@ -568,6 +570,7 @@
         gridBagConstraints.gridwidth = 3;
         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
         gridBagConstraints.anchor = java.awt.GridBagConstraints.ABOVE_BASELINE_LEADING;
+        gridBagConstraints.weightx = 1.0;
         gridBagConstraints.insets = new java.awt.Insets(0, 12, 0, 0);
         add(scopeCombo, gridBagConstraints);
 
@@ -590,6 +593,7 @@
         gridBagConstraints.gridy = 1;
         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
         gridBagConstraints.anchor = java.awt.GridBagConstraints.ABOVE_BASELINE_LEADING;
+        gridBagConstraints.weightx = 1.0;
         gridBagConstraints.insets = new java.awt.Insets(12, 12, 0, 0);
         add(configurationCombo, gridBagConstraints);
 
@@ -640,6 +644,7 @@
         gridBagConstraints.gridy = 2;
         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
         gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE;
+        gridBagConstraints.weightx = 1.0;
         gridBagConstraints.insets = new java.awt.Insets(12, 12, 0, 0);
         add(inspectionCombo, gridBagConstraints);
 
@@ -656,6 +661,12 @@
         gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE;
         gridBagConstraints.insets = new java.awt.Insets(12, 12, 0, 0);
         add(browse, gridBagConstraints);
+        gridBagConstraints = new java.awt.GridBagConstraints();
+        gridBagConstraints.gridy = 3;
+        gridBagConstraints.gridwidth = 4;
+        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+        gridBagConstraints.weighty = 1.0;
+        add(emptyPanel, gridBagConstraints);
     }// </editor-fold>//GEN-END:initComponents
 
     private void configurationComboActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_configurationComboActionPerformed
@@ -672,6 +683,7 @@
             }
         };
         AdjustConfigurationPanel panel = new AdjustConfigurationPanel(analyzers, preselectedAnalyzer, preselected, configurationToSelect, errorListener);
+        panel.setPreferredSize(new Dimension(700, 300));
         DialogDescriptor nd = new DialogDescriptor(panel, Bundle.LBL_Configurations(), true, NotifyDescriptor.OK_CANCEL_OPTION, NotifyDescriptor.OK_OPTION, null);
         
         nls[0] = nd.createNotificationLineSupport();
@@ -727,8 +739,6 @@
     private javax.swing.JComboBox configurationCombo;
     private javax.swing.JRadioButton configurationRadio;
     private javax.swing.JComboBox inspectionCombo;
-    private javax.swing.JLabel jLabel1;
-    private javax.swing.JLabel jLabel2;
     private javax.swing.JButton manage;
     private javax.swing.ButtonGroup radioButtons;
     private javax.swing.JComboBox scopeCombo;
diff --git a/ide/code.analysis/src/org/netbeans/modules/analysis/ui/AdjustConfigurationPanel.form b/ide/code.analysis/src/org/netbeans/modules/analysis/ui/AdjustConfigurationPanel.form
index 409f75b..973afe9 100644
--- a/ide/code.analysis/src/org/netbeans/modules/analysis/ui/AdjustConfigurationPanel.form
+++ b/ide/code.analysis/src/org/netbeans/modules/analysis/ui/AdjustConfigurationPanel.form
@@ -48,7 +48,7 @@
                       </Group>
                       <EmptySpace max="-2" attributes="0"/>
                       <Group type="103" groupAlignment="0" attributes="0">
-                          <Component id="configurationCombo" pref="254" max="32767" attributes="0"/>
+                          <Component id="configurationCombo" pref="220" max="32767" attributes="0"/>
                           <Component id="analyzerCombo" max="32767" attributes="0"/>
                       </Group>
                   </Group>
@@ -70,8 +70,8 @@
                   <Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/>
                   <Component id="analyzerCombo" alignment="3" min="-2" max="-2" attributes="0"/>
               </Group>
-              <EmptySpace type="separate" max="-2" attributes="0"/>
-              <Component id="analyzerPanel" pref="198" max="32767" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="analyzerPanel" pref="180" max="32767" attributes="0"/>
               <EmptySpace max="-2" attributes="0"/>
           </Group>
       </Group>
diff --git a/ide/code.analysis/src/org/netbeans/modules/analysis/ui/AdjustConfigurationPanel.java b/ide/code.analysis/src/org/netbeans/modules/analysis/ui/AdjustConfigurationPanel.java
index 2affb79..a2d33da 100644
--- a/ide/code.analysis/src/org/netbeans/modules/analysis/ui/AdjustConfigurationPanel.java
+++ b/ide/code.analysis/src/org/netbeans/modules/analysis/ui/AdjustConfigurationPanel.java
@@ -20,7 +20,6 @@
 
 import java.awt.BorderLayout;
 import java.awt.Component;
-import java.awt.Dimension;
 import java.awt.Window;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -41,7 +40,6 @@
 import javax.swing.DefaultListCellRenderer;
 import javax.swing.JComponent;
 import javax.swing.JList;
-import javax.swing.JPanel;
 import javax.swing.SwingUtilities;
 import org.netbeans.modules.analysis.Configuration;
 import org.netbeans.modules.analysis.ConfigurationsManager;
@@ -281,7 +279,7 @@
                             .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                            .addComponent(configurationCombo, 0, 254, Short.MAX_VALUE)
+                            .addComponent(configurationCombo, 0, 220, Short.MAX_VALUE)
                             .addComponent(analyzerCombo, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                 .addContainerGap())
         );
@@ -296,8 +294,8 @@
                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                     .addComponent(jLabel2)
                     .addComponent(analyzerCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
-                .addGap(18, 18, 18)
-                .addComponent(analyzerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 198, Short.MAX_VALUE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(analyzerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 180, Short.MAX_VALUE)
                 .addContainerGap())
         );
     }// </editor-fold>//GEN-END:initComponents
diff --git a/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/options/HintsPanel.form b/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/options/HintsPanel.form
index 5291292..4b35cc4 100644
--- a/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/options/HintsPanel.form
+++ b/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/options/HintsPanel.form
@@ -47,16 +47,13 @@
     <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
     <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
     <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
-    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,-116,0,0,3,9"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,-35,0,0,3,66"/>
   </AuxValues>
 
   <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
   <SubComponents>
     <Container class="javax.swing.JSplitPane" name="jSplitPane1">
       <Properties>
-        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
-          <Border info="null"/>
-        </Property>
         <Property name="dividerLocation" type="int" value="320"/>
       </Properties>
       <Constraints>
@@ -127,15 +124,15 @@
             <DimensionLayout dim="0">
               <Group type="103" groupAlignment="0" attributes="0">
                   <Component id="optionsPanel" max="32767" attributes="0"/>
-                  <Component id="descriptionPanel" alignment="0" pref="430" max="32767" attributes="0"/>
+                  <Component id="descriptionPanel" alignment="0" max="32767" attributes="0"/>
               </Group>
             </DimensionLayout>
             <DimensionLayout dim="1">
               <Group type="103" groupAlignment="0" attributes="0">
-                  <Group type="102" attributes="0">
-                      <Component id="optionsPanel" pref="109" max="32767" attributes="0"/>
-                      <EmptySpace min="-2" pref="12" max="-2" attributes="0"/>
-                      <Component id="descriptionPanel" pref="186" max="32767" attributes="0"/>
+                  <Group type="102" alignment="0" attributes="0">
+                      <Component id="optionsPanel" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                      <Component id="descriptionPanel" pref="314" max="32767" attributes="0"/>
                   </Group>
               </Group>
             </DimensionLayout>
@@ -277,7 +274,7 @@
                       <Group type="103" groupAlignment="0" attributes="0">
                           <Group type="102" alignment="1" attributes="0">
                               <Component id="openInEditor" min="-2" max="-2" attributes="0"/>
-                              <EmptySpace pref="195" max="32767" attributes="0"/>
+                              <EmptySpace pref="212" max="32767" attributes="0"/>
                               <Component id="saveButton" min="-2" max="-2" attributes="0"/>
                               <EmptySpace type="unrelated" max="-2" attributes="0"/>
                               <Component id="cancelEdit" min="-2" max="-2" attributes="0"/>
@@ -463,7 +460,7 @@
               <Group type="102" alignment="0" attributes="0">
                   <Component id="configLabel" min="-2" max="-2" attributes="0"/>
                   <EmptySpace max="-2" attributes="0"/>
-                  <Component id="configCombo" pref="683" max="32767" attributes="0"/>
+                  <Component id="configCombo" pref="719" max="32767" attributes="0"/>
               </Group>
           </Group>
         </DimensionLayout>
@@ -503,7 +500,7 @@
           <Group type="103" groupAlignment="0" attributes="0">
               <Group type="102" alignment="1" attributes="0">
                   <Component id="refactoringsLabel" min="-2" max="-2" attributes="0"/>
-                  <EmptySpace pref="540" max="32767" attributes="0"/>
+                  <EmptySpace pref="576" max="32767" attributes="0"/>
                   <Component id="searchLabel" min="-2" max="-2" attributes="0"/>
                   <EmptySpace max="-2" attributes="0"/>
                   <Component id="searchTextField" min="-2" pref="121" max="-2" attributes="0"/>
diff --git a/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/options/HintsPanel.java b/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/options/HintsPanel.java
index d789283..3854d95 100644
--- a/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/options/HintsPanel.java
+++ b/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/options/HintsPanel.java
@@ -39,16 +39,10 @@
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.IdentityHashMap;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
 import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.prefs.Preferences;
 import javax.swing.AbstractAction;
@@ -355,7 +349,7 @@
 
     private int getDividerLocation() {
         final int location = (int) ((jSplitPane1.getWidth() - jSplitPane1.getDividerSize()) * 0.4f);
-        return Math.min(320, location);
+        return Math.min(400, location);
     }
     
     /** This method is called from within the constructor to
@@ -405,7 +399,6 @@
         setBorder(javax.swing.BorderFactory.createEmptyBorder(8, 8, 8, 8));
         setLayout(new java.awt.GridBagLayout());
 
-        jSplitPane1.setBorder(null);
         jSplitPane1.setDividerLocation(320);
 
         treePanel.setOpaque(false);
@@ -516,7 +509,7 @@
             editingButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, editingButtonsLayout.createSequentialGroup()
                 .addComponent(openInEditor)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 198, Short.MAX_VALUE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 212, Short.MAX_VALUE)
                 .addComponent(saveButton)
                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                 .addComponent(cancelEdit))
@@ -560,9 +553,9 @@
         detailsPanelLayout.setVerticalGroup(
             detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
             .addGroup(detailsPanelLayout.createSequentialGroup()
-                .addComponent(optionsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 97, Short.MAX_VALUE)
-                .addGap(12, 12, 12)
-                .addComponent(descriptionPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 175, Short.MAX_VALUE))
+                .addComponent(optionsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                .addComponent(descriptionPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE))
         );
 
         jSplitPane1.setRightComponent(detailsPanel);
@@ -618,7 +611,7 @@
                 .addComponent(importButton)
                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                 .addComponent(exportButton)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 329, Short.MAX_VALUE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 292, Short.MAX_VALUE)
                 .addComponent(editScriptButton)
                 .addGap(35, 35, 35)
                 .addComponent(okButton)
@@ -660,7 +653,7 @@
             .addGroup(configurationsPanelLayout.createSequentialGroup()
                 .addComponent(configLabel)
                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(configCombo, 0, 642, Short.MAX_VALUE))
+                .addComponent(configCombo, 0, 719, Short.MAX_VALUE))
         );
         configurationsPanelLayout.setVerticalGroup(
             configurationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -684,7 +677,7 @@
             searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, searchPanelLayout.createSequentialGroup()
                 .addComponent(refactoringsLabel)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 493, Short.MAX_VALUE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 576, Short.MAX_VALUE)
                 .addComponent(searchLabel)
                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                 .addComponent(searchTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE))
diff --git a/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/refactoring/InspectAndRefactorPanel.form b/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/refactoring/InspectAndRefactorPanel.form
index 2a7418c..5b642cf 100644
--- a/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/refactoring/InspectAndRefactorPanel.form
+++ b/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/refactoring/InspectAndRefactorPanel.form
@@ -50,27 +50,24 @@
               <EmptySpace max="-2" attributes="0"/>
               <Group type="103" groupAlignment="0" attributes="0">
                   <Group type="102" attributes="0">
-                      <Group type="103" groupAlignment="0" attributes="0">
-                          <Component id="configurationRadio" alignment="0" min="-2" max="-2" attributes="0"/>
-                          <Component id="singleRefactorRadio" alignment="0" min="-2" max="-2" attributes="0"/>
-                      </Group>
+                      <Component id="singleRefactorRadio" min="-2" max="-2" attributes="0"/>
                       <EmptySpace max="-2" attributes="0"/>
-                      <Group type="103" groupAlignment="0" attributes="0">
-                          <Component id="singleRefactoringCombo" pref="196" max="32767" attributes="0"/>
-                          <Component id="configurationCombo" alignment="0" pref="196" max="32767" attributes="0"/>
-                      </Group>
+                      <Component id="singleRefactoringCombo" max="32767" attributes="0"/>
                   </Group>
-                  <Component id="scopeCombo" alignment="1" pref="346" max="32767" attributes="0"/>
+                  <Group type="102" attributes="0">
+                      <Component id="configurationRadio" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="-2" pref="25" max="-2" attributes="0"/>
+                      <Component id="configurationCombo" pref="242" max="32767" attributes="0"/>
+                  </Group>
+                  <Component id="scopeCombo" alignment="1" pref="377" max="32767" attributes="0"/>
               </Group>
               <EmptySpace type="unrelated" max="-2" attributes="0"/>
-              <Group type="103" groupAlignment="0" attributes="0">
-                  <Group type="103" groupAlignment="0" max="-2" attributes="0">
-                      <Component id="manageSingleRefactoring" alignment="1" max="32767" attributes="1"/>
-                      <Component id="manageConfigurations" alignment="1" max="32767" attributes="1"/>
-                  </Group>
+              <Group type="103" groupAlignment="0" max="-2" attributes="0">
+                  <Component id="manageConfigurations" max="32767" attributes="1"/>
                   <Component id="customScopeButton" alignment="0" min="-2" max="-2" attributes="0"/>
+                  <Component id="manageSingleRefactoring" alignment="0" max="32767" attributes="1"/>
               </Group>
-              <EmptySpace max="-2" attributes="0"/>
+              <EmptySpace min="-2" max="-2" attributes="0"/>
           </Group>
       </Group>
     </DimensionLayout>
@@ -90,12 +87,13 @@
                   <Component id="manageConfigurations" alignment="3" min="-2" max="-2" attributes="0"/>
                   <Component id="refactorUsingLabel" alignment="3" min="-2" max="-2" attributes="0"/>
               </Group>
-              <EmptySpace min="1" pref="1" max="1" attributes="0"/>
+              <EmptySpace type="unrelated" max="-2" attributes="0"/>
               <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="singleRefactorRadio" alignment="3" min="-2" max="-2" attributes="0"/>
                   <Component id="singleRefactoringCombo" alignment="3" min="-2" max="-2" attributes="0"/>
                   <Component id="manageSingleRefactoring" alignment="3" min="-2" max="-2" attributes="0"/>
-                  <Component id="singleRefactorRadio" alignment="3" min="-2" max="-2" attributes="0"/>
               </Group>
+              <EmptySpace max="32767" attributes="0"/>
           </Group>
       </Group>
     </DimensionLayout>
diff --git a/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/refactoring/InspectAndRefactorPanel.java b/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/refactoring/InspectAndRefactorPanel.java
index 5c19e0a..7ae45ef 100644
--- a/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/refactoring/InspectAndRefactorPanel.java
+++ b/java/java.hints.ui/src/org/netbeans/modules/java/hints/spiimpl/refactoring/InspectAndRefactorPanel.java
@@ -328,8 +328,7 @@
 
         GroupLayout layout = new GroupLayout(this);
         this.setLayout(layout);
-        layout.setHorizontalGroup(
-            layout.createParallelGroup(Alignment.LEADING)
+        layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING)
             .addGroup(layout.createSequentialGroup()
                 .addContainerGap()
                 .addGroup(layout.createParallelGroup(Alignment.LEADING)
@@ -338,24 +337,22 @@
                 .addPreferredGap(ComponentPlacement.RELATED)
                 .addGroup(layout.createParallelGroup(Alignment.LEADING)
                     .addGroup(layout.createSequentialGroup()
-                        .addGroup(layout.createParallelGroup(Alignment.LEADING)
-                            .addComponent(configurationRadio)
-                            .addComponent(singleRefactorRadio))
+                        .addComponent(singleRefactorRadio)
                         .addPreferredGap(ComponentPlacement.RELATED)
-                        .addGroup(layout.createParallelGroup(Alignment.LEADING)
-                            .addComponent(singleRefactoringCombo, 0, 196, Short.MAX_VALUE)
-                            .addComponent(configurationCombo, 0, 196, Short.MAX_VALUE)))
-                    .addComponent(scopeCombo, Alignment.TRAILING, 0, 346, Short.MAX_VALUE))
+                        .addComponent(singleRefactoringCombo, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+                    .addGroup(layout.createSequentialGroup()
+                        .addComponent(configurationRadio)
+                        .addGap(25, 25, 25)
+                        .addComponent(configurationCombo, 0, 242, Short.MAX_VALUE))
+                    .addComponent(scopeCombo, Alignment.TRAILING, 0, 377, Short.MAX_VALUE))
                 .addPreferredGap(ComponentPlacement.UNRELATED)
-                .addGroup(layout.createParallelGroup(Alignment.LEADING)
-                    .addGroup(layout.createParallelGroup(Alignment.LEADING, false)
-                        .addComponent(manageSingleRefactoring, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
-                        .addComponent(manageConfigurations, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
-                    .addComponent(customScopeButton))
+                .addGroup(layout.createParallelGroup(Alignment.LEADING, false)
+                    .addComponent(manageConfigurations, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                    .addComponent(customScopeButton)
+                    .addComponent(manageSingleRefactoring, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                 .addContainerGap())
         );
-        layout.setVerticalGroup(
-            layout.createParallelGroup(Alignment.LEADING)
+        layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING)
             .addGroup(layout.createSequentialGroup()
                 .addContainerGap()
                 .addGroup(layout.createParallelGroup(Alignment.BASELINE)
@@ -368,11 +365,12 @@
                     .addComponent(configurationCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                     .addComponent(manageConfigurations)
                     .addComponent(refactorUsingLabel))
-                .addGap(1, 1, 1)
+                .addPreferredGap(ComponentPlacement.UNRELATED)
                 .addGroup(layout.createParallelGroup(Alignment.BASELINE)
+                    .addComponent(singleRefactorRadio)
                     .addComponent(singleRefactoringCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
-                    .addComponent(manageSingleRefactoring)
-                    .addComponent(singleRefactorRadio)))
+                    .addComponent(manageSingleRefactoring))
+                .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
     }// </editor-fold>//GEN-END:initComponents
 
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/WrongStringComparisonCustomizer.form b/java/java.hints/src/org/netbeans/modules/java/hints/WrongStringComparisonCustomizer.form
index 8212bd5..13fe67a 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/WrongStringComparisonCustomizer.form
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/WrongStringComparisonCustomizer.form
@@ -45,8 +45,8 @@
           <Group type="102" attributes="0">
               <EmptySpace max="-2" attributes="0"/>
               <Group type="103" groupAlignment="0" attributes="0">
-                  <Component id="ternaryNullCheck" alignment="0" min="-2" pref="346" max="-2" attributes="0"/>
-                  <Component id="stringLiteralsFirst" alignment="0" min="-2" pref="346" max="-2" attributes="0"/>
+                  <Component id="ternaryNullCheck" alignment="0" min="-2" max="-2" attributes="0"/>
+                  <Component id="stringLiteralsFirst" alignment="0" min="-2" pref="315" max="-2" attributes="0"/>
               </Group>
               <EmptySpace max="32767" attributes="0"/>
           </Group>
@@ -56,9 +56,9 @@
       <Group type="103" groupAlignment="0" attributes="0">
           <Group type="102" alignment="0" attributes="0">
               <EmptySpace max="-2" attributes="0"/>
-              <Component id="ternaryNullCheck" min="-2" pref="30" max="-2" attributes="0"/>
+              <Component id="ternaryNullCheck" min="-2" pref="24" max="-2" attributes="0"/>
               <EmptySpace type="unrelated" max="-2" attributes="0"/>
-              <Component id="stringLiteralsFirst" min="-2" pref="30" max="-2" attributes="0"/>
+              <Component id="stringLiteralsFirst" min="-2" max="-2" attributes="0"/>
               <EmptySpace max="32767" attributes="0"/>
           </Group>
       </Group>
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/WrongStringComparisonCustomizer.java b/java/java.hints/src/org/netbeans/modules/java/hints/WrongStringComparisonCustomizer.java
index fcbbf1c..407f021 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/WrongStringComparisonCustomizer.java
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/WrongStringComparisonCustomizer.java
@@ -29,7 +29,7 @@
  */
 public class WrongStringComparisonCustomizer extends javax.swing.JPanel {
 
-    private Preferences p;
+    private final Preferences p;
 
     /** Creates new customizer WrongStringComparisonCustomizer */
     public WrongStringComparisonCustomizer(Preferences p) {
@@ -73,17 +73,17 @@
             .addGroup(layout.createSequentialGroup()
                 .addContainerGap()
                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                    .addComponent(ternaryNullCheck, javax.swing.GroupLayout.PREFERRED_SIZE, 346, javax.swing.GroupLayout.PREFERRED_SIZE)
-                    .addComponent(stringLiteralsFirst, javax.swing.GroupLayout.PREFERRED_SIZE, 346, javax.swing.GroupLayout.PREFERRED_SIZE))
+                    .addComponent(ternaryNullCheck)
+                    .addComponent(stringLiteralsFirst, javax.swing.GroupLayout.PREFERRED_SIZE, 315, javax.swing.GroupLayout.PREFERRED_SIZE))
                 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
         layout.setVerticalGroup(
             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
             .addGroup(layout.createSequentialGroup()
                 .addContainerGap()
-                .addComponent(ternaryNullCheck, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addComponent(ternaryNullCheck, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
-                .addComponent(stringLiteralsFirst, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addComponent(stringLiteralsFirst)
                 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
 
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/errors/FinalFieldsFromCtorCustomiser.form b/java/java.hints/src/org/netbeans/modules/java/hints/errors/FinalFieldsFromCtorCustomiser.form
index 487c616..712875c 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/errors/FinalFieldsFromCtorCustomiser.form
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/errors/FinalFieldsFromCtorCustomiser.form
@@ -39,17 +39,17 @@
       <Group type="103" groupAlignment="0" attributes="0">
           <Group type="102" alignment="0" attributes="0">
               <EmptySpace max="-2" attributes="0"/>
-              <Component id="finalCheckBox" min="-2" pref="222" max="-2" attributes="0"/>
-              <EmptySpace max="32767" attributes="0"/>
+              <Component id="finalCheckBox" max="32767" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
           </Group>
       </Group>
     </DimensionLayout>
     <DimensionLayout dim="1">
       <Group type="103" groupAlignment="0" attributes="0">
           <Group type="102" alignment="0" attributes="0">
-              <EmptySpace min="-2" pref="19" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
               <Component id="finalCheckBox" min="-2" max="-2" attributes="0"/>
-              <EmptySpace pref="24" max="32767" attributes="0"/>
+              <EmptySpace max="32767" attributes="0"/>
           </Group>
       </Group>
     </DimensionLayout>
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/errors/FinalFieldsFromCtorCustomiser.java b/java/java.hints/src/org/netbeans/modules/java/hints/errors/FinalFieldsFromCtorCustomiser.java
index b57b201..2622aa4 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/errors/FinalFieldsFromCtorCustomiser.java
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/errors/FinalFieldsFromCtorCustomiser.java
@@ -59,15 +59,15 @@
             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
             .addGroup(layout.createSequentialGroup()
                 .addContainerGap()
-                .addComponent(finalCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE, 222, javax.swing.GroupLayout.PREFERRED_SIZE)
-                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+                .addComponent(finalCheckBox)
+                .addContainerGap())
         );
         layout.setVerticalGroup(
             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
             .addGroup(layout.createSequentialGroup()
-                .addGap(19, 19, 19)
-                .addComponent(finalCheckBox)
-                .addContainerGap(24, Short.MAX_VALUE))
+                .addContainerGap()
+                .addComponent(finalCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
 
         finalCheckBox.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(FinalFieldsFromCtorCustomiser.class, "ACSN_Final_Checkbox")); // NOI18N
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/errors/ImportClassCustomizer.form b/java/java.hints/src/org/netbeans/modules/java/hints/errors/ImportClassCustomizer.form
index fa57da7..d8304b1 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/errors/ImportClassCustomizer.form
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/errors/ImportClassCustomizer.form
@@ -40,7 +40,7 @@
           <Group type="102" alignment="0" attributes="0">
               <EmptySpace max="-2" attributes="0"/>
               <Component id="organizeImports" min="-2" max="-2" attributes="0"/>
-              <EmptySpace pref="195" max="32767" attributes="0"/>
+              <EmptySpace max="32767" attributes="0"/>
           </Group>
       </Group>
     </DimensionLayout>
@@ -49,7 +49,7 @@
           <Group type="102" alignment="0" attributes="0">
               <EmptySpace max="-2" attributes="0"/>
               <Component id="organizeImports" min="-2" max="-2" attributes="0"/>
-              <EmptySpace pref="269" max="32767" attributes="0"/>
+              <EmptySpace max="32767" attributes="0"/>
           </Group>
       </Group>
     </DimensionLayout>
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/errors/ImportClassCustomizer.java b/java/java.hints/src/org/netbeans/modules/java/hints/errors/ImportClassCustomizer.java
index aef56aa..9d7c4ed 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/errors/ImportClassCustomizer.java
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/errors/ImportClassCustomizer.java
@@ -61,14 +61,14 @@
             .addGroup(layout.createSequentialGroup()
                 .addContainerGap()
                 .addComponent(organizeImports)
-                .addContainerGap(195, Short.MAX_VALUE))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
         layout.setVerticalGroup(
             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
             .addGroup(layout.createSequentialGroup()
                 .addContainerGap()
                 .addComponent(organizeImports)
-                .addContainerGap(269, Short.MAX_VALUE))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
     }// </editor-fold>//GEN-END:initComponents
 
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/errors/LocalVariableFixCustomizer.form b/java/java.hints/src/org/netbeans/modules/java/hints/errors/LocalVariableFixCustomizer.form
index f6f69f3..2d1681e 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/errors/LocalVariableFixCustomizer.form
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/errors/LocalVariableFixCustomizer.form
@@ -25,6 +25,7 @@
   <AuxValues>
     <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
     <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
     <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
     <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
     <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
@@ -39,7 +40,7 @@
           <Group type="102" alignment="0" attributes="0">
               <EmptySpace max="-2" attributes="0"/>
               <Component id="inPlace" min="-2" max="-2" attributes="0"/>
-              <EmptySpace pref="186" max="32767" attributes="0"/>
+              <EmptySpace max="32767" attributes="0"/>
           </Group>
       </Group>
     </DimensionLayout>
@@ -48,7 +49,7 @@
           <Group type="102" alignment="0" attributes="0">
               <EmptySpace max="-2" attributes="0"/>
               <Component id="inPlace" min="-2" max="-2" attributes="0"/>
-              <EmptySpace pref="269" max="32767" attributes="0"/>
+              <EmptySpace max="32767" attributes="0"/>
           </Group>
       </Group>
     </DimensionLayout>
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/errors/LocalVariableFixCustomizer.java b/java/java.hints/src/org/netbeans/modules/java/hints/errors/LocalVariableFixCustomizer.java
index 34395ab..0922457 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/errors/LocalVariableFixCustomizer.java
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/errors/LocalVariableFixCustomizer.java
@@ -60,14 +60,14 @@
             .addGroup(layout.createSequentialGroup()
                 .addContainerGap()
                 .addComponent(inPlace)
-                .addContainerGap(186, Short.MAX_VALUE))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
         layout.setVerticalGroup(
             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
             .addGroup(layout.createSequentialGroup()
                 .addContainerGap()
                 .addComponent(inPlace)
-                .addContainerGap(269, Short.MAX_VALUE))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
     }// </editor-fold>//GEN-END:initComponents
 
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/errors/SurroundWithTryCatchLog.form b/java/java.hints/src/org/netbeans/modules/java/hints/errors/SurroundWithTryCatchLog.form
index 6db149a..beefab8 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/errors/SurroundWithTryCatchLog.form
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/errors/SurroundWithTryCatchLog.form
@@ -52,7 +52,7 @@
                       </Group>
                   </Group>
               </Group>
-              <EmptySpace min="-2" pref="221" max="-2" attributes="0"/>
+              <EmptySpace max="32767" attributes="0"/>
           </Group>
       </Group>
     </DimensionLayout>
@@ -71,7 +71,7 @@
               <Component id="rethrowRuntime" min="-2" max="-2" attributes="0"/>
               <EmptySpace type="unrelated" max="-2" attributes="0"/>
               <Component id="rethrow" min="-2" max="-2" attributes="0"/>
-              <EmptySpace pref="134" max="32767" attributes="0"/>
+              <EmptySpace max="32767" attributes="0"/>
           </Group>
       </Group>
     </DimensionLayout>
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/errors/SurroundWithTryCatchLog.java b/java/java.hints/src/org/netbeans/modules/java/hints/errors/SurroundWithTryCatchLog.java
index e11d37c..dab17c0 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/errors/SurroundWithTryCatchLog.java
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/errors/SurroundWithTryCatchLog.java
@@ -112,7 +112,7 @@
                             .addComponent(printStackTrace)
                             .addComponent(rethrowRuntime)
                             .addComponent(rethrow))))
-                .addGap(221, 221, 221))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
         layout.setVerticalGroup(
             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -129,7 +129,7 @@
                 .addComponent(rethrowRuntime)
                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                 .addComponent(rethrow)
-                .addContainerGap(134, Short.MAX_VALUE))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
     }// </editor-fold>//GEN-END:initComponents
 
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/jdk/ConvertToVarHint.java b/java/java.hints/src/org/netbeans/modules/java/hints/jdk/ConvertToVarHint.java
index c9e537d..f1a19da 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/jdk/ConvertToVarHint.java
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/jdk/ConvertToVarHint.java
@@ -204,6 +204,8 @@
                     break;
                 case LAMBDA_EXPRESSION:
                     return false;
+                case MEMBER_REFERENCE:
+                    return false;
                 default:
                     break;
             }
diff --git a/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/jdk/ConvertToVarHintTest.java b/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/jdk/ConvertToVarHintTest.java
index a9a2168..30b3a21 100644
--- a/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/jdk/ConvertToVarHintTest.java
+++ b/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/jdk/ConvertToVarHintTest.java
@@ -122,6 +122,24 @@
     }
     
     @Test
+    public void testMethodRefToVar() throws Exception {
+
+        HintTest.create()
+                .setCaretMarker('^')
+                .input("package test;\n"
+                        + "import java.util.function.Consumer;\n"
+                        + "public class Test {\n"
+                        + "    void m2() {\n"
+                        + "       final Consumer<String> println = System.out::println^;\n"
+                        + "    }\n"
+                        + "}\n")
+                .sourceLevel("1.10")
+                .run(ConvertToVarHint.class)
+                .assertNotContainsWarnings(VAR_CONV_DESC);
+
+    }
+    
+    @Test
     public void testArrayInitializerVar() throws Exception {
 
         HintTest.create()
diff --git a/java/java.lsp.server/arch.xml b/java/java.lsp.server/arch.xml
index 31ff8d8..2f36d68 100644
--- a/java/java.lsp.server/arch.xml
+++ b/java/java.lsp.server/arch.xml
@@ -961,6 +961,7 @@
        <table>
            <tbody>
                <tr><td>is:folder</td><td>the Node represents a folder, or a DataFolder</td><td></td></tr>
+               <tr><td>is:file</td><td>the Node represents a file</td><td></td></tr>
                <tr><td>is:project</td><td>the Node represents a project (the project's node itself)</td><td></td></tr>
                <tr><td>is:projectRoot</td><td>the Node represents a root project in a multi-project tree</td><td></td></tr>
                <tr><td>is:subProject</td><td>the Node represents a subproject in a multi-project tree</td><td></td></tr>
diff --git a/java/java.lsp.server/licenseinfo.xml b/java/java.lsp.server/licenseinfo.xml
index b2f957a..0c93cfb 100644
--- a/java/java.lsp.server/licenseinfo.xml
+++ b/java/java.lsp.server/licenseinfo.xml
@@ -24,8 +24,9 @@
         <file>vscode/package-lock.json</file>
         <file>vscode/package.json</file>
         <file>vscode/tsconfig.json</file>
-        <file>vscode/src/extension.ts</file>
-        <license ref="MIT-vscode-ext" />
+        <file>vscode/schemas/package.schema.json</file>
+        <license ref="Apache-2.0" />
+        <comment type="COMMENT_UNSUPPORTED" />
     </fileset>
     <fileset>
         <file>src/org/netbeans/modules/java/lsp/server/refactoring/ui/codicon.ttf</file>
@@ -40,6 +41,7 @@
         <file>vscode/.vscode/tasks.json</file>
         <file>vscode/.vscode/settings.json</file>
         <license ref="Apache-2.0" />
+        <comment type="COMMENT_UNSUPPORTED" />
     </fileset>
     <fileset>
         <file>vscode/images/Apache_NetBeans_Logo.png</file>
diff --git a/java/java.lsp.server/nbcode/README.md b/java/java.lsp.server/nbcode/README.md
new file mode 100644
index 0000000..20b2073
--- /dev/null
+++ b/java/java.lsp.server/nbcode/README.md
@@ -0,0 +1,26 @@
+# Apache NetBeans Language Server Distribution
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+
+Projects in this subdirectory are **not part of standard Apache NetBeans IDE distribution**. 
+They are part of a special Language Server application, based on Apache NetBeans Platform,
+that runs *headless*. Modules in  this subtree may register services, that override or 
+disrupt normal IDE operation: be careful when sharing or using code from this project and 
+subprojects.
diff --git a/java/java.lsp.server/nbcode/integration/build.xml b/java/java.lsp.server/nbcode/integration/build.xml
index e5fc3c5..9a0c12e 100644
--- a/java/java.lsp.server/nbcode/integration/build.xml
+++ b/java/java.lsp.server/nbcode/integration/build.xml
@@ -17,9 +17,46 @@
     KIND, either express or implied.  See the License for the
     specific language governing permissions and limitations
     under the License.
-
--->
+    
+    -->
 <project name="org.netbeans.modules.nbcode.integration" default="netbeans" basedir=".">
-    <description>Builds, tests, and runs the project org.netbeans.modules.nbcode.integration.</description>
-    <import file="nbproject/build-impl.xml"/>
+<description>Builds, tests, and runs the project org.netbeans.modules.nbcode.integration.</description>
+<import file="nbproject/build-impl.xml"/>
+
+<property name="nbantext.jar" location="${harness.dir}/../../build/nbantext.jar"/>
+<target name="copy-icon-files" depends="init">
+    <!-- load the properties as plain text into a property -->
+    <loadfile property="_imagelist" srcfile="${src.dir}/org/netbeans/modules/nbcode/integration/resources/uimanager-icons.properties">
+        <!-- only load affirmative values of properties -->
+        <filterchain>
+            <linecontainsregexp negate="true">
+                <regexp pattern="^#|^\s*$|=" />
+            </linecontainsregexp>
+            <tokenfilter>
+                <replaceregex pattern="(.+)$" replace="\1,"/>
+            </tokenfilter>
+            <!--
+            <prefixlines prefix="copyicons." />
+            -->
+        </filterchain>
+    </loadfile>
+    
+    <echo message="${_imagelist}"/>
+    
+    <mkdir dir="${build.dir}/org/netbeans/modules/nbcode/integration/resources/uidefaults"/>
+    <taskdef name="repeat" classname="org.netbeans.nbbuild.Repeat" classpath="${nbantext.jar}"/>
+    <repeat target="-copy-single-file" name="copy.icon.name" values="${_imagelist}" />
+</target>
+
+    <target name="-copy-single-file">
+        <condition property="empty">
+            <equals arg1="${copy.icon.name}" arg2="" trim="true"/>
+        </condition>
+        <antcall target="-copy-single-file2"/>
+    </target>
+    <target name="-copy-single-file2" unless="${empty}">
+        <copy file="${src.dir}/org/netbeans/modules/nbcode/integration/resources/empty.png" tofile="${build.classes.dir}/org/netbeans/modules/nbcode/integration/resources/uidefaults/${copy.icon.name}.png"/>
+    </target>
+    
+    <target name="-pre-release" depends="projectized-common.-pre-release, copy-icon-files"/>
 </project>
diff --git a/java/java.lsp.server/nbcode/integration/nbproject/project.xml b/java/java.lsp.server/nbcode/integration/nbproject/project.xml
index b94c2ed..dbe1c66 100644
--- a/java/java.lsp.server/nbcode/integration/nbproject/project.xml
+++ b/java/java.lsp.server/nbcode/integration/nbproject/project.xml
@@ -36,6 +36,14 @@
                     </run-dependency>
                 </dependency>
                 <dependency>
+                    <code-name-base>org.netbeans.api.htmlui</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.23</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
                     <code-name-base>org.netbeans.api.io</code-name-base>
                     <build-prerequisite/>
                     <compile-dependency/>
@@ -61,14 +69,6 @@
                     </run-dependency>
                 </dependency>
                 <dependency>
-                    <code-name-base>org.netbeans.api.htmlui</code-name-base>
-                    <build-prerequisite/>
-                    <compile-dependency/>
-                    <run-dependency>
-                        <specification-version>1.23</specification-version>
-                    </run-dependency>
-                </dependency>
-                <dependency>
                     <code-name-base>org.netbeans.html.presenters.spi</code-name-base>
                     <build-prerequisite/>
                     <compile-dependency/>
@@ -116,6 +116,14 @@
                     </run-dependency>
                 </dependency>
                 <dependency>
+                    <code-name-base>org.openide.modules</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.63</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
                     <code-name-base>org.openide.util</code-name-base>
                     <build-prerequisite/>
                     <compile-dependency/>
@@ -136,7 +144,7 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <specification-version>9.23</specification-version>
+                        <specification-version>9.24</specification-version>
                     </run-dependency>
                 </dependency>
             </module-dependencies>
diff --git a/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/UIDefaultsIconMetadata.java b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/UIDefaultsIconMetadata.java
new file mode 100644
index 0000000..d92e9ce
--- /dev/null
+++ b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/UIDefaultsIconMetadata.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.nbcode.integration;
+
+import java.awt.EventQueue;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Properties;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.UIDefaults;
+import javax.swing.UIDefaults.LazyValue;
+import javax.swing.UIManager;
+import org.openide.modules.OnStart;
+import org.openide.util.ImageUtilities;
+import org.openide.util.Lookup;
+
+/**
+ * Goes through UIDefaults and replaces Icons and Images with variants that
+ * return image's URL from the 'url' property. 
+ * <b>Imporant note:</b> the class is <b>not a part of NetBeans IDE runtime</b>, it is
+ * packaged only to a LSP "nbcode" headless server.
+ * <p>
+ * The class processes resource
+ * {@code org/netbeans/modules/nbcode/integration/resources/uimanager-icons.properties}:
+ * keys define {@link UIManager} keys that will be replaced. If the key has a value, it will
+ * be replaced by an Icon {@link ImageUtilities#loadImage(java.lang.String) loaded} from that resource.
+ * If the key has no value, the image will be copied from a stub resource ({@code org/netbeans/modules/nbcode/integration/resources/empty.png})
+ * at build time and will get URL {@code org/netbeans/modules/nbcode/integration/resources/uidefaults&lt;property-key>}.
+ * 
+ * @author sdedic
+ */
+@OnStart
+public class UIDefaultsIconMetadata implements Runnable {
+    private static final Logger LOG = Logger.getLogger(UIDefaultsIconMetadata.class.getName());
+    private static final String RESOURCE_PREFIX = "org/netbeans/modules/nbcode/integration/resources/uidefaults/"; // NOI18N
+    @Override
+    public void run() {
+        EventQueue.invokeLater(() -> {
+            // force LaF initialization before the UIDefaults are read/patched.
+            UIManager.get("force.laf.initialization");
+            // force initialization of ImageUtilities class, otherwise its clinit could recursively call
+            // the lazy value here, which results in call into an (still) uninitialized ImageUtilities -> ClassDefNotFoundError.
+            ImageUtilities.loadImage("org/netbeans/modules/nbcode/integration/resources/empty.png");
+            replaceIconsAndImages(UIManager.getDefaults());
+        });
+    }
+    
+    static void replaceIconsAndImages(UIDefaults defs) {
+        ClassLoader l = Lookup.getDefault().lookup(ClassLoader.class);
+        try (InputStream is = UIDefaultsIconMetadata.class.getResourceAsStream("resources/uimanager-icons.properties")) { // NOI18N
+            Properties p = new Properties();
+            p.load(is);
+            // UIDefaults.keySet() is so lazy implemented that it does not enumerate any items ... but entrySet
+            // works and even allows to see raw LazyValue and ActiveValue instances...
+            Set<Map.Entry<Object,Object>> entries = defs.entrySet();
+            Set<Object> uiDefaultsKeys = new HashSet<>();
+            for (Map.Entry<Object,Object> e : entries) {
+                uiDefaultsKeys.add(e.getKey());
+            }
+            // defs.keySet() is empty for some reason 
+            for (String uiKey : p.stringPropertyNames()) {
+                if (!uiDefaultsKeys.contains(uiKey)) {
+                    LOG.log(Level.INFO, "Icon not used: {0}", uiKey);
+                    continue;
+                }
+                String resImage = RESOURCE_PREFIX + uiKey + ".png"; // NOI18N
+                URL u = l.getResource(resImage);
+                if (u == null) {
+                    LOG.log(Level.WARNING, "Resource missing: {0}", resImage);
+                    continue;
+                }
+                LOG.log(Level.INFO, "Lazy-replacing icon: {0}", uiKey);
+                // verify the resource exists
+                defs.put(uiKey, new LazyValue() {
+                    @Override
+                    public Object createValue(UIDefaults table) {
+                        return ImageUtilities.image2Icon(ImageUtilities.loadImage(resImage));
+                    }
+                });
+            }
+        } catch (IOException ex) {
+            LOG.log(Level.WARNING, "Could not load image replacements", ex);
+        }
+    }
+}
diff --git a/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/empty.png b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/empty.png
new file mode 100644
index 0000000..c4be7c4
--- /dev/null
+++ b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/empty.png
Binary files differ
diff --git a/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.closedIcon.png b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.closedIcon.png
new file mode 100644
index 0000000..7d62539
--- /dev/null
+++ b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.closedIcon.png
Binary files differ
diff --git a/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.leafIcon.png b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.leafIcon.png
new file mode 100644
index 0000000..7d62539
--- /dev/null
+++ b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.leafIcon.png
Binary files differ
diff --git a/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.openIcon.png b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.openIcon.png
new file mode 100644
index 0000000..708af96
--- /dev/null
+++ b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.openIcon.png
Binary files differ
diff --git a/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/uimanager-icons.properties b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/uimanager-icons.properties
new file mode 100644
index 0000000..2d53bdb
--- /dev/null
+++ b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/resources/uimanager-icons.properties
@@ -0,0 +1,63 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# This file lists icons to be replaced by URL-loaded images. 
+# The format is j.u.Properties; if value is missing, the key will be prefixed
+# with org/netbeans/modules/nbcode/integration/resources/uidefaults/, suffix
+# .png. If the value is present, it must be the full path to the resource incl.
+# extension, that can be loaded by ImageUtilities.loadImage.
+#
+# Buildscript will automatically create stub resources for keys without value.
+
+CheckBox.icon
+ComboBox.icon
+ETableHeader.ascendingIcon
+ETableHeader.descendingIcon
+FileChooser.homeFolderIcon
+FileChooser.newFolderIcon
+FileChooser.upFolderIcon
+Menu.arrowIcon
+MSG_WaitScan
+nb.bigclose.tab.icon.enabled.icon
+nb.bigclose.tab.icon.pressed.icon
+nb.bigclose.tab.icon.rollover.icon
+nb.close.tab.icon.enabled.icon
+nb.close.tab.icon.pressed.icon
+nb.close.tab.icon.rollover.icon
+nb.multitabs.button.dropdown.icon
+nb.multitabs.button.left.icon
+nb.multitabs.button.maximize.icon
+nb.multitabs.button.right.icon
+nb.popupswitcher.closebutton.defaultIcon
+nb.popupswitcher.closebutton.rolloverIcon
+nb.tabcontrol.busy.icon.normal
+nb.tabcontrol.busy.icon.selected
+OptionPane.informationIcon
+OptionPane.warningIcon
+PropSheet.customButtonIcon
+RadioButton.icon
+Table.columnSelection
+ToolBar.handleIcon
+Nb.Explorer.Folder.icon
+Nb.Explorer.Folder.openedIcon
+Tree.gtk_collapsedIcon
+Tree.gtk_expandedIcon
+Tree.closedIcon=org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.closedIcon.png
+Tree.collapsedIcon
+Tree.expandedIcon
+Tree.leafIcon=org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.leafIcon.png
+Tree.openIcon=org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.openIcon.png
diff --git a/java/java.lsp.server/nbproject/project.xml b/java/java.lsp.server/nbproject/project.xml
index 211a839..7857b9b 100644
--- a/java/java.lsp.server/nbproject/project.xml
+++ b/java/java.lsp.server/nbproject/project.xml
@@ -617,7 +617,7 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <specification-version>9.14</specification-version>
+                        <specification-version>9.24</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/DefaultDecorationsImpl.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/DefaultDecorationsImpl.java
index beeeffa..09c5cb5 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/DefaultDecorationsImpl.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/DefaultDecorationsImpl.java
@@ -56,6 +56,7 @@
     public static final String EXPLORER_ROOT = "Explorers"; // NOI18N
     public static final String COOKIES_EXT = "contextValues"; // NOI18N
     
+    public static final String CTXVALUE_FILE = "is:file"; // NOI18N
     public static final String CTXVALUE_FOLDER = "is:folder"; // NOI18N
     public static final String CTXVALUE_PROJECT = "is:project"; // NOI18N
     public static final String CTXVALUE_PROJECT_ROOT = "is:projectRoot"; // NOI18N
@@ -166,7 +167,8 @@
                                 }
                                 folder = true;
                                 d.addContextValues(CTXVALUE_FOLDER);
-                            } else {
+                            } else if ((f.isData() || f.isValid()) && !f.isVirtual()) {
+                                d.addContextValues(CTXVALUE_FILE);
                                 // PENDING: this could be moved to the VSNetbeans module ?
                                 d.setCommand("vscode.open"); // NOI18N
                             }
diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeItem.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeItem.java
index 734a912..5bd279b 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeItem.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeItem.java
@@ -43,7 +43,6 @@
     public String description;
     // ?: string | Uri | {dark: string | Uri, light: string | Uri} | ThemeIcon
     public URI iconUri;
-    public int iconIndex;
     // id for the tree item that has to be unique across tree.
     // The id is used to preserve the selection and expansion state of the tree item.
     public int id;
@@ -56,6 +55,27 @@
     public String resourceUri;
     // ?: string | MarkdownString | undefined
     public Object tooltip;
+    
+    // NBLS-specific items, to be processed by the client:
+    // Metadata for the icon.
+    public IconDescriptor iconDescriptor;
+    // The icon's index
+    public int iconIndex;
+    
+    /**
+     * Metadata that describe an icon origin or contents.
+     */
+    public static class IconDescriptor {
+        /**
+         * Base URI / imageId of the icon.
+         */
+        public URI baseUri;
+        
+        /**
+         * Supplemental IDs from composed merged-in images or applied filters.
+         */
+        public String[] composition;
+    }
 
     public TreeItem() {
     }
diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeNodeRegistry.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeNodeRegistry.java
index 52e6149..e738022 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeNodeRegistry.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeNodeRegistry.java
@@ -20,6 +20,8 @@
 
 import java.awt.Image;
 import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
 import java.util.concurrent.CompletionStage;
 import org.openide.nodes.Node;
 
@@ -40,6 +42,19 @@
     CompletionStage<TreeViewProvider> createProvider(String id);
     
     public class ImageDataOrIndex {
+        /**
+         * Base URL of the image, if it could be extracted from the Image object.
+         */
+        public URI          baseURI;
+        
+        /**
+         * URLs(?) of additional image constituents.
+         */
+        public String[]     composition;
+        
+        /**
+         * Image URI, data: protocol.
+         */
         public final URI    imageURI;
         public final int    imageIndex;
 
@@ -57,5 +72,24 @@
             this.imageIndex = imageIndex;
             this.imageURI = null;
         }
+        
+        public ImageDataOrIndex baseURL(URL u) {
+            try {
+                baseURI = u == null ? null : u.toURI();
+            } catch (URISyntaxException ex) {
+                throw new IllegalArgumentException(ex);
+            }
+            return this;
+        }
+        
+        public ImageDataOrIndex baseURL(URI u) {
+            this.baseURI = u;
+            return this;
+        }
+        
+        public ImageDataOrIndex composition(String[] composition) {
+            this.composition = composition;
+            return this;
+        }
     }
 }
diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeNodeRegistryImpl.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeNodeRegistryImpl.java
index d5b945e..2b0a756 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeNodeRegistryImpl.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeNodeRegistryImpl.java
@@ -30,6 +30,7 @@
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.net.URL;
 import java.util.Base64;
 import java.util.HashMap;
 import java.util.Map;
@@ -49,6 +50,7 @@
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
 import org.openide.nodes.Node;
+import org.openide.util.ImageUtilities;
 import org.openide.util.Lookup;
 import org.openide.util.lookup.Lookups;
 import org.openide.util.lookup.ProxyLookup;
@@ -220,7 +222,6 @@
                 if (h == -1 || w == -1) {
                     try {
                         observer.cdl.await();
-                        Thread.sleep(1000);
                     } catch (InterruptedException ex) {
                     }
                     synchronized (observer) {
@@ -248,10 +249,31 @@
         }
         synchronized (this) {
             if (res == null) {
-                res = new ImageDataOrIndex(imageURI, imageCounter++);
+                res = new ImageDataOrIndex(imageURI, imageCounter++).
+                        baseURL(findImageURI(i));
             }
             images.put(i, res);
         }
         return res;
     }
+
+
+    public static URI findImageURI(Image i) {
+        URL u = ImageUtilities.findImageBaseURL(i);
+        if (u == null) {
+            return null;
+        }
+        String s = u.toString();
+        try {
+            if (s.contains(":")) {
+                return new URI(s);
+            } else {
+                return new URI("nbres:/" + s);
+            }
+        } catch (URISyntaxException ex) {
+            LOG.log(Level.WARNING, "Unable to interpret image ID: {0}", s);
+            return null;
+        }
+    }
+    
 }
diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeViewProvider.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeViewProvider.java
index a9b0e8a..a1e8d50 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeViewProvider.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeViewProvider.java
@@ -24,6 +24,10 @@
 import org.netbeans.modules.java.lsp.server.explorer.api.TreeDataEvent;
 import org.netbeans.modules.java.lsp.server.explorer.api.TreeDataProvider;
 import java.beans.PropertyChangeEvent;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -40,6 +44,7 @@
 import java.util.concurrent.CompletionStage;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.netbeans.modules.java.lsp.server.explorer.TreeItem.IconDescriptor;
 import org.openide.explorer.ExplorerManager;
 import org.openide.nodes.AbstractNode;
 import org.openide.nodes.Children;
@@ -385,6 +390,16 @@
             if (idoi != null) {
                 ti.iconIndex = idoi.imageIndex;
                 ti.iconUri = idoi.imageURI;
+                ti.iconDescriptor = new IconDescriptor();
+                try {
+                    URI baseURI = builtinURI2URI(idoi.baseURI);
+                    if (baseURI != null) {
+                        ti.iconDescriptor.baseUri = baseURI;
+                        ti.iconDescriptor.composition = idoi.composition;
+                    }
+                } catch (URISyntaxException ex) {
+                    LOG.log(Level.WARNING, "Cannot convert URL: {0}", idoi.baseURI);
+                }
             }
         } else if (data.getIconURI() != null) {
             ti.iconUri = data.getIconURI();
@@ -620,4 +635,27 @@
         protected void onDidChangeTreeData(Node n, int id) {
         }
     };
+    
+    static URI builtinURI2URI(URI u) throws URISyntaxException {
+        if (u == null) {
+            return null;
+        }
+        // I could work through URLMapper + FileUtil, but that would open the JAR
+        // as filesystem, which gives some perf overhead:
+        try {
+            if ("jar".equals(u.getScheme())) { // NOI18N
+                URL u2 = u.toURL();
+                String s = u2.getPath();
+                int i = s.indexOf('!');
+                // I don't want to send file: / jar: URLs over LSP wire,
+                // let's have just resource path
+                if (i != -1) {
+                    return new URI("nbres", s.substring(i + 1), null); // NOI18N
+                }
+            }
+        } catch (MalformedURLException ex) {
+            throw new URISyntaxException(u.toString(), ex.getMessage());
+        }
+        return u;
+    }
 }
diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/api/TreeItemData.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/api/TreeItemData.java
index f36355e..2f9b5a3 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/api/TreeItemData.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/api/TreeItemData.java
@@ -83,7 +83,7 @@
         this.contextValues = contextValues;
         return this;
     }
-
+    
     public String getCommand() {
         return command;
     }
diff --git a/java/java.lsp.server/vscode/package.json b/java/java.lsp.server/vscode/package.json
index b786ba9..d9b93fa 100644
--- a/java/java.lsp.server/vscode/package.json
+++ b/java/java.lsp.server/vscode/package.json
@@ -661,8 +661,79 @@
 					"group": "inline@1"
 				}
 			]
-		}
+		},
+		
+		"netbeans.iconMapping" : [
+			{
+				"uriExpression": "nbres:/org/netbeans/modules/gradle/resources/gradle.png",
+				"codeicon": "project"
+			},
+			{
+				"uriExpression": "nbres:/org/netbeans/modules/gradle/java/resources/javaseProjectIcon.png",
+				"codeicon": "project"
+			},
+			{
+				"uriExpression": "nbres:/org/netbeans/modules/maven/resources/jaricon.png",
+				"codeicon": "project"
+			},
+
+			{
+				"uriExpression": "nbres:/org/netbeans/modules/gradle/resources/libraries.png",
+				"codeicon": "settings-gear"
+			},
+			{
+				"uriExpression": "nbres:/org/netbeans/modules/gradle/resources/(empty.png|module-artifact.png)",
+				"codeicon": "file-zip"
+			},
+			{
+				"uriExpression": "nbres:/org/netbeans/modules/maven/DependencyIcon.png",
+				"codeicon": "file-zip"
+			},
+			{
+				"uriExpression": "nbres:/org/netbeans/modules/maven/TransitiveDependencyIcon.png",
+				"codeicon": "library"
+			},
+			{
+				"uriExpression": "nbres:/org/netbeans/spi/java/project/support/ui/package(Empty)?.gif",
+				"codeicon": "file-submodule"
+			},
+			{
+				"uriExpression": "nbres:/org/netbeans/modules/java/resources/(abstract_class_file|class|enum_file).png",
+				"codeicon": "symbol-class"
+			},
+			{
+				"uriExpression": "nbres:/org/netbeans/modules/java/resources/(annotation_file|interface_file).png",
+				"codeicon": "symbol-interface"
+			},
+			{
+				"uriExpression": "nbres:/org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.(open|closed)Icon",
+				"valueMatch": [ " [0-9]+([A-Z][A-z]+)?SourceRoot | Dependencies[A-Z]+ | OtherRoots | projectfiles | BootCPNode " ],
+				"codeicon": "file-submodule"
+			},
+			{
+				"uriExpression": "nbres:/org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.(open|closed)Icon",
+				"valueMatch": [ " [0-9]+([A-z]+).(java|groovy|generated|resources) " ],
+				"codeicon": "file-submodule"
+			},
+			{
+				"uriExpression": "nbres:/org/netbeans/modules/nbcode/integration/resources/uidefaults/Tree.(open|closed)Icon",
+				"codeicon": "*folder"
+			},
+			{
+				"uriExpression": "nbres:/org/netbeans/modules/java/api/common/project/ui/resources/platform.gif",
+				"codeicon": "vm"
+			}
+		],
+	
+		"jsonValidation": [
+			{
+				"fileMatch": "package.json",
+				"url": "./schemas/package.schema.json"
+			}
+		]
 	},
+
+
 	"scripts": {
 		"vscode:prepublish": "npm run compile",
 		"compile": "tsc -p ./",
diff --git a/java/java.lsp.server/vscode/schemas/package.schema.json b/java/java.lsp.server/vscode/schemas/package.schema.json
new file mode 100644
index 0000000..e328ba4
--- /dev/null
+++ b/java/java.lsp.server/vscode/schemas/package.schema.json
@@ -0,0 +1,42 @@
+{
+    "$schema": "http://json-schema.org/draft-07/schema#",
+    "title": "LSP Image Resource Mapping contributions to package.json",
+    "type": "object",
+    "properties": {
+            "contributes": {
+                    "type": "object",
+                    "properties": {
+                            "netbeans.iconMapping" : {
+                                "type" : "array",
+                                "description" : "Defines replacements for image URIs for vscode-provided product icons",
+                                "items": {
+                                    "type" : "object",
+                                    "properties": {
+                                        "uriExpression" : {
+                                            "type" : "string",
+                                            "description": "Regular expression that must fully match the resource URI"
+                                        },
+                                        "valueMatch" : {
+                                            "type" : "array",
+                                            "description": "Additional value(s) required for the replacement to match.",
+                                            "items": {
+                                                "type" : "string",
+                                                "description": "Regular expression that describes the required value"
+                                            }
+                                        },
+                                        "iconPath" : {
+                                            "type" : "string",
+                                            "description" : "Path to the replacement icon"
+                                        },
+                                        "codeicon" : {
+                                            "type" : "string",
+                                            "description" : "codeicon identifier that will be used instead of the server-provided image"
+                                        }
+                                    }
+                                }
+                            }
+                    }
+            }
+    }
+}
+
diff --git a/java/java.lsp.server/vscode/src/explorer.ts b/java/java.lsp.server/vscode/src/explorer.ts
index f8ab9ec..fd7437c 100644
--- a/java/java.lsp.server/vscode/src/explorer.ts
+++ b/java/java.lsp.server/vscode/src/explorer.ts
@@ -1,23 +1,78 @@
-import { disconnect } from 'process';
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 import * as vscode from 'vscode';
+import { ThemeIcon } from 'vscode';
 import {  LanguageClient } from 'vscode-languageclient/node';
 import { NbLanguageClient } from './extension';
 import { NodeChangedParams, NodeInfoNotification, NodeInfoRequest } from './protocol';
 
 const doLog : boolean = false;
+
+/**
+ * Cached image information.
+ */
+class CachedImage {
+  constructor(
+    /**
+     * Base URI of the image, if available.
+     */
+    public baseUri? : string,
+
+    /**
+     * Icon URI as sent by the LSP server. Images translated to ThemeIcons have this field undefined.
+     */
+    public iconUri? : vscode.Uri,
+
+    /**
+     * Local resource or theme icon.
+     */
+    public icon? : string | ThemeIcon,
+
+    /**
+     * Additional matched values
+     */
+    public values? : string[],
+  ) {}
+}
+
 export class TreeViewService extends vscode.Disposable {  
   
   private handler : vscode.Disposable | undefined;
   private client : NbLanguageClient;
   private trees : Map<string, vscode.TreeView<Visualizer>> = new Map();
-  private images : Map<number, vscode.Uri> = new Map();
+  private images : Map<number, CachedImage> = new Map();
   private providers : Map<number, VisualizerProvider> = new Map();
   log : vscode.OutputChannel;
-  
-  constructor (log : vscode.OutputChannel, c : NbLanguageClient, disposeFunc : () => void) {
-    super(() => { this.disposeAllViews(); disposeFunc(); });
+  private entries : ImageEntry[] = [];
+
+  constructor (log : vscode.OutputChannel, c : NbLanguageClient, dd : vscode.Disposable[]) {
+    super(() => { 
+      this.disposeAllViews(); 
+      for (const d of dd) {
+        d?.dispose();
+      }
+    });
     this.log = log;
     this.client = c;
+
+    this.refreshImages();
+    dd.push(vscode.extensions.onDidChange(() => this.refreshImages()));
   }
 
   getClient() : NbLanguageClient {
@@ -73,14 +128,99 @@
     }
   }
 
-  imageUri(nodeData : NodeInfoRequest.Data) : vscode.Uri | undefined {
-    if (nodeData.iconUri) {
-      const uri : vscode.Uri = vscode.Uri.parse(nodeData.iconUri)
-      this.images.set(nodeData.iconIndex, uri);
-      return uri;
-    } else {
-      return this.images.get(nodeData.iconIndex);
+  imageUri(nodeData : NodeInfoRequest.Data) : vscode.Uri | string | ThemeIcon | undefined {
+    let ci : CachedImage | undefined;
+    if (nodeData.iconIndex) {
+      ci = this.images.get(nodeData.iconIndex);
+      if (ci && ci.baseUri) {
+        // hack because of bad protocol: will be fixed when client actively asks for icon data and server will not cache icons.
+        const r = this.findProductIcon(ci.baseUri, nodeData.name, nodeData.contextValue);
+        if (r) {
+          return r;
+        }
+      }
     }
+
+    if (!ci) {
+      if (nodeData.iconDescriptor?.baseUri) {
+        const r = this.findProductIcon(nodeData.iconDescriptor.baseUri, nodeData.name, nodeData.contextValue);
+        // override the icon with local.
+        if (r) {
+          ci = new CachedImage(nodeData.iconDescriptor.baseUri, undefined, r, [ nodeData.name, nodeData.contextValue ]);
+          this.images.set(nodeData.iconIndex, ci);
+        }
+      }
+      if (!ci) {
+        // hardcode visual vscode's File icons for regular files:
+        if (nodeData.resourceUri && nodeData.contextValue.includes('is:file')) {
+          const uri : vscode.Uri | undefined  = nodeData.iconUri ? vscode.Uri.parse(nodeData.iconUri) : undefined;
+          // do not cache
+          return ThemeIcon.File;
+        }
+      }
+      if (!ci && nodeData.iconUri) {
+          const uri : vscode.Uri = vscode.Uri.parse(nodeData.iconUri);
+          ci = new CachedImage(nodeData?.iconDescriptor?.baseUri, uri, undefined);
+          this.images.set(nodeData.iconIndex, ci);
+      }
+    }
+    return ci?.icon ? ci.icon : ci?.iconUri;
+  }
+
+  public setTranslations(entries : ImageEntry[]) {
+    this.entries = entries;
+  }
+
+  public findProductIcon(res : string, ...values: string[]) : string | ThemeIcon | undefined {
+  outer: for (let e of this.entries) {
+      if (e.uriRegexp.exec(res)) {
+        if (e.valueRegexps) {
+          let s : string = " " + values.join(" ") + " ";
+          for (let vr of e.valueRegexps) {
+            if (!vr.exec(s)) {
+              continue outer;
+            }
+          }
+        }
+        if (e.codeicon === '*file') {
+          return ThemeIcon.File;
+        } else if (e.codeicon == '*folder') {
+          return ThemeIcon.Folder;
+        } else if (e.iconPath) {
+          return e.iconPath;
+        }
+        return new ThemeIcon(e.codeicon);
+      }
+    }
+    return undefined;
+  }
+
+  public refreshImages() {
+    let newEntries : ImageEntry[] = [];
+    for (const ext of vscode.extensions.all) {
+      const iconMapping = ext.packageJSON?.contributes && ext.packageJSON?.contributes['netbeans.iconMapping'];
+      if (Array.isArray(iconMapping)) {
+        for (const m of iconMapping) {
+          const reString = m?.uriExpression;
+          if (reString) {
+            try {
+              let re : RegExp = new RegExp(reString);
+              let vals = [];
+              if (m?.valueMatch) {
+                for (const vm of m.valueMatch) {
+                  const re = new RegExp(vm);
+                  vals.push(re);
+                }
+              }
+              newEntries.push(new ImageEntry(re, m?.codeicon, m?.iconPath, vals));
+            } catch (e) {
+              console.log("Invalid icon mapping in extension %s: %s -> %s", ext.id, reString, m?.codicon);
+            }
+          }
+        }
+      }
+    }
+    this.setTranslations(newEntries);
   }
 }
 
@@ -369,7 +509,7 @@
   pendingChange : boolean = false;
   constructor(
     public data : NodeInfoRequest.Data,
-    public image : vscode.Uri | undefined
+    public image : vscode.Uri | string | ThemeIcon | undefined
   ) {
     super(data.label, data.collapsibleState);
     this.visId = visualizerSerial++;
@@ -449,6 +589,31 @@
   }
 }
 
+class ImageEntry {
+  constructor(
+    readonly uriRegexp : RegExp,
+    readonly codeicon : string,
+    readonly iconPath? : string,
+    readonly valueRegexps? : RegExp[]
+    ) {}
+}
+class ImageTranslator {
+  private entries : ImageEntry[] = [];
+
+  public setTranslations(entries : ImageEntry[]) {
+    this.entries = entries;
+  }
+
+  public findProductIcon(res : string) : string | undefined {
+    for (let e of this.entries) {
+      if (e.uriRegexp.exec(res)) {
+        return e.codeicon;
+      }
+    }
+    return undefined;
+  }
+}
+
 export async function createViewProvider(c : NbLanguageClient, id : string) : Promise<VisualizerProvider> {
   const ts = c.findTreeViewService();
   const client = ts.getClient();
@@ -487,9 +652,7 @@
             vscode.window.showErrorMessage('Cannot delete node ' + v.label);
         }
     });
-    const ts : TreeViewService = new TreeViewService(log, c, () => {
-      d.dispose()
-    });
+    const ts : TreeViewService = new TreeViewService(log, c, [ d ]);
     return ts;
 }
 
diff --git a/java/java.lsp.server/vscode/src/protocol.ts b/java/java.lsp.server/vscode/src/protocol.ts
index a2ab4ed..ab259fb 100644
--- a/java/java.lsp.server/vscode/src/protocol.ts
+++ b/java/java.lsp.server/vscode/src/protocol.ts
@@ -172,6 +172,9 @@
     export const destroy = new ProtocolRequestType<NodeOperationParams, boolean, never, void, void>('nodes/delete');
     export const collapsed = new ProtocolNotificationType<NodeOperationParams, void>('nodes/collapsed');
     
+    export interface IconDescriptor {
+        baseUri : string;
+    }
     export interface Data {
         id : number; /* numeric ID of the node */
         name : string; /* Node.getName() */
@@ -182,6 +185,7 @@
         collapsibleState : vscode.TreeItemCollapsibleState;
         canDestroy : boolean; /* Node.canDestroy() */
         contextValue : string; /* Node.getCookies() */
+        iconDescriptor? : IconDescriptor;
         iconUri : string | null;
         iconIndex : number;
         command? : string;
diff --git a/java/maven.hints/src/org/netbeans/modules/maven/hints/ui/customizers/SearchDependencyCustomizer.form b/java/maven.hints/src/org/netbeans/modules/maven/hints/ui/customizers/SearchDependencyCustomizer.form
index e23179f..356fead 100644
--- a/java/maven.hints/src/org/netbeans/modules/maven/hints/ui/customizers/SearchDependencyCustomizer.form
+++ b/java/maven.hints/src/org/netbeans/modules/maven/hints/ui/customizers/SearchDependencyCustomizer.form
@@ -1,4 +1,4 @@
-<?xml version="1.1" encoding="UTF-8" ?>
+<?xml version="1.0" encoding="UTF-8" ?>
 
 <!--
 
@@ -47,14 +47,13 @@
           <Group type="102" alignment="0" attributes="0">
               <EmptySpace max="-2" attributes="0"/>
               <Group type="103" groupAlignment="0" attributes="0">
-                  <Component id="lblHeader" alignment="0" pref="432" max="32767" attributes="0"/>
-                  <Group type="102" alignment="0" attributes="0">
-                      <EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
-                      <Component id="jrOptionInplace" pref="422" max="32767" attributes="0"/>
-                  </Group>
-                  <Group type="102" alignment="0" attributes="0">
-                      <EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
-                      <Component id="jrOptionDialog" pref="422" max="32767" attributes="0"/>
+                  <Component id="lblHeader" alignment="0" max="32767" attributes="0"/>
+                  <Group type="102" attributes="0">
+                      <EmptySpace min="10" pref="10" max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Component id="jrOptionInplace" alignment="0" max="32767" attributes="0"/>
+                          <Component id="jrOptionDialog" alignment="0" max="32767" attributes="0"/>
+                      </Group>
                   </Group>
               </Group>
               <EmptySpace max="-2" attributes="0"/>
@@ -70,7 +69,7 @@
               <Component id="jrOptionDialog" min="-2" max="-2" attributes="0"/>
               <EmptySpace type="unrelated" max="-2" attributes="0"/>
               <Component id="jrOptionInplace" min="-2" max="-2" attributes="0"/>
-              <EmptySpace pref="219" max="32767" attributes="0"/>
+              <EmptySpace max="32767" attributes="0"/>
           </Group>
       </Group>
     </DimensionLayout>
@@ -91,7 +90,6 @@
         <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
           <ResourceString bundle="org/netbeans/modules/maven/hints/ui/customizers/Bundle.properties" key="LBL_Option_Dialog" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
-        <Property name="opaque" type="boolean" value="false"/>
       </Properties>
       <Events>
         <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jrOptionDialogActionPerformed"/>
@@ -105,7 +103,6 @@
         <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
           <ResourceString bundle="org/netbeans/modules/maven/hints/ui/customizers/Bundle.properties" key="LBL_Option_InPlace" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
-        <Property name="opaque" type="boolean" value="false"/>
       </Properties>
       <Events>
         <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jrOptionInplaceActionPerformed"/>
diff --git a/java/maven.hints/src/org/netbeans/modules/maven/hints/ui/customizers/SearchDependencyCustomizer.java b/java/maven.hints/src/org/netbeans/modules/maven/hints/ui/customizers/SearchDependencyCustomizer.java
index ca9b89e..90a249d 100644
--- a/java/maven.hints/src/org/netbeans/modules/maven/hints/ui/customizers/SearchDependencyCustomizer.java
+++ b/java/maven.hints/src/org/netbeans/modules/maven/hints/ui/customizers/SearchDependencyCustomizer.java
@@ -65,7 +65,6 @@
 
         buttonGroup1.add(jrOptionDialog);
         jrOptionDialog.setText(org.openide.util.NbBundle.getMessage(SearchDependencyCustomizer.class, "LBL_Option_Dialog")); // NOI18N
-        jrOptionDialog.setOpaque(false);
         jrOptionDialog.addActionListener(new java.awt.event.ActionListener() {
             public void actionPerformed(java.awt.event.ActionEvent evt) {
                 jrOptionDialogActionPerformed(evt);
@@ -74,7 +73,6 @@
 
         buttonGroup1.add(jrOptionInplace);
         jrOptionInplace.setText(org.openide.util.NbBundle.getMessage(SearchDependencyCustomizer.class, "LBL_Option_InPlace")); // NOI18N
-        jrOptionInplace.setOpaque(false);
         jrOptionInplace.addActionListener(new java.awt.event.ActionListener() {
             public void actionPerformed(java.awt.event.ActionEvent evt) {
                 jrOptionInplaceActionPerformed(evt);
@@ -88,13 +86,12 @@
             .addGroup(layout.createSequentialGroup()
                 .addContainerGap()
                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                    .addComponent(lblHeader, javax.swing.GroupLayout.DEFAULT_SIZE, 432, Short.MAX_VALUE)
+                    .addComponent(lblHeader)
                     .addGroup(layout.createSequentialGroup()
                         .addGap(10, 10, 10)
-                        .addComponent(jrOptionInplace, javax.swing.GroupLayout.DEFAULT_SIZE, 422, Short.MAX_VALUE))
-                    .addGroup(layout.createSequentialGroup()
-                        .addGap(10, 10, 10)
-                        .addComponent(jrOptionDialog, javax.swing.GroupLayout.DEFAULT_SIZE, 422, Short.MAX_VALUE)))
+                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addComponent(jrOptionInplace, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                            .addComponent(jrOptionDialog, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                 .addContainerGap())
         );
         layout.setVerticalGroup(
@@ -106,7 +103,7 @@
                 .addComponent(jrOptionDialog)
                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                 .addComponent(jrOptionInplace)
-                .addContainerGap(219, Short.MAX_VALUE))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
     }// </editor-fold>//GEN-END:initComponents
 
diff --git a/platform/openide.util.ui/apichanges.xml b/platform/openide.util.ui/apichanges.xml
index 7505b6e..d2fcd96 100644
--- a/platform/openide.util.ui/apichanges.xml
+++ b/platform/openide.util.ui/apichanges.xml
@@ -27,6 +27,20 @@
     <apidef name="actions">Actions API</apidef>
 </apidefs>
 <changes>
+    <change id="propertyURL">
+      <api name="util"/>
+      <summary>Declaration of long-used URL image property</summary>  
+      <version major="9" minor="24"/>
+      <date year="2021" month="1" day="15"/>
+      <author login="sdedic"/>
+      <compatibility addition="yes" binary="compatible" source="compatible" semantic="compatible"/>
+      <description>
+          The property <code>url</code> is documented in Javadoc <b>since 8.12</b> but the key string was not
+          added to the API. <a href="@TOP@/org/openide/util/ImageUtilities.html#PROPERTY_URL">It is now</a>, along with a 
+          <a href="@TOP@/org/openide/util/ImageUtilities.html#findImageBaseURL-java.awt.Image-">convenience method</a>, which should be used in preference.
+      </description>
+      <class package="org.openide.util" name="ImageUtilities"/>
+    </change>
     <change id="SVGLoader">
       <api name="util"/>
       <summary>Support loading of SVG icons for scalable rendering on HiDPI displays.</summary>
diff --git a/platform/openide.util.ui/arch.xml b/platform/openide.util.ui/arch.xml
index e23627c..dc9e95d 100644
--- a/platform/openide.util.ui/arch.xml
+++ b/platform/openide.util.ui/arch.xml
@@ -298,6 +298,13 @@
 
 
  <answer id="exec-property">
+     <ul>
+         <li>
+             <api type="export" group="property" name="url" category="private">Images loaded by <a href="@TOP@/org/openide/util/ImageUtilities.html#loadImage__">ImageUtilities.loadImage</a>
+             defines <code>"url"</code> image property for the loaded image.
+             </api>
+         </li>
+    </ul>
 <!--  <ul>
     <li><api type="export" group="systemproperty" name="netbeans.screen.insets" category="private">
     Influences results of Utilities.getUsableScreenBounds</api>.</li>
diff --git a/platform/openide.util.ui/manifest.mf b/platform/openide.util.ui/manifest.mf
index a6e8ba7..441596a 100644
--- a/platform/openide.util.ui/manifest.mf
+++ b/platform/openide.util.ui/manifest.mf
@@ -1,5 +1,5 @@
 Manifest-Version: 1.0
 OpenIDE-Module: org.openide.util.ui
 OpenIDE-Module-Localizing-Bundle: org/openide/util/Bundle.properties
-OpenIDE-Module-Specification-Version: 9.23
+OpenIDE-Module-Specification-Version: 9.24
 
diff --git a/platform/openide.util.ui/src/org/openide/util/ImageUtilities.java b/platform/openide.util.ui/src/org/openide/util/ImageUtilities.java
index d9d613c..083919e 100644
--- a/platform/openide.util.ui/src/org/openide/util/ImageUtilities.java
+++ b/platform/openide.util.ui/src/org/openide/util/ImageUtilities.java
@@ -58,6 +58,7 @@
 import javax.imageio.stream.ImageInputStream;
 import javax.swing.Icon;
 import javax.swing.ImageIcon;
+import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.SwingUtilities;
 import javax.swing.UIManager;
@@ -78,6 +79,12 @@
  */
 public final class ImageUtilities {
 
+    /**
+     * Property that holds URL of the image bits.
+     * @since 9.24
+     */
+    public static final String PROPERTY_URL = "url"; // NOI18N
+    
     private static final Logger LOGGER = Logger.getLogger(ImageUtilities.class.getName());
 
     /** separator for individual parts of tool tip text */
@@ -117,18 +124,27 @@
      * {@link Icon#paintIcon(Component, Graphics, int, int)} when converting an {@code Icon} to an
      * {@code Image}. See comment in {@link #icon2ToolTipImage(Icon, URL)}.
      */
-    private static volatile Component dummyIconComponent;
+    private static volatile Component dummyIconComponentLabel;
+
+    /**
+     * Second dummy component. Some {@link Icon#paintIcon(java.awt.Component, java.awt.Graphics, int, int)} are very picky and downcast the
+     * Component to a specific subclass. JCheckBox will satisfy checkboxes, abstract buttons etc. Will not eliminate all cases, but helps.
+     * 
+     */
+    private static volatile Component dummyIconComponentButton;
 
     static {
         /* Could have used Mutex.EVENT.writeAccess here, but it doesn't seem to be available during
         testing. */
         if (EventQueue.isDispatchThread()) {
-            dummyIconComponent = new JLabel();
+            dummyIconComponentLabel = new JLabel();
+            dummyIconComponentButton = new JCheckBox();
         } else {
             SwingUtilities.invokeLater(new Runnable() {
                 @Override
                 public void run() {
-                    dummyIconComponent = new JLabel();
+                    dummyIconComponentLabel = new JLabel();
+                    dummyIconComponentButton = new JCheckBox();
                 }
             });
         }
@@ -175,8 +191,9 @@
      * 
      * <p>Caching of loaded images can be used internally to improve performance.
      * <p> Since version 8.12 the returned image object responds to call
-     * <code>image.getProperty("url", null)</code> by returning the internal
-     * {@link URL} of the found and loaded <code>resource</code>.
+     * <code>image.getProperty({@link #PROPERTY_URL}, null)</code> by returning the internal
+     * {@link URL} of the found and loaded <code>resource</code>. Convenience method {@link #findImageBaseURL}
+     * should be used in preference to direct property access.
      * 
      * <p>If the current look and feel is 'dark' (<code>UIManager.getBoolean("nb.dark.theme")</code>)
      * then the method first attempts to load image <i>&lt;original file name&gt;<b>_dark</b>.&lt;original extension&gt;</i>.
@@ -352,7 +369,14 @@
         should really only be called on the Event Dispatch Thread. Constructing the component once
         on the EDT fixed the problem. Read-only operations from non-EDT threads shouldn't really be
         a problem; most Icon implementations won't ever access the component parameter anyway. */
-        icon.paintIcon(dummyIconComponent, g, 0, 0);
+        try {
+            icon.paintIcon(dummyIconComponentLabel, g, 0, 0);
+        } catch (ClassCastException ex) {
+            // java.desktop/javax.swing.plaf.metal.OceanTheme$IFIcon.paintIcon assumes a different component,
+            // so let's try second most used one type, it satisfies AbstractButton, JCheckbox. Not all cases are
+            // covered, however.
+            icon.paintIcon(dummyIconComponentButton, g, 0, 0);
+        }
         g.dispose();
         return image;
     }
@@ -447,7 +471,22 @@
         // Go through FilteredIcon to preserve scalable icons.
         return icon2Image(createDisabledIcon(image2Icon(image)));
     }
-
+    
+    /**
+     * Attempts to find image's URL, if it is defined. Image Observer features
+     * are not used during this call, the property is assumed to be populated. Note that
+     * the URL may be specific for a localization or branding, and may be the same for
+     * bare and badged icons.
+     * 
+     * @param image image to inspect
+     * @return image's URL or {@code null} if not defined.
+     * @since 9.24
+     */
+    public static URL findImageBaseURL(Image image) {
+      Object o = image.getProperty(PROPERTY_URL, null);
+      return o instanceof URL ? (URL)o : null;
+    }
+    
     /**
      * Get an SVG icon loader, if the appropriate service provider module is installed. To ensure
      * lazy loading of the SVG loader module, this method should only be called when there actually
@@ -824,7 +863,7 @@
             }
             str.append(toolTip);
         }
-        Object firstUrl = image1.getProperty("url", null);
+        Object firstUrl = image1.getProperty(PROPERTY_URL, null);
         
         ColorModel model = colorModel(bitmask? Transparency.BITMASK: Transparency.TRANSLUCENT);
         // Provide a delegate Icon for scalable rendering.
@@ -1067,11 +1106,11 @@
             int w = Math.max(1, image.getWidth(null));
             int h = Math.max(1, image.getHeight(null));
             if (url == null) {
-                Object value = image.getProperty("url", null);
+                Object value = image.getProperty(PROPERTY_URL, null);
                 url = (value instanceof URL) ? (URL) value : null;
-            }            
+            }
             Icon icon = (image instanceof ToolTipImage)
-                    ? ((ToolTipImage) image).getDelegateIcon() : null;
+                   ? ((ToolTipImage) image).getDelegateIcon() : null;
             ToolTipImage newImage = new ToolTipImage(
                 toolTipText,
                 icon,
@@ -1178,7 +1217,7 @@
 
         @Override
         public Object getProperty(String name, ImageObserver observer) {
-            if ("url".equals(name)) { // NOI18N
+            if (PROPERTY_URL.equals(name)) { // NOI18N
                 /* In some cases it might strictly be more appropriate to return
                 Image.UndefinedProperty rather than null (see Javadoc spec for this method), but
                 retain the existing behavior and use null instead here. That way there won't be a
@@ -1192,7 +1231,7 @@
                     if (image == this || image == null) {
                         return null;
                     }
-                    return image.getProperty("url", observer);
+                    return image.getProperty(name, observer);
                 }
             }
             return super.getProperty(name, observer);