   render: ->
     @messages = @linter.messages.getAllMessages()
     @updateTabCounts()
-    @updateLineMessages()
     @updateBubble()
     @renderPanelMarkers()
+    @updateLineMessages()
     @renderPanelMessages()
 
-  updateTabs: ->
-    first = null
-    last = null
-
-    for key, tab of @tabs
-      tab.classList.remove('first')
-      tab.classList.remove('last')
-      tab.visibility = atom.config.get("linter.showErrorTab#{key}")
-      if tab.visibility
-        last = tab
-        first = tab unless first
-
-    first.classList.add('first') if first
-    last.classList.add('last') if last
-
-    unless @tabs[@state.scope]?.visibility
-      @state.scope = @tabPriority.filter((key) => @tabs[key].visibility)[0]
-      @state.scope ?= 'File'
-
-    @changeTab(@state.scope, false)
-
-  # consumed in editor-linter, renderPanel
+  updateTabCounts: ->
+    @tabs.File.count = @linter.messages.count.File
+    @tabs.Project.count = @linter.messages.count.Project
+    @bottomStatus.count = @linter.messages.count.Project
+
   updateBubble: (point) ->
     @removeBubble()
     return unless @showBubble

      )
      throw null

  updateLineMessages: (shouldRender = false) ->
    return unless @tabs.Line.visibility
    row = atom.workspace.getActiveTextEditor()?.getCursorBufferPosition()?.row
    @lineMessages = @linter.messages.getActiveFileMessagesForRow(row)
    @tabs.Line.count = @lineMessages.length
    if shouldRender then @renderPanelMessages()

  # This method is called when we get the status-bar service
  attachBottom: (statusBar) ->

      bubble.appendChild Message.fromMessage(trace, addPath: true)
    bubble

  removeMarkers: ->
    return unless @markers.length
    for marker in @markers
      try marker.destroy()
    @markers = []

  # this method is called on package deactivate
  destroy: ->
