diff --git a/basis/ui/gadgets/gadgets.factor b/basis/ui/gadgets/gadgets.factor
index ffcd2ac1a5..e508aa59c2 100644
--- a/basis/ui/gadgets/gadgets.factor
+++ b/basis/ui/gadgets/gadgets.factor
@@ -293,22 +293,22 @@ PRIVATE>
     in-layout? get
     [ "Cannot add/remove gadgets in layout*" throw ] when ;
 
+GENERIC: remove-gadget ( gadget parent -- )
+
+M: gadget remove-gadget
+    over (unparent)
+    [ unfocus-gadget ]
+    [ children>> delete ]
+    [ nip relayout ]
+    2tri ;
+
 : unparent ( gadget -- )
     not-in-layout
-    [
-        dup parent>> dup [
-            over (unparent)
-            [ unfocus-gadget ] 2keep
-            [ children>> delete ] keep
-            relayout
-        ] [
-            2drop
-        ] if
-    ] when* ;
+    [ dup parent>> dup [ remove-gadget ] [ 2drop ] if ] when* ;
 
 : clear-gadget ( gadget -- )
     not-in-layout
-    dup (clear-gadget) relayout ;
+    [ (clear-gadget) ] [ relayout ] bi ;
 
 <PRIVATE
 
diff --git a/basis/ui/gadgets/tracks/tracks-tests.factor b/basis/ui/gadgets/tracks/tracks-tests.factor
index 9abe70bfaa..844cb375d1 100644
--- a/basis/ui/gadgets/tracks/tracks-tests.factor
+++ b/basis/ui/gadgets/tracks/tracks-tests.factor
@@ -1,5 +1,5 @@
 USING: kernel ui.gadgets ui.gadgets.tracks tools.test
-math.rectangles accessors sequences ;
+math.rectangles accessors sequences namespaces ;
 IN: ui.gadgets.tracks.tests
 
 [ { 100 100 } ] [
@@ -49,14 +49,25 @@ IN: ui.gadgets.tracks.tests
     [ layout ] [ children>> [ dim>> ] map ] bi
 ] unit-test
 
-[ V{ { 10 10 } { 10 35 } { 10 10 } { 10 35 } { 10 10 } } ] [
+[ ] [
     vertical <track>
         0 >>fill
         <gadget> { 10 10 } >>dim f track-add
-        <gadget> { 10 10 } >>dim 1/2 track-add
-        <gadget> { 10 10 } >>dim f track-add
+        <gadget> { 10 10 } >>dim dup "g1" set 1/2 track-add
+        <gadget> { 10 10 } >>dim dup "g2" set f track-add
         <gadget> { 10 10 } >>dim 1/2 track-add
         <gadget> { 10 10 } >>dim f track-add
     { 10 100 } >>dim
-    [ layout ] [ children>> [ dim>> ] map ] bi
-] unit-test
\ No newline at end of file
+    "track" set
+] unit-test
+
+[ V{ { 10 10 } { 10 35 } { 10 10 } { 10 35 } { 10 10 } } ]
+[ "track" get [ layout ] [ children>> [ dim>> ] map ] bi ] unit-test
+
+[ V{ { 10 10 } { 10 80 } { 10 10 } } ] [
+    "g1" get unparent
+    "g2" get unparent
+    "track" get [ layout ] [ children>> [ dim>> ] map ] bi
+] unit-test
+
+[ 3 ] [ "track" get sizes>> length ] unit-test
\ No newline at end of file
diff --git a/basis/ui/gadgets/tracks/tracks.factor b/basis/ui/gadgets/tracks/tracks.factor
index bf86c7f34e..92268690ac 100644
--- a/basis/ui/gadgets/tracks/tracks.factor
+++ b/basis/ui/gadgets/tracks/tracks.factor
@@ -60,12 +60,7 @@ PRIVATE>
 : track-add ( track gadget constraint -- track )
     pick sizes>> push add-gadget ;
 
-: track-remove ( track gadget -- track )
-    [ drop ] [
-        [ swap children>> index ]
-        [ drop sizes>> ]
-        [ nip unparent ]
-        2tri delete-nth
-    ] 2bi ;
+M: track remove-gadget
+    [ [ children>> index ] keep sizes>> delete-nth ] [ call-next-method ] 2bi ;
 
 : clear-track ( track -- ) [ sizes>> delete-all ] [ clear-gadget ] bi ;