+local stanza_mt = st.stanza_mt;
+local function fast_st_clone(stanza, lookup)
+ local stanza_attr = stanza.attr;
+ local stanza_tags = stanza.tags;
+ local tags, attr = {}, {};
+ local clone = { name = stanza.name, attr = attr, tags = tags, last_add = {} };
+ for k,v in pairs(stanza_attr) do attr[k] = v; end
+ lookup[stanza_attr] = attr;
+ for i=1,#stanza_tags do
+ local child = stanza_tags[i];
+ local new = fast_st_clone(child, lookup);
+ tags[i] = new;
+ lookup[child] = new;
+ end
+ for i=1,#stanza do
+ local child = stanza[i];
+ clone[i] = lookup[child] or child;
+ end
+ return setmetatable(clone, stanza_mt);
+end
+