     false
 
   start: ->
-    @_resumeTimer = setInterval(@resumeFetches, 20000)
+    @_resumeTimer = new BackoffTimer(@resumeFetches)
     @_connection.start()
     @resumeFetches()
 
   cleanup: ->
-    clearInterval(@_resumeTimer)
+    @_resumeTimer.cancel()
     @_connection.end()
     @_terminated = true
     @
 
   resumeFetches: =>
     return unless @_state
+
+    # Stop the timer. If one or more network requests fails during the fetch process
+    # we'll backoff and restart the timer.
+    @_resumeTimer.cancel()
+
     @fetchCollection('threads')
     @fetchCollection('calendars')
     @fetchCollection('contacts')

    ,100
    @_writeState()
    @trigger()

        @updateTransferState(model, count: response.count)
      error: (err) =>
        return if @_terminated
        @_resumeTimer.backoff()
        @_resumeTimer.start()

  fetchCollectionPage: (model, params = {}) ->
    requestOptions =
      error: (err) =>
        return if @_terminated
        @_resumeTimer.backoff()
        @_resumeTimer.start()
        @updateTransferState(model, {busy: false, complete: false, error: err.toString()})
      success: (json) =>
        return if @_terminated
