diff --git a/app/templates/game-menu/choose-hero-view.jade b/app/templates/game-menu/choose-hero-view.jade
index 5b65f845a..0356e4611 100644
--- a/app/templates/game-menu/choose-hero-view.jade
+++ b/app/templates/game-menu/choose-hero-view.jade
@@ -38,8 +38,8 @@
   .form-group.select-group
     label.control-label(for="option-code-language", data-i18n="choose_hero.programming_language") Programming Language
     select#option-code-language(name="code-language")
-      for option in languages
-        option(value=option.id, selected=(me.get('aceConfig', true).language === option.id))= option.name
+      for option in codeLanguages
+        option(value=option.id, selected=codeLanguage === option.id)= option.name
     span.help-block(data-i18n="choose_hero.programming_language_description") Which programming language do you want to use?
 
 if level
diff --git a/app/views/game-menu/ChooseHeroView.coffee b/app/views/game-menu/ChooseHeroView.coffee
index 6e6a905ca..f8dd78329 100644
--- a/app/views/game-menu/ChooseHeroView.coffee
+++ b/app/views/game-menu/ChooseHeroView.coffee
@@ -13,6 +13,7 @@ module.exports = class ChooseHeroView extends CocoView
   events:
     'click #restart-level-confirm-button': -> Backbone.Mediator.publish 'level:restart', {}
     'slide.bs.carousel #hero-carousel': 'onHeroChanged'
+    'change #option-code-language': 'onCodeLanguageChanged'
 
   shortcuts:
     'left': -> @$el.find('#hero-carousel').carousel('prev')
@@ -36,7 +37,7 @@ module.exports = class ChooseHeroView extends CocoView
     context = super(context)
     context.heroes = @heroes.models
     context.level = @options.level
-    context.languages = [
+    context.codeLanguages = [
       {id: 'python', name: 'Python'}
       {id: 'javascript', name: 'JavaScript'}
       {id: 'coffeescript', name: 'CoffeeScript'}
@@ -44,6 +45,7 @@ module.exports = class ChooseHeroView extends CocoView
       {id: 'lua', name: 'Lua (Experimental)'}
       {id: 'io', name: 'Io (Experimental)'}
     ]
+    context.codeLanguage = @codeLanguage = @options.session.get('codeLanguage') ? me.get('aceConfig')?.language ? 'python'
     context.heroInfo = temporaryHeroInfo
     context
 
@@ -110,7 +112,9 @@ module.exports = class ChooseHeroView extends CocoView
 
   onHidden: ->
 
-
+  onCodeLanguageChanged: (e) ->
+    @codeLanguage = @$el.find('#option-code-language').val()
+    @codeLanguageChanged = true
 
 temporaryHeroInfo =
   captain:
diff --git a/app/views/game-menu/GameMenuModal.coffee b/app/views/game-menu/GameMenuModal.coffee
index fc190028f..0f108eb8d 100644
--- a/app/views/game-menu/GameMenuModal.coffee
+++ b/app/views/game-menu/GameMenuModal.coffee
@@ -43,11 +43,11 @@ module.exports = class GameMenuModal extends ModalView
   onHidden: ->
     super()
     subview.onHidden?() for subviewKey, subview of @subviews
-    patchingMe = @updateHeroConfig()
-    me.patch() unless patchingMe  # Might need to patch for options menu
+    patchingMe = @updateConfig()
+    me.patch() unless patchingMe  # Might need to patch for options menu, too
     Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'game-menu-close', volume: 1
 
-  updateHeroConfig: ->
+  updateConfig: ->
     sessionHeroConfig = @options.session.get('heroConfig') ? {}
     lastHeroConfig = me.get('heroConfig') ? {}
     thangType = @subviews.choose_hero_view.selectedHero.get 'original'
@@ -59,6 +59,13 @@ module.exports = class GameMenuModal extends ModalView
       patchMe ||= not _.isEqual val, lastHeroConfig[key]
       sessionHeroConfig[key] = val
       lastHeroConfig[key] = val
+    if (codeLanguage = @subviews.choose_hero_view.codeLanguage) and @subviews.choose_hero_view.codeLanguageChanged
+      patchSession ||= codeLanguage isnt @options.session.get('codeLanguage')
+      patchMe ||= codeLanguage isnt me.get('aceConfig')?.language
+      @options.session.set 'codeLanguage', codeLanguage
+      aceConfig = me.get('aceConfig', true) ? {}
+      aceConfig.language = codeLanguage
+      me.set 'aceConfig', aceConfig
     if patchSession
       @options.session.set 'heroConfig', sessionHeroConfig
       @options.session.patch success: ->
diff --git a/app/views/play/modal/PlayLevelModal.coffee b/app/views/play/modal/PlayLevelModal.coffee
index caca06b7b..2fae2c118 100644
--- a/app/views/play/modal/PlayLevelModal.coffee
+++ b/app/views/play/modal/PlayLevelModal.coffee
@@ -46,11 +46,11 @@ module.exports = class PlayLevelModal extends ModalView
   onHidden: ->
     unless @navigatingToPlay
       skipSessionSave = not @options.session.get('levelName')?  # Has to have been already started.
-      @updateHeroConfig null, skipSessionSave
+      @updateConfig null, skipSessionSave
     Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'game-menu-close', volume: 1
     super()
 
-  updateHeroConfig: (callback, skipSessionSave) ->
+  updateConfig: (callback, skipSessionSave) ->
     sessionHeroConfig = @options.session.get('heroConfig') ? {}
     lastHeroConfig = me.get('heroConfig') ? {}
     thangType = @subviews.choose_hero_view.selectedHero.get 'original'
@@ -62,6 +62,13 @@ module.exports = class PlayLevelModal extends ModalView
       patchMe ||= not _.isEqual val, lastHeroConfig[key]
       sessionHeroConfig[key] = val
       lastHeroConfig[key] = val
+    if (codeLanguage = @subviews.choose_hero_view.codeLanguage) and @subviews.choose_hero_view.codeLanguageChanged
+      patchSession ||= codeLanguage isnt @options.session.get('codeLanguage')
+      patchMe ||= codeLanguage isnt me.get('aceConfig')?.language
+      @options.session.set 'codeLanguage', codeLanguage
+      aceConfig = me.get('aceConfig', true) ? {}
+      aceConfig.language = codeLanguage
+      me.set 'aceConfig', aceConfig
     if patchMe
       me.set 'heroConfig', lastHeroConfig
       me.patch()
@@ -81,7 +88,7 @@ module.exports = class PlayLevelModal extends ModalView
 
   onClickPlayLevel: (e) ->
     @showLoading()
-    @updateHeroConfig =>
+    @updateConfig =>
       @navigatingToPlay = true
       Backbone.Mediator.publish 'router:navigate', {
         route: "/play/#{@options.levelPath || 'level'}/#{@options.levelID}",