diff --git a/ChangeLog b/ChangeLog
index 2171a4066c009d028299fa3faf75f5b1d2ce5d34..99ae506e2a111a6945f8ea976f9e8e4e1526a0b7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1962,4 +1962,7 @@
 	* lib/math/lib_b16atan2.c:  Add a fixed precision atan2() function
 	* graphics/nxglib/nxglib_splitline.c: Add logic to divide a wide line into
 	  trapezoidal components.
+	* graphics/nxmu/nx_drawline.c, graphics/nxsu/nx_drawline.c,
+	  graphics/nxtk/nxtk_drawlinewindow.c, graphics/nxtk/nxtk_drawlinetoolbar.c:
+	  Add new line drawing interfaces (untested).
 
diff --git a/Documentation/NXGraphicsSubsystem.html b/Documentation/NXGraphicsSubsystem.html
index 681c2bc2836dbef186ebface526e9c9e0abe9b56..a8367c607583bd147feaaccb1e555d18e3be9c5e 100644
--- a/Documentation/NXGraphicsSubsystem.html
+++ b/Documentation/NXGraphicsSubsystem.html
@@ -12,7 +12,7 @@
       <h1><big><font color="#3c34ec">
         <i>NX Graphics Subsystem</i>
       </font></big></h1>
-      <p>Last Updated: July 27 2011</p>
+      <p>Last Updated: August 2, 2011</p>
     </td>
   </tr>
 </table>
@@ -76,7 +76,8 @@
         <i>2.2.15 <a href="#nxglruncopy"><code>nxgl_runcopy()</code></a></i><br>
         <i>2.2.16 <a href="#nxgltrapoffset"><code>nxgl_trapoffset()</code></a></i><br>
         <i>2.2.17 <a href="#nxgltrapcopy"><code>nxgl_trapcopy()</code></a></i><br>
-        <i>2.2.18 <a href="#nxglcolorcopy"><code>nxgl_colorcopy</code></a></i>
+        <i>2.2.18 <a href="#nxglcolorcopy"><code>nxgl_colorcopy</code></a></i><br>
+        <i>2.2.19 <a href="#nxglsplitline"><code>nxgl_splitline</code></a></i>
       </ul>
      </p>
    <p>
@@ -113,11 +114,12 @@
         <i>2.3.19 <a href="#nxlower"><code>nx_lower()</code></a></i><br>
         <i>2.3.20 <a href="#nxfill"><code>nx_fill()</code></a></i><br>
         <i>2.3.21 <a href="#nxfilltrapezoid"><code>nx_filltrapezoid()</code></a></i><br>
-        <i>2.3.22 <a href="#nxglrgb2yuv"><code>nx_setbgcolor()</code></a></i><br>
-        <i>2.3.23 <a href="#nxmove"><code>nx_move()</code></a></i><br>
-        <i>2.3.24 <a href="#nxbitmap"><code>nx_bitmap()</code></a></i><br>
-        <i>2.3.25 <a href="#nxkbdin"><code>nx_kbdin()</code></a></i><br>
-        <i>2.3.26 <a href="#nxmousein"><code>nx_mousein()</code></a></i><br>
+        <i>2.3.22 <a href="#nxdrawline"><code>nx_drawline()</code></a></i><br>
+        <i>2.3.23 <a href="#nxglrgb2yuv"><code>nx_setbgcolor()</code></a></i><br>
+        <i>2.3.24 <a href="#nxmove"><code>nx_move()</code></a></i><br>
+        <i>2.3.25 <a href="#nxbitmap"><code>nx_bitmap()</code></a></i><br>
+        <i>2.3.26 <a href="#nxkbdin"><code>nx_kbdin()</code></a></i><br>
+        <i>2.3.27 <a href="#nxmousein"><code>nx_mousein()</code></a></i><br>
      </ul>
    </p>
   </td>
@@ -137,14 +139,16 @@
         <i>2.4.8 <a href="#nxtklower"><code>nxtk_lower()</code></a></i><br>
         <i>2.4.9 <a href="#nxtkfillwindow"><code>nxtk_fillwindow()</code></a></i><br>
         <i>2.4.10 <a href="#nxtkfilltrapwindow"><code>nxtk_filltrapwindow()</code></a></i><br>
-        <i>2.4.11 <a href="#nxtkmovewindow"><code>nxtk_movewindow()</code></a></i><br>
-        <i>2.4.12 <a href="#nxtkbitmapwindow"><code>nxtk_bitmapwindow()</code></a></i><br>
-        <i>2.4.13 <a href="#nxtkopentoolbar"><code>nxtk_opentoolbar()</code></a></i><br>
-        <i>2.4.14 <a href="#nxtkclosetoolbar"><code>nxtk_closetoolbar()</code></a></i><br>
-        <i>2.4.15 <a href="#nxtkfilltoolbar"><code>nxtk_filltoolbar()</code></a></i><br>
-        <i>2.4.16 <a href="#nxtkfilltraptoolbar"><code>nxtk_filltraptoolbar()</code></a></i><br>
-        <i>2.4.17 <a href="#nxtkmovetoolbar"><code>nxtk_movetoolbar()</code></a></i><br>
-        <i>2.4.18 <a href="#nxtkbitmaptoolbar"><code>nxtk_bitmaptoolbar()</code></a></i>
+        <i>2.4.11 <a href="#nxtkdrawlinewindow"><code>nxtk_drawlinewindow()</code></a></i><br>
+        <i>2.4.12 <a href="#nxtkmovewindow"><code>nxtk_movewindow()</code></a></i><br>
+        <i>2.4.13 <a href="#nxtkbitmapwindow"><code>nxtk_bitmapwindow()</code></a></i><br>
+        <i>2.4.14 <a href="#nxtkopentoolbar"><code>nxtk_opentoolbar()</code></a></i><br>
+        <i>2.4.15 <a href="#nxtkclosetoolbar"><code>nxtk_closetoolbar()</code></a></i><br>
+        <i>2.4.16 <a href="#nxtkfilltoolbar"><code>nxtk_filltoolbar()</code></a></i><br>
+        <i>2.4.17 <a href="#nxtkfilltraptoolbar"><code>nxtk_filltraptoolbar()</code></a></i><br>
+        <i>2.4.18 <a href="#nxtkdrawlinetoolbar"><code>nxtk_drawlinetoolbar()</code></a></i><br>
+        <i>2.4.19 <a href="#nxtkmovetoolbar"><code>nxtk_movetoolbar()</code></a></i><br>
+        <i>2.4.20 <a href="#nxtkbitmaptoolbar"><code>nxtk_bitmaptoolbar()</code></a></i>
      </ul>
    </p>
    <p>
@@ -711,7 +715,7 @@ void nxgl_trapoffset(FAR struct nxgl_trapezoid_s *dest,
   Offset the trapezoid position by the specified <code>dx</code>, <code>dy</code> values.
 </p>
 
-<h3>2.2.1 <a name="nxgltrapcopy"><code>nxgl_trapcopy()</code></a></h3>
+<h3>2.2.17 <a name="nxgltrapcopy"><code>nxgl_trapcopy()</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -724,7 +728,7 @@ void nxgl_trapcopy(FAR struct nxgl_trapezoid_s *dest,
   assignments because some compilers are not good at that.
 </p>
 
-<h3>2.2.1 <a name="nxglcolorcopy"><code>nxgl_colorcopy</code></a></h3>
+<h3>2.2.18 <a name="nxglcolorcopy"><code>nxgl_colorcopy</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -738,6 +742,70 @@ nxgl_colorcopy(nxgl_mxpixel_t dest[CONFIG_NX_NPLANES],
   in one place.
 </p>
 
+<h3>2.2.19 <a name="nxglsplitline"><code>nxgl_splitline</code></a></h3>
+
+<p><b>Function Prototype:</b></p>
+<ul><pre>
+#include &lt;nuttx/nx/nxglib.h&gt;
+int nxgl_splitline(FAR struct nxgl_vector_s *vector, FAR struct nxgl_trapezoid_s *traps,
+                   FAR struct nxgl_rect_s *rect, nxgl_coord_t linewidth);
+</pre></ul>
+<p>
+  <b>Description:</b>
+  In the general case, a line with width can be represented as a parallelogram with a triangle at the top and bottom.
+  Triangles and parallelograms are both degenerate versions of a trapeziod.
+  This function breaks a wide line into triangles and trapezoids. 
+  This function also detects other degenerate cases:
+</p>
+<ol>
+  <li>
+    If <code>y1 == y2</code> then the line is horizontal and is better represented as a rectangle.
+  </li>
+  <li>
+    If <code>x1 == x2</code> then the line is vertical and also better represented as a rectangle.
+  </li>
+  <li>
+    If the width of the line is 1, then there are no triangles at the top and bottome
+    (this may also be the case if the width is narrow and the line is near vertical).
+  </li>
+  <li>
+     If the line is oriented is certain angles, it may consist only of the upper and lower triangles with no trapezoid in between.
+     In this case, 3 trapezoids will be returned, but traps[1] will be  degenerate.
+  </li>
+</ol>
+<p>
+   <b>Input parameters</b>:
+<p>
+<ul><dl>
+   <dt><code>vector</code>
+     <dd>A pointer to the vector described the line to be drawn.
+   <dt><code>traps</code>
+     <dd>A pointer to a array of trapezoids (size 3).
+   <dt><code>rect</code>
+    <dd> A pointer to a rectangle.
+</dl></ul>
+<p>
+  <b>Returned value</b>:
+</p>
+<ul>
+  <p>
+    <code>0</code>: Line successfully broken up into three trapezoids. 
+    Values in <code>traps[0]</code>, <code>traps[1]</code>, and <code>traps[2]</code> are valid.
+  </p>
+  <p>
+    <code>1</code>: Line successfully represented by one trapezoid.
+    Value in <code>traps[1]</code> is valid.
+  </p>
+  <p>
+     <code>2</code>: Line successfully represented by one rectangle.
+     Value in <code>rect </code>is valid
+  </p>
+  <p>
+    <code>&lt;0</code>: On errors, a negated <code>errno</code> value is returned.
+  </p>
+  <p>
+</ul>
+
 <h2>2.3 <a name="nx2">NX</a></h2>
 
 <h3>2.3.1 <a name="nxppdefs">Pre-Processor Definitions</a></h3>
@@ -1581,7 +1649,43 @@ int nx_filltrapezoid(NXWINDOW hwnd, FAR const struct nxgl_rect_s *clip,
   <code>ERROR</code> on failure with <code>errno</code> set appropriately
 </p>
 
-<h3>2.3.22 <a name="nxglrgb2yuv"><code>nx_setbgcolor()</code></a></h3>
+<h3>2.3.22 <a name="nxdrawline"><code>nx_drawline()</code></a></h3>
+<p><b>Function Prototype:</b></p>
+<ul><pre>
+#include &lt;nuttx/nx/nxglib.h&gt;
+#include &lt;nuttx/nx/nx.h&gt;
+
+int nx_drawline(NXWINDOW hwnd, FAR struct nxgl_vector_s *vector,
+               nxgl_coord_t width, nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
+</pre></ul>
+<p>
+  <b>Description:</b>
+  Fill the specified trapezoidal region in the window with the specified color.
+  Fill the specified line in the window with the specified color.
+  This is simply a wrapper that uses <code>nxgl_splitline()</code> to break the line into
+  trapezoids and then calls <code>nx_filltrapezoid()</code> to render the line.
+</p>
+<p>
+  <b>Input Parameters:</b>
+  <ul><dl>
+    <dt><code>hwnd</code>
+      <dd>The handle returned by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>
+        or <a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>
+    <dt><code>vector</code>
+      <dd>Describes the line to be drawn.
+    <dt><code>width</code>
+      <dd>The width of the line
+    <dt><code>color</code>
+      <dd>The color to use to fill the line
+  </dl></ul>
+</p>
+<p>
+  <b>Returned Value:</b>
+  <code>OK</code> on success;
+  <code>ERROR</code> on failure with <code>errno</code> set appropriately
+</p>
+
+<h3>2.3.23 <a name="nxglrgb2yuv"><code>nx_setbgcolor()</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -1609,7 +1713,7 @@ int nx_setbgcolor(NXHANDLE handle,
   <code>ERROR</code> on failure with <code>errno</code> set appropriately
 </p>
 
-<h3>2.3.23 <a name="nxmove"><code>nx_move()</code></a></h3>
+<h3>2.3.24 <a name="nxmove"><code>nx_move()</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -1640,7 +1744,7 @@ int nx_move(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
   <code>ERROR</code> on failure with <code>errno</code> set appropriately
 </p>
 
-<h3>2.3.24 <a name="nxbitmap"><code>nx_bitmap()</code></a></h3>
+<h3>2.3.25 <a name="nxbitmap"><code>nx_bitmap()</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -1682,7 +1786,7 @@ int nx_bitmap(NXWINDOW hwnd, FAR const struct nxgl_rect_s *dest,
   <code>ERROR</code> on failure with <code>errno</code> set appropriately
 </p>
 
-<h3>2.3.25 <a name="nxkbdin"><code>nx_kbdin()</code></a></h3>
+<h3>2.3.26 <a name="nxkbdin"><code>nx_kbdin()</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -1705,7 +1809,7 @@ int nx_kbdin(NXHANDLE handle, uint8_t nch, FAR const uint8_t *ch);
   <code>ERROR</code> on failure with <code>errno</code> set appropriately
 </p>
 
-<h3>2.3.26 <a name="nxmousein"><code>nx_mousein()</code></a></h3>
+<h3>2.3.27 <a name="nxmousein"><code>nx_mousein()</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -2061,7 +2165,44 @@ int nxtk_filltrapwindow(NXTKWINDOW hfwnd,
   <code>ERROR</code> on failure with <code>errno</code> set appropriately
 </p>
 
-<h3>2.4.11 <a name="nxtkmovewindow"><code>nxtk_movewindow()</code></a></h3>
+<h3>2.4.11 <a name="nxtkdrawlinewindow"><code>nxtk_drawlinewindow()</code></a></h3>
+<p><b>Function Prototype:</b></p>
+<ul><pre>
+#include &lt;nuttx/nx/nxglib.h&gt;
+#include &lt;nuttx/nx/nx.h&gt;
+#include &lt;nuttx/nx/nxtk.h&gt;
+
+int nxtk_drawlinewindow(NXTKWINDOW hfwnd, FAR struct nxgl_vector_s *vector,
+                        nxgl_coord_t width, nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
+</pre></ul>
+<p>
+  <b>Description:</b>
+  Fill the specified trapezoidal region in the window with the specified color.
+  Fill the specified line in the window with the specified color.
+  This is simply a wrapper that uses <code>nxgl_splitline()</code> to break the line into
+  trapezoids and then calls <code>nxtk_filltrapwindow()</code> to render the line.
+</p>
+<p>
+  <b>Input Parameters:</b>
+  <ul><dl>
+    <dt><code>hfwnd</code>
+      <dd>A handle previously returned by
+        <a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
+    <dt><code>vector</code>
+      <dd>Describes the line to be drawn.
+    <dt><code>width</code>
+      <dd>The width of the line
+    <dt><code>color</code>
+      <dd>The color to use to fill the line
+  </dl></ul>
+</p>
+<p>
+  <b>Returned Value:</b>
+  <code>OK</code> on success;
+  <code>ERROR</code> on failure with <code>errno</code> set appropriately
+</p>
+
+<h3>2.4.12 <a name="nxtkmovewindow"><code>nxtk_movewindow()</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -2094,7 +2235,7 @@ int nxtk_movewindow(NXTKWINDOW hfwnd, FAR const struct nxgl_rect_s *rect,
   <code>ERROR</code> on failure with <code>errno</code> set appropriately
 </p>
 
-<h3>2.4.12 <a name="nxtkbitmapwindow"><code>nxtk_bitmapwindow()</code></a></h3>
+<h3>2.4.13 <a name="nxtkbitmapwindow"><code>nxtk_bitmapwindow()</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -2139,7 +2280,7 @@ int nxtk_bitmapwindow(NXTKWINDOW hfwnd,
   <code>ERROR</code> on failure with <code>errno</code> set appropriately
 </p>
 
-<h3>2.4.13 <a name="nxtkopentoolbar"><code>nxtk_opentoolbar()</code></a></h3>
+<h3>2.4.14 <a name="nxtkopentoolbar"><code>nxtk_opentoolbar()</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -2174,7 +2315,7 @@ int nxtk_opentoolbar(NXTKWINDOW hfwnd, nxgl_coord_t height,
   <code>ERROR</code> on failure with <code>errno</code> set appropriately
 </p>
 
-<h3>2.4.14 <a name="nxtkclosetoolbar"><code>nxtk_closetoolbar()</code></a></h3>
+<h3>2.4.15 <a name="nxtkclosetoolbar"><code>nxtk_closetoolbar()</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -2203,7 +2344,7 @@ int nxtk_closetoolbar(NXTKWINDOW hfwnd);
   <code>ERROR</code> on failure with <code>errno</code> set appropriately
 </p>
 
-<h3>2.4.15 <a name="nxtkfilltoolbar"><code>nxtk_filltoolbar()</code></a></h3>
+<h3>2.4.16 <a name="nxtkfilltoolbar"><code>nxtk_filltoolbar()</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -2235,7 +2376,7 @@ int nxtk_filltoolbar(NXTKWINDOW hfwnd, FAR const struct nxgl_rect_s *rect,
   <code>ERROR</code> on failure with <code>errno</code> set appropriately
 </p>
 
-<h3>2.4.16 <a name="nxtkfilltraptoolbar"><code>nxtk_filltraptoolbar()</code></a></h3>
+<h3>2.4.17 <a name="nxtkfilltraptoolbar"><code>nxtk_filltraptoolbar()</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -2267,7 +2408,44 @@ int nxtk_filltraptoolbar(NXTKWINDOW hfwnd, FAR const struct nxgl_trapezoid_s *tr
   <code>ERROR</code> on failure with <code>errno</code> set appropriately
 </p>
 
-<h3>2.4.17 <a name="nxtkmovetoolbar"><code>nxtk_movetoolbar()</code></a></h3>
+<h3>2.4.18 <a name="nxtkdrawlinetoolbar"><code>nxtk_drawlinetoolbar()</code></a></h3>
+<p><b>Function Prototype:</b></p>
+<ul><pre>
+#include &lt;nuttx/nx/nxglib.h&gt;
+#include &lt;nuttx/nx/nx.h&gt;
+#include &lt;nuttx/nx/nxtk.h&gt;
+
+int nxtk_drawlinetoolbar(NXTKWINDOW hfwnd, FAR struct nxgl_vector_s *vector,
+                         nxgl_coord_t width, nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
+
+</pre></ul>
+<p>
+  <b>Description:</b>
+  Fill the specified line in the toolbar sub-window with the specified color.
+  This is simply a wrapper that uses <code>nxgl_splitline()</code> to break the line into
+  trapezoids and then calls <code>nxtk_filltraptoolbar()</code> to render the line.
+</p>
+<p>
+  <b>Input Parameters:</b>
+  <ul><dl>
+    <dt><code>hfwnd</code>
+      <dd>A handle previously returned by
+        <a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
+    <dt><code>vector</code>
+      <dd>Describes the line to be drawn.
+    <dt><code>width</code>
+      <dd>The width of the line
+    <dt><code>color</code>
+      <dd>The color to use to fill the line
+  </dl></ul>
+</p>
+<p>
+  <b>Returned Value:</b>
+  <code>OK</code> on success;
+  <code>ERROR</code> on failure with <code>errno</code> set appropriately
+</p>
+
+<h3>2.4.19 <a name="nxtkmovetoolbar"><code>nxtk_movetoolbar()</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -2301,7 +2479,7 @@ int nxtk_movetoolbar(NXTKWINDOW hfwnd, FAR const struct nxgl_rect_s *rect,
   <code>ERROR</code> on failure with <code>errno</code> set appropriately
 </p>
 
-<h3>2.4.18 <a name="nxtkbitmaptoolbar"><code>nxtk_bitmaptoolbar()</code></a></h3>
+<h3>2.4.20 <a name="nxtkbitmaptoolbar"><code>nxtk_bitmaptoolbar()</code></a></h3>
 <p><b>Function Prototype:</b></p>
 <ul><pre>
 #include &lt;nuttx/nx/nxglib.h&gt;
@@ -3139,9 +3317,13 @@ make
   <td><br></td>
   <td align="center" bgcolor="skyblue">YES</td>
 </tr>
+<tr>
+  <td align="left" valign="top"><a href="#nxglsplitline"><code>nxgl_splitline</code></a></td>
+  <td><br></td>
+  <td align="center" bgcolor="skyblue">PART</td>
+</tr>
 </table></center>
 
-
 <center><h2>Table D.2: <a name="nxcbcoverage">NX Server Callbacks Test Coverage</a></h2></center>
 <center><table border="1" width="80%">
 <tr>
@@ -3285,6 +3467,11 @@ make
   <td><br></td>
   <td align="center" bgcolor="lightgrey">NO</td>
 </tr>
+<tr>
+  <td align="left" valign="top"><a href="#nxdrawline"><code>nx_drawline()</code></a></td>
+  <td><br></td>
+  <td align="center" bgcolor="lightgrey">NO</td>
+</tr>
 <tr>
   <td align="left" valign="top"><a href="#nxglrgb2yuv"><code>nx_setbgcolor()</code></a></td>
   <td><br></td>
@@ -3367,6 +3554,11 @@ make
   <td><br></td>
   <td align="center" bgcolor="lightgrey">NO</td>
 </tr>
+<tr>
+  <td align="left" valign="top"><a href="#nxtkdrawlinewindow"><code>nxtk_drawlinewindow()</code></a></td>
+  <td><br></td>
+  <td align="center" bgcolor="skyblue">YES</td>
+</tr>
 <tr>
   <td align="left" valign="top"><a href="#nxtkmovewindow"><code>nxtk_movewindow()</code></a></td>
   <td><br></td>
@@ -3397,6 +3589,11 @@ make
   <td><br></td>
   <td align="center" bgcolor="lightgrey">NO</td>
 </tr>
+<tr>
+  <td align="left" valign="top"><a href="#nxtkdrawlinetoolbar"><code>nxtk_drawlinetoolbar()</code></a></td>
+  <td><br></td>
+  <td align="center" bgcolor="lightgrey">NO</td>
+</tr>
 <tr>
   <td align="left" valign="top"><a href="#nxtkmovetoolbar"><code>nxtk_movetoolbar()</code></a></td>
   <td><br></td>
diff --git a/graphics/nxglib/nxglib_splitline.c b/graphics/nxglib/nxglib_splitline.c
index d4d2899b3a9e42b1d22952aff0ef351c8adecd28..7be9cc115b0820affd5a40cf2cea934cfd5fe071 100644
--- a/graphics/nxglib/nxglib_splitline.c
+++ b/graphics/nxglib/nxglib_splitline.c
@@ -75,7 +75,8 @@
  *   In the general case, a line with width can be represented as a
  *   parallelogram with a triangle at the top and bottom.  Triangles and
  *   parallelograms are both degenerate versions of a trapeziod.  This
- *   function breaks.  This function also detects other degenerate cases:
+ *   function breaks a wide line into triangles and trapezoids.  This
+ *   function also detects other degenerate cases:
  *
  *   1. If y1 == y2 then the line is horizontal and is better represented
  *      as a rectangle.
@@ -83,9 +84,9 @@
  *      as a rectangle.
  *   3. If the width of the line is 1, then there are no triangles at the
  *      top and bottome (this may also be the case if the width is narrow
- *      and the line is near vertical)
+ *      and the line is near vertical).
  *   4. If the line is oriented is certain angles, it may consist only of
- *      the upper and lower triangles with no trapezoid inbetween.  In
+ *      the upper and lower triangles with no trapezoid in between.  In
  *      this case, 3 trapezoids will be returned, but traps[1] will be
  *      degenerate.
  *
diff --git a/graphics/nxmu/Make.defs b/graphics/nxmu/Make.defs
index 64d5fc72427a0d0897ed1fa0c2f6738203605aac..79959a4a0597ebc63ef93901ba919e3e384088f3 100644
--- a/graphics/nxmu/Make.defs
+++ b/graphics/nxmu/Make.defs
@@ -39,7 +39,7 @@ NXAPI_CSRCS	= nx_bitmap.c nx_closewindow.c nx_connect.c nx_disconnect.c \
 		  nx_getposition.c nx_kbdchin.c nx_kbdin.c nx_lower.c \
 		  nx_mousein.c nx_move.c nx_openwindow.c nx_raise.c \
 		  nx_releasebkgd.c nx_requestbkgd.c nx_setsize.c \
-		  nx_setbgcolor.c nx_setposition.c
+		  nx_setbgcolor.c nx_setposition.c nx_drawline.c
 NXMU_CSRCS	= nxmu_constructwindow.c nxmu_kbdin.c nxmu_mouse.c \
 		  nxmu_openwindow.c nxmu_redrawreq.c nxmu_releasebkgd.c \
 		  nxmu_requestbkgd.c nxmu_reportposition.c nxmu_semtake.c \
diff --git a/graphics/nxmu/nx_drawline.c b/graphics/nxmu/nx_drawline.c
new file mode 100644
index 0000000000000000000000000000000000000000..0267d8058b0a779190d57ba499daebd6825dd04e
--- /dev/null
+++ b/graphics/nxmu/nx_drawline.c
@@ -0,0 +1,136 @@
+/****************************************************************************
+ * graphics/nxmu/nx_drawline.c
+ *
+ *   Copyright (C) 2011 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <debug.h>
+#include <errno.h>
+
+#include <nuttx/nx/nxglib.h>
+#include <nuttx/nx/nx.h>
+
+/****************************************************************************
+ * Pre-Processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: nx_drawline
+ *
+ * Description:
+ *  Fill the specified line in the window with the specified color.  This
+ *  is simply a wrapper that uses nxgl_splitline() to break the line into
+ *  trapezoids and then calls nx_filltrapezoid() to render the line.
+ *
+ * Input Parameters:
+ *   hwnd   - The window handle
+ *   vector - Describes the line to be drawn
+ *   width  - The width of the line
+ *   color  - The color to use to fill the line
+ *
+ * Return:
+ *   OK on success; ERROR on failure with errno set appropriately
+ *
+ ****************************************************************************/
+
+int nx_drawline(NXWINDOW hwnd, FAR struct nxgl_vector_s *vector,
+                nxgl_coord_t width, nxgl_mxpixel_t color[CONFIG_NX_NPLANES])
+{
+  struct nxgl_trapezoid_s trap[3];
+  struct nxgl_rect_s rect;
+  int ret;
+
+#ifdef CONFIG_DEBUG
+  if (!hwnd || !vector || width < 1 || !color)
+    {
+      set_errno(EINVAL);
+      return ERROR;
+    }
+#endif
+
+  ret = nxgl_splitline(vector, trap, &rect, width);
+  switch (ret)
+    {
+      case 0:
+        ret = nx_filltrapezoid(hwnd, NULL, &trap[0], color);
+        if (ret == OK)
+          {
+            ret = nx_filltrapezoid(hwnd, NULL, &trap[1], color);
+            if (ret == OK)
+              {
+                ret = nx_filltrapezoid(hwnd, NULL, &trap[2], color);
+              }
+          }
+        break;
+
+      case 1:
+        ret = nx_filltrapezoid(hwnd, NULL, &trap[1], color);
+        break;
+
+      case 2:
+        ret = nx_fill(hwnd, &rect, color);
+        break;
+
+      default:
+        set_errno(-ret);
+        return ERROR;
+    }
+
+  return ret;
+}
diff --git a/graphics/nxsu/Make.defs b/graphics/nxsu/Make.defs
index af525bea997f6952f978b8aa41949831189ca732..3cddf3a2c5ba650e8510795ffa40fa81a20beae2 100644
--- a/graphics/nxsu/Make.defs
+++ b/graphics/nxsu/Make.defs
@@ -38,6 +38,6 @@ NXAPI_CSRCS	= nx_bitmap.c nx_close.c nx_closewindow.c nx_fill.c \
 		  nx_filltrapezoid.c nx_getposition.c nx_kbdchin.c  \
 		  nx_kbdin.c nx_lower.c nx_mousein.c nx_move.c nx_open.c \
 		  nx_openwindow.c nx_raise.c nx_releasebkgd.c nx_requestbkgd.c \
-		  nx_setsize.c nx_setbgcolor.c nx_setposition.c
+		  nx_setsize.c nx_setbgcolor.c nx_setposition.c nx_drawline.c
 NXSU_CSRCS	= nxsu_constructwindow.c nxsu_redrawreq.c nxsu_reportposition.c
 NX_CSRCS	= $(NXAPI_CSRCS) $(NXSU_CSRCS)
diff --git a/graphics/nxsu/nx_drawline.c b/graphics/nxsu/nx_drawline.c
new file mode 100644
index 0000000000000000000000000000000000000000..ca4ddaf188af8c53bd44675bad5608c10bc05eff
--- /dev/null
+++ b/graphics/nxsu/nx_drawline.c
@@ -0,0 +1,136 @@
+/****************************************************************************
+ * graphics/nxsu/nx_drawline.c
+ *
+ *   Copyright (C) 2011 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <debug.h>
+#include <errno.h>
+
+#include <nuttx/nx/nxglib.h>
+#include <nuttx/nx/nx.h>
+
+/****************************************************************************
+ * Pre-Processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: nx_drawline
+ *
+ * Description:
+ *  Fill the specified line in the window with the specified color.  This
+ *  is simply a wrapper that uses nxgl_splitline() to break the line into
+ *  trapezoids and then calls nx_filltrapezoid() to render the line.
+ *
+ * Input Parameters:
+ *   hwnd   - The window handle
+ *   vector - Describes the line to be drawn
+ *   width  - The width of the line
+ *   color  - The color to use to fill the line
+ *
+ * Return:
+ *   OK on success; ERROR on failure with errno set appropriately
+ *
+ ****************************************************************************/
+
+int nx_drawline(NXWINDOW hwnd, FAR struct nxgl_vector_s *vector,
+                nxgl_coord_t width, nxgl_mxpixel_t color[CONFIG_NX_NPLANES])
+{
+  struct nxgl_trapezoid_s trap[3];
+  struct nxgl_rect_s rect;
+  int ret;
+
+#ifdef CONFIG_DEBUG
+  if (!hwnd || !vector || width < 1 || !color)
+    {
+      set_errno(EINVAL);
+      return ERROR;
+    }
+#endif
+
+  ret = nxgl_splitline(vector, trap, &rect, width);
+  switch (ret)
+    {
+      case 0:
+        ret = nx_filltrapezoid(hwnd, NULL, &trap[0], color);
+        if (ret == OK)
+          {
+            ret = nx_filltrapezoid(hwnd, NULL, &trap[1], color);
+            if (ret == OK)
+              {
+                ret = nx_filltrapezoid(hwnd, NULL, &trap[2], color);
+              }
+          }
+        break;
+
+      case 1:
+        ret = nx_filltrapezoid(hwnd, NULL, &trap[1], color);
+        break;
+
+      case 2:
+        ret = nx_fill(hwnd, &rect, color);
+        break;
+
+      default:
+        set_errno(-ret);
+        return ERROR;
+    }
+
+  return ret;
+}
diff --git a/graphics/nxtk/Make.defs b/graphics/nxtk/Make.defs
index 67c9b63ae057eea33d190251b098b1a1639020f2..736d91003c9cb867600ae4148be94a350e9a84aa 100644
--- a/graphics/nxtk/Make.defs
+++ b/graphics/nxtk/Make.defs
@@ -1,7 +1,7 @@
 ############################################################################
 # graphics/nxtk/Make.defs
 #
-#   Copyright (C) 2008 Gregory Nutt. All rights reserved.
+#   Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved.
 #   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
 #
 # Redistribution and use in source and binary forms, with or without
@@ -37,8 +37,10 @@ NXTK_ASRCS	=
 NXTKWIN_CSRCS	= nxtk_openwindow.c nxtk_closewindow.c nxtk_getposition.c \
 		  nxtk_setposition.c nxtk_setsize.c nxtk_raise.c nxtk_lower.c \
 		  nxtk_fillwindow.c nxtk_filltrapwindow.c nxtk_movewindow.c \
-		  nxtk_bitmapwindow.c nxtk_events.c nxtk_setsubwindows.c
+		  nxtk_bitmapwindow.c nxtk_events.c nxtk_setsubwindows.c \
+		  nxtk_drawlinewindow.c
 NXTKTB_CSRCS	= nxtk_opentoolbar.c nxtk_closetoolbar.c nxtk_filltoolbar.c \
-		  nxtk_filltraptoolbar.c nxtk_movetoolbar.c nxtk_bitmaptoolbar.c
+		  nxtk_filltraptoolbar.c nxtk_movetoolbar.c nxtk_bitmaptoolbar.c \
+		  nxtk_drawlinetoolbar.c
 NXTK_CSRCS	= $(NXTKWIN_CSRCS) $(NXTKTB_CSRCS) nxtk_subwindowclip.c \
 		  nxtk_containerclip.c nxtk_subwindowmove.c nxtk_drawframe.c
diff --git a/graphics/nxtk/nxtk_drawlinetoolbar.c b/graphics/nxtk/nxtk_drawlinetoolbar.c
new file mode 100644
index 0000000000000000000000000000000000000000..4af8b373271b058a2327d2fb0af9daefe0655d3f
--- /dev/null
+++ b/graphics/nxtk/nxtk_drawlinetoolbar.c
@@ -0,0 +1,139 @@
+/****************************************************************************
+ * graphics/nxtk/nxtk_drawlinetoolbar.c
+ *
+ *   Copyright (C) 2011 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <debug.h>
+#include <errno.h>
+
+#include <nuttx/nx/nxglib.h>
+#include <nuttx/nx/nx.h>
+#include <nuttx/nx/nxtk.h>
+
+/****************************************************************************
+ * Pre-Processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: nxtk_drawlinetoolbar
+ *
+ * Description:
+ *  Fill the specified line in the toolbar sub-window with the specified
+ *  color.  This is simply a wrapper that uses nxgl_splitline() to break the
+ *  line into trapezoids and then calls nxtk_filltrapwindow() to render the
+ *  line.
+ *
+ * Input Parameters:
+ *   hfwnd - The window handle returned by nxtk_openwindow
+ *   vector - Describes the line to be drawn
+ *   width  - The width of the line
+ *   color  - The color to use to fill the line
+ *
+ * Return:
+ *   OK on success; ERROR on failure with errno set appropriately
+ *
+ ****************************************************************************/
+
+int nxtk_drawlinetoolbar(NXTKWINDOW hfwnd,  FAR struct nxgl_vector_s *vector,
+                         nxgl_coord_t width, nxgl_mxpixel_t color[CONFIG_NX_NPLANES])
+
+{  
+  struct nxgl_trapezoid_s trap[3];
+  struct nxgl_rect_s rect;
+  int ret;
+
+#ifdef CONFIG_DEBUG
+  if (!hfwnd || !vector || width < 1 || !color)
+    {
+      set_errno(EINVAL);
+      return ERROR;
+    }
+#endif
+
+  ret = nxgl_splitline(vector, trap, &rect, width);
+  switch (ret)
+    {
+      case 0:
+        ret = nxtk_filltraptoolbar(hfwnd, &trap[0], color);
+        if (ret == OK)
+          {
+            ret = nxtk_filltraptoolbar(hfwnd, &trap[1], color);
+            if (ret == OK)
+              {
+                ret = nxtk_filltraptoolbar(hfwnd, &trap[2], color);
+              }
+          }
+        break;
+
+      case 1:
+        ret = nxtk_filltraptoolbar(hfwnd, &trap[1], color);
+         break;
+
+      case 2:
+         ret = nxtk_filltoolbar(hfwnd, &rect, color);
+         break;
+
+      default:
+         set_errno(EINVAL);
+         return ERROR;
+    }
+
+  return ret;
+}
diff --git a/graphics/nxtk/nxtk_drawlinewindow.c b/graphics/nxtk/nxtk_drawlinewindow.c
new file mode 100644
index 0000000000000000000000000000000000000000..2dfd7e8452169d9d9306f8dbb9c49dd51933ab1a
--- /dev/null
+++ b/graphics/nxtk/nxtk_drawlinewindow.c
@@ -0,0 +1,138 @@
+/****************************************************************************
+ * graphics/nxtk/nxtk_drawlinewindow.c
+ *
+ *   Copyright (C) 2011 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <debug.h>
+#include <errno.h>
+
+#include <nuttx/nx/nxglib.h>
+#include <nuttx/nx/nx.h>
+#include <nuttx/nx/nxtk.h>
+
+/****************************************************************************
+ * Pre-Processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: nxtk_drawlinewindow
+ *
+ * Description:
+ *  Fill the specified line in the window with the specified color.  This
+ *  is simply a wrapper that uses nxgl_splitline() to break the line into
+ *  trapezoids and call calls nxtk_filltrapwindow() to render the line.
+ *
+ * Input Parameters:
+ *   hfwnd - The window handle returned by nxtk_openwindow
+ *   vector - Describes the line to be drawn
+ *   width  - The width of the line
+ *   color  - The color to use to fill the line
+ *
+ * Return:
+ *   OK on success; ERROR on failure with errno set appropriately
+ *
+ ****************************************************************************/
+
+int nxtk_drawlinewindow(NXTKWINDOW hfwnd, FAR struct nxgl_vector_s *vector,
+                        nxgl_coord_t width, nxgl_mxpixel_t color[CONFIG_NX_NPLANES])
+
+{  
+  struct nxgl_trapezoid_s trap[3];
+  struct nxgl_rect_s rect;
+  int ret;
+
+#ifdef CONFIG_DEBUG
+  if (!hfwnd || !vector || width < 1 || !color)
+    {
+      set_errno(EINVAL);
+      return ERROR;
+    }
+#endif
+
+  ret = nxgl_splitline(vector, trap, &rect, width);
+  switch (ret)
+    {
+      case 0:
+        ret = nxtk_filltrapwindow(hfwnd, &trap[0], color);
+        if (ret == OK)
+          {
+            ret = nxtk_filltrapwindow(hfwnd, &trap[1], color);
+            if (ret == OK)
+              {
+                ret = nxtk_filltrapwindow(hfwnd, &trap[2], color);
+              }
+          }
+        break;
+
+      case 1:
+        ret = nxtk_filltrapwindow(hfwnd, &trap[1], color);
+         break;
+
+      case 2:
+         ret = nxtk_fillwindow(hfwnd, &rect, color);
+         break;
+
+      default:
+         set_errno(EINVAL);
+         return ERROR;
+    }
+
+  return ret;
+}
diff --git a/include/nuttx/nx/nx.h b/include/nuttx/nx/nx.h
index c031a3bf95cafec3107a21c0fd3eb77394fe4de5..66163e6793eedd0e1895c1db21828e1099a0b5e4 100644
--- a/include/nuttx/nx/nx.h
+++ b/include/nuttx/nx/nx.h
@@ -611,6 +611,28 @@ EXTERN int nx_filltrapezoid(NXWINDOW hwnd, FAR const struct nxgl_rect_s *clip,
                             FAR const struct nxgl_trapezoid_s *trap,
                             nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
 
+/****************************************************************************
+ * Name: nx_drawline
+ *
+ * Description:
+ *  Fill the specified line in the window with the specified color.  This
+ *  is simply a wrapper that uses nxgl_splitline() to break the line into
+ *  trapezoids and then calls nx_filltrapezoid() to render the line.
+ *
+ * Input Parameters:
+ *   hwnd   - The window handle
+ *   vector - Describes the line to be drawn
+ *   width  - The width of the line
+ *   color  - The color to use to fill the line
+ *
+ * Return:
+ *   OK on success; ERROR on failure with errno set appropriately
+ *
+ ****************************************************************************/
+
+EXTERN int nx_drawline(NXWINDOW hwnd, FAR struct nxgl_vector_s *vector,
+                       nxgl_coord_t width, nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
+
 /****************************************************************************
  * Name: nx_setbgcolor
  *
diff --git a/include/nuttx/nx/nxglib.h b/include/nuttx/nx/nxglib.h
index 583eedf5733bef150d29014cd57462e5a66b6e44..c1dc3afc646f77bfcb0d9a74bcbfed9d7b411fc9 100644
--- a/include/nuttx/nx/nxglib.h
+++ b/include/nuttx/nx/nxglib.h
@@ -595,7 +595,8 @@ EXTERN void nxgl_colorcopy(nxgl_mxpixel_t dest[CONFIG_NX_NPLANES],
  *   In the general case, a line with width can be represented as a
  *   parallelogram with a triangle at the top and bottom.  Triangles and
  *   parallelograms are both degenerate versions of a trapeziod.  This
- *   function breaks.  This function also detects other degenerate cases:
+ *   function breaks a wide line into triangles and trapezoids.  This
+ *   function also detects other degenerate cases:
  *
  *   1. If y1 == y2 then the line is horizontal and is better represented
  *      as a rectangle.
@@ -603,9 +604,9 @@ EXTERN void nxgl_colorcopy(nxgl_mxpixel_t dest[CONFIG_NX_NPLANES],
  *      as a rectangle.
  *   3. If the width of the line is 1, then there are no triangles at the
  *      top and bottome (this may also be the case if the width is narrow
- *      and the line is near vertical)
+ *      and the line is near vertical).
  *   4. If the line is oriented is certain angles, it may consist only of
- *      the upper and lower triangles with no trapezoid inbetween.  In
+ *      the upper and lower triangles with no trapezoid in between.  In
  *      this case, 3 trapezoids will be returned, but traps[1] will be
  *      degenerate.
  *
diff --git a/include/nuttx/nx/nxtk.h b/include/nuttx/nx/nxtk.h
index 76416ecbb937f92ef7c273ac11a4879fe8448438..d0a4dcb867b1242d47629a030a2ef17700bf6603 100644
--- a/include/nuttx/nx/nxtk.h
+++ b/include/nuttx/nx/nxtk.h
@@ -240,6 +240,30 @@ EXTERN int nxtk_filltrapwindow(NXTKWINDOW hfwnd,
                                FAR const struct nxgl_trapezoid_s *trap,
                                nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
 
+/****************************************************************************
+ * Name: nxtk_drawlinewindow
+ *
+ * Description:
+ *  Fill the specified line in the window with the specified color.  This
+ *  is simply a wrapper that uses nxgl_splitline() to break the line into
+ *  trapezoids and then calls nxtk_filltrapwindow() to render the line.
+ *
+ * Input Parameters:
+ *   hfwnd - The window handle returned by nxtk_openwindow
+ *   vector - Describes the line to be drawn
+ *   width  - The width of the line
+ *   color  - The color to use to fill the line
+ *
+ * Return:
+ *   OK on success; ERROR on failure with errno set appropriately
+ *
+ ****************************************************************************/
+
+EXTERN int nxtk_drawlinewindow(NXTKWINDOW hfwnd,
+                              FAR struct nxgl_vector_s *vector,
+                              nxgl_coord_t width,
+                              nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
+
 /****************************************************************************
  * Name: nxtk_movewindow
  *
@@ -365,6 +389,31 @@ EXTERN int nxtk_filltoolbar(NXTKWINDOW hfwnd, FAR const struct nxgl_rect_s *rect
 EXTERN int nxtk_filltraptoolbar(NXTKWINDOW hfwnd, FAR const struct nxgl_trapezoid_s *trap,
                                 nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
 
+/****************************************************************************
+ * Name: nxtk_drawlinetoolbar
+ *
+ * Description:
+ *  Fill the specified line in the toolbar sub-window with the specified
+ *  color.  This is simply a wrapper that uses nxgl_splitline() to break the
+ *  line into trapezoids and then calls nxtk_filltrapwindow() to render the
+ *  line.
+ *
+ * Input Parameters:
+ *   hfwnd - The window handle returned by nxtk_openwindow
+ *   vector - Describes the line to be drawn
+ *   width  - The width of the line
+ *   color  - The color to use to fill the line
+ *
+ * Return:
+ *   OK on success; ERROR on failure with errno set appropriately
+ *
+ ****************************************************************************/
+
+EXTERN int nxtk_drawlinetoolbar(NXTKWINDOW hfwnd,
+                                FAR struct nxgl_vector_s *vector,
+                                nxgl_coord_t width,
+                                nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
+
 /****************************************************************************
  * Name: nxtk_movetoolbar
  *