diff --git a/pred-trie.cabal b/pred-trie.cabal
--- a/pred-trie.cabal
+++ b/pred-trie.cabal
@@ -1,5 +1,5 @@
 Name:                   pred-trie
-Version:                0.0.5
+Version:                0.0.6
 Author:                 Athan Clark <athan.clark@gmail.com>
 Maintainer:             Athan Clark <athan.clark@gmail.com>
 License:                BSD3
diff --git a/src/Data/Trie/Pred/Disjoint.hs b/src/Data/Trie/Pred/Disjoint.hs
--- a/src/Data/Trie/Pred/Disjoint.hs
+++ b/src/Data/Trie/Pred/Disjoint.hs
@@ -30,3 +30,17 @@
     getFirst [] = Nothing
     getFirst (Nothing:xs) = getFirst xs
     getFirst (Just x :xs) = Just x
+
+
+litSingleton :: [t] -> x -> RDPTrie p t x
+litSingleton [] x = Rooted (Just x) []
+litSingleton ts x = Rooted Nothing [ND.litSingletonTail (NE.fromList ts) x]
+
+
+litExtrude :: [t] -> RDPTrie p t x -> RDPTrie p t x
+litExtrude [] r = r
+litExtrude (t:[]) (Rooted mx xs) = Rooted Nothing [DMore t mx xs]
+litExtrude ts (Rooted mx xs) = Rooted Nothing [ND.litExtrudeTail (init ts) $
+                                                 DMore (last ts) mx xs
+                                              ]
+
diff --git a/src/Data/Trie/Pred/Disjoint/Tail.hs b/src/Data/Trie/Pred/Disjoint/Tail.hs
--- a/src/Data/Trie/Pred/Disjoint/Tail.hs
+++ b/src/Data/Trie/Pred/Disjoint/Tail.hs
@@ -7,6 +7,9 @@
   , lookup
   , merge
   , areDisjoint
+  , litSingletonTail
+  , litExtrudeTail
+  , sort
   ) where
 
 import Prelude hiding (lookup)
@@ -69,7 +72,12 @@
 getFirst (Just x :xs) = Just x
 
 
-buildLitSingletonTail :: NonEmpty t -> x -> DPTrie p t x
-buildLitSingletonTail (t:|[]) x = DMore t (Just x) []
-buildLitSingletonTail (t:|ts) x = DMore t Nothing  [buildLitSingletonTail (NE.fromList ts) x]
+litSingletonTail :: NonEmpty t -> x -> DPTrie p t x
+litSingletonTail (t:|[]) x = DMore t (Just x) []
+litSingletonTail (t:|ts) x = DMore t Nothing  [litSingletonTail (NE.fromList ts) x]
+
+
+litExtrudeTail :: [t] -> DPTrie p t x -> DPTrie p t x
+litExtrudeTail [] r = r
+litExtrudeTail (t:ts) r = DMore t Nothing [litExtrudeTail ts r]
 
diff --git a/src/Data/Trie/Pred/Unified.hs b/src/Data/Trie/Pred/Unified.hs
--- a/src/Data/Trie/Pred/Unified.hs
+++ b/src/Data/Trie/Pred/Unified.hs
@@ -29,3 +29,16 @@
     getFirst [] = Nothing
     getFirst (Nothing:xs) = getFirst xs
     getFirst (Just x :xs) = Just x
+
+
+litSingleton :: [t] -> x -> RUPTrie t x
+litSingleton [] x = Rooted (Just x) []
+litSingleton ts x = Rooted Nothing [NU.litSingletonTail (NE.fromList ts) x]
+
+
+litExtrude :: [t] -> RUPTrie t x -> RUPTrie t x
+litExtrude [] r = r
+litExtrude (t:[]) (Rooted mx xs) = Rooted Nothing [UMore t mx xs]
+litExtrude ts (Rooted mx xs) = Rooted Nothing [NU.litExtrudeTail (init ts) $
+                                                 UMore (last ts) mx xs
+                                              ]
diff --git a/src/Data/Trie/Pred/Unified/Tail.hs b/src/Data/Trie/Pred/Unified/Tail.hs
--- a/src/Data/Trie/Pred/Unified/Tail.hs
+++ b/src/Data/Trie/Pred/Unified/Tail.hs
@@ -7,11 +7,14 @@
   , lookup
   , merge
   , areDisjoint
+  , litSingletonTail
+  , litExtrudeTail
+  , sort
   ) where
 
 import Prelude hiding (lookup)
-import Data.List.NonEmpty hiding (map)
-import Data.List.NonEmpty as NE hiding (map)
+import Data.List.NonEmpty hiding (map, sort)
+import Data.List.NonEmpty as NE hiding (map, sort)
 
 
 
@@ -30,21 +33,16 @@
 -- | Overwrites when similar, leaves untouched when not
 merge :: (Eq t) => UPTrie t x -> UPTrie t x -> UPTrie t x
 merge xx@(UMore t mx xs) yy@(UMore p my ys)
-  | t == p = UMore p my $ foldr go [] $ xs ++ ys
+  | t == p = UMore p my $ sort $ xs ++ ys
   | otherwise = xx
-  where
-    go :: (Eq t) => UPTrie t x -> [UPTrie t x] -> [UPTrie t x]
-    go a [] = [a]
-    go a (b:bs) | areDisjoint a b =       a : b : bs
-                | otherwise       = (merge a b) : bs
 merge xx@(UPred t q mrx xrs) yy@(UPred p w mry yrs)
-  | t == p = yy
+  | t == p = yy -- predicate children are incompatible
   | otherwise = xx
 merge xx@(UMore t mx xs) yy@(UPred p w mrx xrs)
-  | t == p = yy -- predicate children are incompatible
+  | t == p = yy -- rightward bias
   | otherwise = xx
 merge xx@(UPred t q mrx xrs) yy@(UMore p my ys)
-  | t == p = yy
+  | t == p = yy -- rightward bias
   | otherwise = xx
 
 
@@ -74,7 +72,32 @@
 getFirst (Just x :xs) = Just x
 
 
-buildLitSingletonTail :: NonEmpty t -> x -> UPTrie t x
-buildLitSingletonTail (t:|[]) x = UMore t (Just x) []
-buildLitSingletonTail (t:|ts) x = UMore t Nothing  [buildLitSingletonTail (NE.fromList ts) x]
+litSingletonTail :: NonEmpty t -> x -> UPTrie t x
+litSingletonTail (t:|[]) x = UMore t (Just x) []
+litSingletonTail (t:|ts) x = UMore t Nothing  [litSingletonTail (NE.fromList ts) x]
+
+
+litExtrudeTail :: [t] -> UPTrie t x -> UPTrie t x
+litExtrudeTail [] r = r
+litExtrudeTail (t:ts) r = UMore t Nothing [litExtrudeTail ts r]
+
+
+-- also does a non-deterministic merge - make sure your nodes are disjoint & clean
+sort :: (Eq t) => [UPTrie t x] -> [UPTrie t x]
+sort = foldr insert []
+  where
+    insert :: (Eq t) => UPTrie t x -> [UPTrie t x] -> [UPTrie t x]
+    insert r [] = [r]
+    insert x@(UMore t _ _) (y@(UMore p _ _):rs)
+      | t == p = x : rs
+      | otherwise = x : y : rs
+    insert x@(UMore t _ _) (y@(UPred p _ _ _):rs)
+      | t == p = x : rs
+      | otherwise = x : y : rs
+    insert x@(UPred t _ _ _) (y@(UPred p _ _ _):rs)
+      | t == p = x : rs -- basis
+      | otherwise = x : y : rs
+    insert x@(UPred t _ _ _) (y@(UMore p _ _):rs)
+      | t == p = insert x rs
+      | otherwise = y : insert x rs
 
