diff --git a/FL/Fl_Widget.H b/FL/Fl_Widget.H
index 60beafc..f144fbe 100644
--- a/FL/Fl_Widget.H
+++ b/FL/Fl_Widget.H
@@ -157,6 +157,7 @@ protected:
         COPIED_TOOLTIP  = 1<<17,  ///< the widget tooltip is internally copied, its destruction is handled by the widget
         FULLSCREEN      = 1<<18,  ///< a fullscreen window (Fl_Window)
         MAC_USE_ACCENTS_MENU = 1<<19, ///< On the Mac OS platform, pressing and holding a key on the keyboard opens an accented-character menu window (Fl_Input_, Fl_Text_Editor)
+        SKIP_TASKBAR    = 1<<20,  ///< window will not show in taskbar (Fl_Window)
         // (space for more flags)
         USERFLAG3       = 1<<29,  ///< reserved for 3rd party extensions
         USERFLAG2       = 1<<30,  ///< reserved for 3rd party extensions
diff --git a/FL/Fl_Window.H b/FL/Fl_Window.H
index 9d94926..75de105 100644
--- a/FL/Fl_Window.H
+++ b/FL/Fl_Window.H
@@ -185,6 +185,19 @@ public:
   */
   virtual void resize(int X,int Y,int W,int H);
   /**
+    Sets whether or not the window will skip the taskbar.
+    The default value is not to skip.  Under many window managers,
+    this will not work after show() has been called.  Certain
+    windows, "modal" windows, or "clear_border" windows, by
+    default will not show in the taskbar.  Call this method
+    after defining the window type to override this behavior.
+    This is also dependent on the windowing driver supporting
+    the behavior, and on underlying OS support.
+  */
+  void skip_taskbar(int t);
+  //* Returns non zero if SKIP_TASKBAR is set
+  unsigned int skip_taskbar() const {return (flags() & SKIP_TASKBAR);}
+  /**
     Sets whether or not the window manager border is around the
     window.  The default value is true. void border(int) can be
     used to turn the border on and off. <I>Under most X window
@@ -196,7 +209,7 @@ public:
     Fast inline function to turn the window manager border
     off. It only works before show() is called.
   */
-  void clear_border()	{set_flag(NOBORDER);}
+  void clear_border()	{set_flag(NOBORDER);set_flag(SKIP_TASKBAR);}
   /** See void Fl_Window::border(int) */
   unsigned int border() const	{return !(flags() & NOBORDER);}
   /** Activates the flags NOBORDER|FL_OVERRIDE */
diff --git a/src/Fl_Window.cxx b/src/Fl_Window.cxx
index f69899f..4cff8a3 100644
--- a/src/Fl_Window.cxx
+++ b/src/Fl_Window.cxx
@@ -536,6 +536,13 @@ void Fl_Window::show() {
   pWindowDriver->show();
 }
 
+void Fl_Window::skip_taskbar(int t) {
+  if (t) {
+    set_flag(SKIP_TASKBAR);
+  } else {
+    clear_flag(SKIP_TASKBAR);
+  }
+}
 void Fl_Window::resize(int X,int Y,int W,int H) {
   pWindowDriver->resize(X, Y, W, H);
 }
diff --git a/src/Fl_Window_fullscreen.cxx b/src/Fl_Window_fullscreen.cxx
index 71695c8..502b98d 100644
--- a/src/Fl_Window_fullscreen.cxx
+++ b/src/Fl_Window_fullscreen.cxx
@@ -23,9 +23,11 @@ void Fl_Window::border(int b) {
   if (b) {
     if (border()) return;
     clear_flag(NOBORDER);
+    clear_flag(SKIP_TASKBAR);
   } else {
     if (!border()) return;
     set_flag(NOBORDER);
+    set_flag(SKIP_TASKBAR);
   }
   pWindowDriver->use_border();
 }
diff --git a/src/Fl_win32.cxx b/src/Fl_win32.cxx
index 37d0e37..6b52575 100644
--- a/src/Fl_win32.cxx
+++ b/src/Fl_win32.cxx
@@ -2028,6 +2028,11 @@ Fl_X *Fl_WinAPI_Window_Driver::makeWindow() {
 	break;
     }
 
+    // Forces a top-level window onto the taskbar when the window is visible
+    if (!w->skip_taskbar()) {
+      styleEx |= WS_EX_APPWINDOW;
+    }
+
     int xwm = xp, ywm = yp, bt, bx, by; // these are in graphical units
     fake_X_wm_style(w, xwm, ywm, bt, bx, by, style, styleEx, maxw(), minw(), maxh(), minh(), size_range_set());
     if (by + bt) {
diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx
index 239f824..2c27e58 100644
--- a/src/Fl_x.cxx
+++ b/src/Fl_x.cxx
@@ -2495,18 +2495,18 @@ void Fl_X::make_xid(Fl_Window* win, XVisualInfo *visual, Colormap colormap)
       if (!wp->visible()) showit = 0; // guess that wm will not show it
       if (win->modal()) {
         Atom net_wm_state = XInternAtom (fl_display, "_NET_WM_STATE", 0);
-        Atom net_wm_state_skip_taskbar = XInternAtom (fl_display, "_NET_WM_STATE_MODAL", 0);
+        Atom net_wm_state_modal = XInternAtom (fl_display, "_NET_WM_STATE_MODAL", 0);
         XChangeProperty (fl_display, xp->xid, net_wm_state, XA_ATOM, 32,
-            PropModeAppend, (unsigned char*) &net_wm_state_skip_taskbar, 1);
+	                 PropModeAppend, (unsigned char*) &net_wm_state_modal, 1);
       }
     }
 
-    // Make sure that borderless windows do not show in the task bar
-    if (!win->border()) {
+    // Skip the taskbar if requested
+    if (win->skip_taskbar()) {
       Atom net_wm_state = XInternAtom (fl_display, "_NET_WM_STATE", 0);
       Atom net_wm_state_skip_taskbar = XInternAtom (fl_display, "_NET_WM_STATE_SKIP_TASKBAR", 0);
       XChangeProperty (fl_display, xp->xid, net_wm_state, XA_ATOM, 32,
-          PropModeAppend, (unsigned char*) &net_wm_state_skip_taskbar, 1);
+                       PropModeAppend, (unsigned char*) &net_wm_state_skip_taskbar, 1);
     }
 
     // If asked for, create fullscreen
