diff --git a/app/locale/en.coffee b/app/locale/en.coffee
index 103f368cb..072dc62ec 100644
--- a/app/locale/en.coffee
+++ b/app/locale/en.coffee
@@ -416,7 +416,9 @@
     tome_cast_button_running: "Running"
     tome_cast_button_ran: "Ran"
     tome_submit_button: "Submit"
-    tome_select_spell: "Select a Spell"
+    tome_reload_method: "Reload original code for this method"  # Title text for individual method reload button.
+    tome_select_method: "Select a Method"
+    tome_see_all_methods: "See all methods you can edit"  # Title text for method list selector (shown when there are multiple programmable methdos).
     tome_select_a_thang: "Select Someone for "
     tome_available_spells: "Available Spells"
     tome_your_skills: "Your Skills"
diff --git a/app/templates/play/level/tome/spell_list.jade b/app/templates/play/level/tome/spell_list.jade
index 90d7f9e06..84b28511a 100644
--- a/app/templates/play/level/tome/spell_list.jade
+++ b/app/templates/play/level/tome/spell_list.jade
@@ -1 +1 @@
-h5(data-i18n="play_level.tome_select_spell") Select a Spell
+h5(data-i18n="play_level.tome_select_method") Select a Method
diff --git a/app/templates/play/level/tome/spell_list_tab_entry.jade b/app/templates/play/level/tome/spell_list_tab_entry.jade
index 9e3ac0ce8..a2ec05b06 100644
--- a/app/templates/play/level/tome/spell_list_tab_entry.jade
+++ b/app/templates/play/level/tome/spell_list_tab_entry.jade
@@ -1,20 +1,23 @@
 img(src="/images/level/code_editor_tab_background.png").spell-tab-image-hidden.hidden
 
-.btn.btn-small.spell-list-button(title="See all spells you can edit")
-  i.icon-chevron-down
+if includeSpellList
+  .btn.btn-small.spell-list-button(data-i18n="[title]play_level.tome_see_all_methods", title="See all methods you can edit")
+    i.icon-chevron-down
 .thang-avatar-placeholder
 
 code #{methodSignature}
 
 .spell-tool-buttons
-  .btn.btn-small.fullscreen-code(title=maximizeShortcutVerbose)
-    i.icon-fullscreen
-    i.icon-resize-small
+  if levelType !== 'hero'
+   .btn.btn-small.fullscreen-code(title=maximizeShortcutVerbose)
+     i.icon-fullscreen
+     i.icon-resize-small
       
-  .btn.btn-small.reload-code(title="Reload original code for " + spell.name)
+  .btn.btn-small.reload-code(data-i18n="[title]play_level.tome_reload_method", title="Reload original code for this method")
     i.icon-repeat
   
-  .btn.btn-small.beautify-code(title=beautifyShortcutVerbose)
-    i.icon-magnet
+  if codeLanguage === 'javascript'
+    .btn.btn-small.beautify-code(title=beautifyShortcutVerbose)
+      i.icon-magnet
 
   .clearfix
\ No newline at end of file
diff --git a/app/views/play/level/tome/CastButtonView.coffee b/app/views/play/level/tome/CastButtonView.coffee
index e30bac173..650fb801f 100644
--- a/app/views/play/level/tome/CastButtonView.coffee
+++ b/app/views/play/level/tome/CastButtonView.coffee
@@ -104,7 +104,8 @@ module.exports = class CastButtonView extends CocoView
       else if castable
         s = $.i18n.t('play_level.tome_cast_button_run')
         s = $.i18n.t('play_level.tome_cast_button_casting') if s is 'Run' and me.get('preferredLanguage').split('-')[0] isnt 'en'  # Temporary, if tome_cast_button_running isn't translated.
-        s += ' ' + @castShortcut
+        unless @options.levelID in ['dungeons-of-kithgard', 'gems-in-the-deep', 'shadow-guard', 'true-names']  # Hide for first few.
+          s += ' ' + @castShortcut
       else
         s = $.i18n.t('play_level.tome_cast_button_ran')
         s = $.i18n.t('play_level.tome_cast_button_casting') if s is 'Ran' and me.get('preferredLanguage').split('-')[0] isnt 'en'  # Temporary, if tome_cast_button_running isn't translated.
diff --git a/app/views/play/level/tome/Spell.coffee b/app/views/play/level/tome/Spell.coffee
index be55f5c35..af5349f6e 100644
--- a/app/views/play/level/tome/Spell.coffee
+++ b/app/views/play/level/tome/Spell.coffee
@@ -43,7 +43,7 @@ module.exports = class Spell
     if @canRead()  # We can avoid creating these views if we'll never use them.
       @view = new SpellView {spell: @, level: options.level, session: @session, worker: @worker}
       @view.render()  # Get it ready and code loaded in advance
-      @tabView = new SpellListTabEntryView spell: @, supermodel: @supermodel, language: @language
+      @tabView = new SpellListTabEntryView spell: @, supermodel: @supermodel, codeLanguage: @language, level: options.level
       @tabView.render()
     @team = @permissions.readwrite[0] ? 'common'
     Backbone.Mediator.publish 'tome:spell-created', spell: @
@@ -56,7 +56,7 @@ module.exports = class Spell
     @worker = null
 
   setLanguage: (@language) ->
-    console.log 'setting language to', @language, 'so using original source', @languages[language] ? @languages.javascript
+    #console.log 'setting language to', @language, 'so using original source', @languages[language] ? @languages.javascript
     @originalSource = @languages[language] ? @languages.javascript
 
   addThang: (thang) ->
diff --git a/app/views/play/level/tome/SpellListTabEntryView.coffee b/app/views/play/level/tome/SpellListTabEntryView.coffee
index 86a6cec27..b27ed0792 100644
--- a/app/views/play/level/tome/SpellListTabEntryView.coffee
+++ b/app/views/play/level/tome/SpellListTabEntryView.coffee
@@ -33,6 +33,9 @@ module.exports = class SpellListTabEntryView extends SpellListEntryView
     shift = $.i18n.t 'keyboard_shortcuts.shift'
     context.beautifyShortcutVerbose = "#{ctrl}+#{shift}+B: #{$.i18n.t 'keyboard_shortcuts.beautify'}"
     context.maximizeShortcutVerbose = "#{ctrl}+#{shift}+M: #{$.i18n.t 'keyboard_shortcuts.maximize_editor'}"
+    context.includeSpellList = @options.includeSpellList
+    context.codeLanguage = @options.codeLanguage
+    context.levelType = @options.level.get 'type', true
     context
 
   afterRender: ->
@@ -71,7 +74,7 @@ module.exports = class SpellListTabEntryView extends SpellListEntryView
           found = true
           break
     return unless found
-    docFormatter = new DocFormatter doc: doc, thang: @thang, language: @options.language, selectedMethod: true
+    docFormatter = new DocFormatter doc: doc, thang: @thang, language: @options.codeLanguage, selectedMethod: true
     @$el.find('code').popover(
       animation: true
       html: true
@@ -122,11 +125,12 @@ module.exports = class SpellListTabEntryView extends SpellListEntryView
 
   onSpellChangedLanguage: (e) ->
     return unless e.spell is @spell
-    @options.language = e.language
+    @options.codeLanguage = e.language
     @$el.find('code').popover 'destroy'
     @render()
     @docsBuilt = false
     @buildDocs() if @thang
+    @updateReloadButton()
 
   toggleControls: (e, enabled) ->
     # Don't call super; do it differently
diff --git a/app/views/play/level/tome/SpellListView.coffee b/app/views/play/level/tome/SpellListView.coffee
index febdbce12..9bf6ece39 100644
--- a/app/views/play/level/tome/SpellListView.coffee
+++ b/app/views/play/level/tome/SpellListView.coffee
@@ -61,7 +61,7 @@ module.exports = class SpellListView extends CocoView
       theseThangs = _.keys(spell.thangs)
       changedThangs = not lastThangs or not _.isEqual theseThangs, lastThangs
       lastThangs = theseThangs
-      newEntries.push entry = new SpellListEntryView spell: spell, showTopDivider: changedThangs, supermodel: @supermodel
+      newEntries.push entry = new SpellListEntryView spell: spell, showTopDivider: changedThangs, supermodel: @supermodel, includeSpellList: @spells.length > 1
       @entries.push entry
     for entry in newEntries
       @$el.append entry.el