diff --git a/app/application.coffee b/app/application.coffee
index 860aee96e..caf648679 100644
--- a/app/application.coffee
+++ b/app/application.coffee
@@ -44,11 +44,12 @@ Application = initialize: ->
   }, (t) =>
     @router = new Router()
     @router.subscribe()
+    onIdleChanged = (to) => => Backbone.Mediator.publish 'application:idle-changed', idle: @userIsIdle = to
     @idleTracker = new Idle
-      onAway: => @userIsIdle = true
-      onAwayBack: => @userIsIdle = false
-      onHidden: => @userIsIdle = true
-      onVisible: => @userIsIdle = false
+      onAway: onIdleChanged true
+      onAwayBack: onIdleChanged false
+      onHidden: onIdleChanged true
+      onVisible: onIdleChanged false
       awayTimeout: 5 * 60 * 1000
     @idleTracker.start()
 
diff --git a/app/views/play/ladder_view.coffee b/app/views/play/ladder_view.coffee
index 0323d3ec5..e275d0613 100644
--- a/app/views/play/ladder_view.coffee
+++ b/app/views/play/ladder_view.coffee
@@ -25,6 +25,9 @@ module.exports = class LadderView extends RootView
   template: require 'templates/play/ladder'
   startsLoading: true
 
+  subscriptions:
+    'application:idle-changed': 'onIdleChanged'
+
   events:
     'click #simulate-button': 'onSimulateButtonClick'
     'click #simulate-all-button': 'onSimulateAllButtonClick'
@@ -70,10 +73,14 @@ module.exports = class LadderView extends RootView
     @sessions.fetch({"success": @refreshViews})
 
   refreshViews: =>
-    return if @destroyed or application.userIsIdle
+    return if @destroyed or application.userIsIdle or new Date() - 2000 < @lastRefreshTime
+    @lastRefreshTime = new Date()
     @ladderTab.refreshLadder()
     @myMatchesTab.refreshMatches()
-    console.log "refreshed views!"
+    console.log "Refreshing ladder and matches views."
+
+  onIdleChanged: (e) ->
+    @refreshViews() unless e.idle
 
   # Simulations