                     console.warn("_save('#{@_table}') error: #{err}")
                 else
                     @emit('saved', saved_objs)
-
-                if not err and not at_start.equals(@_value_local)
-                    # keep saving until table doesn't change *during* the save
-                    @_save(cb)
+                if err
+                    cb?(err)
+                    return
                 else
-                    cb?(err)
+                    if @_last_set != last_set
+                        # keep saving until table doesn't change *during* the save due to user set call
+                        @_save(cb)
+                    else
+                        cb?()
+
 
     ###
     Disabled --

            cb?()
            return

        at_start = @_value_local
        changed = @_changes()

        # Send our changes to the server.

        # If something changed, then change in our local store, and also kick off a save to the backend.
        if not immutable.is(new_val, cur)
            @_value_local = @_value_local.set(id, new_val)
            @_last_set = new Date() - 0
            @save(cb)
            @emit('change', [id])  # CRITICAL: other code assumes the key is *NOT* sent with this change event!
        return new_val
