   node id is supplied, the key value pair is added at the current node."
   [game key value & [node-id]]
   (let [z (-> (game-zip game (or node-id (-> game :current-node :node-id)))
-              (zip-add-key-value-pair key value))]
-    (assoc game :root-node (zip/root z))))
+              (zip-add-key-value-pair key value))
+        g (assoc game :root-node (zip/root z))]
+    (assoc g :current-node (find-node g (-> g :current-node :node-id)))))
 
 
 (defn add-comment

              (str 
                (when children
                  (str 
                    ;; SAN of first child move (main variation):
                    (let [m (-> (first children) :board board/last-move)
                          wtm (= :white (board/side-to-move board))]

  [game]
  (-> game :current-node :board))

(defn find-node-matching
  "Finds the first (as found by a depth-first search) game tree node
  matching the given predicate. If no such node is found, returns nil."
  [game predicate & [start-node]]
  (let [start-node (or start-node (game :root-node))]
    (if (predicate start-node)
      start-node
      (first (filter identity
                     (map #(find-node-matching game predicate %)
                          (start-node :children)))))))

(defn find-node
  "Returns the node with the given node id, or nil if no such node exists."
  [game node-id]
  (find-node-matching game #(= node-id (% :node-id))))
 
(defn- game-zip
  "Creates a zipper for traversing a game. By default, the zipper
  is initialized to the root node of the game tree. The optional
