diff -r 3464c423ac10 doc/interpreter/genpropdoc.m
--- a/doc/interpreter/genpropdoc.m	Fri Jul 13 15:53:29 2018 -0400
+++ b/doc/interpreter/genpropdoc.m	Mon Jul 16 22:59:15 2018 +0200
@@ -34,7 +34,8 @@
   objnames = {"root", "figure", "axes", "line", ...
               "text", "image", "patch", "surface", "light", ...
               "uimenu", "uibuttongroup", "uicontextmenu", "uipanel", ...
-              "uicontrol", "uitoolbar", "uipushtool", "uitoggletool"};
+              "uicontrol", "uitable", "uitoolbar", "uipushtool", ...
+              "uitoggletool"};
 
   ## Base properties
   base = getstructure ("base");
@@ -1607,6 +1608,41 @@
 
     endswitch
 
+  ## uitable Properties
+  elseif (strcmp (objname, "uitable"))
+      switch (field)
+        ## Overridden shared properties
+
+        ## Specific properties
+        case "backgroundcolor"
+        case "celleditcallback"
+        case "cellselectioncallback"
+        case "columneditable"
+        case "columnformat"
+        case "columnname"
+        case "columnwidth"
+        case "createfcn"
+        case "data"
+        case "deletefcn"
+        case "enable"
+        case "extent"
+        case "fontangle"
+        case "fontname"
+        case "fontsize"
+        case "fontunits"
+        case "fontweight"
+        case "foregroundcolor"
+        case "keypressfcn"
+        case "keyreleasefcn"
+        case "position"
+        case "rearrangeablecolumns"
+        case "rowname"
+        case "rowstriping"
+        case "tooltipstring"
+        case "units"
+
+      endswitch
+
   ## uitoolbar properties
   elseif (strcmp (objname, "uitoolbar"))
     switch (field)
diff -r 3464c423ac10 doc/interpreter/gui.txi
--- a/doc/interpreter/gui.txi	Fri Jul 13 15:53:29 2018 -0400
+++ b/doc/interpreter/gui.txi	Mon Jul 16 22:59:15 2018 +0200
@@ -113,6 +113,8 @@
 
 @DOCSTRING(uipanel)
 
+@DOCSTRING(uitable)
+
 @DOCSTRING(uipushtool)
 
 @DOCSTRING(uitoggletool)
diff -r 3464c423ac10 doc/interpreter/module.mk
--- a/doc/interpreter/module.mk	Fri Jul 13 15:53:29 2018 -0400
+++ b/doc/interpreter/module.mk	Mon Jul 16 22:59:15 2018 +0200
@@ -15,6 +15,7 @@
   %reldir%/plot-uicontextmenuproperties.texi \
   %reldir%/plot-uipanelproperties.texi \
   %reldir%/plot-uicontrolproperties.texi \
+  %reldir%/plot-uitableproperties.texi \
   %reldir%/plot-uitoolbarproperties.texi \
   %reldir%/plot-uipushtoolproperties.texi \
   %reldir%/plot-uitoggletoolproperties.texi
@@ -69,6 +70,9 @@
 %reldir%/plot-uicontrolproperties.texi: %reldir%/genpropdoc.m
 	$(AM_V_GEN)$(call gen-propdoc-texi,uicontrol)
 
+%reldir%/plot-uitableproperties.texi: doc/interpreter/genpropdoc.m
+	$(AM_V_GEN)$(call gen-propdoc-texi,uitable)
+
 %reldir%/plot-uitoolbarproperties.texi: %reldir%/genpropdoc.m
 	$(AM_V_GEN)$(call gen-propdoc-texi,uitoolbar)
 
diff -r 3464c423ac10 doc/interpreter/plot.txi
--- a/doc/interpreter/plot.txi	Fri Jul 13 15:53:29 2018 -0400
+++ b/doc/interpreter/plot.txi	Mon Jul 16 22:59:15 2018 +0200
@@ -1499,6 +1499,7 @@
 * Uicontextmenu Properties::
 * Uipanel Properties::
 * Uicontrol Properties::
+* Uitable Properties::
 * Uitoolbar Properties::
 * Uipushtool Properties::
 * Uitoggletool Properties::
@@ -1637,6 +1638,14 @@
 
 @include plot-uicontrolproperties.texi
 
+@node Uitable Properties
+@subsubsection Uitable Properties
+@cindex uitable properties
+
+The @code{uitable} properties are:
+
+@include plot-uitableproperties.texi
+
 @node Uitoolbar Properties
 @subsubsection Uitoolbar Properties
 @prindex @sortas{@ Uitoolbar Properties} Uitoolbar Properties
diff -r 3464c423ac10 libgui/graphics/Backend.cc
--- a/libgui/graphics/Backend.cc	Fri Jul 13 15:53:29 2018 -0400
+++ b/libgui/graphics/Backend.cc	Mon Jul 16 22:59:15 2018 +0200
@@ -58,6 +58,7 @@
              || go.isa ("uibuttongroup")
              || go.isa ("uimenu")
              || go.isa ("uicontextmenu")
+             || go.isa ("uitable")
              || go.isa ("uitoolbar")
              || go.isa ("uipushtool")
              || go.isa ("uitoggletool"))
@@ -90,6 +91,7 @@
         || go.isa ("uibuttongroup")
         || go.isa ("uimenu")
         || go.isa ("uicontextmenu")
+        || go.isa ("uitable")
         || go.isa ("uitoolbar")
         || go.isa ("uipushtool")
         || go.isa ("uitoggletool"))
@@ -121,6 +123,7 @@
         || pId == uibuttongroup::properties::ID___OBJECT__
         || pId == uimenu::properties::ID___OBJECT__
         || pId == uicontextmenu::properties::ID___OBJECT__
+        || pId == uitable::properties::ID___OBJECT__
         || pId == uitoolbar::properties::ID___OBJECT__
         || pId == uipushtool::properties::ID___OBJECT__
         || pId == uitoggletool::properties::ID___OBJECT__
diff -r 3464c423ac10 libgui/graphics/Canvas.cc
--- a/libgui/graphics/Canvas.cc	Fri Jul 13 15:53:29 2018 -0400
+++ b/libgui/graphics/Canvas.cc	Mon Jul 16 22:59:15 2018 +0200
@@ -382,7 +382,7 @@
               axesList.append (childObj);
           }
         else if (childObj.isa ("uicontrol") || childObj.isa ("uipanel")
-                 || childObj.isa ("uibuttongroup"))
+                 || childObj.isa ("uibuttongroup") || childObj.isa ("uitable"))
           {
             Matrix bb = childObj.get_properties ().get_boundingbox (false);
             QRectF r (bb(0), bb(1), bb(2), bb(3));
diff -r 3464c423ac10 libgui/graphics/ObjectFactory.cc
--- a/libgui/graphics/ObjectFactory.cc	Fri Jul 13 15:53:29 2018 -0400
+++ b/libgui/graphics/ObjectFactory.cc	Mon Jul 16 22:59:15 2018 +0200
@@ -46,6 +46,7 @@
 #include "PushTool.h"
 #include "RadioButtonControl.h"
 #include "SliderControl.h"
+#include "Table.h"
 #include "TextControl.h"
 #include "ToggleButtonControl.h"
 #include "ToggleTool.h"
@@ -128,6 +129,8 @@
                   obj = Menu::create (go);
                 else if (go.isa ("uicontextmenu"))
                   obj = ContextMenu::create (go);
+                else if (go.isa ("uitable"))
+                  obj = Table::create (go);
                 else if (go.isa ("uitoolbar"))
                   obj = ToolBar::create (go);
                 else if (go.isa ("uipushtool"))
diff -r 3464c423ac10 libgui/graphics/QtHandlesUtils.cc
--- a/libgui/graphics/QtHandlesUtils.cc	Fri Jul 13 15:53:29 2018 -0400
+++ b/libgui/graphics/QtHandlesUtils.cc	Mon Jul 16 22:59:15 2018 +0200
@@ -140,6 +140,10 @@
     template QFont computeFont<uibuttongroup> (const uibuttongroup::properties&
         props,
         int height);
+
+    template QFont computeFont<uitable> (const uitable::properties& props,
+                                         int height);
+
     QColor
     fromRgb (const Matrix& rgb)
     {
diff -r 3464c423ac10 libgui/graphics/module.mk
--- a/libgui/graphics/module.mk	Fri Jul 13 15:53:29 2018 -0400
+++ b/libgui/graphics/module.mk	Mon Jul 16 22:59:15 2018 +0200
@@ -19,6 +19,7 @@
   %reldir%/moc-PushTool.cc \
   %reldir%/moc-SliderControl.cc \
   %reldir%/moc-TextEdit.cc \
+  %reldir%/moc-Table.cc \
   %reldir%/moc-ToggleTool.cc \
   %reldir%/moc-ToolBar.cc
 
@@ -75,6 +76,7 @@
   %reldir%/QtHandlesUtils.h \
   %reldir%/RadioButtonControl.h \
   %reldir%/SliderControl.h \
+  %reldir%/Table.h \
   %reldir%/TextControl.h \
   %reldir%/TextEdit.h \
   %reldir%/ToggleButtonControl.h \
@@ -114,6 +116,7 @@
   %reldir%/QtHandlesUtils.cc \
   %reldir%/RadioButtonControl.cc \
   %reldir%/SliderControl.cc \
+  %reldir%/Table.cc \
   %reldir%/TextControl.cc \
   %reldir%/TextEdit.cc \
   %reldir%/ToggleButtonControl.cc \
diff -r 3464c423ac10 libinterp/corefcn/genprops.awk
--- a/libinterp/corefcn/genprops.awk	Fri Jul 13 15:53:29 2018 -0400
+++ b/libinterp/corefcn/genprops.awk	Mon Jul 16 22:59:15 2018 +0200
@@ -232,10 +232,10 @@
 
 function emit_get_callback (i)
 {
-  printf ("  void execute_%s (const octave_value& data = octave_value ()) const", name[i]);
+  printf ("  void execute_%s (const octave_value& _data = octave_value ()) const", name[i]);
 
   if (emit_get[i] == "definition")
-    printf (" { %s.execute (data); }\n", name[i]);
+    printf (" { %s.execute (_data); }\n", name[i]);
   else
     printf (";\n");
 
diff -r 3464c423ac10 libinterp/corefcn/gl-render.cc
--- a/libinterp/corefcn/gl-render.cc	Fri Jul 13 15:53:29 2018 -0400
+++ b/libinterp/corefcn/gl-render.cc	Mon Jul 16 22:59:15 2018 +0200
@@ -647,7 +647,8 @@
       draw_image (dynamic_cast<const image::properties&> (props));
     else if (go.isa ("uimenu") || go.isa ("uicontrol")
              || go.isa ("uicontextmenu") || go.isa ("uitoolbar")
-             || go.isa ("uipushtool") || go.isa ("uitoggletool"))
+             || go.isa ("uipushtool") || go.isa ("uitoggletool")
+             || go.isa ("uitable"))
       ; // SKIP
     else if (go.isa ("uipanel"))
       {
diff -r 3464c423ac10 libinterp/corefcn/graphics.cc
--- a/libinterp/corefcn/graphics.cc	Fri Jul 13 15:53:29 2018 -0400
+++ b/libinterp/corefcn/graphics.cc	Mon Jul 16 22:59:15 2018 +0200
@@ -565,6 +565,32 @@
   return m;
 }
 
+static Matrix
+default_table_position (void)
+{
+  Matrix retval (1, 4);
+
+  retval(0) = 20;
+  retval(1) = 20;
+  retval(2) = 300;
+  retval(3) = 300;
+
+  return retval;
+}
+
+static Matrix
+default_table_backgroundcolor (void)
+{
+  Matrix retval (2, 3);
+  retval(0, 0) = 1;
+  retval(0, 1) = 1;
+  retval(0, 2) = 1;
+  retval(1, 0) = 0.94;
+  retval(1, 1) = 0.94;
+  retval(1, 2) = 0.94;
+  return retval;
+}
+
 static double
 convert_font_size (double font_size, const caseless_str& from_units,
                    const caseless_str& to_units, double parent_height = 0)
@@ -1059,7 +1085,7 @@
                   pfx = name.substr (0, 7);
 
                   if (pfx.compare ("surface") || pfx.compare ("hggroup")
-                      || pfx.compare ("uipanel"))
+                      || pfx.compare ("uipanel") || pfx.compare ("uitable"))
                     offset = 7;
                   else if (len >= 9)
                     {
@@ -1141,6 +1167,8 @@
     go = new uibuttongroup (h, p);
   else if (type.compare ("uicontextmenu"))
     go = new uicontextmenu (h, p);
+  else if (type.compare ("uitable"))
+    go = new uitable (h, p);
   else if (type.compare ("uitoolbar"))
     go = new uitoolbar (h, p);
   else if (type.compare ("uipushtool"))
@@ -2112,7 +2140,7 @@
                   pfx = name.substr (0, 7);
 
                   if (pfx.compare ("surface") || pfx.compare ("hggroup")
-                      || pfx.compare ("uipanel"))
+                      || pfx.compare ("uipanel") || pfx.compare ("uitable"))
                     offset = 7;
                   else if (len > 9)
                     {
@@ -2185,6 +2213,8 @@
             has_property = uipanel::properties::has_core_property (pname);
           else if (pfx == "uicontextmenu")
             has_property = uicontextmenu::properties::has_core_property (pname);
+          else if (pfx == "uitable")
+            has_property = uitable::properties::has_core_property (pname);
           else if (pfx == "uitoolbar")
             has_property = uitoolbar::properties::has_core_property (pname);
           else if (pfx == "uipushtool")
@@ -2252,7 +2282,7 @@
                   pfx = name.substr (0, 7);
 
                   if (pfx.compare ("surface") || pfx.compare ("hggroup")
-                      || pfx.compare ("uipanel"))
+                      || pfx.compare ("uipanel") || pfx.compare ("uitable"))
                     offset = 7;
                   else if (len > 9)
                     {
@@ -9891,6 +9921,251 @@
 
 // ---------------------------------------------------------------------
 
+Matrix
+uitable::properties::get_boundingbox (bool,
+                                      const Matrix& parent_pix_size) const
+{
+  Matrix pos = get_position ().matrix_value ();
+  Matrix parent_size (parent_pix_size);
+
+  if (parent_size.isempty ())
+    {
+      graphics_object go = gh_manager::get_object (get_parent ());
+
+      parent_size =
+        go.get_properties ().get_boundingbox (true).extract_n (0, 2, 1, 2);
+    }
+
+  pos = convert_position (pos, get_units (), "pixels", parent_size);
+
+  pos(0)--;
+  pos(1)--;
+  pos(1) = parent_size(1) - pos(1) - pos(3);
+  return pos;
+}
+
+void
+uitable::properties::set_columnformat (const octave_value& val)
+{
+  /* Matlab only allows certain values for columnformat - here we will only
+     check the structure of the argument. Values will be checked in Table.cc */
+
+  if (val.iscellstr ())
+    {
+      if (columnformat.set (val, true))
+        {
+          mark_modified ();
+        }
+    }
+  else if (val.iscell ())
+    {
+      Cell cell_value = val.cell_value ();
+
+      for (int i = 0; i < cell_value.numel (); i++)
+        {
+          octave_value v = cell_value (i);
+          if (v.iscell ())
+            {
+              /* We are in a pop-up menu selection
+               * Matlab only allows non-empty strings here */
+              Cell popup = v.cell_value ();
+              for (int j = 0; j < popup.numel (); j++)
+                {
+                  octave_value p = popup (j);
+                  if (!p.is_string () || p.string_value ().length () == 0)
+                    {
+                      error ("set: pop-up menu definitions must be non-empty strings.");
+                    }
+                }
+            }
+          else if (!(v.is_string () || v.isempty ()))
+            {
+              error ("set: columnformat definintions must be a cellstr of "
+                "either 'char', 'short [e|g|eng]?', 'long [e|g|eng]?', "
+                "'numeric', 'bank', '+', 'rat', 'logical', or a cellstr of non-empty "
+                "pop-up menu definitions.");
+            }
+        }
+
+      if (columnformat.set (val, true))
+        {
+          mark_modified ();
+        }
+    }
+  else if (val.isempty ())
+    {
+      if (columnformat.set (Cell (), true))
+        {
+          mark_modified ();
+        }
+    }
+  else
+    {
+      error ("set: expecting cell of strings.");
+    }
+}
+
+void
+uitable::properties::set_columnwidth (const octave_value& val)
+{
+  bool error_exists = false;
+  if (val.is_string ()  && val.string_value (false) == "auto")
+    {
+      error_exists = false;
+    }
+  else if (val.iscell ())
+    {
+      Cell cell_value = val.cell_value ();
+      for (int i = 0; i < cell_value.numel (); i++)
+        {
+          octave_value v = cell_value (i);
+          if (v.is_string ())
+            {
+              if (v.string_value (false) != "auto")
+                error_exists = true;
+            }
+          else if (v.iscell ())
+            {
+              error_exists = true;
+            }
+          else if (!(v.is_scalar_type ()))
+            {
+              error_exists = true;
+            }
+        }
+    }
+  else
+    {
+      error_exists = true;
+    }
+
+  if (error_exists)
+    {
+      error ("set: expecting either 'auto' or a cell of pixel values or auto.");
+    }
+  else
+    {
+      if (columnwidth.set (val, true))
+        {
+          mark_modified ();
+        }
+    }
+}
+
+void
+uitable::properties::set_units (const octave_value& val)
+{
+  caseless_str old_units = get_units ();
+
+  if (units.set (val, true))
+    {
+      update_units (old_units);
+      mark_modified ();
+    }
+}
+
+void
+uitable::properties::update_units (const caseless_str& old_units)
+{
+  Matrix pos = get_position ().matrix_value ();
+
+  graphics_object parent_go = gh_manager::get_object (get_parent ());
+  Matrix parent_bbox = parent_go.get_properties ().get_boundingbox (true);
+  Matrix parent_size = parent_bbox.extract_n (0, 2, 1, 2);
+
+  pos = convert_position (pos, old_units, get_units (), parent_size);
+  set_position (pos);
+}
+
+void
+uitable::properties::set_fontunits (const octave_value& val)
+{
+  caseless_str old_fontunits = get_fontunits ();
+
+  if (fontunits.set (val, true))
+    {
+      update_fontunits (old_fontunits);
+      mark_modified ();
+    }
+}
+
+void
+uitable::properties::update_fontunits (const caseless_str& old_units)
+{
+  caseless_str new_units = get_fontunits ();
+  double parent_height = get_boundingbox (false).elem (3);
+  double fontsz = get_fontsize ();
+
+  fontsz = convert_font_size (fontsz, old_units, new_units, parent_height);
+
+  set_fontsize (octave_value (fontsz));
+}
+
+double
+uitable::properties::get___fontsize_points__ (double box_pix_height) const
+{
+  double fontsz = get_fontsize ();
+  double parent_height = box_pix_height;
+
+  if (fontunits_is ("normalized") && parent_height <= 0)
+    parent_height = get_boundingbox (false).elem (3);
+
+  return convert_font_size (fontsz, get_fontunits (), "points", parent_height);
+}
+
+double
+uitable::properties::get_fontsize_pixels (double box_pix_height) const
+{
+  double fontsz = get_fontsize ();
+  double parent_height = box_pix_height;
+
+  if (fontunits_is ("normalized") && parent_height <= 0)
+    parent_height = get_boundingbox (false).elem (3);
+
+  return convert_font_size (fontsz, get_fontunits (), "pixels", parent_height);
+}
+
+Matrix
+uitable::properties::get_backgroundcolor_rgb (void)
+{
+  Matrix bg = backgroundcolor.get ().matrix_value ();
+  return bg.row (0);
+}
+
+Matrix
+uitable::properties::get_alternatebackgroundcolor_rgb (void)
+{
+  int i = 0;
+  Matrix bg = backgroundcolor.get ().matrix_value ();
+  if (bg.rows () > 1)
+    i = 1;
+  return bg.row (i);
+}
+
+Matrix
+uitable::properties::get_extent_matrix (void) const
+{
+  return extent.get ().matrix_value ();
+}
+
+octave_value
+uitable::properties::get_extent (void) const
+{
+  // FIXME: Is it really acceptable to just let the toolkit update the extent?
+  Matrix m = extent.get ().matrix_value ();
+  graphics_object parent_go = gh_manager::get_object (get_parent ());
+  if (parent_go)
+    {
+      Matrix parent_bbox = parent_go.get_properties ().get_boundingbox (true);
+      Matrix parent_size = parent_bbox.extract_n (0, 2, 1, 2);
+
+      return convert_position (m, "pixels", get_units (), parent_size);
+    }
+  return m;
+}
+
+// ---------------------------------------------------------------------
+
 octave_value
 uitoolbar::get_default (const caseless_str& pname) const
 {
@@ -11421,6 +11696,15 @@
   GO_BODY (uicontextmenu);
 }
 
+DEFUN (__go_uitable__, args, ,
+       doc: /* -*- texinfo -*-
+@deftypefn {} {} __go_uitable__ (@var{parent})
+Undocumented internal function.
+@end deftypefn */)
+{
+  GO_BODY (uitable);
+}
+
 DEFUN (__go_uitoolbar__, args, ,
        doc: /* -*- texinfo -*-
 @deftypefn {} {} __go_uitoolbar__ (@var{parent})
diff -r 3464c423ac10 libinterp/corefcn/graphics.in.h
--- a/libinterp/corefcn/graphics.in.h	Fri Jul 13 15:53:29 2018 -0400
+++ b/libinterp/corefcn/graphics.in.h	Mon Jul 16 22:59:15 2018 +0200
@@ -5747,6 +5747,105 @@
 
 // ---------------------------------------------------------------------
 
+class OCTINTERP_API uitable : public base_graphics_object
+{
+public:
+  class OCTINTERP_API properties : public base_properties
+  {
+  public:
+    Matrix get_boundingbox (bool internal = false,
+                            const Matrix& parent_pix_size = Matrix ()) const;
+
+    double get___fontsize_points__ (double box_pix_height = 0) const;
+
+    double get_fontsize_pixels (double box_pix_height = 0) const;
+
+    // See the genprops.awk script for an explanation of the
+    // properties declarations.
+    // Programming note: Keep property list sorted if new ones are added.
+
+    BEGIN_PROPERTIES (uitable)
+      any_property __object__ h , Matrix ()
+      array_property backgroundcolor , default_table_backgroundcolor ()
+      callback_property celleditcallback , Matrix ()
+      callback_property cellselectioncallback , Matrix ()
+      row_vector_property columneditable , Matrix ()
+      any_property columnformat S , Matrix ()
+      any_property columnname , "numbered"
+      any_property columnwidth S , "auto"
+      any_property data u , Matrix ()
+      radio_property enable , "{on}|inactive|off"
+      array_property extent rG , Matrix (1, 4, 0.0)
+      radio_property fontangle u , "{normal}|italic|oblique"
+      string_property fontname u , OCTAVE_DEFAULT_FONTNAME
+      double_property fontsize u , 10
+      radio_property fontunits S , "inches|centimeters|normalized|{points}|pixels"
+      radio_property fontweight u , "light|{normal}|demi|bold"
+      color_property foregroundcolor , color_values (0, 0, 0)
+      callback_property keypressfcn , Matrix ()
+      callback_property keyreleasefcn , Matrix ()
+      array_property position , default_table_position ()
+      bool_property rearrangeablecolumns , "off"
+      any_property rowname , "numbered"
+      bool_property rowstriping , "on"
+      string_property tooltipstring , ""
+      radio_property units S , "normalized|inches|centimeters|points|{pixels}|characters"
+    END_PROPERTIES
+
+    Matrix get_extent_matrix (void) const;
+
+    Matrix get_backgroundcolor_rgb (void);
+
+    Matrix get_alternatebackgroundcolor_rgb (void);
+
+  protected:
+    void init (void)
+    {
+      position.add_constraint (dim_vector (1, 4));
+      extent.add_constraint (dim_vector (1, 4));
+      backgroundcolor.add_constraint (dim_vector (-1, 3));
+      backgroundcolor.add_constraint ("double");
+      columneditable.add_constraint ("logical");
+    }
+
+    void update_units (const caseless_str& old_units);
+    void update_fontunits (const caseless_str& old_units);
+    void update_table_extent (void) { };
+    void update_data (void) { update_table_extent (); }
+    void update_fontname (void) { update_table_extent (); }
+    void update_fontsize (void) { update_table_extent (); }
+    void update_fontangle (void) { update_table_extent (); }
+    void update_fontweight (void) { update_table_extent (); }
+
+  };
+
+private:
+  properties xproperties;
+
+public:
+  uitable (const graphics_handle& mh, const graphics_handle& p)
+    : base_graphics_object (), xproperties (mh, p)
+  { }
+
+  ~uitable (void) { }
+
+  base_properties& get_properties (void) { return xproperties; }
+
+  const base_properties& get_properties (void) const { return xproperties; }
+
+  bool valid_object (void) const { return true; }
+
+  bool has_readonly_property (const caseless_str& pname) const
+  {
+    bool retval = xproperties.has_readonly_property (pname);
+    if (! retval)
+      retval = base_properties::has_readonly_property (pname);
+    return retval;
+  }
+};
+
+// ---------------------------------------------------------------------
+
 class OCTINTERP_API uitoolbar : public base_graphics_object
 {
 public:
diff -r 3464c423ac10 libinterp/corefcn/kron.cc
--- a/libinterp/corefcn/kron.cc	Fri Jul 13 15:53:29 2018 -0400
+++ b/libinterp/corefcn/kron.cc	Mon Jul 16 22:59:15 2018 +0200
@@ -63,15 +63,30 @@
   MArray<T> c (dim_vector (nra*nrb, nca*ncb));
   T *cv = c.fortran_vec ();
 
-  for (octave_idx_type ja = 0; ja < nca; ja++)
-    for (octave_idx_type jb = 0; jb < ncb; jb++)
-      for (octave_idx_type ia = 0; ia < nra; ia++)
-        {
-          octave_quit ();
-          mx_inline_mul (nrb, cv, a(ia, ja), b.data () + nrb*jb);
-          cv += nrb;
-        }
-
+  if (nrb == 1)
+    {
+      for (octave_idx_type ja = 0; ja < nca; ja++)
+        for (octave_idx_type jb = 0; jb < ncb; jb++)
+          {
+            octave_quit ();
+            for (octave_idx_type ia = 0; ia < nra; ia++)
+              {
+                mx_inline_mul (nrb, cv, a(ia, ja), b.data () + nrb*jb);
+                cv += nrb;
+              }
+	  }
+    }
+  else
+    {
+      for (octave_idx_type ja = 0; ja < nca; ja++)
+        for (octave_idx_type jb = 0; jb < ncb; jb++)
+          for (octave_idx_type ia = 0; ia < nra; ia++)
+            {
+              octave_quit ();
+              mx_inline_mul (nrb, cv, a(ia, ja), b.data () + nrb*jb);
+              cv += nrb;
+            }
+    }
   return c;
 }
 
diff -r 3464c423ac10 libinterp/corefcn/module.mk
--- a/libinterp/corefcn/module.mk	Fri Jul 13 15:53:29 2018 -0400
+++ b/libinterp/corefcn/module.mk	Mon Jul 16 22:59:15 2018 +0200
@@ -85,6 +85,7 @@
   %reldir%/symrec.h \
   %reldir%/symscope.h \
   %reldir%/symtab.h \
+  %reldir%/str2double.h \
   %reldir%/sysdep.h \
   %reldir%/text-renderer.h \
   %reldir%/toplev.h \
@@ -100,7 +101,8 @@
 NOINSTALL_COREFCN_INC = \
   %reldir%/interpreter-private.h \
   %reldir%/oct-hdf5.h \
-  %reldir%/oct-opengl.h
+  %reldir%/oct-opengl.h \
+  %reldir%/str2double.h
 
 ## oct-tex-parser.h is in the SRC list so that it will be distributed
 ## but not installed.
diff -r 3464c423ac10 libinterp/corefcn/pr-output.cc
--- a/libinterp/corefcn/pr-output.cc	Fri Jul 13 15:53:29 2018 -0400
+++ b/libinterp/corefcn/pr-output.cc	Mon Jul 16 22:59:15 2018 +0200
@@ -236,7 +236,7 @@
 }
 
 template <typename T>
-static inline std::string
+std::string
 rational_approx (T val, int len)
 {
   std::string s;
diff -r 3464c423ac10 libinterp/corefcn/pr-output.h
--- a/libinterp/corefcn/pr-output.h	Fri Jul 13 15:53:29 2018 -0400
+++ b/libinterp/corefcn/pr-output.h	Mon Jul 16 22:59:15 2018 +0200
@@ -579,4 +579,8 @@
 // TRUE means don't put empty lines in output
 extern bool Vcompact_format;
 
+template <typename T>
+std::string
+rational_approx (T val, int len);
+
 #endif
diff -r 3464c423ac10 libinterp/corefcn/str2double.cc
--- a/libinterp/corefcn/str2double.cc	Fri Jul 13 15:53:29 2018 -0400
+++ b/libinterp/corefcn/str2double.cc	Mon Jul 16 22:59:15 2018 +0200
@@ -259,8 +259,8 @@
 #endif
 }
 
-static Complex
-str2double1 (const std::string& str_arg)
+Complex
+str2double_internal (const std::string& str_arg)
 {
   Complex val (0.0, 0.0);
 
@@ -351,12 +351,12 @@
       if (args(0).rows () == 0 || args(0).columns () == 0)
         retval = Matrix (1, 1, octave::numeric_limits<double>::NaN ());
       else if (args(0).rows () == 1 && args(0).ndims () == 2)
-        retval = str2double1 (args(0).string_value ());
+        retval = str2double_internal (args(0).string_value ());
       else
         {
           const string_vector sv = args(0).string_vector_value ();
 
-          retval = sv.map<Complex> (str2double1);
+          retval = sv.map<Complex> (str2double_internal);
         }
     }
   else if (args(0).iscell ())
@@ -368,7 +368,7 @@
       for (octave_idx_type i = 0; i < cell.numel (); i++)
         {
           if (cell(i).is_string ())
-            output(i) = str2double1 (cell(i).string_value ());
+            output(i) = str2double_internal (cell(i).string_value ());
         }
       retval = output;
     }
diff -r 3464c423ac10 scripts/gui/module.mk
--- a/scripts/gui/module.mk	Fri Jul 13 15:53:29 2018 -0400
+++ b/scripts/gui/module.mk	Mon Jul 16 22:59:15 2018 +0200
@@ -36,6 +36,7 @@
   %reldir%/uipushtool.m \
   %reldir%/uiputfile.m \
   %reldir%/uiresume.m \
+  %reldir%/uitable.m \
   %reldir%/uitoggletool.m \
   %reldir%/uitoolbar.m \
   %reldir%/uiwait.m \
