diff --git a/ChangeLog b/ChangeLog
index fe9e229616bef92935e3355df585735ae7834baa..b663b8f556ac49e2789711c6249cd8647171dee8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1971,4 +1971,4 @@
 	* arch/arm/src/lpc17xx/chip.h:  Fix some chip memory configuration errors
 	  for the LPC1764, LPC1756, and LPC1754 (submitted by Li Zhuoy (Lzzy))
 	* arch/arm/src/lpc17xx/lpc17_can.h:  Revised CAN driver submitted by
-	   Li Zhuoy (Lzzy).
+	   Li Zhuoy (Lzzy).  The driver now supports both CAN1 and CAN2.
diff --git a/configs/sim/nx/defconfig b/configs/sim/nx/defconfig
index d4688ea498830ec7d06a3bcfe7e0cd4037f6e283..9859e74c5a928da6474c51febd606fb917ef2a43 100644
--- a/configs/sim/nx/defconfig
+++ b/configs/sim/nx/defconfig
@@ -524,6 +524,38 @@ CONFIG_EXAMPLES_NX_CLIENTPRIO=80
 CONFIG_EXAMPLES_NX_SERVERPRIO=120
 CONFIG_EXAMPLES_NX_NOTIFYSIGNO=4
 
+#
+# Settings for examples/nxlines
+#
+# CONFIG_EXAMPLES_NXLINES_BUILTIN -- Build the NXLINES example as a "built-in"
+#   that can be executed from the NSH command line
+# CONFIG_EXAMPLES_NXLINES_VPLANE -- The plane to select from the frame-
+#   buffer driver for use in the test.  Default: 0
+# CONFIG_EXAMPLES_NXLINES_DEVNO - The LCD device to select from the LCD
+#   driver for use in the test: Default: 0
+# CONFIG_EXAMPLES_NXLINES_BGCOLOR -- The color of the background.  Default
+#   depends on CONFIG_EXAMPLES_NXLINES_BPP.
+# CONFIG_EXAMPLES_NXLINES_LINEWIDTH - Selects the width of the lines in
+#   pixels (default: 16)
+# CONFIG_EXAMPLES_NXLINES_LINECOLOR -- The color of the lines drawn in the
+#   background window. Default depends on CONFIG_EXAMPLES_NXLINES_BPP.
+# CONFIG_EXAMPLES_NXLINES_BPP -- Pixels per pixel to use.  Valid options
+#   include 2, 4, 8, 16, 24, and 32.  Default is 16.
+# CONFIG_EXAMPLES_NXLINES_EXTERNINIT - The driver for the graphics device on
+#   this platform requires some unusual initialization.  This is the
+#   for, for example, SPI LCD/OLED devices.  If this configuration is
+#   selected, then the platform code must provide an LCD initialization
+#   function.
+#
+CONFIG_EXAMPLES_NXLINES_BUILTIN=n
+CONFIG_EXAMPLES_NXLINES_VPLANE=0
+CONFIG_EXAMPLES_NXLINES_DEVNO=0
+#CONFIG_EXAMPLES_NXLINES_BGCOLOR=
+CONFIG_EXAMPLES_NXLINES_LINEWIDTH=16
+#CONFIG_EXAMPLES_NXLINES_LINECOLOR=
+CONFIG_EXAMPLES_NXLINES_BPP=CONFIG_SIM_FBBPP
+CONFIG_EXAMPLES_NXLINES_EXTERNINIT=n
+
 #
 # Settings for examples/mount
 CONFIG_EXAMPLES_MOUNT_DEVNAME="/dev/ram0"
diff --git a/configs/stm3210e-eval/nsh2/defconfig b/configs/stm3210e-eval/nsh2/defconfig
index 3d51891a5bf9b88397b6d84e9b24a9346d47f132..987127cfddeee03e33722763c966f2d418d73e7c 100644
--- a/configs/stm3210e-eval/nsh2/defconfig
+++ b/configs/stm3210e-eval/nsh2/defconfig
@@ -1132,6 +1132,38 @@ CONFIG_EXAMPLES_NXIMAGE_YSCALE1p5=y
 CONFIG_EXAMPLES_NXIMAGE_YSCALE2p0=n
 CONFIG_EXAMPLES_NXIMAGE_EXTERNINIT=n
 
+#
+# Settings for examples/nxlines
+#
+# CONFIG_EXAMPLES_NXLINES_BUILTIN -- Build the NXLINES example as a "built-in"
+#   that can be executed from the NSH command line
+# CONFIG_EXAMPLES_NXLINES_VPLANE -- The plane to select from the frame-
+#   buffer driver for use in the test.  Default: 0
+# CONFIG_EXAMPLES_NXLINES_DEVNO - The LCD device to select from the LCD
+#   driver for use in the test: Default: 0
+# CONFIG_EXAMPLES_NXLINES_BGCOLOR -- The color of the background.  Default
+#   depends on CONFIG_EXAMPLES_NXLINES_BPP.
+# CONFIG_EXAMPLES_NXLINES_LINEWIDTH - Selects the width of the lines in
+#   pixels (default: 16)
+# CONFIG_EXAMPLES_NXLINES_LINECOLOR -- The color of the lines drawn in the
+#   background window. Default depends on CONFIG_EXAMPLES_NXLINES_BPP.
+# CONFIG_EXAMPLES_NXLINES_BPP -- Pixels per pixel to use.  Valid options
+#   include 2, 4, 8, 16, 24, and 32.  Default is 16.
+# CONFIG_EXAMPLES_NXLINES_EXTERNINIT - The driver for the graphics device on
+#   this platform requires some unusual initialization.  This is the
+#   for, for example, SPI LCD/OLED devices.  If this configuration is
+#   selected, then the platform code must provide an LCD initialization
+#   function.
+#
+CONFIG_EXAMPLES_NXLINES_BUILTIN=n
+CONFIG_EXAMPLES_NXLINES_VPLANE=0
+CONFIG_EXAMPLES_NXLINES_DEVNO=0
+CONFIG_EXAMPLES_NXLINES_BGCOLOR=0x0320
+CONFIG_EXAMPLES_NXLINES_LINEWIDTH=16
+CONFIG_EXAMPLES_NXLINES_LINECOLOR=0xffe0
+CONFIG_EXAMPLES_NXLINES_BPP=16
+CONFIG_EXAMPLES_NXLINES_EXTERNINIT=n
+
 #
 # Settings for examples/usbstorage
 #
diff --git a/configs/stm3210e-eval/nx/defconfig b/configs/stm3210e-eval/nx/defconfig
index 2a6c2846d53eebcf95ecd5a4725d4ca083a66d74..894f569f5ebe12826dfd24640197396172206f7c 100644
--- a/configs/stm3210e-eval/nx/defconfig
+++ b/configs/stm3210e-eval/nx/defconfig
@@ -1083,6 +1083,38 @@ CONFIG_EXAMPLES_NXIMAGE_YSCALE1p5=y
 CONFIG_EXAMPLES_NXIMAGE_YSCALE2p0=n
 CONFIG_EXAMPLES_NXIMAGE_EXTERNINIT=n
 
+#
+# Settings for examples/nxlines
+#
+# CONFIG_EXAMPLES_NXLINES_BUILTIN -- Build the NXLINES example as a "built-in"
+#   that can be executed from the NSH command line
+# CONFIG_EXAMPLES_NXLINES_VPLANE -- The plane to select from the frame-
+#   buffer driver for use in the test.  Default: 0
+# CONFIG_EXAMPLES_NXLINES_DEVNO - The LCD device to select from the LCD
+#   driver for use in the test: Default: 0
+# CONFIG_EXAMPLES_NXLINES_BGCOLOR -- The color of the background.  Default
+#   depends on CONFIG_EXAMPLES_NXLINES_BPP.
+# CONFIG_EXAMPLES_NXLINES_LINEWIDTH - Selects the width of the lines in
+#   pixels (default: 16)
+# CONFIG_EXAMPLES_NXLINES_LINECOLOR -- The color of the lines drawn in the
+#   background window. Default depends on CONFIG_EXAMPLES_NXLINES_BPP.
+# CONFIG_EXAMPLES_NXLINES_BPP -- Pixels per pixel to use.  Valid options
+#   include 2, 4, 8, 16, 24, and 32.  Default is 16.
+# CONFIG_EXAMPLES_NXLINES_EXTERNINIT - The driver for the graphics device on
+#   this platform requires some unusual initialization.  This is the
+#   for, for example, SPI LCD/OLED devices.  If this configuration is
+#   selected, then the platform code must provide an LCD initialization
+#   function.
+#
+CONFIG_EXAMPLES_NXLINES_BUILTIN=n
+CONFIG_EXAMPLES_NXLINES_VPLANE=0
+CONFIG_EXAMPLES_NXLINES_DEVNO=0
+CONFIG_EXAMPLES_NXLINES_BGCOLOR=0x0320
+CONFIG_EXAMPLES_NXLINES_LINEWIDTH=16
+CONFIG_EXAMPLES_NXLINES_LINECOLOR=0xffe0
+CONFIG_EXAMPLES_NXLINES_BPP=16
+CONFIG_EXAMPLES_NXLINES_EXTERNINIT=n
+
 #
 # Stack and heap information
 #
diff --git a/configs/stm3210e-eval/nxtext/defconfig b/configs/stm3210e-eval/nxtext/defconfig
index ca75976562e0ad8e2fc53d567011268cbb09c27c..dc66b0fa8ba4bdce26f24c181732c0ba50d24a05 100644
--- a/configs/stm3210e-eval/nxtext/defconfig
+++ b/configs/stm3210e-eval/nxtext/defconfig
@@ -1110,7 +1110,7 @@ CONFIG_EXAMPLES_NXTEXT_NOTIFYSIGNO=4
 # Settings for examples/nximage
 #
 # CONFIG_EXAMPLES_NXIMAGE_BUILTIN -- Build the NXIMAGE example as a "built-in"
-#   that can be executed from the NSH command line    
+#   that can be executed from the NSH command line
 # CONFIG_EXAMPLES_NXIMAGE_VPLANE -- The plane to select from the frame-
 #   buffer driver for use in the test.  Default: 0
 # CONFIG_EXAMPLES_NXIMAGE_DEVNO - The LCD device to select from the LCD
@@ -1143,6 +1143,38 @@ CONFIG_EXAMPLES_NXIMAGE_YSCALE1p5=y
 CONFIG_EXAMPLES_NXIMAGE_YSCALE2p0=n
 CONFIG_EXAMPLES_NXIMAGE_EXTERNINIT=n
 
+#
+# Settings for examples/nxlines
+#
+# CONFIG_EXAMPLES_NXLINES_BUILTIN -- Build the NXLINES example as a "built-in"
+#   that can be executed from the NSH command line
+# CONFIG_EXAMPLES_NXLINES_VPLANE -- The plane to select from the frame-
+#   buffer driver for use in the test.  Default: 0
+# CONFIG_EXAMPLES_NXLINES_DEVNO - The LCD device to select from the LCD
+#   driver for use in the test: Default: 0
+# CONFIG_EXAMPLES_NXLINES_BGCOLOR -- The color of the background.  Default
+#   depends on CONFIG_EXAMPLES_NXLINES_BPP.
+# CONFIG_EXAMPLES_NXLINES_LINEWIDTH - Selects the width of the lines in
+#   pixels (default: 16)
+# CONFIG_EXAMPLES_NXLINES_LINECOLOR -- The color of the lines drawn in the
+#   background window. Default depends on CONFIG_EXAMPLES_NXLINES_BPP.
+# CONFIG_EXAMPLES_NXLINES_BPP -- Pixels per pixel to use.  Valid options
+#   include 2, 4, 8, 16, 24, and 32.  Default is 16.
+# CONFIG_EXAMPLES_NXLINES_EXTERNINIT - The driver for the graphics device on
+#   this platform requires some unusual initialization.  This is the
+#   for, for example, SPI LCD/OLED devices.  If this configuration is
+#   selected, then the platform code must provide an LCD initialization
+#   function.
+#
+CONFIG_EXAMPLES_NXLINES_BUILTIN=n
+CONFIG_EXAMPLES_NXLINES_VPLANE=0
+CONFIG_EXAMPLES_NXLINES_DEVNO=0
+CONFIG_EXAMPLES_NXLINES_BGCOLOR=0x0320
+CONFIG_EXAMPLES_NXLINES_LINEWIDTH=16
+CONFIG_EXAMPLES_NXLINES_LINECOLOR=0xffe0
+CONFIG_EXAMPLES_NXLINES_BPP=16
+CONFIG_EXAMPLES_NXLINES_EXTERNINIT=n
+
 #
 # Stack and heap information
 #
diff --git a/graphics/nxglib/fb/nxglib_filltrapezoid.c b/graphics/nxglib/fb/nxglib_filltrapezoid.c
index 2f16b58edf33a5f06aeaac48bff828c5397fcae9..4f0c2f072cfbcb66867b363b469f211c84f46790 100644
--- a/graphics/nxglib/fb/nxglib_filltrapezoid.c
+++ b/graphics/nxglib/fb/nxglib_filltrapezoid.c
@@ -115,8 +115,8 @@ void NXGL_FUNCNAME(nxgl_filltrapezoid,NXGLIB_SUFFIX)(
 
   /* Get the top run position and the number of rows to draw */
 
-  x1 = trap->top.x1;
-  x2 = trap->top.x2;
+  x1    = trap->top.x1;
+  x2    = trap->top.x2;
 
   /* Calculate the number of rows to render */
 
@@ -133,6 +133,15 @@ void NXGL_FUNCNAME(nxgl_filltrapezoid,NXGLIB_SUFFIX)(
 
   if (y1 < bounds->pt1.y)
     {
+      /* Is the entire trapezoid "above" the clipping window? */
+
+      if (y2 < bounds->pt1.y)
+        {
+          /* Yes.. then do nothing */
+
+          return;
+        }
+
       /* Calculate the x values for the new top run */
 
       int dy = bounds->pt1.y - y1;
@@ -147,6 +156,15 @@ void NXGL_FUNCNAME(nxgl_filltrapezoid,NXGLIB_SUFFIX)(
 
   if (y2 > bounds->pt2.y)
     {
+      /* Is the entire trapezoid "below" the clipping window? */
+
+      if (y1 > bounds->pt2.y)
+        {
+          /* Yes.. then do nothing */
+
+          return;
+        }
+
       /* Clip and re-calculate the number of rows to render */
 
       y2     = bounds->pt2.y;
diff --git a/graphics/nxglib/lcd/nxglib_filltrapezoid.c b/graphics/nxglib/lcd/nxglib_filltrapezoid.c
index 0c86110885ed0549df7d8a4eaa12a648775a1402..970bbf829c2c0a4c72b3a277998a8b70e4751957 100644
--- a/graphics/nxglib/lcd/nxglib_filltrapezoid.c
+++ b/graphics/nxglib/lcd/nxglib_filltrapezoid.c
@@ -124,14 +124,23 @@ void NXGL_FUNCNAME(nxgl_filltrapezoid,NXGLIB_SUFFIX)
 
   /* Calculate the slope of the left and right side of the trapezoid */
 
-  dy    = boty - topy;
-  dx1dy = b16divi((botx1 - topx1), dy);
-  dx2dy = b16divi((botx2 - topx2), dy);
+  dy     = boty - topy;
+  dx1dy  = b16divi((botx1 - topx1), dy);
+  dx2dy  = b16divi((botx2 - topx2), dy);
 
   /* Perform vertical clipping */
 
   if (topy < bounds->pt1.y)
     {
+      /* Is the entire trapezoid "above" the clipping window? */
+
+      if (boty < bounds->pt1.y)
+        {
+          /* Yes.. then do nothing */
+
+          return;
+        }
+
       /* Calculate the x values for the new top run */
 
       dy      = bounds->pt1.y - topy;
@@ -145,6 +154,15 @@ void NXGL_FUNCNAME(nxgl_filltrapezoid,NXGLIB_SUFFIX)
 
   if (boty > bounds->pt2.y)
     {
+      /* Is the entire trapezoid "below" the clipping window? */
+
+      if (topy > bounds->pt2.y)
+        {
+          /* Yes.. then do nothing */
+
+          return;
+        }
+
       /* Calculate the x values for the new bottom run */
 
       dy      = boty - bounds->pt2.y;
diff --git a/graphics/nxglib/nxglib_runoffset.c b/graphics/nxglib/nxglib_runoffset.c
index 31d0dd163e09b308100e3e3a67560497a01a103a..f66d73674169d0698d37bc03133f0ae991e1d8ed 100644
--- a/graphics/nxglib/nxglib_runoffset.c
+++ b/graphics/nxglib/nxglib_runoffset.c
@@ -70,7 +70,7 @@
  * Name: nxgl_runoffset
  *
  * Description:
- *   Offset the run position by the specified dx, dy values.
+ *   Offset the run position by the specified (integer) dx, dy values.
  *
  ****************************************************************************/
 
@@ -79,7 +79,7 @@ void nxgl_runoffset(FAR struct nxgl_run_s *dest,
                     nxgl_coord_t dx, nxgl_coord_t dy)
 {
   b16_t b16dx = itob16(dx);
-  dest->x1  += b16dx;
-  dest->x2  += b16dx;
-  dest->y   += dy;
+  dest->x1    = src->x1 + b16dx;
+  dest->x2    = src->x2 + b16dx;
+  dest->y     = src->y  + dy;
 }
diff --git a/graphics/nxglib/nxglib_splitline.c b/graphics/nxglib/nxglib_splitline.c
index 7be9cc115b0820affd5a40cf2cea934cfd5fe071..eb2906e3f5ffbf36c66e0a069fa9a3dc8199e87b 100644
--- a/graphics/nxglib/nxglib_splitline.c
+++ b/graphics/nxglib/nxglib_splitline.c
@@ -112,15 +112,16 @@ int nxgl_splitline(FAR struct nxgl_vector_s *vector,
                    nxgl_coord_t linewidth)
 {
   struct nxgl_vector_s line;
-  struct nxgl_point_s pt;
   nxgl_coord_t iheight;
   nxgl_coord_t iwidth;
+  nxgl_coord_t iy;
   nxgl_coord_t triheight;
-  nxgl_coord_t adjwidth;
-  nxgl_coord_t xoffset;
-  nxgl_coord_t halfoffset;
   nxgl_coord_t halfheight;
+  b16_t adjwidth;
+  b16_t xoffset;
+  b16_t halfoffset;
   b16_t angle;
+  b16_t b16x;
 
   /* First, check the linewidth */
 
@@ -226,13 +227,17 @@ int nxgl_splitline(FAR struct nxgl_vector_s *vector,
 
   angle        = b16atan2(itob16(iheight), itob16(iwidth));
   triheight    = b16toi(linewidth * b16cos(angle));
-  adjwidth     = b16toi(b16divb16(itob16(linewidth), b16sin(angle)));
-  xoffset      = (linewidth * linewidth + (adjwidth >> 1)) / adjwidth;
+  adjwidth     = b16divb16(itob16(linewidth), b16sin(angle));
+  xoffset      = itob16(linewidth * linewidth);
+  xoffset      = b16divb16(xoffset, adjwidth);
 
   halfoffset   = (xoffset   >> 1);
   halfheight   = (triheight >> 1);
 
-  /* Return the top triangle (if there is one) */
+  /* Return the top triangle (if there is one).  NOTE that the horizontal
+   * (z) positions are represented with 16 bits of fraction.  The vertical
+   * (y) positions, on the other hand, are integer.
+   */
 
   if (triheight > 0)
     {
@@ -240,53 +245,53 @@ int nxgl_splitline(FAR struct nxgl_vector_s *vector,
         {
           /* Line is going "south east" */
 
-          pt.x = line.pt1.x - halfoffset;
-          pt.y = line.pt1.y + halfheight;
+          b16x = itob16(line.pt1.x) - halfoffset;
+          iy   = line.pt1.y + halfheight;
 
-          traps[0].top.x1 = pt.x + xoffset;
+          traps[0].top.x1 = b16x + xoffset;
           traps[0].top.x2 = traps[0].top.x1;
-          traps[0].top.y  = pt.y - triheight + 1;
-          traps[0].bot.x1 = pt.x;
-          traps[0].bot.x2 = pt.x + adjwidth - 1;
-          traps[0].bot.y  = pt.y;
-
-          pt.x = line.pt2.x + halfoffset;
-          pt.y = line.pt2.y - halfheight;
-
-          traps[2].top.x1 = pt.x - adjwidth + 1;
-          traps[2].top.x2 = pt.x;
-          traps[2].top.y  = pt.y;
-          traps[2].bot.x1 = pt.x - xoffset;
+          traps[0].top.y  = iy - triheight + 1;
+          traps[0].bot.x1 = b16x;
+          traps[0].bot.x2 = b16x + adjwidth - b16ONE;
+          traps[0].bot.y  = iy;
+
+          b16x = itob16(line.pt2.x) + halfoffset;
+          iy   = itob16(line.pt2.y) - halfheight;
+
+          traps[2].top.x1 = b16x - adjwidth + b16ONE;
+          traps[2].top.x2 = b16x;
+          traps[2].top.y  = iy;
+          traps[2].bot.x1 = b16x - xoffset;
           traps[2].bot.x2 = traps[2].bot.x1;
-          traps[2].bot.y  = pt.y + triheight - 1;
+          traps[2].bot.y  = iy + triheight - 1;
         }
       else
         {
           /* Line is going "south west" */
 
-          pt.x = line.pt1.x + halfoffset;
-          pt.y = line.pt1.y + halfheight;
+          b16x = itob16(line.pt1.x) + halfoffset;
+          iy   = itob16(line.pt1.y) + halfheight;
 
-          traps[0].top.x1 = pt.x - xoffset;
+          traps[0].top.x1 = b16x - xoffset;
           traps[0].top.x2 = traps[0].top.x1;
-          traps[0].top.y  = pt.y - triheight + 1;
-          traps[0].bot.x1 = pt.x - adjwidth + 1;
-          traps[0].bot.x2 = pt.x;
-          traps[0].bot.y  = pt.y;
-
-          pt.x = line.pt2.x - halfoffset;
-          pt.y = line.pt2.y - halfheight;
-
-          traps[2].top.x1 = pt.x;
-          traps[2].top.x2 = pt.x + adjwidth - 1;
-          traps[2].top.y  = pt.y;
-          traps[2].bot.x1 = pt.x + xoffset;
+          traps[0].top.y  = iy - triheight + 1;
+          traps[0].bot.x1 = b16x - adjwidth + b16ONE;
+          traps[0].bot.x2 = b16x;
+          traps[0].bot.y  = iy;
+
+          b16x = itob16(line.pt2.x) - halfoffset;
+          iy   = itob16(line.pt2.y) - halfheight;
+
+          traps[2].top.x1 = b16x;
+          traps[2].top.x2 = b16x + adjwidth - b16ONE;
+          traps[2].top.y  = iy;
+          traps[2].bot.x1 = b16x + xoffset;
           traps[2].bot.x2 = traps[2].bot.x1;
-          traps[2].bot.y  = pt.y + triheight - 1;
+          traps[2].bot.y  = iy + triheight - 1;
         }
 
       /* The center parallelogram is the horizontal edge of each triangle.
-       * Note the minor inefficency: that horizontal edge is drawn twice.
+       * Note the minor inefficency: that horizontal edges are drawn twice.
        */
 
       traps[1].top.x1 = traps[0].bot.x1;
@@ -304,11 +309,11 @@ int nxgl_splitline(FAR struct nxgl_vector_s *vector,
    * bottom.  Just return the center parallelogram.
    */
 
-  traps[1].top.x1 = line.pt1.x - halfoffset;
+  traps[1].top.x1 = itob16(line.pt1.x) - halfoffset;
   traps[1].top.x2 = traps[1].top.x1 + adjwidth - 1;
   traps[1].top.y  = line.pt1.y;
  
-  traps[1].bot.x1 = line.pt2.x - halfoffset;
+  traps[1].bot.x1 = itob16(line.pt2.x) -  halfoffset;
   traps[1].bot.x2 = traps[1].bot.x1 + adjwidth - 1;
   traps[1].bot.y  = line.pt2.y;
   return 1;