diff --git a/app/views/play/WorldMapView.coffee b/app/views/play/WorldMapView.coffee
index 703b1eb8b..99511e68c 100644
--- a/app/views/play/WorldMapView.coffee
+++ b/app/views/play/WorldMapView.coffee
@@ -68,8 +68,7 @@ module.exports = class WorldMapView extends RootView
       for level, index in campaign.levels
         level.x ?= 10 + 80 * Math.random()
         level.y ?= 10 + 80 * Math.random()
-        #level.locked = index > 0 and not me.earnedLevel level.original
-        level.locked = false  # Not working yet, but time for sleep.
+        level.locked = index > 0 and not me.earnedLevel level.original
     context.levelStatusMap = @levelStatusMap
     context.levelPlayCountMap = @levelPlayCountMap
     context.isIPadApp = application.isIPadApp
diff --git a/app/views/play/level/PlayLevelView.coffee b/app/views/play/level/PlayLevelView.coffee
index 003f374fe..fb1796dc2 100644
--- a/app/views/play/level/PlayLevelView.coffee
+++ b/app/views/play/level/PlayLevelView.coffee
@@ -272,7 +272,7 @@ module.exports = class PlayLevelView extends RootView
     @insertSubView new ChatView levelID: @levelID, sessionID: @session.id, session: @session
     worldName = utils.i18n @level.attributes, 'name'
     @controlBar = @insertSubView new ControlBarView {worldName: worldName, session: @session, level: @level, supermodel: @supermodel}
-    Backbone.Mediator.publish('level:set-debug', debug: true) if @isIPadApp()  # if me.displayName() is 'Nick'
+    _.delay (=> Backbone.Mediator.publish('level:set-debug', debug: true)), 5000 if @isIPadApp()   # if me.displayName() is 'Nick'
 
   initVolume: ->
     volume = me.get('volume')
diff --git a/server/plugins/achievements.coffee b/server/plugins/achievements.coffee
index c0dacf96f..b252981e4 100644
--- a/server/plugins/achievements.coffee
+++ b/server/plugins/achievements.coffee
@@ -34,64 +34,65 @@ AchievablePlugin = (schema, options) ->
     if category of loadedAchievements
       docObj = doc.toObject()
       for achievement in loadedAchievements[category]
-        query = achievement.get('query')
-        isRepeatable = achievement.get('proportionalTo')?
-        alreadyAchieved = if isNew then false else LocalMongo.matchesQuery originalDocObj, query
-        newlyAchieved = LocalMongo.matchesQuery(docObj, query)
-        #log.debug 'isRepeatable: ' + isRepeatable
-        #log.debug 'alreadyAchieved: ' +  alreadyAchieved
-        #log.debug 'newlyAchieved: ' + newlyAchieved
+        do (achievement) ->
+          query = achievement.get('query')
+          isRepeatable = achievement.get('proportionalTo')?
+          alreadyAchieved = if isNew then false else LocalMongo.matchesQuery originalDocObj, query
+          newlyAchieved = LocalMongo.matchesQuery(docObj, query)
+          #log.debug 'isRepeatable: ' + isRepeatable
+          #log.debug 'alreadyAchieved: ' +  alreadyAchieved
+          #log.debug 'newlyAchieved: ' + newlyAchieved
 
-        userObjectID = doc.get(achievement.get('userField'))
-        userID = if _.isObject userObjectID then userObjectID.toHexString() else userObjectID # Standardize! Use strings, not ObjectId's
+          userObjectID = doc.get(achievement.get('userField'))
+          userID = if _.isObject userObjectID then userObjectID.toHexString() else userObjectID # Standardize! Use strings, not ObjectId's
 
-        if newlyAchieved and (not alreadyAchieved or isRepeatable)
-          earned =
-            user: userID
-            achievement: achievement._id.toHexString()
-            achievementName: achievement.get 'name'
-            earnedRewarsd: achievement.get 'rewards'
+          if newlyAchieved and (not alreadyAchieved or isRepeatable)
+            earned =
+              user: userID
+              achievement: achievement._id.toHexString()
+              achievementName: achievement.get 'name'
+              earnedRewarsd: achievement.get 'rewards'
 
-          worth = achievement.get('worth') ? 10
-          earnedPoints = 0
-          wrapUp = ->
-            # Update user's experience points
-            update = {$inc: {points: earnedPoints}}
-            for rewardType, rewards of achievement.get('rewards') ? {}
-              if rewardType is 'gems'
-                update.$inc['earned.gems'] = rewards if rewards
-              else if rewards.length
-                update.$addToSet ?= {}
-                update.$addToSet["earned.#{rewardType}"] = $each: rewards
-            User.update {_id: userID}, update, {}, (err, count) ->
-              log.error err if err?
+            worth = achievement.get('worth') ? 10
+            earnedPoints = 0
+            wrapUp = ->
+              # Update user's experience points
+              update = {$inc: {points: earnedPoints}}
+              for rewardType, rewards of achievement.get('rewards') ? {}
+                if rewardType is 'gems'
+                  update.$inc['earned.gems'] = rewards if rewards
+                else if rewards.length
+                  update.$addToSet ?= {}
+                  update.$addToSet["earned.#{rewardType}"] = $each: rewards
+              User.update {_id: userID}, update, {}, (err, count) ->
+                log.error err if err?
 
-          if isRepeatable
-            #log.debug 'Upserting repeatable achievement called \'' + (achievement.get 'name') + '\' for ' + userID
-            proportionalTo = achievement.get 'proportionalTo'
-            originalAmount = if originalDocObj then util.getByPath(originalDocObj, proportionalTo) or 0 else 0
-            newAmount = docObj[proportionalTo]
+            if isRepeatable
+              #log.debug 'Upserting repeatable achievement called \'' + (achievement.get 'name') + '\' for ' + userID
+              proportionalTo = achievement.get 'proportionalTo'
+              originalAmount = if originalDocObj then util.getByPath(originalDocObj, proportionalTo) or 0 else 0
+              newAmount = docObj[proportionalTo]
 
-            if originalAmount isnt newAmount
-              expFunction = achievement.getExpFunction()
-              earned.notified = false
-              earned.achievedAmount = newAmount
-              earned.earnedPoints = (expFunction(newAmount) - expFunction(originalAmount)) * worth
-              earned.previouslyAchievedAmount = originalAmount
-              EarnedAchievement.update {achievement: earned.achievement, user: earned.user}, earned, {upsert: true}, (err) ->
-                return log.debug err if err?
+              if originalAmount isnt newAmount
+                expFunction = achievement.getExpFunction()
+                earned.notified = false
+                earned.achievedAmount = newAmount
+                earned.earnedPoints = (expFunction(newAmount) - expFunction(originalAmount)) * worth
+                earned.previouslyAchievedAmount = originalAmount
+                EarnedAchievement.update {achievement: earned.achievement, user: earned.user}, earned, {upsert: true}, (err) ->
+                  return log.debug err if err?
 
-              earnedPoints = earned.earnedPoints
-              #log.debug earnedPoints
-              wrapUp()
+                earnedPoints = earned.earnedPoints
+                #log.debug earnedPoints
+                wrapUp()
 
-          else # not alreadyAchieved
-            #log.debug 'Creating a new earned achievement called \'' + (achievement.get 'name') + '\' for ' + userID
-            earned.earnedPoints = worth
-            (new EarnedAchievement(earned)).save (err, doc) ->
-              return log.error err if err?
-              earnedPoints = worth
-              wrapUp()
+            else # not alreadyAchieved
+              #log.debug 'Creating a new earned achievement called \'' + (achievement.get 'name') + '\' for ' + userID
+              earned.earnedPoints = worth
+              (new EarnedAchievement(earned)).save (err, doc) ->
+                return log.error err if err?
+                earnedPoints = worth
+                wrapUp()
 
     delete before[doc.id] if doc.id of before