{
        unsigned char slen = tn->pos;
        unsigned long stride, i;
+       unsigned char slen_max;
+
+       /* only vector 0 can have a suffix length greater than or equal to
+        * tn->pos + tn->bits, the second highest node will have a suffix
+        * length at most of tn->pos + tn->bits - 1
+        */
+       slen_max = min_t(unsigned char, tn->pos + tn->bits - 1, tn->slen);
 
        /* search though the list of children looking for nodes that might
         * have a suffix greater than the one we currently have.  This is
                slen = n->slen;
                i &= ~(stride - 1);
 
-               /* if slen covers all but the last bit we can stop here
-                * there will be nothing longer than that since only node
-                * 0 and 1 << (bits - 1) could have that as their suffix
-                * length.
-                */
-               if ((slen + 1) >= (tn->pos + tn->bits))
+               /* stop searching if we have hit the maximum possible value */
+               if (slen >= slen_max)
                        break;
        }
 
                return collapse(t, tn);
 
        /* update parent in case halve failed */
-       tp = node_parent(tn);
-
-       /* Return if at least one deflate was run */
-       if (max_work != MAX_WORK)
-               return tp;
-
-       /* push the suffix length to the parent node */
-       if (tn->slen > tn->pos) {
-               unsigned char slen = update_suffix(tn);
-
-               if (slen > tp->slen)
-                       tp->slen = slen;
-       }
-
-       return tp;
+       return node_parent(tn);
 }
 
 static void node_pull_suffix(struct key_vector *tn, unsigned char slen)
        }
 
        /* Case 3: n is NULL, and will just insert a new leaf */
+       node_push_suffix(tp, new->fa_slen);
        NODE_INIT_PARENT(l, tp);
        put_child_root(tp, key, l);
        trie_rebalance(t, tp);
         * out parent suffix lengths as a part of trie_rebalance
         */
        if (hlist_empty(&l->leaf)) {
+               if (tp->slen == l->slen)
+                       node_pull_suffix(tp, tp->pos);
                put_child_root(tp, l->key, NULL);
                node_free(l);
                trie_rebalance(t, tp);
                        if (IS_TRIE(pn))
                                break;
 
+                       /* update the suffix to address pulled leaves */
+                       if (pn->slen > pn->pos)
+                               update_suffix(pn);
+
                        /* resize completed node */
                        pn = resize(t, pn);
                        cindex = get_index(pkey, pn);
                        if (IS_TRIE(pn))
                                break;
 
+                       /* update the suffix to address pulled leaves */
+                       if (pn->slen > pn->pos)
+                               update_suffix(pn);
+
                        /* resize completed node */
                        pn = resize(t, pn);
                        cindex = get_index(pkey, pn);