Index: src/Fl_Tree.cxx
===================================================================
--- src/Fl_Tree.cxx	(revision 12517)
+++ src/Fl_Tree.cxx	(working copy)
@@ -911,15 +911,59 @@
 
 /// Clear the entire tree's children, including the root.
 /// The tree will be left completely empty.
+/// Also clears any child FLTK widgets.
 ///
 void Fl_Tree::clear() {
-  if ( ! _root ) return;
-  _root->clear_children();
-  delete _root; _root = 0;
+
+  // Clear items first.
+  //     This should delete any widgets assigned with item->widget().
+  //
+  clear_items();
+
+  // Clear widgets not assigned to item->widget().
+  //     This would be unusual, but could happen if any widgets got
+  //     sucked into Fl_Tree's group by way of begin()/end().
+  //
+  clear_widgets();
+} 
+
+/// Clear the all the tree's child items, including the root.
+/// The tree will be left completely empty. This does not clear
+/// any child FLTK widgets; for that, use clear_widgets().
+///
+void Fl_Tree::clear_items() {
+  if ( _root ) {
+    _root->clear_children();
+    delete _root; _root = 0;
+  }
   _item_focus = 0;
   _lastselect = 0;
-} 
+}
 
+/// Clear the tree's child fltk widgets (does not affect items).
+/// Any FLTK widgets assigned to items with item->widget()
+/// will be removed and destroyed, leaving the item intact.
+///
+void Fl_Tree::clear_widgets() {
+  if ( _root ) {
+    _root->clear_children_widgets();   // let item handle clearing widgets
+    _root->clear_widget();
+  }
+  // Clear Fl_Group of children as well.
+  //    Any widgets not part of the tree belong to the app.
+  //    Do this in case app called Fl_Tree::clear() first.
+  //
+  for ( int t=0; t<Fl_Group::children(); t++ ) {
+    Fl_Widget *w = Fl_Group::child(t);
+    if ( w != _vscroll && w != _hscroll ) {
+      Fl_Group::remove(*w);	// handles delete_widget()
+      Fl::delete_widget(w);
+      --t;
+    }
+  }
+  recalc_tree();
+}
+
 /// Clear all the children for \p 'item'.
 /// Item may not be NULL.
 ///
Index: src/Fl_Tree_Item.cxx
===================================================================
--- src/Fl_Tree_Item.cxx	(revision 12517)
+++ src/Fl_Tree_Item.cxx	(working copy)
@@ -104,7 +104,7 @@
 
 /// Copy constructor.
 Fl_Tree_Item::Fl_Tree_Item(const Fl_Tree_Item *o) {
-  _tree             = o->_tree;
+  _tree         = o->_tree;
   _label        = o->label() ? strdup(o->label()) : 0;
   _labelfont    = o->labelfont();
   _labelsize    = o->labelsize();
@@ -170,6 +170,41 @@
   return(_children[index]);
 }
 
+/// Clear the widget assigned to this item (if any).
+/// The widget is destroyed and widget() set to 0.
+/// The tree's geometry is recalculated unless recalc==0.
+///
+/// param[in] recalc Set to 0 to avoid costly recalculation of tree
+///                  geometry, useful if clearing many widgets before
+///                  a redraw. Default is 1.
+///
+void Fl_Tree_Item::clear_widget(int recalc) {
+  if (widget()) {
+    Fl_Widget *w = widget();
+    widget(0);                         // remove from our item
+    _tree->Fl_Group::remove(*w);       // deparent from group
+    Fl::delete_widget(w);              // destroy the widget
+    if (recalc) recalc_tree();         // removing widget can change tree geom
+  }
+}
+
+/// Clear all the fltk widgets assigned to this item's child items.
+/// The tree's geometry is recalculated unless recalc==0.
+///
+/// param[in] recalc Set to 0 to avoid costly recalculation of tree
+///                  geometry, useful if clearing many widgets before
+///                  a redraw. Default is 1.
+///
+void Fl_Tree_Item::clear_children_widgets(int recalc) {
+  for ( int t=0; t<children(); t++ ) {
+    if ( child(t)->has_children() ) {
+      child(t)->clear_children_widgets();
+    }
+    child(t)->clear_widget();
+  }
+  if (recalc) recalc_tree();   // removing widgets can change tree geom
+}
+
 /// Clear all the children for this item.
 void Fl_Tree_Item::clear_children() {
   _children.clear();
Index: FL/Fl_Tree.H
===================================================================
--- FL/Fl_Tree.H	(revision 12517)
+++ FL/Fl_Tree.H	(working copy)
@@ -369,6 +369,8 @@
   Fl_Tree_Item* insert(Fl_Tree_Item *item, const char *name, int pos);
   int remove(Fl_Tree_Item *item);
   void clear();
+  void clear_widgets();
+  void clear_items();
   void clear_children(Fl_Tree_Item *item);
 
   ////////////////////////
Index: FL/Fl_Tree_Item.H
===================================================================
--- FL/Fl_Tree_Item.H	(revision 12517)
+++ FL/Fl_Tree_Item.H	(working copy)
@@ -189,6 +189,10 @@
     return(_labelbgcolor); 
   }
   /// Assign an FLTK widget to this item.
+  ///    Once assigned, the item 'takes ownership' of the widget,
+  ///    and will manage its destruction if the item is itself destroyed
+  ///    (by e.g. clear() or remove())
+  ///
   void widget(Fl_Widget *val) {
     _widget = val; 
     recalc_tree();		// may change tree geometry
@@ -215,6 +219,8 @@
   int find_child(Fl_Tree_Item *item);
   int remove_child(Fl_Tree_Item *item);
   int remove_child(const char *new_label);
+  void clear_widget(int recalc=1);
+  void clear_children_widgets(int recalc=1);
   void clear_children();
   void swap_children(int ax, int bx);
   int swap_children(Fl_Tree_Item *a, Fl_Tree_Item *b);
Index: FL/Fl_Tree_Prefs.H
===================================================================
--- FL/Fl_Tree_Prefs.H	(revision 12517)
+++ FL/Fl_Tree_Prefs.H	(working copy)
@@ -87,9 +87,9 @@
 /// via item_draw_mode().
 ///
 enum Fl_Tree_Item_Draw_Mode {
-  FL_TREE_ITEM_DRAW_DEFAULT=0,		///< If widget() defined, draw in place of label,
+  FL_TREE_ITEM_DRAW_DEFAULT=0,		///< If widget() defined, draw in place of item's label,
                                         ///< and widget() tracks item height (default)
-  FL_TREE_ITEM_DRAW_LABEL_AND_WIDGET=1,	///< If widget() defined, include label to the left of the widget
+  FL_TREE_ITEM_DRAW_LABEL_AND_WIDGET=1,	///< If widget() defined, include item's label to the left of the widget
   FL_TREE_ITEM_HEIGHT_FROM_WIDGET=2	///< If widget() defined, widget()'s height controls item's height
 };
 
