SOLR-10035 Admin UI cannot find dataimport handlers.
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 50b8aee..9408c6d 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -29,6 +29,13 @@
 Apache ZooKeeper 3.4.6
 Jetty 9.3.14.v20161028
 
+Upgrade Notes
+----------------------
+* SOLR-10035: Category names of some SolrInfoMBeans have been changed in release 6.4.0. This issue
+  changes the /admin/mbeans handler to return these beans both under the new and the old back-compatible
+  names. Old names are deprecated and will be eventually removed in Solr 7.0. They can be also removed via
+  system property "-Dsolr.mbeans.useOnlyNewNaming=true". (ab, Shawn Heisey, Jan Høydahl)
+
 Bug Fixes
 ----------------------
 * SOLR-9969: "Plugin/Stats" section of the UI doesn't display empty metric types (Tomás Fernández Löbbe)
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java
index f5f28c5..297cdbf 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java
@@ -33,6 +33,7 @@
 import java.net.URL;
 import java.text.NumberFormat;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
@@ -46,6 +47,21 @@
 @SuppressWarnings("unchecked")
 public class SolrInfoMBeanHandler extends RequestHandlerBase {
 
+  // back-compat names, only needed in 6.x - see SOLR-10035
+  static final Map<String, String> newToOldCategories = new HashMap<String, String>() {{
+    put(Category.QUERY.toString(), "QUERYHANDLER");
+    put(Category.UPDATE.toString(), "UPDATEHANDLER");
+    put(Category.HIGHLIGHTER.toString(), "HIGHLIGHTING");
+  }};
+  static final Map<String, String> oldToNewCategories = new HashMap<String, String>() {{
+    put("QUERYHANDLER", Category.QUERY.toString());
+    put("UPDATEHANDLER", Category.UPDATE.toString());
+    put("HIGHLIGHTING", Category.HIGHLIGHTER.toString());
+  }};
+
+  static final boolean useOnlyNewNaming = Boolean.valueOf(System.getProperty("solr.mbeans.useOnlyNewNaming", "false"));
+
+
   /**
    * Take an array of any type and generate a Set containing the toString.
    * Set is guarantee to never be null (but may be empty)
@@ -120,9 +136,22 @@
       for (SolrInfoMBean.Category cat : SolrInfoMBean.Category.values()) {
         cats.add(cat.name(), new SimpleOrderedMap<NamedList<Object>>());
       }
+      if (!useOnlyNewNaming) {
+        for (String oldName : newToOldCategories.values()) {
+          cats.add(oldName, new SimpleOrderedMap<NamedList<Object>>());
+        }
+      }
     } else {
       for (String catName : requestedCats) {
         cats.add(catName,new SimpleOrderedMap<NamedList<Object>>());
+        if (!useOnlyNewNaming) {
+          if (newToOldCategories.containsKey(catName)) {
+            cats.add(newToOldCategories.get(catName), new SimpleOrderedMap<NamedList<Object>>());
+          }
+          if (oldToNewCategories.containsKey(catName)) {
+            cats.add(oldToNewCategories.get(catName), new SimpleOrderedMap<NamedList<Object>>());
+          }
+        }
       }
     }
          
@@ -130,18 +159,28 @@
     
     Map<String, SolrInfoMBean> reg = req.getCore().getInfoRegistry();
     for (Map.Entry<String, SolrInfoMBean> entry : reg.entrySet()) {
-      addMBean(req, cats, requestedKeys, entry.getKey(),entry.getValue());
+      String cat = entry.getValue().getCategory().name();
+      addMBean(req, cat, cats, requestedKeys, entry.getKey(),entry.getValue());
+      // add it also under back-compat name
+      if (!useOnlyNewNaming && newToOldCategories.containsKey(cat)) {
+        addMBean(req, newToOldCategories.get(cat), cats, requestedKeys, entry.getKey(),entry.getValue());
+      }
     }
 
     for (SolrInfoMBean infoMBean : req.getCore().getCoreDescriptor().getCoreContainer().getResourceLoader().getInfoMBeans()) {
-      addMBean(req,cats,requestedKeys,infoMBean.getName(),infoMBean);
+      String cat = infoMBean.getCategory().name();
+      addMBean(req,cat, cats,requestedKeys,infoMBean.getName(),infoMBean);
+      // add it also under back-compat name
+      if (!useOnlyNewNaming && newToOldCategories.containsKey(cat)) {
+        addMBean(req, newToOldCategories.get(cat), cats, requestedKeys, infoMBean.getName(), infoMBean);
+      }
     }
     return cats;
   }
 
-  private void addMBean(SolrQueryRequest req, NamedList<NamedList<NamedList<Object>>> cats, Set<String> requestedKeys, String key, SolrInfoMBean m) {
+  private void addMBean(SolrQueryRequest req, String categoryName, NamedList<NamedList<NamedList<Object>>> cats, Set<String> requestedKeys, String key, SolrInfoMBean m) {
     if ( ! ( requestedKeys.isEmpty() || requestedKeys.contains(key) ) ) return;
-    NamedList<NamedList<Object>> catInfo = cats.get(m.getCategory().name());
+    NamedList<NamedList<Object>> catInfo = cats.get(categoryName);
     if ( null == catInfo ) return;
     NamedList<Object> mBeanInfo = new SimpleOrderedMap<>();
     mBeanInfo.add("class", m.getName());
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java
index 21634b7..a5e0a6c 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java
@@ -25,6 +25,7 @@
 import org.apache.solr.common.util.ContentStreamBase;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.request.LocalSolrQueryRequest;
+import org.apache.solr.request.SolrQueryRequest;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -84,4 +85,38 @@
 
     assertTrue("external entity ignored properly", true);
   }
+
+  @Test
+  public void testBackCompatNames() throws Exception {
+    SolrQueryRequest req = req(
+        CommonParams.QT,"/admin/mbeans",
+        CommonParams.WT,"xml"
+    );
+    h.validateQuery(req,
+        "boolean(//lst[@name='QUERY'])",
+        "boolean(//lst[@name='QUERYHANDLER'])",
+        "boolean(//lst[@name='UPDATE'])",
+        "boolean(//lst[@name='UPDATEHANDLER'])",
+        "boolean(//lst[@name='HIGHLIGHTING'])",
+        "boolean(//lst[@name='HIGHLIGHTER'])"
+    );
+    req = req(
+        CommonParams.QT,"/admin/mbeans",
+        CommonParams.WT,"xml",
+        "cat", "QUERYHANDLER"
+    );
+    h.validateQuery(req,
+        "boolean(//lst[@name='QUERY'])",
+        "boolean(//lst[@name='QUERYHANDLER'])"
+    );
+    req = req(
+        CommonParams.QT,"/admin/mbeans",
+        CommonParams.WT,"xml",
+        "cat", "UPDATE"
+    );
+    h.validateQuery(req,
+        "boolean(//lst[@name='UPDATE'])",
+        "boolean(//lst[@name='UPDATEHANDLER'])"
+    );
+  }
 }
diff --git a/solr/webapp/web/css/angular/plugins.css b/solr/webapp/web/css/angular/plugins.css
index 0310e0e..eb524c4 100644
--- a/solr/webapp/web/css/angular/plugins.css
+++ b/solr/webapp/web/css/angular/plugins.css
@@ -25,9 +25,12 @@
 #content #plugins #navigation .cache a { background-image: url( ../../img/ico/disk-black.png ); }
 #content #plugins #navigation .core a { background-image: url( ../../img/ico/wooden-box.png ); }
 #content #plugins #navigation .other a { background-image: url( ../../img/ico/zone.png ); }
-#content #plugins #navigation .highlighting a { background-image: url( ../../img/ico/highlighter-text.png ); }
-#content #plugins #navigation .updatehandler a{ background-image: url( ../../img/ico/arrow-circle.png ); }
-#content #plugins #navigation .queryhandler a { background-image: url( ../../img/ico/magnifier.png ); }
+#content #plugins #navigation .highlighting a { text-decoration: line-through; background-image: url( ../../img/ico/highlighter-text.png ); }
+#content #plugins #navigation .highlighter a { background-image: url( ../../img/ico/highlighter-text.png ); }
+#content #plugins #navigation .updatehandler a{ text-decoration: line-through; background-image: url( ../../img/ico/arrow-circle.png ); }
+#content #plugins #navigation .update a{ background-image: url( ../../img/ico/arrow-circle.png ); }
+#content #plugins #navigation .queryhandler a { text-decoration: line-through; background-image: url( ../../img/ico/magnifier.png ); }
+#content #plugins #navigation .query a { background-image: url( ../../img/ico/magnifier.png ); }
 #content #plugins #navigation .queryparser a { background-image: url( ../../img/ico/asterisk.png ); }
 
 #content #plugins #navigation .PLUGINCHANGES { margin-top: 20px; }
diff --git a/solr/webapp/web/css/styles/plugins.css b/solr/webapp/web/css/styles/plugins.css
index f8ea769..290bdff 100644
--- a/solr/webapp/web/css/styles/plugins.css
+++ b/solr/webapp/web/css/styles/plugins.css
@@ -25,9 +25,12 @@
 #content #plugins #navigation .cache a { background-image: url( ../../img/ico/disk-black.png ); }
 #content #plugins #navigation .core a { background-image: url( ../../img/ico/wooden-box.png ); }
 #content #plugins #navigation .other a { background-image: url( ../../img/ico/zone.png ); }
-#content #plugins #navigation .highlighting a { background-image: url( ../../img/ico/highlighter-text.png ); }
-#content #plugins #navigation .updatehandler a{ background-image: url( ../../img/ico/arrow-circle.png ); }
-#content #plugins #navigation .queryhandler a { background-image: url( ../../img/ico/magnifier.png ); }
+#content #plugins #navigation .highlighting a { text-decoration: line-through; background-image: url( ../../img/ico/highlighter-text.png ); }
+#content #plugins #navigation .highlighter a { background-image: url( ../../img/ico/highlighter-text.png ); }
+#content #plugins #navigation .updatehandler a{ text-decoration: line-through; background-image: url( ../../img/ico/arrow-circle.png ); }
+#content #plugins #navigation .update a{ background-image: url( ../../img/ico/arrow-circle.png ); }
+#content #plugins #navigation .queryhandler a { text-decoration: line-through; background-image: url( ../../img/ico/magnifier.png ); }
+#content #plugins #navigation .query a { background-image: url( ../../img/ico/magnifier.png ); }
 #content #plugins #navigation .queryparser a { background-image: url( ../../img/ico/asterisk.png ); }
 
 #content #plugins #navigation .PLUGINCHANGES { margin-top: 20px; }
diff --git a/solr/webapp/web/js/angular/controllers/dataimport.js b/solr/webapp/web/js/angular/controllers/dataimport.js
index d8fbc4f..3a26324 100644
--- a/solr/webapp/web/js/angular/controllers/dataimport.js
+++ b/solr/webapp/web/js/angular/controllers/dataimport.js
@@ -22,7 +22,7 @@
         $scope.resetMenu("dataimport", Constants.IS_COLLECTION_PAGE);
 
         $scope.refresh = function () {
-            Mbeans.info({core: $routeParams.core, cat: 'QUERYHANDLER'}, function (data) {
+            Mbeans.info({core: $routeParams.core, cat: 'QUERY'}, function (data) {
                 var mbeans = data['solr-mbeans'][1];
                 $scope.handlers = [];
                 for (var key in mbeans) {
diff --git a/solr/webapp/web/js/scripts/dataimport.js b/solr/webapp/web/js/scripts/dataimport.js
index ef2b896..20532c6 100644
--- a/solr/webapp/web/js/scripts/dataimport.js
+++ b/solr/webapp/web/js/scripts/dataimport.js
@@ -28,7 +28,7 @@
     $.ajax
     (
       {
-        url : core_basepath + '/admin/mbeans?cat=QUERYHANDLER&wt=json',
+        url : core_basepath + '/admin/mbeans?cat=QUERY&wt=json',
         dataType : 'json',
         beforeSend : function( xhr, settings )
         {