diff -u glib/src/nodetree.hg glib/src/nodetree.hg
--- glib/src/nodetree.hg	(working copy)
+++ glib/src/nodetree.hg	(working copy)
@@ -102,10 +102,26 @@
    */
   ~NodeTree()
   {
-    g_node_destroy(gobj());
+    if(!is_root())
+      unlink();
+
+    while(NodeTree<T>* i = first_child())
+      delete i;
+
+    g_slice_free(GNode, gobject_);
   };
   _IGNORE(g_node_destroy)
 
+  NodeTree(const NodeTree<T>& node) :
+    data_(node.data_)
+  {
+    //Store the this pointer in the GNode so we can discover this wrapper later:
+    gobject_ = g_node_new(reinterpret_cast<gpointer>(this));
+
+    for(const NodeTree<T>* i = node.last_child();  i != 0; i = i->prev_sibling())
+      prepend(*(new NodeTree<T>(*i)));
+  }
+
   /// Provides access to the underlying C GObject.
   inline GNode* gobj()
   {
@@ -614,12 +630,38 @@
 
   /** Unlinks a node from a tree, resulting in two separate trees.
    */
-  void unlink(NodeTree<T>& child)
+  void unlink()
   {
-    g_node_unlink(child.gobj());
+    g_node_unlink(gobj());
   }
   _IGNORE(g_node_unlink)
 
+  /** Recursively copies a @a node.
+   *
+   * Returns: a new node containing the same data pointers
+   */
+  NodeTree<T>* copy_deep() const
+  {
+    NodeTree<T>* new_node = copy();
+    new_node->data_ = *(new T(new_node->data_));
+
+    for(const NodeTree<T>* i = last_child();  i != 0; i = i->prev_sibling())
+      new_node->prepend(*(i->copy_deep()));
+
+    return new_node;
+  }
+  _IGNORE(g_node_copy_deep)
+
+  /** Recursively copies a @a node.
+   *
+   * Returns: a new node containing the same data pointers
+   */
+  inline NodeTree<T>* copy() const
+  {
+    return new NodeTree<T>(*this);
+  }
+  _IGNORE(g_node_copy)
+
   /// Accessor for this node's data
   T& data()
   {
@@ -641,11 +683,6 @@
     return wrap(gobj()->parent);
   }
 
-  // Leaving these unimplemented for now
-  _IGNORE(g_node_copy)
-  _IGNORE(g_node_copy_deep)
-
-
 private:
 
   GNode* gobject_;
