     # Resolves conflicts between changes to this model and the remotely-changed
     # new attributes on this model.
     onReloaded: () ->
-      @_addItem(model, {}, false) for model in _.values(@_addedItems)
+      @_addItem(model, {}, false) for model in _.values(@_localAddedItems)
 
     onSaved: () ->
-      @_addedItems = {}
+      @_localAddedItems = {}
+
+    # FIXME HACK, horrible Hack.
+    # When a remote commit occurs, all models that were changed are reloaded.
+    # The order they are reloaded is non-deterministic and a "Book"
+    # is actually represented by 2 files: the OPF and the navigation HTML.
+    # This patch ensures the navigation file is updated.
+    _monkeypatch_navModel: () ->
+
+      # Resolves conflicts between changes to this model and the remotely-changed
+      # new attributes on this model.
+      onReloaded = () =>
+        @_parseNavModel()
+        _.each @_localNavAdded, (model, path) => @addChild(model)
+
+      onSaved = () =>
+        @_localNavAdded = {}
+
+      @navModel.onReloaded = onReloaded
+      @navModel.onSaved = onSaved
+
 
     newNode: (options) ->
       model = options.model


            # Set all the titles of models in the workspace based on the nav tree
            # XhtmlModel titles are not saved anyway.
            contentModel.set 'title', title, {parse:true} if not contentModel.get('title')

            model = @newNode {title: title, htmlAttributes: attributes, model: contentModel}


        # then remember it.
        if 'nav' == $item.attr('properties')
          @navModel = model
          @_monkeypatch_navModel(@navModel)

      # Add all the models in one batch so views do not re-sort on every add.
      allContent.add @manifest.models, {loading:true}
