diff --git a/app/lib/LevelOptions.coffee b/app/lib/LevelOptions.coffee
index 78ca21820..6505ea68c 100644
--- a/app/lib/LevelOptions.coffee
+++ b/app/lib/LevelOptions.coffee
@@ -188,7 +188,7 @@ module.exports = LevelOptions =
     hidesCodeToolbar: true
     hidesRealTimePlayback: true
     requiredGear: {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'tarnished-bronze-breastplate', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses'}
-    restrictedGear: {feet: 'leather-boots'}
+    restrictedGear: {feet: 'leather-boots', 'right-hand': 'crude-builders-hammer'}
     suspectCode: [{name: 'lone-find-nearest-enemy', pattern: /^[ ]*(self|this|@)?[:.]?findNearestEnemy()/m}]
   'kithgard-gates':
     hidesSay: true
diff --git a/app/lib/sprites/SpriteBuilder.coffee b/app/lib/sprites/SpriteBuilder.coffee
index 91ee6a07e..dde680984 100644
--- a/app/lib/sprites/SpriteBuilder.coffee
+++ b/app/lib/sprites/SpriteBuilder.coffee
@@ -96,6 +96,8 @@ module.exports = class SpriteBuilder
       shape.graphics.lf shapeData.lf...
     else if shapeData.fc?
       shape.graphics.f @colorMap[shapeKey] or shapeData.fc
+    else if shapeData.rf?
+      shape.graphics.rf shapeData.rf...
     if shapeData.ls?
       shape.graphics.ls shapeData.ls...
     else if shapeData.sc?
diff --git a/app/lib/sprites/SpriteParser.coffee b/app/lib/sprites/SpriteParser.coffee
index 408664220..361dc8411 100644
--- a/app/lib/sprites/SpriteParser.coffee
+++ b/app/lib/sprites/SpriteParser.coffee
@@ -52,7 +52,7 @@ module.exports = class SpriteParser
         container.bounds[0] -= @width / 2
         container.bounds[1] -= @height / 2
       [shapeKeys, localShapes] = @getShapesFromBlock container, source
-      localContainers = @getContainersFromMovieClip container, source
+      localContainers = @getContainersFromMovieClip container, source, true # Added true because anya attack was breaking, but might break other imports
       addChildArgs = @getAddChildCallArguments container, source
       instructions = []
       for bn in addChildArgs
@@ -248,9 +248,13 @@ module.exports = class SpriteParser
       if fillCall.callee.property.name is 'lf'
         linearGradientFillSource = @subSourceFromRange fillCall.parent.range, source
         linearGradientFill = @grabFunctionArguments linearGradientFillSource.replace(/.*?lf\(/, 'lf('), true
+      else if fillCall.callee.property.name is 'rf'
+        radialGradientFillSource = @subSourceFromRange fillCall.parent.range, source
+        radialGradientFill = @grabFunctionArguments radialGradientFillSource.replace(/.*?lf\(/, 'lf('), true
       else
         fillColor = fillCall.arguments[0]?.value ? null
-        console.error 'What is this?! Not a fill!' unless fillCall.callee.property.name is 'f'
+        callName = fillCall.callee.property.name
+        console.error 'What is this?! Not a fill!', callName unless callName is 'f'
       strokeCall = node.parent.parent.parent.parent
       if strokeCall.object.callee.property.name is 'ls'
         linearGradientStrokeSource = @subSourceFromRange strokeCall.parent.range, source
@@ -301,6 +305,7 @@ module.exports = class SpriteParser
       shape.ss = strokeStyle if strokeStyle
       shape.fc = fillColor if fillColor
       shape.lf = linearGradientFill if linearGradientFill
+      shape.rf = radialGradientFill if radialGradientFill
       shape.ls = linearGradientStroke if linearGradientStroke
       if name.search('shape') isnt -1 and shape.fc is 'rgba(0,0,0,0.451)' and not shape.ss and not shape.sc
         console.log 'Skipping a shadow', name, shape, 'because we\'re doing shadows separately now.'
diff --git a/app/lib/surface/Camera.coffee b/app/lib/surface/Camera.coffee
index 7848828e3..7b27eb740 100644
--- a/app/lib/surface/Camera.coffee
+++ b/app/lib/surface/Camera.coffee
@@ -285,7 +285,7 @@ module.exports = class Camera extends CocoClass
     @currentTarget = target
     viewportDifference = @updateViewports target
     if viewportDifference > 0.1  # Roughly 0.1 pixel difference in what we can see
-      Backbone.Mediator.publish 'camera:zoom-updated', camera: @, zoom: @zoom, surfaceViewport: @surfaceViewport
+      Backbone.Mediator.publish 'camera:zoom-updated', camera: @, zoom: @zoom, surfaceViewport: @surfaceViewport, minZoom: @minZoom
 
   boundTarget: (pos, zoom) ->
     # Given an {x, y} in Surface coordinates, return one that will keep our viewport on the Surface.
diff --git a/app/lib/surface/Lank.coffee b/app/lib/surface/Lank.coffee
index 16d76032d..318dc5310 100644
--- a/app/lib/surface/Lank.coffee
+++ b/app/lib/surface/Lank.coffee
@@ -104,7 +104,8 @@ module.exports = Lank = class Lank extends CocoClass
       @sprite.destroy?()
       if parent = @sprite.parent
         parent.removeChild @sprite
-        parent.addChild newSprite
+        if parent.spriteSheet is newSprite.spriteSheet
+          parent.addChild newSprite
 
     # get the lank to update things
     for prop in ['lastPos', 'currentRootAction']
diff --git a/app/lib/surface/Surface.coffee b/app/lib/surface/Surface.coffee
index 195dab4b2..dfd0f35f2 100644
--- a/app/lib/surface/Surface.coffee
+++ b/app/lib/surface/Surface.coffee
@@ -384,6 +384,11 @@ module.exports = Surface = class Surface extends CocoClass
     if @ended
       @setPaused false
       @surfaceZoomPauseTimeout = _.delay (=> @setPaused true), 3000
+    @zoomedIn = e.zoom > e.minZoom * 1.1
+    @updateGrabbability()
+
+  updateGrabbability: ->
+    @webGLCanvas.toggleClass 'grabbable', @zoomedIn and not @playing and not @disabled
 
   onDisableControls: (e) ->
     return if e.controls and not ('surface' in e.controls)
@@ -400,6 +405,7 @@ module.exports = Surface = class Surface extends CocoClass
 
   setDisabled: (@disabled) ->
     @lankBoss.disabled = @disabled
+    @updateGrabbability()
 
   onSetPlaying: (e) ->
     @playing = (e ? {}).playing ? true
@@ -408,6 +414,7 @@ module.exports = Surface = class Surface extends CocoClass
       @currentFrame = 1  # Go back to the beginning (but not frame 0, that frame is weird)
     if @fastForwardingToFrame and not @playing
       @fastForwardingToFrame = null
+    @updateGrabbability()
 
   onSetTime: (e) ->
     toFrame = @currentFrame
diff --git a/app/locale/ar.coffee b/app/locale/ar.coffee
index 44afe6448..fcd3d0421 100644
--- a/app/locale/ar.coffee
+++ b/app/locale/ar.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
     for_beginners: "للمبتدئين"
     multiplayer: "متعدد اللاعبين" # Not currently shown on home page
     for_developers: "للمطوّرين" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "إلعب" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
     amount_achieved: "مبلغ"
     achievement: "الإنجاز"
     category_contributor: "مساهم"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
     category_miscellaneous: "متنوعة"
     category_levels: "مستويات"
     category_undefined: "غير مصنف"
diff --git a/app/locale/bg.coffee b/app/locale/bg.coffee
index de3108a77..a6f44ba04 100644
--- a/app/locale/bg.coffee
+++ b/app/locale/bg.coffee
@@ -4,12 +4,13 @@ module.exports = nativeDescription: "български език", englishDescri
     no_ie: "CodeCombat не работи под Internet Explorer 8 или по-стари версии. Съжалявам!" # Warning that only shows up in IE8 and older
     no_mobile: "CodeCombat не е направен за мобилни устройства и може да не работи!" # Warning that shows up on mobile devices
     play: "Играй" # The big play button that just starts playing a level
-    old_browser: "О, не! Браузърът ти е твърде стар за CodeCombat. Съжалявам!" #"Uh oh, your browser is too old to run CodeCombat. Sorry!" # Warning that shows up on really old Firefox/Chrome/Safari
-    old_browser_suffix: "Все пак можеш да опиваш, но най-вероятно няма да проработи." # "You can try anyway, but it probably won't work."
+    old_browser: "О, не! Браузърът ти е твърде стар за CodeCombat. Съжалявам!" # Warning that shows up on really old Firefox/Chrome/Safari
+    old_browser_suffix: "Все пак можеш да опиваш, но най-вероятно няма да проработи."
 #    campaign: "Campaign"
-    for_beginners: "За начинаещи" # "For Beginners"
+    for_beginners: "За начинаещи"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
-    for_developers: "За разработчици" # "For Developers" # Not currently shown on home page.
+    for_developers: "За разработчици" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Нива" # The top nav bar entry where players choose which levels to play
@@ -23,12 +24,12 @@ module.exports = nativeDescription: "български език", englishDescri
 #    code: "Code"
 #    admin: "Admin" # Only shows up when you are an admin
     home: "Начало"
-    contribute: "Допринеси" # "Contribute"
+    contribute: "Допринеси"
 #    legal: "Legal"
     about: "За нас"
     contact: "Контакти"
-    twitter_follow: "Започни да следиш" # "Follow"
-    teachers: "Учители" # "Teachers"
+    twitter_follow: "Започни да следиш"
+    teachers: "Учители"
 
   modal:
     close: "Затвори"
@@ -39,19 +40,19 @@ module.exports = nativeDescription: "български език", englishDescri
 
   diplomat_suggestion:
     title: "Помогни да преведем CodeCombat!" # This shows up when a player switches to a non-English language using the language selector.
-    sub_heading: "Имаме нужда от твоите езикови познания!" # "We need your language skills."
+    sub_heading: "Имаме нужда от твоите езикови познания!"
     pitch_body: "We develop CodeCombat in English, but we already have players all over the world. Many of them want to play in Bulgarian but don't speak English, so if you can speak both, please consider signing up to be a Diplomat and help translate both the CodeCombat website and all the levels into Bulgarian."
     missing_translations: "Until we can translate everything into Bulgarian, you'll see English when Bulgarian isn't available."
     learn_more: "Научи повече за това как да станеш Дипломат"
-    subscribe_as_diplomat: "Стани дипломат" # "Subscribe as a Diplomat"
+    subscribe_as_diplomat: "Стани дипломат"
 
   play:
 #    play_as: "Play As" # Ladder page
 #    spectate: "Spectate" # Ladder page
 #    players: "players" # Hover over a level on /play
 #    hours_played: "hours played" # Hover over a level on /play
-    items: "Предмети" # "Items" # Tooltip on item shop button from /play
-    unlock: "Отключи" # "Unlock" # For purchasing items and heroes
+    items: "Предмети" # Tooltip on item shop button from /play
+    unlock: "Отключи" # For purchasing items and heroes
     confirm: "Потвърди"
 #    owned: "Owned" # For items you own
     locked: "Заключено"
@@ -64,27 +65,27 @@ module.exports = nativeDescription: "български език", englishDescri
 #    next: "Next" # Go from choose hero to choose inventory before playing a level
 #    change_hero: "Change Hero" # Go back from choose inventory to choose hero
 #    choose_inventory: "Equip Items"
-    buy_gems: "Купи скъпоценни камъни" # "Buy Gems"
-    older_campaigns: "Предишни капмании" # "Older Campaigns"
-    anonymous: "Анонимен играч" # "Anonymous Player"
-    level_difficulty: "Трудност" # "Difficulty: "
-    campaign_beginner: "Кампания за начинаещи" # "Beginner Campaign"
+    buy_gems: "Купи скъпоценни камъни"
+    older_campaigns: "Предишни капмании"
+    anonymous: "Анонимен играч"
+    level_difficulty: "Трудност"
+    campaign_beginner: "Кампания за начинаещи"
 #    awaiting_levels_adventurer_prefix: "We release five levels per week."
-    awaiting_levels_adventurer: "Стани Приключенец" # "Sign up as an Adventurer"
-    awaiting_levels_adventurer_suffix: "за да бъдеш първият, който играе нови нива." # "to be the first to play new levels."
+    awaiting_levels_adventurer: "Стани Приключенец"
+    awaiting_levels_adventurer_suffix: "за да бъдеш първият, който играе нови нива."
     choose_your_level: "Избери своето ниво" # The rest of this section is the old play view at /play-old and isn't very important.
 #    adventurer_prefix: "You can jump to any level below, or discuss the levels on "
-    adventurer_forum: "Приключенският форум" # "the Adventurer forum"
+    adventurer_forum: "Приключенският форум"
 #    adventurer_suffix: "."
-    campaign_old_beginner: "Предишни кампании за начинаещи" # "Old Beginner Campaign"
+    campaign_old_beginner: "Предишни кампании за начинаещи"
 #    campaign_old_beginner_description: "... in which you learn the wizardry of programming."
-    campaign_dev: "Случайни трудни нива" # "Random Harder Levels"
+    campaign_dev: "Случайни трудни нива"
 #    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
 #    campaign_multiplayer: "Multiplayer Arenas"
 #    campaign_multiplayer_description: "... in which you code head-to-head against other players."
 #    campaign_player_created: "Player-Created"
 #    campaign_player_created_description: "... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>."
-    campaign_classic_algorithms: "Класически алгоритми" # "Classic Algorithms"
+    campaign_classic_algorithms: "Класически алгоритми"
 #    campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
 #    campaign_forest: "Forest Campaign"
 #    campaign_dungeon: "Dungeon Campaign"
@@ -115,13 +116,13 @@ module.exports = nativeDescription: "български език", englishDescri
   recover:
     recover_account_title: "Възстанови Акаунт"
     send_password: "Изпрати парола за възстановяване"
-    recovery_sent: "Писмото за възстановяване на парола е изпратено." # "Recovery email sent."
+    recovery_sent: "Писмото за възстановяване на парола е изпратено."
 
 #  items:
 #    primary: "Primary"
 #    secondary: "Secondary"
 #    armor: "Armor"
-    accessories: "Аксесоари" # "Accessories"
+#    accessories: "Accessories"
 #    misc: "Misc"
 #    books: "Books"
 
@@ -145,11 +146,11 @@ module.exports = nativeDescription: "български език", englishDescri
   general:
     and: "и"
     name: "Име"
-    date: "Дата" # "Date"
+    date: "Дата"
 #    body: "Body"
     version: "Версия"
 #    commit_msg: "Commit Message"
-    version_history: "Предишни версии" # "Version History"
+    version_history: "Предишни версии"
 #    version_history_for: "Version History for: "
 #    result: "Result"
     results: "Резултати"
@@ -157,7 +158,7 @@ module.exports = nativeDescription: "български език", englishDescri
     or: "или"
 #    subject: "Subject"
     email: "Email"
-    password: "Парола" # "Password"
+    password: "Парола"
     message: "Съобщение"
 #    code: "Code"
 #    ladder: "Ladder"
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "български език", englishDescri
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "български език", englishDescri
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "български език", englishDescri
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -405,10 +429,10 @@ module.exports = nativeDescription: "български език", englishDescri
 #    cla_prefix: "To save changes, first you must agree to our"
 #    cla_url: "CLA"
 #    cla_suffix: "."
-    cla_agree: "СЪГЛАСЕН СЪМ" # "I AGREE"
+#    cla_agree: "I AGREE"
 
 #  contact:
-    contact_us: "Свържи се с CodeCombat" # "Contact CodeCombat"
+#    contact_us: "Contact CodeCombat"
 #    welcome: "Good to hear from you! Use this form to send us email. "
 #    contribute_prefix: "If you're interested in contributing, check out our "
 #    contribute_page: "contribute page"
@@ -430,17 +454,17 @@ module.exports = nativeDescription: "български език", englishDescri
 #    password_tab: "Password"
 #    emails_tab: "Emails"
 #    admin: "Admin"
-    new_password: "Нова парола" # "New Password"
+#    new_password: "New Password"
 #    new_password_verify: "Verify"
 #    email_subscriptions: "Email Subscriptions"
 #    email_subscriptions_none: "No Email Subscriptions."
-    email_announcements: "Съобщения" # "Announcements"
+#    email_announcements: "Announcements"
 #    email_announcements_description: "Get emails on the latest news and developments at CodeCombat."
-    email_notifications: "Известия" # "Notifications"
+#    email_notifications: "Notifications"
 #    email_notifications_summary: "Controls for personalized, automatic email notifications related to your CodeCombat activity."
 #    email_any_notes: "Any Notifications"
 #    email_any_notes_description: "Disable to stop all activity notification emails."
-    email_news: "Новини" # "News"
+#    email_news: "News"
 #    email_recruit_notes: "Job Opportunities"
 #    email_recruit_notes_description: "If you play really well, we may contact you about getting you a (better) job."
 #    contributor_emails: "Contributor Class Emails"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "български език", englishDescri
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/ca.coffee b/app/locale/ca.coffee
index a8828d10f..b4062a62b 100644
--- a/app/locale/ca.coffee
+++ b/app/locale/ca.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
     for_beginners: "Per a principiants"
     multiplayer: "Multijugador" # Not currently shown on home page
     for_developers: "Per a Desenvolupadors" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Nivells" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
     failing: "Fallant"
     action_timeline: "Cronologia d'accions"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
     choose_hero: "Escull el teu heroi"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
     skills: "Habilitats"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
   save_load:
     granularity_saved_games: "Desats"
     granularity_change_history: "Historial"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
     amount_achieved: "Cantitat"
     achievement: "Triomf"
     category_contributor: "Contribuidor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
     category_miscellaneous: "Miscel·lània"
     category_levels: "Nivells"
     category_undefined: "Sense categoria"
diff --git a/app/locale/cs.coffee b/app/locale/cs.coffee
index 0f55bdc94..3f3af785d 100644
--- a/app/locale/cs.coffee
+++ b/app/locale/cs.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Úrovně" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
 #    failing: "Failing"
     action_timeline: "Časová osa"
     click_to_select: "Vyberte kliknutím."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Znovunačíst veškerý kód?"
     reload_really: "Opravdu chcete resetovat tuto úroveň do počátečního stavu?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/da.coffee b/app/locale/da.coffee
index 24149009a..9632260a0 100644
--- a/app/locale/da.coffee
+++ b/app/locale/da.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
     for_beginners: "For Begyndere"
     multiplayer: "Multiplayer" # Not currently shown on home page
     for_developers: "For Udviklere" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Spil" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
 #    failing: "Failing"
     action_timeline: "Handlingstidslinje"
     click_to_select: "Klik på en enhed for at vælge"
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Genindlæs alt kode?"
     reload_really: "Er du sikker på at du ønsker at genindlæse denne bane helt fra begyndelsen?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/de-AT.coffee b/app/locale/de-AT.coffee
index eefe6fe44..cca647469 100644
--- a/app/locale/de-AT.coffee
+++ b/app/locale/de-AT.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
     for_beginners: "Für Anfänger"
     multiplayer: "Mehrspieler" # Not currently shown on home page
     for_developers: "Für Entwickler" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Spielen" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
 #    failing: "Failing"
     action_timeline: "Aktionszeitstrahl"
     click_to_select: "Klicke auf eine Einheit, um sie auszuwählen."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Gesamten Code neu laden?"
     reload_really: "Bist Du sicher, dass Du das Level neu beginnen willst?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
     choose_hero: "Wähle deinen Helden"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
   save_load:
     granularity_saved_games: "Gespeichert"
     granularity_change_history: "Historie"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
     amount_achieved: "Anzahl"
     achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
     category_miscellaneous: "Sonstiges"
     category_levels: "Level"
     category_undefined: "ohne Kategorie"
diff --git a/app/locale/de-CH.coffee b/app/locale/de-CH.coffee
index bca160b09..3ada8310f 100644
--- a/app/locale/de-CH.coffee
+++ b/app/locale/de-CH.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
     for_beginners: "Für Afänger"
     multiplayer: "Multiplayer" # Not currently shown on home page
     for_developers: "Für Entwickler" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
     failing: "Fehler"
     action_timeline: "Aktionsziitleiste"
     click_to_select: "Klick uf e Einheit zum sie uswähle."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "De ganze Code neu lade?"
     reload_really: "Bisch sicher du willsch level neu lade bis zrugg zum Afang?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/de-DE.coffee b/app/locale/de-DE.coffee
index 09be531d0..12ea5069e 100644
--- a/app/locale/de-DE.coffee
+++ b/app/locale/de-DE.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
     for_beginners: "Für Anfänger"
     multiplayer: "Mehrspieler" # Not currently shown on home page
     for_developers: "Für Entwickler" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Spielen" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
     failing: "Fehlgeschlagen"
     action_timeline: "Aktionszeitstrahl"
     click_to_select: "Klicke auf eine Einheit, um sie auszuwählen."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
     reload: "Neu laden"
     reload_title: "Gesamten Code neu laden?"
     reload_really: "Bist Du sicher, dass Du das Level neu beginnen willst?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
     few_gems: "Ein paar Edelsteine"
     pile_gems: "Stapel von Edelsteinen"
     chest_gems: "Kiste von Edelsteinen"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
     choose_hero: "Wähle deinen Helden"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
     blocks: "Blockieren" # As in "this shield blocks this much damage"
     skills: "Fähigkeiten"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
   save_load:
     granularity_saved_games: "Gespeichert"
     granularity_change_history: "Historie"
@@ -587,7 +611,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
     page_title: "Mitwirken"
     character_classes_title: "Charakter Klassen"
     introduction_desc_intro: "Wir haben hohe Erwartungen für CodeCombat."
-#   introduction_desc_pref: "We want to be where programmers of all stripes come to learn and play together, introduce others to the wonderful world of coding, and reflect the best parts of the community. We can't and don't want to do that alone; what makes projects like GitHub, Stack Overflow and Linux great are the people who use them and build on them. To that end, "
+#    introduction_desc_pref: "We want to be where programmers of all stripes come to learn and play together, introduce others to the wonderful world of coding, and reflect the best parts of the community. We can't and don't want to do that alone; what makes projects like GitHub, Stack Overflow and Linux great are the people who use them and build on them. To that end, "
     introduction_desc_github_url: "CodeCombat ist komplett OpenSource"
 #    introduction_desc_suf: ", and we aim to provide as many ways as possible for you to take part and make this project as much yours as ours."
     introduction_desc_ending: "Wir hoffen du nimmst an unserer Party teil!"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
     amount_achieved: "Anzahl"
     achievement: "Achievement"
     category_contributor: "Mitwirkender"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
     category_miscellaneous: "Sonstiges"
     category_levels: "Level"
     category_undefined: "ohne Kategorie"
diff --git a/app/locale/el.coffee b/app/locale/el.coffee
index ab50ce914..1a75aff2c 100644
--- a/app/locale/el.coffee
+++ b/app/locale/el.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre
     for_beginners: "Για αρχάριους"
     multiplayer: "Πολλαπλοί Παίκτες" # Not currently shown on home page
     for_developers: "Για προγραμματιστές" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Επίπεδα" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre
 #    failing: "Failing"
     action_timeline: "Χρονοδιάγραμμα δράσης"
     click_to_select: "Κάντε κλικ σε μια μονάδα για να το επιλέξετε."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Ανανέωση όλου του κωδικά;"
     reload_really: "Είστε σίγουροι ότι θέλετε να φορτώσετε αυτό το επίπεδο από την αρχή;"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/en-AU.coffee b/app/locale/en-AU.coffee
index caeba616e..9550bac2b 100644
--- a/app/locale/en-AU.coffee
+++ b/app/locale/en-AU.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
 #  nav:
 #    play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "English (AU)", englishDescription: "English
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/en-GB.coffee b/app/locale/en-GB.coffee
index a94ec00b4..9231d7c1a 100644
--- a/app/locale/en-GB.coffee
+++ b/app/locale/en-GB.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
 #  nav:
 #    play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/en-US.coffee b/app/locale/en-US.coffee
index ddfc418ae..440d59d2b 100644
--- a/app/locale/en-US.coffee
+++ b/app/locale/en-US.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
 #  nav:
 #    play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/en.coffee b/app/locale/en.coffee
index 92615b86b..987e29bdb 100644
--- a/app/locale/en.coffee
+++ b/app/locale/en.coffee
@@ -351,6 +351,24 @@
     blocks: "Blocks" # As in "this shield blocks this much damage"
     skills: "Skills"
 
+  skill_docs:
+    writable: "writable"  # Hover over "attack" in Your Skills while playing a level to see most of this
+    read_only: "read-only"
+    action_name: "name"
+    action_cooldown: "Takes"
+    action_specific_cooldown: "Cooldown"
+    action_damage: "Damage"
+    action_range: "Range"
+    action_radius: "Radius"
+    action_duration: "Duration"
+    example: "Example"
+    ex: "ex"  # Abbreviation of "example"
+    current_value: "Current Value"
+    default_value: "Default value"
+    parameters: "Parameters"
+    returns: "Returns"
+    granted_by: "Granted by"
+
   save_load:
     granularity_saved_games: "Saved"
     granularity_change_history: "History"
diff --git a/app/locale/es-419.coffee b/app/locale/es-419.coffee
index 3e83a46a4..c10af814c 100644
--- a/app/locale/es-419.coffee
+++ b/app/locale/es-419.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
     for_beginners: "Para Principiantes"
     multiplayer: "Multijugador" # Not currently shown on home page
     for_developers: "Para Desarrolladores" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Jugar" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
     failing: "Fallando"
     action_timeline: "Cronologia de Accion"
     click_to_select: "Has click en una unidad para seleccionarla."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "¿Recargar Todo el Código?"
     reload_really: "¿Estás seguro de que quieres empezar este nivel desde el principio?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
     choose_hero: "Elige tu héroe"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
   save_load:
     granularity_saved_games: "Almacenado"
     granularity_change_history: "Historia"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/es-ES.coffee b/app/locale/es-ES.coffee
index f6536648f..94cb3e038 100644
--- a/app/locale/es-ES.coffee
+++ b/app/locale/es-ES.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
     for_beginners: "Para principiantes"
     multiplayer: "Multijugador" # Not currently shown on home page
     for_developers: "Para programadores" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Jugar" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
     failing: "Fallando"
     action_timeline: "Cronología de Acción"
     click_to_select: "Click en una unidad para seleccionarla"
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "¿Recargar todo el código?"
     reload_really: "¿Estas seguro que quieres reiniciar el nivel?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
     choose_hero: "Selecciona tu Heroe"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
     skills: "Habilidades"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
   save_load:
     granularity_saved_games: "Salvado"
     granularity_change_history: "Historia"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
     amount_achieved: "Cantidad"
     achievement: "Logro"
     category_contributor: "Contribuidor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
     category_miscellaneous: "Miscelanea"
     category_levels: "Niveles"
     category_undefined: "Sin categorizar"
diff --git a/app/locale/fa.coffee b/app/locale/fa.coffee
index 126cf153e..91556148a 100644
--- a/app/locale/fa.coffee
+++ b/app/locale/fa.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "سطوح" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/fi.coffee b/app/locale/fi.coffee
index 1ac382a95..200e5e610 100644
--- a/app/locale/fi.coffee
+++ b/app/locale/fi.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
 #  nav:
 #    play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/fr.coffee b/app/locale/fr.coffee
index 1acbd3846..6ba8ff7ef 100644
--- a/app/locale/fr.coffee
+++ b/app/locale/fr.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
     for_beginners: "Pour débutants"
     multiplayer: "Multijoueurs" # Not currently shown on home page
     for_developers: "Pour développeurs" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Jouer" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
     failing: "Échec"
     action_timeline: "Action sur la ligne de temps"
     click_to_select: "Clique sur une unité pour la sélectionner."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Recharger tout le code?"
     reload_really: "Êtes-vous sûr de vouloir recharger ce niveau et retourner au début?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
     choose_hero: "Choisissez votre Héro"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
     skills: "Compétences"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
   save_load:
     granularity_saved_games: "Sauvegardé"
     granularity_change_history: "Historique"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
     amount_achieved: "Quantité"
     achievement: "Succès"
     category_contributor: "Contributeur"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
     category_miscellaneous: "Divers"
     category_levels: "Niveaux"
     category_undefined: "Non classé"
diff --git a/app/locale/gl.coffee b/app/locale/gl.coffee
index f5e87f1aa..18a0ec771 100644
--- a/app/locale/gl.coffee
+++ b/app/locale/gl.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr
     for_beginners: "Para principiantes"
     multiplayer: "Multixogador" # Not currently shown on home page
     for_developers: "Para programadores" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Xogar" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr
     failing: "Fallando"
     action_timeline: "Cronoloxía de Acción"
     click_to_select: "Preme nunha unidade para seleccionala"
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Recargar todo o código?"
     reload_really: "Estás seguro que queres reiniciar o nivel?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
     choose_hero: "Selecciona o teu Heroe"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
     skills: "Habilidades"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
   save_load:
     granularity_saved_games: "Gardado"
     granularity_change_history: "Historia"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr
     amount_achieved: "Cantidade"
     achievement: "Logro"
     category_contributor: "Contribuidor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
     category_miscellaneous: "Miscelánea"
     category_levels: "Niveis"
     category_undefined: "Sen categorizar"
diff --git a/app/locale/he.coffee b/app/locale/he.coffee
index 09e3914d9..20d669e2b 100644
--- a/app/locale/he.coffee
+++ b/app/locale/he.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
     for_beginners: "למתחילים"
     multiplayer: "רב-משתתפים" # Not currently shown on home page
     for_developers: "למומחים" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "שלבים" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/hi.coffee b/app/locale/hi.coffee
index 7f6018cb6..6f2b67f4d 100644
--- a/app/locale/hi.coffee
+++ b/app/locale/hi.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
 #  nav:
 #    play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/hu.coffee b/app/locale/hu.coffee
index 5ff8c447e..d87e401e8 100644
--- a/app/locale/hu.coffee
+++ b/app/locale/hu.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
     for_beginners: "Kezdőknek"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
     for_developers: "Fejlesztőknek" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Játék" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
 #    failing: "Failing"
     action_timeline: "Akció - Idővonal"
     click_to_select: "Kattints egy egységre, hogy kijelöld!"
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Újra kezded mindet?"
     reload_really: "Biztos vagy benne, hogy előlről szeretnéd kezdeni az egész pályát?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/id.coffee b/app/locale/id.coffee
index 67b838a8f..be6888644 100644
--- a/app/locale/id.coffee
+++ b/app/locale/id.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
 #  nav:
 #    play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/it.coffee b/app/locale/it.coffee
index b1e261777..11bb86072 100644
--- a/app/locale/it.coffee
+++ b/app/locale/it.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
     for_beginners: "Per Principianti"
     multiplayer: "Multiplayer" # Not currently shown on home page
     for_developers: "Per Sviluppatori" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Livelli" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
 #    failing: "Failing"
     action_timeline: "Barra temporale delle azioni"
     click_to_select: "Clicca un'unità per selezionarla."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
     reload: "Ricarica"
     reload_title: "Ricarica tutto il codice?"
     reload_really: "Sei sicuro di voler ricominciare il livello?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
   save_load:
     granularity_saved_games: "Salvato"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/ja.coffee b/app/locale/ja.coffee
index 8ea8ac26c..e1b04fe7e 100644
--- a/app/locale/ja.coffee
+++ b/app/locale/ja.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
     for_beginners: "初心者向け"
     multiplayer: "マルチプレイヤー" # Not currently shown on home page
     for_developers: "開発者向け" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "ゲームスタート" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
 #    failing: "Failing"
     action_timeline: "アクション・タイムライン"
     click_to_select: "ユニットを左クリックで選択してください"
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "コードを再読み込ますか?"
     reload_really: "レベルをリセットします。よろしいですか?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/ko.coffee b/app/locale/ko.coffee
index ba5b8aaec..44383efbc 100644
--- a/app/locale/ko.coffee
+++ b/app/locale/ko.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
     for_beginners: "초보자용"
     multiplayer: "멀티플레이어" # Not currently shown on home page
     for_developers: "개발자용" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "레벨" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
     failing: "다시 한번 더 도전해보세요."
     action_timeline: "액션 타임라인"
     click_to_select: "유닛을 선택하기 위해서 유닛을 마우스로 클릭하세요."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "모든 코드가 다시 로딩 되었나요?"
     reload_really: "모든 레벨 초기화합니다. 확실한가요?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/lt.coffee b/app/locale/lt.coffee
index 905d27914..f4074d540 100644
--- a/app/locale/lt.coffee
+++ b/app/locale/lt.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
 #  nav:
 #    play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/ms.coffee b/app/locale/ms.coffee
index d0db7a9e9..6d52afcad 100644
--- a/app/locale/ms.coffee
+++ b/app/locale/ms.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Mula" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/nb.coffee b/app/locale/nb.coffee
index c53b55eef..89be9a4cf 100644
--- a/app/locale/nb.coffee
+++ b/app/locale/nb.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
     for_beginners: "For Begynnere"
     multiplayer: "Flerspiller" # Not currently shown on home page
     for_developers: "For Utviklere" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Spill" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
 #    failing: "Failing"
     action_timeline: "Hendelsestidslinje"
     click_to_select: "Klikk på en enhet for å velge den."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Laste All Koden på Nytt?"
     reload_really: "Er du sikker på at du vil laste dette nivået på nytt, tilbake til begynnelsen?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/nl-BE.coffee b/app/locale/nl-BE.coffee
index 4e73d27ac..8663012cb 100644
--- a/app/locale/nl-BE.coffee
+++ b/app/locale/nl-BE.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
     for_beginners: "Voor Beginners"
     multiplayer: "Multiplayer" # Not currently shown on home page
     for_developers: "Voor ontwikkelaars" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
 #    failing: "Failing"
     action_timeline: "Actie tijdlijn"
     click_to_select: "Klik op een eenheid om deze te selecteren."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Alle Code Herladen?"
     reload_really: "Weet je zeker dat je dit level tot het begin wilt herladen?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/nl-NL.coffee b/app/locale/nl-NL.coffee
index ec4bc3a19..83b7668dc 100644
--- a/app/locale/nl-NL.coffee
+++ b/app/locale/nl-NL.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
     for_beginners: "Voor Beginners"
     multiplayer: "Multiplayer" # Not currently shown on home page
     for_developers: "Voor ontwikkelaars" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
 #    failing: "Failing"
     action_timeline: "Actie tijdlijn"
     click_to_select: "Klik op een eenheid om deze te selecteren."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Alle Code Herladen?"
     reload_really: "Weet je zeker dat je dit level tot het begin wilt herladen?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/nn.coffee b/app/locale/nn.coffee
index 0fb22f26b..227eaeaf9 100644
--- a/app/locale/nn.coffee
+++ b/app/locale/nn.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
 #  nav:
 #    play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Norwegian Nynorsk", englishDescription: "No
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/no.coffee b/app/locale/no.coffee
index c5c38a972..fae0aa831 100644
--- a/app/locale/no.coffee
+++ b/app/locale/no.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Spill" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
 #    failing: "Failing"
     action_timeline: "Hendelsestidslinje"
     click_to_select: "Klikk på en enhet for å velge den."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Laste all koden på nytt?"
     reload_really: "Er du sikker på at du vil laste dette nivået på nytt, tilbake til begynnelsen?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/pl.coffee b/app/locale/pl.coffee
index 649dcf229..b5cd7f9a8 100644
--- a/app/locale/pl.coffee
+++ b/app/locale/pl.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
     for_beginners: "Dla początkujących"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
     for_developers: "Dla developerów" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Graj" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
     failing: "Niepowodzenie"
     action_timeline: "Oś czasu"
     click_to_select: "Kliknij jednostkę, by ją zaznaczyć."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Przywrócić cały kod?"
     reload_really: "Czy jesteś pewien, że chcesz przywrócić kod startowy tego poziomu?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee
index 96d0a148a..62db838e7 100644
--- a/app/locale/pt-BR.coffee
+++ b/app/locale/pt-BR.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     for_beginners: "Para Iniciantes"
     multiplayer: "Multijogador" # Not currently shown on home page
     for_developers: "Para Desenvolvedores" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Jogar" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     failing: "Falta"
     action_timeline: "Linha do Tempo das Ações"
     click_to_select: "Clique em um personagem para selecioná-lo."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Recarregar Todo o Código?"
     reload_really: "Você tem certeza que quer reiniciar o estágio?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
     choose_hero: "Escolha seu Herói"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
   save_load:
     granularity_saved_games: "Salvo"
     granularity_change_history: "Histórico"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
     amount_achieved: "Montante"
     achievement: "Conquista"
     category_contributor: "Cotribuidor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
     category_miscellaneous: "Diversos"
     category_levels: "Níveis"
     category_undefined: "Sem categoria"
diff --git a/app/locale/pt-PT.coffee b/app/locale/pt-PT.coffee
index bca9a067f..fcdd20cc1 100644
--- a/app/locale/pt-PT.coffee
+++ b/app/locale/pt-PT.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
     for_beginners: "Para Iniciantes"
     multiplayer: "Multijogador" # Not currently shown on home page
     for_developers: "Para Programadores" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Níveis" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
     failing: "A falhar"
     action_timeline: "Linha do Tempo de Ações"
     click_to_select: "Clica numa unidade para selecioná-la."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
     reload: "Recarregar"
     reload_title: "Recarregar o Código Todo?"
     reload_really: "Tens a certeza que queres recarregar este nível de volta ao início?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
     few_gems: "Algumas gemas"
     pile_gems: "Pilha de gemas"
     chest_gems: "Arca de gemas"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
     choose_hero: "Escolhe o Teu Herói"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
     blocks: "Bloqueia" # As in "this shield blocks this much damage"
     skills: "Habilidades"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
   save_load:
     granularity_saved_games: "Guardados"
     granularity_change_history: "Histórico"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
     amount_achieved: "Quantidade"
     achievement: "Conquista"
     category_contributor: "Contribuidor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
     category_miscellaneous: "Vários"
     category_levels: "Níveis"
     category_undefined: "Sem Categoria"
diff --git a/app/locale/ro.coffee b/app/locale/ro.coffee
index ec75be948..034341a82 100644
--- a/app/locale/ro.coffee
+++ b/app/locale/ro.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
     for_beginners: "Pentru Începători"
     multiplayer: "Multiplayer" # Not currently shown on home page
     for_developers: "Pentru dezvoltatori" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Nivele" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
     failing: "Eşec"
     action_timeline: "Timeline-ul acțiunii"
     click_to_select: "Apasă pe o unitate pentru a o selecta."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Reîncarcă tot codul?"
     reload_really: "Ești sigur că vrei să reîncarci nivelul de la început?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/ru.coffee b/app/locale/ru.coffee
index 2535bc95c..ac89842c0 100644
--- a/app/locale/ru.coffee
+++ b/app/locale/ru.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     for_beginners: "Новичкам"
     multiplayer: "Мультиплеер" # Not currently shown on home page
     for_developers: "Разработчикам" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Уровни" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     failing: "Неудача"
     action_timeline: "График действий"
     click_to_select: "Выберите персонажа, щёлкнув на нём"
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
     reload: "Перезагрузить"
     reload_title: "Перезагрузить код полностью?"
     reload_really: "Вы уверены, что хотите начать уровень сначала?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     few_gems: "Немного самоцветов"
     pile_gems: "Кучка самоцветов"
     chest_gems: "Сундук с самоцветами"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
     choose_hero: "Выберите героя"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     blocks: "Блокирует" # As in "this shield blocks this much damage"
     skills: "Умения"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
   save_load:
     granularity_saved_games: "Сохранено"
     granularity_change_history: "История"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
     amount_achieved: "Количество"
     achievement: "Достижение"
     category_contributor: "Помощь"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
     category_miscellaneous: "Помощь"
     category_levels: "Уровни"
     category_undefined: "Неопределено"
diff --git a/app/locale/sk.coffee b/app/locale/sk.coffee
index eaa896a1b..69a11569f 100644
--- a/app/locale/sk.coffee
+++ b/app/locale/sk.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
     for_beginners: "Pre začiatočníkov"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
     for_developers: "Pre vývojárov" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Hraj" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/sl.coffee b/app/locale/sl.coffee
index eff85a426..578d8f577 100644
--- a/app/locale/sl.coffee
+++ b/app/locale/sl.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
 #  nav:
 #    play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/sr.coffee b/app/locale/sr.coffee
index 02afb1fe1..5ff0ec565 100644
--- a/app/locale/sr.coffee
+++ b/app/locale/sr.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Нивои" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
 #    failing: "Failing"
     action_timeline: "Временска линија акције"
     click_to_select: "Кликни на јединицу да је селектујеш"
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Поновно учитавање целог кода?"
     reload_really: "Да ли сте сигурни да желите да кренете ниво испочетка?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/sv.coffee b/app/locale/sv.coffee
index 2af6e59db..9304d9878 100644
--- a/app/locale/sv.coffee
+++ b/app/locale/sv.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
     for_beginners: "För nybörjare"
     multiplayer: "Flera spelare" # Not currently shown on home page
     for_developers: "För utvecklare" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Spela" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
 #    failing: "Failing"
     action_timeline: "Händelse-tidslinje"
     click_to_select: "Klicka på en enhet för att välja den."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Ladda om all kod?"
     reload_really: "Är du säker på att du vill ladda om nivån från början?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/th.coffee b/app/locale/th.coffee
index da645d672..95b7eace7 100644
--- a/app/locale/th.coffee
+++ b/app/locale/th.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "เล่น" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/tr.coffee b/app/locale/tr.coffee
index 3a0150c9b..9c75fda6f 100644
--- a/app/locale/tr.coffee
+++ b/app/locale/tr.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     for_beginners: "Yeni Başlayanlar için"
     multiplayer: "Çoklu-oyuncu Kipi" # Not currently shown on home page
     for_developers: "Geliştiriciler için" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Oyna" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
     failing: "Başarısız"
     action_timeline: "Eylem Çizelgesi"
     click_to_select: "Birimi seçmek için üzerine tıklayın."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Tüm kod yeniden yüklensin mi?"
     reload_really: "Bu seviyeyi en baştan yüklemek istediğinizden emin misiniz?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
     choose_hero: "Kahramanınızı Seçin"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
     skills: "Yetenekler"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
   save_load:
     granularity_saved_games: "Kaydedildi"
     granularity_change_history: "Geçmiş"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/uk.coffee b/app/locale/uk.coffee
index b3adc204e..b192d9d28 100644
--- a/app/locale/uk.coffee
+++ b/app/locale/uk.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "українська мова", englishDesc
     for_beginners: "Для новачків"
     multiplayer: "Командна гра" # Not currently shown on home page
     for_developers: "Для розробників" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Грати" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "українська мова", englishDesc
 #    failing: "Failing"
     action_timeline: "Лінія часу"
     click_to_select: "Клікніть на юніті, щоб обрати його."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Перезавантажити весь код?"
     reload_really: "Ви впевнені, що хочете перезавантажити цей рівень і почати спочатку?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "українська мова", englishDesc
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "українська мова", englishDesc
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "українська мова", englishDesc
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/ur.coffee b/app/locale/ur.coffee
index 590159202..aca26620b 100644
--- a/app/locale/ur.coffee
+++ b/app/locale/ur.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
 #  nav:
 #    play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/vi.coffee b/app/locale/vi.coffee
index c04c63d10..abf72134d 100644
--- a/app/locale/vi.coffee
+++ b/app/locale/vi.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
     for_beginners: "Dành cho người bắt đầu chơi"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "Các cấp độ" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
     click_to_select: "Kích vào đơn vị để chọn nó."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "Tải lại tất cả mã?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/zh-HANS.coffee b/app/locale/zh-HANS.coffee
index 119db945c..6da6959ee 100644
--- a/app/locale/zh-HANS.coffee
+++ b/app/locale/zh-HANS.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     for_beginners: "适合初学者"
     multiplayer: "多人游戏" # Not currently shown on home page
     for_developers: "适合开发者" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "关卡选择" # The top nav bar entry where players choose which levels to play
@@ -55,7 +56,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     confirm: "确认"
     owned: "已拥有" # For items you own
     locked: "需解锁"
-    available: "可用" # Available
+    available: "可用"
     skills_granted: "获得技能" # Property documentation details
     heroes: "英雄" # Tooltip on hero shop button from /play
     achievements: "成就" # Tooltip on achievement list button from /play
@@ -64,14 +65,14 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     next: "下一步" # Go from choose hero to choose inventory before playing a level
     change_hero: "重新选择英雄" # Go back from choose inventory to choose hero
     choose_inventory: "装备道具"
-    buy_gems: "购买宝石" # Buy Gems
+    buy_gems: "购买宝石"
     older_campaigns: "旧的战役"
     anonymous: "匿名玩家"
     level_difficulty: "难度:"
     campaign_beginner: "新手作战"
     awaiting_levels_adventurer_prefix: "我们每周开放五个关卡"
-    awaiting_levels_adventurer: "注册成为冒险家" #"Sign up as an Adventurer"
-    awaiting_levels_adventurer_suffix: "来优先尝试新关卡" #to be the first to play new levels."
+    awaiting_levels_adventurer: "注册成为冒险家"
+    awaiting_levels_adventurer_suffix: "来优先尝试新关卡"
     choose_your_level: "选择关卡" # The rest of this section is the old play view at /play-old and isn't very important.
     adventurer_prefix: "你可以选择以下任意关卡,或者讨论以上的关卡。到"
     adventurer_forum: "冒险者论坛"
@@ -86,8 +87,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     campaign_player_created_description: "……在这里你可以与你的小伙伴的创造力战斗 <a href=\"/contribute#artisan\">技术指导</a>."
     campaign_classic_algorithms: "经典算法"
     campaign_classic_algorithms_description: "... 你可以在此学习到计算机科学中最常用的算法"
-    campaign_forest: "森林战役" #Forest Campaign"
-    campaign_dungeon: "地牢战役" #Dungeon Campaign"
+    campaign_forest: "森林战役"
+    campaign_dungeon: "地牢战役"
 
   login:
     sign_up: "注册"
@@ -95,10 +96,10 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     logging_in: "正在登录"
     log_out: "登出"
     recover: "找回账户"
-    authenticate_gplus: "使用 G+ 授权"#Authenticate G+"
-    load_profile: "载入 G+ 档案" # Load G+ Profile"
-    load_email: "载入 G+ 电子邮件" #Load G+ Email"
-    finishing: "完成..." #Finishing"
+    authenticate_gplus: "使用 G+ 授权"
+    load_profile: "载入 G+ 档案"
+    load_email: "载入 G+ 电子邮件"
+    finishing: "完成..."
 
   signup:
     create_account_title: "创建一个账户来保存进度"
@@ -118,8 +119,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     recovery_sent: "找回账户邮件已发送."
 
   items:
-    primary: "右手"#"Primary"
-    secondary: "左手"#Secondary"
+    primary: "右手"
+    secondary: "左手"
     armor: "盔甲"
     accessories: "配饰"
     misc: "辅助道具"
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     failing: "失败"
     action_timeline: "行动时间轴"
     click_to_select: "点击选择一个单元。"
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
     reload: "重载"
     reload_title: "重载所有代码?"
     reload_really: "确定重载这一关,返回开始处吗?"
@@ -315,10 +318,13 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     equip: "装备"
     unequip: "取消装备"
 
-  buy_gems: 
+  buy_gems:
     few_gems: "几个宝石"
     pile_gems: "一堆宝石"
     chest_gems: "一箱宝石"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
   choose_hero:
     choose_hero: "请选择您的英雄"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     blocks: "格挡" # As in "this shield blocks this much damage"
     skills: "技能"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
   save_load:
     granularity_saved_games: "保存"
     granularity_change_history: "历史记录"
@@ -698,7 +722,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     rank_last_submitted: "已提交"
     help_simulate: "模拟游戏需要帮助?"
     code_being_simulated: "你的新代码正在被其他玩家模拟评分。这个将会刷新,作为一个新游戏开始。"
-    # no_ranked_matches_pre: "No ranked matches for the "
+#    no_ranked_matches_pre: "No ranked matches for the "
 #    no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked."
     choose_opponent: "选择一个对手"
     select_your_language: "选择你使用的语言!"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
     amount_achieved: "数量"
     achievement: "成就"
     category_contributor: "贡献"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
     category_miscellaneous: "其他"
     category_levels: "等级"
     category_undefined: "未分类"
diff --git a/app/locale/zh-HANT.coffee b/app/locale/zh-HANT.coffee
index 40cf88b64..37412d438 100644
--- a/app/locale/zh-HANT.coffee
+++ b/app/locale/zh-HANT.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "開始遊戲" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
 #    failing: "Failing"
     action_timeline: "行動時間軸"
     click_to_select: "點擊選擇一個單元。"
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "重新載入程式碼?"
     reload_really: "確定重設所有的程式碼?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
     amount_achieved: "數量"
     achievement: "成就"
     category_contributor: "貢獻者"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
     category_levels: "等級"
     category_undefined: "未定義"
diff --git a/app/locale/zh-WUU-HANS.coffee b/app/locale/zh-WUU-HANS.coffee
index 0a1e2d0ba..df7a82580 100644
--- a/app/locale/zh-WUU-HANS.coffee
+++ b/app/locale/zh-WUU-HANS.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
 #    for_beginners: "For Beginners"
 #    multiplayer: "Multiplayer" # Not currently shown on home page
 #    for_developers: "For Developers" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
 #  nav:
 #    play: "Levels" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
 #    failing: "Failing"
 #    action_timeline: "Action Timeline"
 #    click_to_select: "Click on a unit to select it."
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
 #    reload_title: "Reload All Code?"
 #    reload_really: "Are you sure you want to reload this level back to the beginning?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/locale/zh-WUU-HANT.coffee b/app/locale/zh-WUU-HANT.coffee
index c2af01631..5cd0c9b1e 100644
--- a/app/locale/zh-WUU-HANT.coffee
+++ b/app/locale/zh-WUU-HANT.coffee
@@ -10,6 +10,7 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
     for_beginners: "適合學起頭個人"
     multiplayer: "聚隊打遊戲" # Not currently shown on home page
     for_developers: "適合開發個人" # Not currently shown on home page.
+#    or_ipad: "Or download for iPad"
 
   nav:
     play: "遊戲開來" # The top nav bar entry where players choose which levels to play
@@ -207,6 +208,8 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
 #    failing: "Failing"
     action_timeline: "行動時間橛"
     click_to_select: "點選一個單位。"
+#    control_bar_multiplayer: "Multiplayer"
+#    control_bar_join_game: "Join Game"
 #    reload: "Reload"
     reload_title: "轉讀取全部個代碼?"
     reload_really: "準定轉讀取箇關,回轉到扣起頭?"
@@ -319,6 +322,9 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
 #    few_gems: "A few gems"
 #    pile_gems: "Pile of gems"
 #    chest_gems: "Chest of gems"
+#    purchasing: "Purchasing..."
+#    declined: "Your card was declined"
+#    retrying: "Server error, retrying."
 
 #  choose_hero:
 #    choose_hero: "Choose Your Hero"
@@ -345,6 +351,24 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
 #    blocks: "Blocks" # As in "this shield blocks this much damage"
 #    skills: "Skills"
 
+#  skill_docs:
+#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+#    read_only: "read-only"
+#    action_name: "name"
+#    action_cooldown: "Takes"
+#    action_specific_cooldown: "Cooldown"
+#    action_damage: "Damage"
+#    action_range: "Range"
+#    action_radius: "Radius"
+#    action_duration: "Duration"
+#    example: "Example"
+#    ex: "ex" # Abbreviation of "example"
+#    current_value: "Current Value"
+#    default_value: "Default value"
+#    parameters: "Parameters"
+#    returns: "Returns"
+#    granted_by: "Granted by"
+
 #  save_load:
 #    granularity_saved_games: "Saved"
 #    granularity_change_history: "History"
@@ -745,6 +769,8 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
 #    amount_achieved: "Amount"
 #    achievement: "Achievement"
 #    category_contributor: "Contributor"
+#    category_ladder: "Ladder"
+#    category_level: "Level"
 #    category_miscellaneous: "Miscellaneous"
 #    category_levels: "Levels"
 #    category_undefined: "Uncategorized"
diff --git a/app/models/ThangType.coffee b/app/models/ThangType.coffee
index fa11b19d6..b47473e09 100644
--- a/app/models/ThangType.coffee
+++ b/app/models/ThangType.coffee
@@ -389,7 +389,12 @@ module.exports = class ThangType extends CocoModel
         props = props.concat config.programmableSnippets
     for stat, value of stats when not value?
       stats[stat] = name: stat, display: '???'
-    props: props, stats: stats
+    statKeys = _.keys(stats)
+    statKeys.sort()
+    props.sort()
+    sortedStats = {}
+    sortedStats[key] = stats[key] for key in statKeys
+    props: props, stats: sortedStats
 
   formatStatDisplay: (name, modifiers) ->
     i18nKey = {
@@ -402,6 +407,7 @@ module.exports = class ThangType extends CocoModel
       visualRange: 'range'
       throwDamage: 'attack'
       throwRange: 'range'
+      bashDamage: 'attack'
     }[name]
 
     if i18nKey
diff --git a/app/models/User.coffee b/app/models/User.coffee
index 880503d97..07d1b83de 100644
--- a/app/models/User.coffee
+++ b/app/models/User.coffee
@@ -104,8 +104,7 @@ module.exports = class User extends CocoModel
       when 2 then 'choice-explicit'
       when 3 then 'choice-implicit'
     @branchingGroup = 'choice-explicit' if me.isAdmin()
-    @branchingGroup = 'no-practice'  # paused A/B test
-    #application.tracker.identify branchingGroup: @branchingGroup unless me.isAdmin()  # paused A/B test
+    application.tracker.identify branchingGroup: @branchingGroup unless me.isAdmin()
     @branchingGroup
 
 tiersByLevel = [-1, 0, 0.05, 0.14, 0.18, 0.32, 0.41, 0.5, 0.64, 0.82, 0.91, 1.04, 1.22, 1.35, 1.48, 1.65, 1.78, 1.96, 2.1, 2.24, 2.38, 2.55, 2.69, 2.86, 3.03, 3.16, 3.29, 3.42, 3.58, 3.74, 3.89, 4.04, 4.19, 4.32, 4.47, 4.64, 4.79, 4.96]
diff --git a/app/schemas/models/thang_type.coffee b/app/schemas/models/thang_type.coffee
index 5f9183745..b32713a6c 100644
--- a/app/schemas/models/thang_type.coffee
+++ b/app/schemas/models/thang_type.coffee
@@ -7,6 +7,7 @@ c.extendNamedProperties ThangTypeSchema  # name first
 ShapeObjectSchema = c.object {title: 'Shape'},
   fc: {type: 'string', title: 'Fill Color'}
   lf: {type: 'array', title: 'Linear Gradient Fill'}
+  rf: {type: 'array', title: 'Radial Gradient Fill'}
   ls: {type: 'array', title: 'Linear Gradient Stroke'}
   p: {type: 'string', title: 'Path'}
   de: {type: 'array', title: 'Draw Ellipse'}
diff --git a/app/schemas/subscriptions/surface.coffee b/app/schemas/subscriptions/surface.coffee
index ba00491e5..4cca5321e 100644
--- a/app/schemas/subscriptions/surface.coffee
+++ b/app/schemas/subscriptions/surface.coffee
@@ -23,6 +23,7 @@ module.exports =  # /app/lib/surface
     camera: {type: 'object'}
     zoom: {type: 'number', minimum: 0, exclusiveMinimum: true}
     surfaceViewport: {type: 'object'}
+    minZoom: {type: 'number', minimum: 0, exclusiveMinimum: true}
 
   'camera:set-camera': c.object {},
     pos: c.object {required: ['x', 'y']},
diff --git a/app/schemas/subscriptions/tome.coffee b/app/schemas/subscriptions/tome.coffee
index 2d5d4a966..7cdcef7a0 100644
--- a/app/schemas/subscriptions/tome.coffee
+++ b/app/schemas/subscriptions/tome.coffee
@@ -126,6 +126,10 @@ module.exports =
     codeFragment: {type: 'string'}
     codeLanguage: {type: 'string'}
 
+  'tome:suspect-code-fragment-deleted': c.object {title: 'Suspect Code Fragment Deleted', description: 'Published when a suspect code fragment is deleted from the sample code.', required: ['codeFragment']},
+    codeFragment: {type: 'string'}
+    codeLanguage: {type: 'string'}
+
   'tome:winnability-updated': c.object {title: 'Winnability Updated', description: 'When we think we can now win (or can no longer win), we may want to emphasize the submit button versus the run button (or vice versa), so this fires when we get new goal states (even preloaded goal states) suggesting success or failure change.', required: ['winnable']},
     winnable: {type: 'boolean'}
 
diff --git a/app/styles/common/site-chrome.sass b/app/styles/common/site-chrome.sass
index f1c7166ea..43cfd6087 100644
--- a/app/styles/common/site-chrome.sass
+++ b/app/styles/common/site-chrome.sass
@@ -77,8 +77,11 @@
     //- Account menu
 
     .dropdown
+      .account-settings-image
+        width: 18px
+
       .dropdown-menu
-        left: auto
+        //left: auto  // this busts it, not sure why it's in
         width: 280px
         padding: 0px
         border-radius: 0px
@@ -219,4 +222,4 @@
         top: 8px
 
       a
-        color: rgb(238,227,131)
\ No newline at end of file
+        color: rgb(238,227,131)
diff --git a/app/styles/game-menu/game-menu-modal.sass b/app/styles/game-menu/game-menu-modal.sass
index 8d9c79203..2707d39b0 100644
--- a/app/styles/game-menu/game-menu-modal.sass
+++ b/app/styles/game-menu/game-menu-modal.sass
@@ -84,3 +84,9 @@
     height: 514px
     padding: 50px
     overflow-y: scroll
+
+  ::-webkit-scrollbar
+    // So that the scrollbar doesn't go on top of the close button.
+    // Wish we could easily do this for Firefox.
+    display: none
+
diff --git a/app/styles/game-menu/inventory-modal.sass b/app/styles/game-menu/inventory-modal.sass
index e5220b91a..0714833ab 100644
--- a/app/styles/game-menu/inventory-modal.sass
+++ b/app/styles/game-menu/inventory-modal.sass
@@ -296,6 +296,9 @@ $itemSlotGridHeight: 70px
     width: $itemSlotSize * 1.2
     height: $itemSlotSize * 1.2
 
+    button
+      display: none
+
     
   //- Available equipment
    
@@ -381,8 +384,9 @@ $itemSlotGridHeight: 70px
         //  display: inline
     
       &.restricted
-        background-color: rgba(255, 80, 67, 0.25)
+        background-color: rgba(190, 190, 190, 1)
         cursor: default
+        @include filter(contrast(50%) brightness(100%))
     
         //.item-view
         //  cursor: default
diff --git a/app/styles/play/level.sass b/app/styles/play/level.sass
index f3f69f0af..7ef12cd54 100644
--- a/app/styles/play/level.sass
+++ b/app/styles/play/level.sass
@@ -90,6 +90,16 @@ $level-resize-transition-time: 0.5s
     z-index: 2
     @include transition($level-resize-transition-time ease-out)
 
+    &.grabbable:not(.flag-color-selected)
+      cursor: -moz-grab
+      cursor: -webkit-grab
+      cursor: grab
+
+      &:active
+        cursor: -moz-grabbing
+        cursor: -webkit-grabbing
+        cursor: grabbing
+
     &.flag-color-selected
       cursor: crosshair
 
diff --git a/app/styles/play/modal/play-achievements-modal.sass b/app/styles/play/modal/play-achievements-modal.sass
index db553646e..089851d75 100644
--- a/app/styles/play/modal/play-achievements-modal.sass
+++ b/app/styles/play/modal/play-achievements-modal.sass
@@ -1,4 +1,8 @@
+@import "app/styles/mixins"
+
 #play-achievements-modal
+  .modal-dialog
+    width: 800px
 
   .modal-header
     padding-bottom: 20px
@@ -16,6 +20,7 @@
     position: relative
     border: 2px solid rgb(75,75,75)
     padding: 2px
+    @include opacity(0.75)
     
     h3
       margin: 0 0 0 50px
@@ -27,7 +32,7 @@
 
     .panel-body
       padding: 5px 150px 5px 5px
-      border: 2px solid rgb(150,150,150)
+      //border: 2px solid rgb(150,150,150)  // Chloe's suggestion to not have this
       
     .created
       position: absolute
@@ -43,6 +48,7 @@
     background: rgb(50,40,33)
     border: 5px solid rgb(26,21,17)
     padding: 0
+    @include opacity(1)
     
     h3
       color: white
@@ -79,4 +85,4 @@
     
     img
       width: 12px
-      height: 12px
\ No newline at end of file
+      height: 12px
diff --git a/app/styles/play/modal/play-heroes-modal.sass b/app/styles/play/modal/play-heroes-modal.sass
index f9c669f23..3138762ef 100644
--- a/app/styles/play/modal/play-heroes-modal.sass
+++ b/app/styles/play/modal/play-heroes-modal.sass
@@ -201,13 +201,13 @@ $heroCanvasHeight: 265px
               
     
           &.attack .stat-progress-bar
-            background: purple
+            background: #c32424
       
           &.health .stat-progress-bar
-            background: red
+            background: #0f802a
     
           &.speed .stat-progress-bar
-            background: green
+            background: #4d52ab
 
     
     //- Carousel switch buttons
diff --git a/app/styles/play/world-map-view.sass b/app/styles/play/world-map-view.sass
index c412b6376..86658769a 100644
--- a/app/styles/play/world-map-view.sass
+++ b/app/styles/play/world-map-view.sass
@@ -265,21 +265,6 @@ $gameControlMargin: 30px
     .tooltip
       font-size: 24px
 
-  .old-levels
-    position: absolute
-    bottom: 5%
-    left: 1%
-    z-index: 3
-
-    a
-      font-size: 24px
-      color: #eee
-      text-decoration: underline
-
-      &:hover
-        color: white
-        text-shadow: 1px 1px 0px black
-
   .user-status
     position: absolute
     bottom: 1%
@@ -322,6 +307,8 @@ body:not(.ipad) #world-map-view
   .level-info-container
     pointer-events: none
 
+  
+
 body.ipad #world-map-view
   // iPad only supports up to Kithgard Gates for now.
   .campaign-switch
diff --git a/app/templates/base.jade b/app/templates/base.jade
index ac6b2360c..bfbd50258 100644
--- a/app/templates/base.jade
+++ b/app/templates/base.jade
@@ -1,47 +1,48 @@
-#site-nav
-  img#nav-logo(src="/images/pages/base/logo.png", title="CodeCombat - Learn how to code by playing a game", alt="CodeCombat")
-  div#site-nav-links
-    a(href="/")
-      span.glyphicon.glyphicon-home
-    a(href="/about", data-i18n="nav.about")
-    a(href='/play/ladder', data-i18n="home.multiplayer")
-    a(href='/community', data-i18n="nav.community")
-    a(href='http://blog.codecombat.com/', data-i18n="nav.blog")
-    a(href='http://discourse.codecombat.com/', data-i18n="nav.forum")
-
-    if me.get('anonymous') === false
-      span.dropdown
-        button.btn.btn-sm.header-font.dropdown-toggle(href="#", data-toggle="dropdown")
-          if me.get('photoURL')
-            img.account-settings-image(src=me.getPhotoURL(18), alt="")
-          else
-            i.glyphicon.glyphicon-user
-          span.spl.spr(data-i18n="nav.account" href="/account") Account
-          span.caret
-        ul.dropdown-menu(role="menu")
-          li.user-dropdown-header
-            span.user-level= me.level()
-            a(href="/user/#{me.getSlugOrID()}")
-              img.img-circle(src="#{me.getPhotoURL()}" alt="")
-            h3=me.displayName()
-          li.user-dropdown-body
-            .col-xs-4.text-center
-              a(href="/user/#{me.getSlugOrID()}" data-i18n="nav.profile") Profile
-            .col-xs-4.text-center
-              a(href="/user/#{me.getSlugOrID()}/stats" data-i18n="nav.stats") Stats
-            .col-xs-4.text-center
-              a.disabled(data-i18n="nav.code") Code
-          li.user-dropdown-footer
-            .pull-left
-              a.btn.btn-default.btn-flat(href="/account" data-i18n="nav.account") Account
-            .pull-right
-              button#logout-button.btn.btn-default.btn-flat(data-i18n="login.log_out") Log Out
-
-    else
-      button.btn.btn-sm.btn-primary.header-font.signup-button(data-i18n="login.sign_up")
-      button.btn.btn-sm.btn-default.header-font.login-button(data-i18n="login.log_in")
-    select.language-dropdown.form-control
-
+block header
+  #site-nav
+    img#nav-logo(src="/images/pages/base/logo.png", title="CodeCombat - Learn how to code by playing a game", alt="CodeCombat")
+    div#site-nav-links
+      a(href="/")
+        span.glyphicon.glyphicon-home
+      a(href="/about", data-i18n="nav.about")
+      a(href='/play/ladder', data-i18n="home.multiplayer")
+      a(href='/community', data-i18n="nav.community")
+      a(href='http://blog.codecombat.com/', data-i18n="nav.blog")
+      a(href='http://discourse.codecombat.com/', data-i18n="nav.forum")
+  
+      if me.get('anonymous') === false
+        span.dropdown
+          button.btn.btn-sm.header-font.dropdown-toggle(href="#", data-toggle="dropdown")
+            if me.get('photoURL')
+              img.account-settings-image(src=me.getPhotoURL(18), alt="")
+            else
+              i.glyphicon.glyphicon-user
+            span.spl.spr(data-i18n="nav.account" href="/account") Account
+            span.caret
+          ul.dropdown-menu(role="menu")
+            li.user-dropdown-header
+              span.user-level= me.level()
+              a(href="/user/#{me.getSlugOrID()}")
+                img.img-circle(src="#{me.getPhotoURL()}" alt="")
+              h3=me.displayName()
+            li.user-dropdown-body
+              .col-xs-4.text-center
+                a(href="/user/#{me.getSlugOrID()}" data-i18n="nav.profile") Profile
+              .col-xs-4.text-center
+                a(href="/user/#{me.getSlugOrID()}/stats" data-i18n="nav.stats") Stats
+              .col-xs-4.text-center
+                a.disabled(data-i18n="nav.code") Code
+            li.user-dropdown-footer
+              .pull-left
+                a.btn.btn-default.btn-flat(href="/account" data-i18n="nav.account") Account
+              .pull-right
+                button#logout-button.btn.btn-default.btn-flat(data-i18n="login.log_out") Log Out
+  
+      else
+        button.btn.btn-sm.btn-primary.header-font.signup-button(data-i18n="login.sign_up")
+        button.btn.btn-sm.btn-default.header-font.login-button(data-i18n="login.log_in")
+      select.language-dropdown.form-control
+  
 
 block outer_content
   #site-content-area
@@ -59,6 +60,7 @@ block footer
       a(href='/legal', tabindex=-1, data-i18n="nav.legal") Legal
       a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/ContactModal", data-i18n="nav.contact") Contact
       a(href='/teachers', data-i18n="nav.teachers") Teachers
+      a(href="/play-old", data-i18n="play.older_campaigns") Older Campaigns
       if me.isAdmin()
         a(href='/admin', data-i18n="nav.admin") Admin
 
diff --git a/app/templates/play/level/tome/spell_palette_entry_popover.jade b/app/templates/play/level/tome/spell_palette_entry_popover.jade
index bd10fc3dd..251d068ce 100644
--- a/app/templates/play/level/tome/spell_palette_entry_popover.jade
+++ b/app/templates/play/level/tome/spell_palette_entry_popover.jade
@@ -3,57 +3,71 @@ h4
   |  - 
   code.prop-type= doc.type == 'function' && doc.owner == 'this' ? 'method' : doc.type
   if doc.type != 'function'
+    |  (
     if writable
-      |  (writable)
+      span(data-i18n="skill_docs.writable") writable
     else
-      |  (read-only)
+      span(data-i18n="skill_docs.read_only") read-only
+    | )
 
 .description
   p!= marked(doc.description || 'Still undocumented, sorry.')
   if cooldowns && (cooldowns.cooldown || cooldowns.specificCooldown)
     p
       span
-        | #{cooldowns.type == 'spell' ? 'Spell' : 'Action'} name: 
+        | #{cooldowns.type == 'spell' ? 'Spell' : 'Action'}
+        span.spl(data-i18n="skill_docs.action_name") name
+        span.spr :
         code "#{cooldowns.name}"
         | .
       span.spl
-        | Cooldown: 
+        span(data-i18n="skill_docs.action_cooldown") Takes
+        span.spr :
         code= cooldowns.cooldown
         | s.
       if cooldowns.specificCooldown
         span.spl
-          | Specific cooldown: 
+          span(data-i18n="skill_docs.action_specific_cooldown") Cooldown
+          span.spr :
           code= cooldowns.specificCooldown
           | s.
       if cooldowns.damage
         span.spl
-          | Damage: 
+          span(data-i18n="skill_docs.action_damage") Damage
+          span.spr :
           code= cooldowns.damage
           | .
       if cooldowns.range
         span.spl
-          | Range: 
+          span(data-i18n="skill_docs.action_range") Range
+          span.spr :
           code= cooldowns.range
           | m.
       if cooldowns.radius
         span.spl
-          | Radius: 
+          span(data-i18n="skill_docs.action_radius") Radius
+          span.spr :
           code= cooldowns.radius
           | m.
       if cooldowns.duration
         span.spl
-          | Duration: 
+          span(data-i18n="skill_docs.action_duration") Duration
+          span.spr :
           code= cooldowns.duration
           | s.
 
 if !selectedMethod
   if doc.example
     p.example
-      strong Example:
+      strong
+        span(data-i18n="skill_docs.example") Example
+        | :
       div!= marked("```\n" + doc.example + "```")
   else if doc.type == 'function' && argumentExamples.length
     p.example
-      strong Example:
+      strong
+        span(data-i18n="skill_docs.example") Example
+        | :
       div
         if language == 'javascript'
           code= doc.owner + '.' + doc.name + '(' + argumentExamples.join(', ') + ');'
@@ -70,36 +84,48 @@ if !selectedMethod
 
 if (doc.type != 'function' && doc.type != 'snippet') || doc.name == 'now'
   p.value
-    strong Current Value: 
+    strong
+      span(data-i18n="skill_docs.current_value") Current Value
+      span.spr :
     pre
       code.current-value(data-prop=doc.name)= value
 
 if doc.args && doc.args.length
   p.args
-    strong Parameters: 
+    strong
+      span(data-i18n="skill_docs.parameters") Parameters
+      span.spr :
     for arg in doc.args
       div
         code= arg.name
-        | : 
+        span.spr :
         code= arg.type
         if arg.example
-          |  (ex: 
+          |  (
+          span(data-i18n="skill_docs.ex") ex
+          span.spr :
           code= arg.example
           | )
         if arg.description
           div!= marked(arg.description)
         if arg.default
           div
-            em Default value: 
+            em
+              span(data-i18n="skill_docs.default_value") Default value
+              span.spr :
             code= arg.default
-    
+
 if doc.returns
   p.returns
-    strong Returns: 
+    strong
+      span(data-i18n="skill_docs.returns") Returns
+      span.spr :
     div
       code= doc.returns.type
       if doc.returns.example
-        |  (ex: 
+        |  (
+        span(data-i18n="skill_docs.ex") ex
+        span.spr :
         code= doc.returns.example
         | )
       if doc.returns.description
@@ -107,7 +133,9 @@ if doc.returns
 
 if item
   p
-    em Granted by #{item.get('name')}.
+    em
+      span.spr(data-i18n="skill_docs.granted_by") Granted by
+      | #{item.get('name')}.
 
 if selectedMethod
   p
diff --git a/app/templates/play/modal/item-details-view.jade b/app/templates/play/modal/item-details-view.jade
index a381fa3dd..3da543a79 100644
--- a/app/templates/play/modal/item-details-view.jade
+++ b/app/templates/play/modal/item-details-view.jade
@@ -23,7 +23,7 @@
             h3.big-font(data-i18n="play.skills_granted")
             for prop in props
               p
-                strong.big-font= prop.name
+                strong= prop.name
                 span.spr :
                 span!= prop.description
 
diff --git a/app/templates/play/world-map-view.jade b/app/templates/play/world-map-view.jade
index 7ab05d2c3..d516ef7e5 100644
--- a/app/templates/play/world-map-view.jade
+++ b/app/templates/play/world-map-view.jade
@@ -7,10 +7,10 @@
 
   - var seenNext = nextLevel;
   each level in campaign.levels
-    if true || !level.hidden
+    if !level.hidden
       - var next = level.id == nextLevel || (!seenNext && levelStatusMap[level.id] != "complete" && !level.locked && !level.disabled && (!level.practice || me.getBranchingGroup() == 'all-practice'));
       - seenNext = seenNext || next;
-      div(style="left: #{level.x}%; bottom: #{level.y}%; background-color: #{level.color}", class="level" + (next ? " next" : "") + (level.disabled ? " disabled" : "") + (level.locked ? " locked" : "") + " " + levelStatusMap[level.id] || "", data-level-id=level.id, title=level.name)
+      div(style="left: #{level.x}%; bottom: #{level.y}%; background-color: #{level.color}", class="level" + (next ? " next" : "") + (level.disabled ? " disabled" : "") + (level.locked ? " locked" : "") + " " + levelStatusMap[level.id] || "", data-level-id=level.id, title=level.name + (level.disabled ? ' (Coming Soon to Adventurers)' : ''))
         a(href=level.type == 'hero' ? '#' : level.disabled ? "/play" : "/play/#{level.levelPath || 'level'}/#{level.id}", disabled=level.disabled, data-level-id=level.id, data-level-path=level.levelPath || 'level', data-level-name=level.name)
       div(style="left: #{level.x}%; bottom: #{level.y}%", class="level-shadow" + (next ? " next" : "") + " " + levelStatusMap[level.id] || "")
       .level-info-container(data-level-id=level.id, data-level-path=level.levelPath || 'level', data-level-name=level.name)
@@ -56,9 +56,6 @@
   //  a.btn.account(href="/user/#{me.getSlugOrID()}", data-i18n="[title]play.account")
   //  a.btn.settings(href='/account', data-i18n="[title]play.settings")
   
-.old-levels
-  a(href="/play-old", data-i18n="play.older_campaigns").header-font Older Campaigns
-
 .user-status.header-font
   span.gem.gem-20
   span#gems-count.spr= me.gems()
diff --git a/app/views/game-menu/InventoryModal.coffee b/app/views/game-menu/InventoryModal.coffee
index 356adc24a..ba4b1cbf6 100644
--- a/app/views/game-menu/InventoryModal.coffee
+++ b/app/views/game-menu/InventoryModal.coffee
@@ -240,10 +240,13 @@ module.exports = class InventoryModal extends ModalView
       me.set('spent', (me.get('spent') ? 0) + item.get('gems'))
 
       #- ...then rerender key bits
-      @requireLevelEquipment()
       @itemGroups.lockedItems.remove(item)
-      @sortItem(item)
-      @renderSelectors("#unequipped", "#gems-count")
+      # Redo all item sorting to make sure that we don't clobber state changes since last render.
+      equipped = _.values @getCurrentEquipmentConfig()
+      @sortItem(item, equipped) for item in @items.models
+      @renderSelectors('#unequipped', '#gems-count')
+
+      @requireLevelEquipment()
       @delegateEvents()
       @setUpDraggableEventsForAvailableEquipment()
       @itemDetailsView.setItem(item)
diff --git a/app/views/i18n/I18NEditComponentView.coffee b/app/views/i18n/I18NEditComponentView.coffee
index 455b1a1aa..42fb3ac35 100644
--- a/app/views/i18n/I18NEditComponentView.coffee
+++ b/app/views/i18n/I18NEditComponentView.coffee
@@ -7,17 +7,17 @@ module.exports = class I18NEditComponentView extends I18NEditModelView
 
   buildTranslationList: ->
     lang = @selectedLanguage
-    
+
     propDocs = @model.get('propertyDocumentation')
-    
+
     for propDoc, propDocIndex in propDocs
-      
+
       #- Component property descriptions
       if i18n = propDoc.i18n
         path = ["propertyDocumentation", propDocIndex]
         if _.isObject propDoc.description
-          for progLang, description of propDoc
-            @wrapRow "#{propDoc.name} description (#{progLang})", [progLang, 'description'], description, i18n[lang]?[progLang]?.description, path, 'markdown'
+          for progLang, description of propDoc.description
+            @wrapRow "#{propDoc.name} description (#{progLang})", ['description', progLang], description, i18n[lang]?[progLang]?.description, path, 'markdown'
         else if _.isString propDoc.description
           @wrapRow "#{propDoc.name} description", ['description'], propDoc.description, i18n[lang]?.description, path, 'markdown'
         if context = propDoc.context
@@ -29,8 +29,8 @@ module.exports = class I18NEditComponentView extends I18NEditModelView
         path = ["propertyDocumentation", propDocIndex, "returns"]
         d = propDoc.returns.description
         if _.isObject d
-          for progLang, description of d
-            @wrapRow "#{propDoc.name} return val (#{progLang})", [progLang, 'description'], description, i18n[lang]?[progLang]?.description, path, 'markdown'
+          for progLang, description of d.description
+            @wrapRow "#{propDoc.name} return val (#{progLang})", ['description', progLang], description, i18n[lang]?[progLang]?.description, path, 'markdown'
         else if _.isString d
           @wrapRow "#{propDoc.name} return val", ['description'], d, i18n[lang]?.description, path, 'markdown'
 
@@ -40,8 +40,7 @@ module.exports = class I18NEditComponentView extends I18NEditModelView
           if i18n = argDoc.i18n
             path = ["propertyDocumentation", propDocIndex, 'args', argIndex]
             if _.isObject argDoc.description
-              for progLang, description of argDoc
-                @wrapRow "#{propDoc.name} arg description #{argDoc.name} (#{progLang})", [progLang, 'description'], description, i18n[lang]?[progLang]?.description, path, 'markdown'
+              for progLang, description of argDoc.description
+                @wrapRow "#{propDoc.name} arg description #{argDoc.name} (#{progLang})", ['description', progLang], description, i18n[lang]?[progLang]?.description, path, 'markdown'
             else if _.isString argDoc.description
               @wrapRow "#{propDoc.name} arg description #{argDoc.name}", ['description'], argDoc.description, i18n[lang]?.description, path, 'markdown'
- 
diff --git a/app/views/play/WorldMapView.coffee b/app/views/play/WorldMapView.coffee
index 32a2992c3..65ba2b01f 100644
--- a/app/views/play/WorldMapView.coffee
+++ b/app/views/play/WorldMapView.coffee
@@ -842,8 +842,8 @@ forest = [
     #nextLevels:
     #  continue: ''
     disabled: not me.isAdmin()
-    x: 77.54
-    y: 25.94
+    x: 83.87
+    y: 18.89
   }
   {
     name: 'Multiplayer Treasure Grove'
diff --git a/app/views/play/level/LevelHUDView.coffee b/app/views/play/level/LevelHUDView.coffee
index e2f5fcb5c..5df0c7e25 100644
--- a/app/views/play/level/LevelHUDView.coffee
+++ b/app/views/play/level/LevelHUDView.coffee
@@ -57,6 +57,7 @@ module.exports = class LevelHUDView extends CocoView
     if not thang? and not @thang? then return
     if thang? and @thang? and thang.id is @thang.id then return
     if thang? and @hidesHUD and thang.id isnt 'Hero Placeholder' then return  # Don't let them find the names of their opponents this way
+    return unless thang  # Don't let them deselect anything, ever.
     @thang = thang
     @thangType = thangType
     return unless @thang
diff --git a/app/views/play/level/PlayLevelView.coffee b/app/views/play/level/PlayLevelView.coffee
index 3f0b759ae..df2d4e9e1 100644
--- a/app/views/play/level/PlayLevelView.coffee
+++ b/app/views/play/level/PlayLevelView.coffee
@@ -4,6 +4,7 @@ template = require 'templates/play/level'
 ThangType = require 'models/ThangType'
 utils = require 'lib/utils'
 storage = require 'lib/storage'
+{createAetherOptions} = require 'lib/aether_utils'
 
 # tools
 Surface = require 'lib/surface/Surface'
@@ -217,8 +218,7 @@ module.exports = class PlayLevelView extends RootView
       opponentSpells = opponentSpells.concat spells
     if (not @session.get('teamSpells')) and @otherSession?.get('teamSpells')
       @session.set('teamSpells', @otherSession.get('teamSpells'))
-    # hero-ladder levels use code instead of transpiledCode
-    opponentCode = @otherSession?.get('transpiledCode') or @otherSession?.get('code') or {}
+    opponentCode = @otherSession?.get('transpiledCode') or {}
     myCode = @session.get('code') or {}
     for spell in opponentSpells
       [thang, spell] = spell.split '/'
@@ -571,7 +571,20 @@ module.exports = class PlayLevelView extends RootView
     @onRealTimeMultiplayerLevelUnloaded()
     super()
 
-  # Real-time Multiplayer ######################################################
+  onIPadMemoryWarning: (e) ->
+    @hasReceivedMemoryWarning = true
+
+  onItemPurchased: (e) ->
+    heroConfig = @session.get('heroConfig') ? {}
+    inventory = heroConfig.inventory ? {}
+    slot = e.item.getAllowedSlots()[0]
+    if slot and not inventory[slot]
+      # Open up the inventory modal so they can equip the new item
+      @setupManager?.destroy()
+      @setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @levelID, parent: @, session: @session, hadEverChosenHero: true})
+      @setupManager.open()
+
+  # Start Real-time Multiplayer ######################################################
   #
   # This view acts as a hub for the real-time multiplayer session for the current level.
   #
@@ -800,6 +813,21 @@ module.exports = class PlayLevelView extends RootView
         opponentPlayer = player
     if myPlayer
       console.info 'Submitting my code'
+      # Transpile code
+      # Copied from scripts/transpile.coffee
+      # TODO: Should this live somewhere else?
+      transpiledCode = {}
+      for thang, spells of @session.get('code')
+        transpiledCode[thang] = {}
+        for spellID, spell of spells
+          spellName = thang + '/' + spellID
+          continue if @session.get('teamSpells') and not (spellName in @session.get('teamSpells')[@session.get('team')])
+          # console.log "PlayLevelView Transpiling spell #{spellName}"
+          aetherOptions = createAetherOptions functionName: spellID, codeLanguage: @session.get('submittedCodeLanguage')
+          aether = new Aether aetherOptions
+          transpiledCode[thang][spellID] = aether.transpile spell
+      # console.log "PlayLevelView transpiled code", transpiledCode
+      @session.set 'transpiledCode', transpiledCode
       @session.patch()
       myPlayer.set 'state', 'submitted'
     else
@@ -904,15 +932,4 @@ module.exports = class PlayLevelView extends RootView
       # TODO: Don't hardcode spellName
       Backbone.Mediator.publish 'level:select-sprite', thangID: sessionState.selected, spellName: 'plan'
 
-  onIPadMemoryWarning: (e) ->
-    @hasReceivedMemoryWarning = true
-
-  onItemPurchased: (e) ->
-    heroConfig = @session.get('heroConfig') ? {}
-    inventory = heroConfig.inventory ? {}
-    slot = e.item.getAllowedSlots()[0]
-    if slot and not inventory[slot]
-      # Open up the inventory modal so they can equip the new item
-      @setupManager?.destroy()
-      @setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @levelID, parent: @, session: @session, hadEverChosenHero: true})
-      @setupManager.open()
+# End Real-time Multiplayer ######################################################
diff --git a/app/views/play/level/tome/DocFormatter.coffee b/app/views/play/level/tome/DocFormatter.coffee
index ad00fb48f..6cc579d8b 100644
--- a/app/views/play/level/tome/DocFormatter.coffee
+++ b/app/views/play/level/tome/DocFormatter.coffee
@@ -100,6 +100,9 @@ module.exports = class DocFormatter
       if val = obj[prop]
         context = @doc.context
         obj[prop] = val = utils.i18n obj, prop
+        # For multiplexed-by-both-code-and-spoken-language objects, now also get code language again.
+        if _.isObject val
+          obj[prop] = val = obj[prop]?[@options.language]
         if @doc.i18n
           spokenLanguage = me.get 'preferredLanguage'
           while spokenLanguage
@@ -113,13 +116,18 @@ module.exports = class DocFormatter
             obj[prop] = _.template val, context
           catch e
             console.error "Couldn't create docs template of", val, "\nwith context", context, "\nError:", e
+        obj[prop] = @replaceSpriteName obj[prop]  # Do this before using the template, otherwise marked might get us first.
 
   formatPopover: ->
     content = popoverTemplate doc: @doc, language: @options.language, value: @formatValue(), marked: marked, argumentExamples: (arg.example or arg.default or arg.name for arg in @doc.args ? []), writable: @options.writable, selectedMethod: @options.selectedMethod, cooldowns: @inferCooldowns(), item: @options.item
     owner = if @doc.owner is 'this' then @options.thang else window[@doc.owner]
-    content = content.replace /#{spriteName}/g, @options.thang.type ? @options.thang.spriteName  # Prefer type, and excluded the quotes we'd get with @formatValue
+    content = @replaceSpriteName content
     content.replace /\#\{(.*?)\}/g, (s, properties) => @formatValue downTheChain(owner, properties.split('.'))
 
+  replaceSpriteName: (s) ->
+    # Prefer type, and excluded the quotes we'd get with @formatValue
+    s.replace /#{spriteName}/g, @options.thang.type ? @options.thang.spriteName
+
   formatValue: (v) ->
     return null if @doc.type is 'snippet'
     return @options.thang.now() if @doc.name is 'now'
@@ -130,7 +138,7 @@ module.exports = class DocFormatter
       else
         v = window[@doc.owner][@doc.name]  # grab Math or Vector
     if @doc.type is 'number' and not _.isNaN v
-      if v == Math.round v
+      if v is Math.round v
         return v
       if _.isNumber v
         return v.toFixed 2
@@ -165,5 +173,7 @@ module.exports = class DocFormatter
     return null unless action
     cooldowns = cooldown: action.cooldown, specificCooldown: action.specificCooldown, name: actionName, type: type
     for prop in ['range', 'radius', 'duration', 'damage']
-      cooldowns[prop] = owner[_.string.camelize actionName + _.string.capitalize(prop)]
+      cooldowns[prop] = v = owner[_.string.camelize actionName + _.string.capitalize(prop)]
+      if _.isNumber(v) and v isnt Math.round v
+        cooldowns[prop] = v.toFixed 2
     cooldowns
diff --git a/app/views/play/level/tome/ProblemAlertView.coffee b/app/views/play/level/tome/ProblemAlertView.coffee
index a94987bf7..3c268e1b2 100644
--- a/app/views/play/level/tome/ProblemAlertView.coffee
+++ b/app/views/play/level/tome/ProblemAlertView.coffee
@@ -88,8 +88,12 @@ module.exports = class ProblemAlertView extends CocoView
   onWindowResize: (e) =>
     # TODO: This all seems a little hacky
     if @problem?
-      @$el.css('left', $('#goals-view').outerWidth(true) + 'px')
-      @$el.css('right', $('#code-area').outerWidth(true) + 'px')
+      levelContentWidth = $('.level-content').outerWidth(true)
+      goalsViewWidth = $('#goals-view').outerWidth(true)
+      codeAreaWidth = $('#code-area').outerWidth(true)
+      # problem alert view has 20px padding
+      @$el.css('max-width', levelContentWidth - codeAreaWidth - goalsViewWidth + 40 + 'px')
+      @$el.css('right', codeAreaWidth + 'px')
 
       # 110px from top roughly aligns top of alert with top of first code line
       # TODO: calculate this in a more dynamic, less sketchy way
diff --git a/app/views/play/level/tome/Spell.coffee b/app/views/play/level/tome/Spell.coffee
index 1d7acdcd9..98e713dc3 100644
--- a/app/views/play/level/tome/Spell.coffee
+++ b/app/views/play/level/tome/Spell.coffee
@@ -185,7 +185,6 @@ module.exports = class Spell
 
   shouldUseTranspiledCode: ->
     # Determine whether this code has already been transpiled, or whether it's raw source needing transpilation.
-    return false if @levelType is 'hero-ladder'
     return true if @spectateView  # Use transpiled code for both teams if we're just spectating.
     return true if @isEnemySpell()  # Use transpiled for enemy spells.
     # Players without permissions can't view the raw code.
diff --git a/app/views/play/level/tome/SpellPaletteEntryView.coffee b/app/views/play/level/tome/SpellPaletteEntryView.coffee
index 506aa9a89..80217af28 100644
--- a/app/views/play/level/tome/SpellPaletteEntryView.coffee
+++ b/app/views/play/level/tome/SpellPaletteEntryView.coffee
@@ -46,10 +46,12 @@ module.exports = class SpellPaletteEntryView extends CocoView
       content: @docFormatter.formatPopover()
       container: 'body'
       template: @overridePopoverTemplate
-    ).on 'show.bs.popover', =>
+    ).on 'shown.bs.popover', =>
       Backbone.Mediator.publish 'tome:palette-hovered', thang: @thang, prop: @doc.name, entry: @
       soundIndex = Math.floor(Math.random() * 4)
       Backbone.Mediator.publish 'audio-player:play-sound', trigger: "spell-palette-entry-open-#{soundIndex}", volume: 0.75
+      popover = @$el.data('bs.popover')
+      popover?.$tip?.i18n()
 
   onMouseEnter: (e) ->
     # Make sure the doc has the updated Thang so it can regenerate its prop value
diff --git a/app/views/play/level/tome/SpellView.coffee b/app/views/play/level/tome/SpellView.coffee
index 45fe0eb2e..d68589fd7 100644
--- a/app/views/play/level/tome/SpellView.coffee
+++ b/app/views/play/level/tome/SpellView.coffee
@@ -228,7 +228,7 @@ module.exports = class SpellView extends CocoView
         unless CampaignOptions?.getOption?(@options?.level?.get?('slug'), 'backspaceThrottle')
           @ace.remove "left"
           return
-        
+
         nowDate = Date.now()
         if @aceSession.selection.isEmpty()
           cursor = @ace.getCursorPosition()
@@ -245,7 +245,7 @@ module.exports = class SpellView extends CocoView
         @backspaceThrottleMs = null
         @lastBackspace = nowDate
         @ace.remove "left"
-          
+
 
 
   fillACE: ->
@@ -946,12 +946,18 @@ module.exports = class SpellView extends CocoView
     return if @destroyed
     source = @getSource().replace @singleLineCommentRegex(), ''
     suspectCodeFragments = LevelOptions[@options.level.get('slug')].suspectCode
+    detectedSuspectCodeFragmentNames = []
     for suspectCodeFragment in suspectCodeFragments
       if suspectCodeFragment.pattern.test source
         @warnedCodeFragments ?= {}
         unless @warnedCodeFragments[suspectCodeFragment.name]
           Backbone.Mediator.publish 'tome:suspect-code-fragment-added', codeFragment: suspectCodeFragment.name, codeLanguage: @spell.language
-        @warnedCodeFragments[suspectCodeFragment] = true
+        @warnedCodeFragments[suspectCodeFragment.name] = true
+        detectedSuspectCodeFragmentNames.push suspectCodeFragment.name
+    for lastDetectedSuspectCodeFragmentName in @lastDetectedSuspectCodeFragmentNames ? []
+      unless lastDetectedSuspectCodeFragmentName in detectedSuspectCodeFragmentNames
+        Backbone.Mediator.publish 'tome:suspect-code-fragment-deleted', codeFragment: lastDetectedSuspectCodeFragmentName, codeLanguage: @spell.language
+    @lastDetectedSuspectCodeFragmentNames = detectedSuspectCodeFragmentNames
 
   destroy: ->
     $(@ace?.container).find('.ace_gutter').off 'click', '.ace_error, .ace_warning, .ace_info', @onAnnotationClick
diff --git a/app/views/play/modal/ItemDetailsView.coffee b/app/views/play/modal/ItemDetailsView.coffee
index 8c860fc3f..6baed33e9 100644
--- a/app/views/play/modal/ItemDetailsView.coffee
+++ b/app/views/play/modal/ItemDetailsView.coffee
@@ -3,6 +3,7 @@ template = require 'templates/play/modal/item-details-view'
 CocoCollection = require 'collections/CocoCollection'
 LevelComponent = require 'models/LevelComponent'
 
+{downTheChain} = require 'lib/world/world_utils'
 utils = require 'lib/utils'
 
 module.exports = class ItemDetailsView extends CocoView
@@ -21,6 +22,7 @@ module.exports = class ItemDetailsView extends CocoView
       @item.affordable = me.gems() >= @item.get('gems')
       @item.owned = me.ownsItem @item.get('original')
       @item.comingSoon = not @item.getFrontFacingStats().props.length and not _.size @item.getFrontFacingStats().stats  # Temp: while there are placeholder items
+      @componentConfigs = (c.config for c in @item.get('components') when c.config)
 
       stats = @item.getFrontFacingStats()
       props = (p for p in stats.props when not @propDocs[p])
@@ -78,15 +80,22 @@ module.exports = class ItemDetailsView extends CocoView
           description = description.replace(/#{spriteName}/g, 'hero')
           if fact = stats.stats.shieldDefenseFactor
             description = description.replace(/#{shieldDefensePercent}%/g, fact.display)
-          ## We don't have the full components loaded here, so we can't really get most of these values.
-          #description = description.replace /#{([^.]+?)}/g, (match, keyChain) ->
-          #  console.log 'gotta find', keyChain, 'from', match, 'and have', stats
-          #  match
+          if prop is 'buildTypes'
+            buildsConfig = _.find @componentConfigs, 'buildables'
+            description = description.replace '#{buildTypes}', "`[\"#{_.keys(buildsConfig.buildables).join('\", \"')}\"]`"
+          # We don't have the full components loaded here, so we can't really get most of these values.
+          componentConfigs = @componentConfigs ? []
+          description = description.replace /#{([^.]+?)}/g, (match, keyChain) ->
+            for componentConfig in componentConfigs
+              if value = downTheChain componentConfig, keyChain
+                return value
+            #console.log 'gotta find', keyChain, 'from', match
+            match
           description = description.replace(/#{(.+?)}/g, '`$1`')
           description = $(marked(description)).html()
 
         c.props.push {
-          name: _.string.humanize prop
+          name: prop
           description: description or '...'
         }
     c
diff --git a/app/views/play/modal/PlayAchievementsModal.coffee b/app/views/play/modal/PlayAchievementsModal.coffee
index 360330685..686bc5ed9 100644
--- a/app/views/play/modal/PlayAchievementsModal.coffee
+++ b/app/views/play/modal/PlayAchievementsModal.coffee
@@ -11,17 +11,16 @@ PAGE_SIZE = 200
 module.exports = class PlayAchievementsModal extends ModalView
   className: 'modal fade play-modal'
   template: template
-  modalWidthPercent: 90
   id: 'play-achievements-modal'
   plain: true
-  
+
   earnedMap: {}
 
   constructor: (options) ->
     super options
     @achievements = new Backbone.Collection()
     earnedMap = {}
-    
+
     achievementsFetcher = new CocoCollection([], {url: '/db/achievement', model: Achievement})
     achievementsFetcher.setProjection([
       'name'
@@ -32,10 +31,10 @@ module.exports = class PlayAchievementsModal extends ModalView
       'rewards'
       'collection'
     ])
-    
+
     earnedAchievementsFetcher = new CocoCollection([], {url: '/db/earned_achievement', model: EarnedAchievement})
     earnedAchievementsFetcher.setProjection([ 'achievement' ])
-    
+
     achievementsFetcher.skip = 0
     achievementsFetcher.fetch({data: {skip: 0, limit: PAGE_SIZE}})
     earnedAchievementsFetcher.skip = 0
@@ -46,7 +45,7 @@ module.exports = class PlayAchievementsModal extends ModalView
 
     @supermodel.loadCollection(achievementsFetcher, 'achievement')
     @supermodel.loadCollection(earnedAchievementsFetcher, 'achievement')
-    
+
     @onEverythingLoaded = _.after(2, @onEverythingLoaded)
 
   onAchievementsLoaded: (fetcher) ->
diff --git a/server/achievements/earned_achievement_handler.coffee b/server/achievements/earned_achievement_handler.coffee
index cfb2a1f62..b35e6de22 100644
--- a/server/achievements/earned_achievement_handler.coffee
+++ b/server/achievements/earned_achievement_handler.coffee
@@ -12,6 +12,7 @@ class EarnedAchievementHandler extends Handler
 
   # Don't allow POSTs or anything yet
   hasAccess: (req) ->
+    return false unless req.user
     req.method in ['GET', 'POST'] # or req.user.isAdmin()
 
   get: (req, res) ->
diff --git a/server/commons/Handler.coffee b/server/commons/Handler.coffee
index d3ae3071c..adabf2d8e 100644
--- a/server/commons/Handler.coffee
+++ b/server/commons/Handler.coffee
@@ -56,7 +56,7 @@ module.exports = class Handler
     isBrandNew = req.method is 'POST' and not req.body.original
     props = props.concat @postEditableProperties if isBrandNew
 
-    if @modelClass.schema.uses_coco_permissions
+    if @modelClass.schema.uses_coco_permissions and req.user
       # can only edit permissions if this is a brand new property,
       # or you are an owner of the old one
       isOwner = document.getAccessForUserObjectId(req.user._id) is 'owner'
@@ -523,7 +523,7 @@ module.exports = class Handler
 
   # This is not a Mongoose user
   projectionForUser: (req, model, ownerID) ->
-    return {} if 'privateProperties' not of model or req.user._id + '' is ownerID + '' or req.user.isAdmin()
+    return {} if 'privateProperties' not of model or req.user?._id + '' is ownerID + '' or req.user.isAdmin()
     projection = {}
     projection[field] = 0 for field in model.privateProperties
     projection
diff --git a/server/levels/level_handler.coffee b/server/levels/level_handler.coffee
index b7c9ccaaa..665c39444 100644
--- a/server/levels/level_handler.coffee
+++ b/server/levels/level_handler.coffee
@@ -102,6 +102,7 @@ LevelHandler = class LevelHandler extends Handler
       # of model, like in this case. Refactor to move that logic to the model instead.
 
   getMySessions: (req, res, slugOrID) ->
+    return @sendForbiddenError(res) if not req.user
     findParameters = {}
     if Handler.isID slugOrID
       findParameters['_id'] = slugOrID
@@ -271,6 +272,7 @@ LevelHandler = class LevelHandler extends Handler
     @doGetFeedback req, res, levelID, false
 
   getAllFeedback: (req, res, levelID) ->
+    return @sendNotFoundError(res) unless req.user
     @doGetFeedback req, res, levelID, true
 
   doGetFeedback: (req, res, levelID, multiple) ->
diff --git a/server/levels/sessions/LevelSession.coffee b/server/levels/sessions/LevelSession.coffee
index 80f511a9c..46beecef2 100644
--- a/server/levels/sessions/LevelSession.coffee
+++ b/server/levels/sessions/LevelSession.coffee
@@ -39,7 +39,7 @@ LevelSessionSchema.statics.privateProperties = ['code', 'submittedCode', 'unsubs
 LevelSessionSchema.statics.editableProperties = ['multiplayer', 'players', 'code', 'codeLanguage', 'completed', 'state',
                                                  'levelName', 'creatorName', 'levelID', 'screenshot',
                                                  'chat', 'teamSpells', 'submitted', 'submittedCodeLanguage', 
-                                                 'unsubscribed', 'playtime', 'heroConfig', 'team']
+                                                 'unsubscribed', 'playtime', 'heroConfig', 'team', 'transpiledCode']
 LevelSessionSchema.statics.jsonSchema = jsonschema
 
 LevelSessionSchema.index {user: 1, changed: -1}, {sparse: true, name: 'last played index'}
diff --git a/server/levels/sessions/level_session_handler.coffee b/server/levels/sessions/level_session_handler.coffee
index 4e23a56f9..77d3ce7e0 100644
--- a/server/levels/sessions/level_session_handler.coffee
+++ b/server/levels/sessions/level_session_handler.coffee
@@ -20,7 +20,7 @@ class LevelSessionHandler extends Handler
       return _.omit documentObject, @privateProperties
 
   getActiveSessions: (req, res) ->
-    return @sendForbiddenError(res) unless req.user.isAdmin()
+    return @sendForbiddenError(res) unless req.user?.isAdmin()
     start = new Date()
     start = new Date(start.getTime() - TIMEOUT)
     query = @modelClass.find({'changed': {$gt: start}})
diff --git a/server/plugins/plugins.coffee b/server/plugins/plugins.coffee
index 9478a4a47..1007719a6 100644
--- a/server/plugins/plugins.coffee
+++ b/server/plugins/plugins.coffee
@@ -116,7 +116,7 @@ module.exports.PermissionsPlugin = (schema) ->
     allowed = allowed[method] or []
 
     for permission in @permissions
-      if permission.target is 'public' or actor._id.equals(permission.target)
+      if permission.target is 'public' or actor?._id.equals(permission.target)
         return true if permission.access in allowed
 
     return false
diff --git a/server/routes/db.coffee b/server/routes/db.coffee
index 8791d3f91..6b967d38d 100644
--- a/server/routes/db.coffee
+++ b/server/routes/db.coffee
@@ -25,7 +25,8 @@ module.exports.setup = (app) ->
     parts = module.split('/')
     module = parts[0]
     return getSchema(req, res, module) if parts[1] is 'schema'
-    return errors.unauthorized(res, 'Must have an identity to do anything with the db. Do you have cookies enabled?') unless req.user
+    if (not req.user) and req.route.method isnt 'get' 
+      return errors.unauthorized(res, 'Must have an identity to do anything with the db. Do you have cookies enabled?')
 
     try
       moduleName = module.replace new RegExp('\\.', 'g'), '_'
diff --git a/server/users/user_handler.coffee b/server/users/user_handler.coffee
index 0e0e989ee..f051b5a3d 100644
--- a/server/users/user_handler.coffee
+++ b/server/users/user_handler.coffee
@@ -224,6 +224,7 @@ UserHandler = class UserHandler extends Handler
       res.end()
 
   getLevelSessionsForEmployer: (req, res, userID) ->
+    return @sendForbiddenError(res) unless req.user
     return @sendForbiddenError(res) unless req.user._id+'' is userID or req.user.isAdmin() or ('employer' in (req.user.get('permissions') ? []))
     query = creator: userID, levelID: {$in: ['criss-cross', 'gridmancer', 'greed', 'dungeon-arena', 'brawlwood', 'gold-rush']}
     projection = 'levelName levelID team playtime codeLanguage submitted code totalScore teamSpells level'
@@ -241,7 +242,7 @@ UserHandler = class UserHandler extends Handler
       return @sendDatabaseError res, err if err
       return @sendNotFoundError res unless userID?
       query = creator: userID + ''
-      isAuthorized = req.user._id+'' is userID or req.user.isAdmin()
+      isAuthorized = req.user?._id+'' is userID or req.user?.isAdmin()
       projection = {}
       if req.query.project
         projection[field] = 1 for field in req.query.project.split(',') when isAuthorized or not (field in LevelSessionHandler.privateProperties)
@@ -278,9 +279,9 @@ UserHandler = class UserHandler extends Handler
 
   trackActivity: (req, res, userID, activityName, increment=1) ->
     return @sendMethodNotAllowed res unless req.method is 'POST'
-    isMe = userID is req.user._id + ''
-    isAuthorized = isMe or req.user.isAdmin()
-    isAuthorized ||= ('employer' in (req.user.get('permissions') ? [])) and (activityName in ['viewed_by_employer', 'contacted_by_employer'])
+    isMe = userID is req.user?._id + ''
+    isAuthorized = isMe or req.user?.isAdmin()
+    isAuthorized ||= ('employer' in (req.user?.get('permissions') ? [])) and (activityName in ['viewed_by_employer', 'contacted_by_employer'])
     return @sendForbiddenError res unless isAuthorized
     updateUser = (user) =>
       activity = user.trackActivity activityName, increment
@@ -322,6 +323,7 @@ UserHandler = class UserHandler extends Handler
         res.end()
 
   getCandidates: (req, res) ->
+    return @sendForbiddenError(res) unless req.user
     authorized = req.user.isAdmin() or ('employer' in (req.user.get('permissions') ? []))
     months = if req.user.isAdmin() then 12 else 2
     since = (new Date((new Date()) - months * 30.4 * 86400 * 1000)).toISOString()
@@ -356,7 +358,7 @@ UserHandler = class UserHandler extends Handler
     true
 
   getEmployers: (req, res) ->
-    return @sendForbiddenError(res) unless req.user.isAdmin()
+    return @sendForbiddenError(res) unless req.user?.isAdmin()
     query = {employerAt: {$exists: true, $ne: ''}}
     selection = 'name firstName lastName email activity signedEmployerAgreement photoURL employerAt'
     User.find(query).select(selection).lean().exec (err, documents) =>
@@ -379,7 +381,7 @@ UserHandler = class UserHandler extends Handler
     hash.digest('hex')
 
   getRemark: (req, res, userID) ->
-    return @sendForbiddenError(res) unless req.user.isAdmin()
+    return @sendForbiddenError(res) unless req.user?.isAdmin()
     query = user: userID
     projection = null
     if req.query.project
@@ -392,7 +394,7 @@ UserHandler = class UserHandler extends Handler
 
   searchForUser: (req, res) ->
     # TODO: also somehow search the CLAs to find a match amongst those fields and to find GitHub ids
-    return @sendForbiddenError(res) unless req.user.isAdmin()
+    return @sendForbiddenError(res) unless req.user?.isAdmin()
     search = req.body.search
     query = email: {$exists: true}, $or: [
       {emailLower: search}
@@ -605,7 +607,7 @@ UserHandler = class UserHandler extends Handler
     @statRecalculators[statName] done
 
   recalculate: (req, res, statName) ->
-    return @sendForbiddenError(res) unless req.user.isAdmin()
+    return @sendForbiddenError(res) unless req.user?.isAdmin()
     log.debug 'recalculate'
     return @sendNotFoundError(res) unless statName of @statRecalculators
     @recalculateStats statName