diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee
index 2b22c98c7..a18d9cc82 100644
--- a/app/lib/LevelLoader.coffee
+++ b/app/lib/LevelLoader.coffee
@@ -91,18 +91,9 @@ module.exports = class LevelLoader extends CocoClass
   loadDependenciesForSession: (session) ->
     if me.id isnt session.get 'creator'
       session.patch = session.save = -> console.error "Not saving session, since we didn't create it."
+    @loadCodeLanguagesForSession session
     if session is @session
-      codeLanguage = session.get('codeLanguage') or me.get('aceConfig')?.language or 'python'
-      modulePath = "vendor/aether-#{codeLanguage}"
-      loading = application.moduleLoader?.load(modulePath)
-      if loading
-        @languageModuleResource = @supermodel.addSomethingResource 'language_module'
-        @listenTo application.moduleLoader, 'loaded', (e) ->
-          if e.id is modulePath
-            @languageModuleResource.markLoaded()
-            @stopListening application.moduleLoader
       @addSessionBrowserInfo session
-
       # hero-ladder games require the correct session team in level:loaded
       team = @team ? @session.get('team')
       Backbone.Mediator.publish 'level:loaded', level: @level, team: team
@@ -138,6 +129,19 @@ module.exports = class LevelLoader extends CocoClass
     if _.size(@sessionDependenciesRegistered) is 2 and @checkAllWorldNecessitiesRegisteredAndLoaded()
       @onWorldNecessitiesLoaded()
 
+  loadCodeLanguagesForSession: (session) ->
+    codeLanguages = _.uniq _.filter [session.get('codeLanguage') or 'python', session.get('submittedCodeLanguage')]
+    for codeLanguage in codeLanguages
+      do (codeLanguage) =>
+        modulePath = "vendor/aether-#{codeLanguage}"
+        return unless application.moduleLoader?.load modulePath
+        languageModuleResource = @supermodel.addSomethingResource 'language_module'
+        onModuleLoaded = (e) ->
+          return unless e.id is modulePath
+          languageModuleResource.markLoaded()
+          @stopListening application.moduleLoader, 'loaded', onModuleLoaded  # listenToOnce might work here instead, haven't tried
+        @listenTo application.moduleLoader, 'loaded', onModuleLoaded
+
   addSessionBrowserInfo: (session) ->
     return unless me.id is session.get 'creator'
     return unless $.browser?
diff --git a/app/schemas/models/level_session.coffee b/app/schemas/models/level_session.coffee
index 2d4c74405..a4fca840e 100644
--- a/app/schemas/models/level_session.coffee
+++ b/app/schemas/models/level_session.coffee
@@ -286,7 +286,7 @@ _.extend LevelSessionSchema.properties,
                 type: ['string', 'null']  # 'null' in case an opponent session got corrupted, don't care much here
                 description: 'What submittedCodeLanguage the opponent used during the match'
         simulator: {type: 'object', description: 'Holds info on who simulated the match, and with what tools.'}
-        randomSeed: {type: 'integer', description: 'Stores the random seed that was used during this match.'}
+        randomSeed: {description: 'Stores the random seed that was used during this match.'}
 
 c.extendBasicProperties LevelSessionSchema, 'level.session'
 c.extendPermissionsProperties LevelSessionSchema, 'level.session'
diff --git a/server/queues/scoring.coffee b/server/queues/scoring.coffee
index 66a947ce8..9b895ec69 100644
--- a/server/queues/scoring.coffee
+++ b/server/queues/scoring.coffee
@@ -611,7 +611,7 @@ updateMatchesInSession = (matchObject, sessionID, callback) ->
   currentMatchObject.opponents = opponentsArray
   currentMatchObject.codeLanguage = matchObject.opponents[opponentsArray[0].sessionID].codeLanguage
   currentMatchObject.simulator = @clientResponseObject.simulator
-  currentMatchObject.randomSeed = @clientResponseObject.randomSeed
+  currentMatchObject.randomSeed = parseInt(@clientResponseObject.randomSeed or 0, 10)
   LevelSession.findOne {'_id': sessionID}, (err, session) ->
     session = session.toObject()
     currentMatchObject.playtime = session.playtime ? 0