             @dom.on 'cursor', (x) =>
                 @syncstring._syncstring.set_cursor_locs(x.locs, x.caused)
             @syncstring._syncstring.on('cursor_activity', @render_cursor)
+            @dom.on('save', @save)
 
     render_cursor: (account_id) =>
         if account_id == salvus_client.account_id

                if @dom.read_only
                    # DOM gets extra info about @read_only status of file from jupyter notebook server.
                    @read_only = true
                cb()
        @dom = new JupyterWrapper(@notebook, @server_url, @filename, @read_only, @project_id, done)

    init_buttons: () =>
        @element.find("a[href=#info]").click(@info)
        @element.find("a[href=#history]").click(@show_history_viewer)
        if @read_only
            @element.find("a[href=#save]").addClass('disabled')
        else
            @save_button = @element.find("a[href=#save]").click(@save)
        @publish_button = @element.find("a[href=#publish]").click(@publish_ui)

    init_dom_events: () =>

    - set_cursors
    - get
    - event:
       - 'ready'
       - 'error'
       - 'change'
       - 'cursor' - cursor info
       - 'info'   - user requests info (clicking on jupyter logo)
       - 'save'   - user requests save

States:

