diff --git a/unpacked/jax/output/CommonHTML/jax.js b/unpacked/jax/output/CommonHTML/jax.js
index a55922430..e00b8a6b0 100644
--- a/unpacked/jax/output/CommonHTML/jax.js
+++ b/unpacked/jax/output/CommonHTML/jax.js
@@ -334,21 +334,32 @@
     ucMatch: HTML.ucMatch,
     setScript: HTML.setScript,
     
-    //
-    //  This replaces node.getElementsByTagName(type)[0]
-    //  and should be replaced by that if we go back to using
-    //  custom tags
-    //
-    getNode: (document.getElementsByClassName ? 
-      function (node,type) {return node.getElementsByClassName(type)[0]} :
+    getNodesByClass: (document.getElementsByClassName ? 
+      function (node,type) {return node.getElementsByClassName(type)} :
       function (node,type) {
+        var NODES = [];
         var nodes = node.getElementsByTagName("span");
         var name = RegExp("\\b"+type+"\\b");
         for (var i = 0, m = nodes.length; i < m; i++) {
-          if (name.test(nodes[i].className)) return nodes[i];
+          if (name.test(nodes[i].className)) NODES.push = nodes[i];
         }
       }
     ),
+    getNode: function (node,type) {
+      var nodes = this.getNodesByClass(node,type);
+      if (nodes.length === 1) return nodes[0];
+      var closest = nodes[0], N = this.getNodeDepth(node,closest);
+      for (var i = 1, m = nodes.length; i < m; i++) {
+        var n = this.getNodeDepth(node,nodes[i]);
+        if (n < N) {closest = nodes[i]; N = n}
+      }
+      return closest;
+    },
+    getNodeDepth: function (parent,node) {
+      var n = 0;
+      while (node && node !== parent) {node = node.parentNode; n++}
+      return n;
+    },
     
 
     /********************************************/
@@ -2070,9 +2081,9 @@
         //
         var under, over, nodes = [];
         if (stretch) {
-          base = CHTML.getNode(node,"mjx-op");
-          under = CHTML.getNode(node,"mjx-under");
-          over = CHTML.getNode(node,"mjx-over");
+          if (this.data[this.base])  base = CHTML.getNode(node,"mjx-op");
+          if (this.data[this.under]) under = CHTML.getNode(node,"mjx-under");
+          if (this.data[this.over])  over = CHTML.getNode(node,"mjx-over");
           nodes[0] = base; nodes[1] = under||over; nodes[2] = over;
         } else {
           var types = ["mjx-op","mjx-under","mjx-over"];
@@ -2256,7 +2267,12 @@
         this.CHTML = BBOX;
       },
       CHTMLstretchV: MML.mbase.CHTMLstretchV,
-      CHTMLstretchH: MML.mbase.CHTMLstretchH
+      CHTMLstretchH: MML.mbase.CHTMLstretchH,
+      CHTMLchildNode: function (node,i) {
+        var types = ["mjx-op","mjx-under","mjx-over"];
+        if (this.over === 1) types[1] = types[2];
+        return CHTML.getNode(node,types[i]);
+      }
     });
 
     /********************************************************/
@@ -2271,9 +2287,9 @@
         //
         var base, sub, sup;
         if (stretch) {
-          base = CHTML.getNode(node,"mjx-base");
-          sub = CHTML.getNode(node,"mjx-sub");
-          sup = CHTML.getNode(node,"mjx-sup");
+          if (this.data[this.base]) base = CHTML.getNode(node,"mjx-base");
+          if (this.data[this.sub])  sub = CHTML.getNode(node,"mjx-sub");
+          if (this.data[this.sup])  sup = CHTML.getNode(node,"mjx-sup");
           stack = CHTML.getNode(node,"mjx-stack");
         } else {
           var types = ["mjx-base","mjx-sub","mjx-sup"];
@@ -2362,7 +2378,12 @@
         return node;
       },
       CHTMLstretchV: MML.mbase.CHTMLstretchV,
-      CHTMLstretchH: MML.mbase.CHTMLstretchH
+      CHTMLstretchH: MML.mbase.CHTMLstretchH,
+      CHTMLchildNode: function (node,i) {
+        var types = ["mjx-base","mjx-sub","mjx-sup"];
+        if (this.over === 1) types[1] = types[2];
+        return CHTML.getNode(node,types[i]);
+      }
     });
 
     /********************************************************/