diff --git a/src/graphics.cc b/src/graphics.cc
--- a/src/graphics.cc
+++ b/src/graphics.cc
@@ -3513,18 +3513,156 @@
 figure::properties::update_papertype (void)
 {
   caseless_str typ = get_papertype ();
-
   if (! typ.compare ("<custom>"))
-    // Call papersize.set rather than set_papersize to avoid loops between
-    // update_papersize and update_papertype
-    papersize.set (octave_value (papersize_from_type (get_paperunits (), typ)));
+    {
+      Matrix sz = papersize_from_type (get_paperunits (), typ);
+      caseless_str porient = get_paperorientation ();
+      if (porient.compare ("landscape"))
+        {
+          double tmp = sz (0);
+          sz (0) = sz (1);
+          sz (1) = tmp;
+        }
+      // Call papersize.set rather than set_papersize to avoid loops between
+      // update_papersize and update_papertype
+      papersize.set (octave_value (sz));
+    }
 }
 
 void
 figure::properties::update_papersize (void)
 {
-  papertype.set ("<custom>");
-}
+  Matrix sz = get_papersize ().matrix_value ();
+  if (sz (0) > sz (1))
+    {
+      double tmp = sz (0);
+      sz (0) = sz (1);
+      sz (1) = tmp;
+      papersize.set (octave_value (sz));
+      caseless_str porient = "landscape";
+      paperorientation.set (octave_value (porient));
+    }
+  else
+    {
+      caseless_str porient = "portrait";
+      paperorientation.set (octave_value (porient));
+    }
+  caseless_str punits = get_paperunits ();
+  if (punits.compare ("centimeters"))
+    {
+      sz (0) = sz (0) / 2.54;
+      sz (1) = sz (1) / 2.54;
+    }
+  else if (punits.compare ("points"))
+    {
+      sz (0) = sz (0) / 72.0;
+      sz (1) = sz (1) / 72.0;
+    }
+  if (punits.compare ("normalized"))
+    {
+      // TODO - Return and avoid changing papertype ?
+      caseless_str typ = get_papertype ();
+      if (typ.compare ("<custom>"))
+        {
+          // TODO - Throw an error and set papertype to default ?
+          typ = "usletter";
+          papertype.set (typ);
+        }
+    }
+  else
+    {
+      caseless_str typ = "<custom>";
+      double mm2in = 1.0 / 25.4;
+      if (sz (0) == 8.5 && sz (1) == 11.0)
+        typ = "usletter";
+      else if (sz (0) == 8.5 && sz (1) == 14.0)
+        typ = "uslegal";
+      else if (sz (0) == 11.0 && sz (1) == 17.0)
+        typ = "tabloid";
+      else if (sz (0) == 841.0 * mm2in && sz (1) == 1198.0 * mm2in)
+        typ = "a0";
+      else if (sz (0) == 594.0 * mm2in && sz (1) == 841.0 * mm2in)
+        typ = "a1";
+      else if (sz (0) == 420.0 * mm2in && sz (1) == 594.0 * mm2in)
+        typ = "a2";
+      else if (sz (0) == 297.0 * mm2in && sz (1) == 420.0 * mm2in)
+        typ = "a3";
+      else if (sz (0) == 210.0 * mm2in && sz (1) == 297.0 * mm2in)
+        typ = "a4";
+      else if (sz (0) == 148.0 * mm2in && sz (1) == 210.0 * mm2in)
+        typ = "a5";
+      else if (sz (0) == 1029.0 * mm2in && sz (1) == 1456.0 * mm2in)
+        typ = "b0";
+      else if (sz (0) == 728.0 * mm2in && sz (1) == 1028.0 * mm2in)
+        typ = "b1";
+      else if (sz (0) == 514.0 * mm2in && sz (1) == 728.0 * mm2in)
+        typ = "b2";
+      else if (sz (0) == 364.0 * mm2in && sz (1) == 514.0 * mm2in)
+        typ = "b3";
+      else if (sz (0) == 257.0 * mm2in && sz (1) == 364.0 * mm2in)
+        typ = "b4";
+      else if (sz (0) == 182.0 * mm2in && sz (1) == 257.0 * mm2in)
+        typ = "b5";
+      else if (sz (0) == 9.0 && sz (1) == 12.0)
+        typ = "arch-a";
+      else if (sz (0) == 12.0 && sz (1) == 18.0)
+        typ = "arch-b";
+      else if (sz (0) == 18.0 && sz (1) == 24.0 )
+        typ = "arch-c";
+      else if (sz (0) == 24.0 && sz (1) == 36.0 )
+        typ = "arch-d";
+      else if (sz (0) == 36.0 && sz (1) == 48.0 )
+        typ = "arch-e";
+      else if (sz (0) == 8.5 && sz (1) == 11.0 )
+        typ = "a";
+      else if (sz (0) == 11.0 && sz (1) == 17.0 )
+        typ = "b";
+      else if (sz (0) == 17.0 && sz (1) == 22.0 )
+        typ = "c";
+      else if (sz (0) == 22.0 && sz (1) == 34.0 )
+        typ = "d";
+      else if (sz (0) == 34.0 && sz (1) == 43.0 )
+        typ = "e";
+      // Call papertype.set rather than set_papertype to avoid loops between
+      // update_papersize and update_papertype
+      papertype.set (typ);
+    }
+}
+
+void
+figure::properties::update_paperorientation (void)
+{
+  caseless_str porient = get_paperorientation ();
+  Matrix sz = get_papersize ().matrix_value ();
+  if (sz (0) > sz (1) && porient.compare ("portrait")
+      || sz (0) < sz (1) && porient.compare ("landscape"))
+    {
+      double tmp = sz (0);
+      sz (0) = sz (1);
+      sz (1) = tmp;
+      // Call papertype.set rather than set_papertype to avoid loops between
+      // update_papersize and update_papertype
+      papersize.set (octave_value (sz));
+    }
+}
+
+/*
+%!test
+%! figure (1, "visible", false);
+%! set (gcf (), "paperorientation", "portrait")
+%! set (gcf (), "paperunits", "inches")
+%! set (gcf (), "papertype", "usletter")
+%! assert (get (gcf (), "papersize"), [8.5, 11.0], eps)
+%! set (gcf (), "paperorientation", "landscape")
+%! assert (get (gcf (), "papersize"), [11.0, 8.5], eps)
+%! set (gcf (), "paperunits", "centimeters")
+%! assert (get (gcf (), "papersize"), [11.0, 8.5] * 2.54, eps)
+%! set (gcf (), "papertype", "a4");
+%! assert (get (gcf (), "papersize"), [297.0, 210.0], eps)
+%! set (gcf (), "paperunits", "inches", "papersize", [8.5, 11.0])
+%! assert (get (gcf (), "papertype"), "usletter")
+%! assert (get (gcf (), "paperorientation"), "portrait")
+*/
 
 void
 figure::properties::set_units (const octave_value& v)
diff --git a/src/graphics.h.in b/src/graphics.h.in
--- a/src/graphics.h.in
+++ b/src/graphics.h.in
@@ -3340,7 +3340,7 @@
       callback_property closerequestfcn , "closereq"
       handle_property currentaxes S , graphics_handle ()
       array_property colormap , jet_colormap ()
-      radio_property paperorientation , "{portrait}|landscape|rotated"
+      radio_property paperorientation SU , "{portrait}|landscape|rotated"
       color_property color , color_property (color_values (1, 1, 1), radio_values ("none"))
       array_property alphamap , Matrix (64, 1, 1)
       string_property currentcharacter r , ""
