diff --git a/app/views/play/level/tome/Problem.coffee b/app/views/play/level/tome/Problem.coffee
index 5f16aa9aa..0ff9fc560 100644
--- a/app/views/play/level/tome/Problem.coffee
+++ b/app/views/play/level/tome/Problem.coffee
@@ -13,7 +13,7 @@ module.exports = class Problem
       @annotation = @buildAnnotationFromAetherProblem(@aetherProblem)
       { @lineMarkerRange, @textMarkerRange } = @buildMarkerRangesFromAetherProblem(@aetherProblem) if isCast
 
-      { @level, @range, @message, @hint, @userInfo } = @aetherProblem
+      { @level, @range, @message, @hint, @userInfo, @type } = @aetherProblem
       { @row, @column: col } = @aetherProblem.range?[0]
       @createdBy = 'aether'
     else
diff --git a/app/views/play/level/tome/SpellView.coffee b/app/views/play/level/tome/SpellView.coffee
index 47f35fae4..c062c7bd3 100644
--- a/app/views/play/level/tome/SpellView.coffee
+++ b/app/views/play/level/tome/SpellView.coffee
@@ -853,34 +853,37 @@ module.exports = class SpellView extends CocoView
     Backbone.Mediator.publish 'tome:problems-updated', spell: @spell, problems: @problems, isCast: isCast
     @ace.resize()
 
-  saveUserCodeProblem: (aether, aetherProblem) ->
+  saveUserCodeProblem: (aether, problem) ->
+    aether ?= @spellThang?.aether
     # Skip duplicate problems
-    hashValue = aether.raw + aetherProblem.message
+    hashValue = aether.raw + problem.message
     return if hashValue of @savedProblems
     @savedProblems[hashValue] = true
-    return unless Math.random() < 0.01  # Let's only save a tiny fraction of these during HoC to reduce writes.
+    return unless Math.random() < 0.01  # Let's only save a tiny fraction of these to reduce writes.
 
     # Save new problem
     @userCodeProblem = new UserCodeProblem()
     @userCodeProblem.set 'code', aether.raw
-    if aetherProblem.range
+    if problem.range or problem.row
       rawLines = aether.raw.split '\n'
-      errorLines = rawLines.slice aetherProblem.range[0].row, aetherProblem.range[1].row + 1
+      startLine = problem.range?[0].row or problem.row
+      endLine = (problem.range?[1].row or problem.row)
+      errorLines = rawLines.slice startLine, endLine + 1
       @userCodeProblem.set 'codeSnippet', errorLines.join '\n'
-    @userCodeProblem.set 'errHint', aetherProblem.hint if aetherProblem.hint
-    @userCodeProblem.set 'errId', aetherProblem.id if aetherProblem.id
-    @userCodeProblem.set 'errLevel', aetherProblem.level if aetherProblem.level
-    if aetherProblem.message
-      @userCodeProblem.set 'errMessage', aetherProblem.message
+    @userCodeProblem.set 'errHint', problem.hint if problem.hint
+    @userCodeProblem.set 'errId', problem.id if problem.id
+    @userCodeProblem.set 'errLevel', problem.level if problem.level
+    if problem.message
+      @userCodeProblem.set 'errMessage', problem.message
       # Save error message without 'Line N: ' prefix
-      messageNoLineInfo = aetherProblem.message
+      messageNoLineInfo = problem.message
       if lineInfoMatch = messageNoLineInfo.match /^Line [0-9]+\: /
         messageNoLineInfo = messageNoLineInfo.slice(lineInfoMatch[0].length)
       @userCodeProblem.set 'errMessageNoLineInfo', messageNoLineInfo
-    @userCodeProblem.set 'errRange', aetherProblem.range if aetherProblem.range
-    @userCodeProblem.set 'errType', aetherProblem.type if aetherProblem.type
+    @userCodeProblem.set 'errRange', problem.range if problem.range
+    @userCodeProblem.set 'errType', problem.type if problem.type
     @userCodeProblem.set 'language', aether.language.id if aether.language?.id
-    @userCodeProblem.set 'levelID', @options.levelID if @options.levelID
+    @userCodeProblem.set 'levelID', problem.levelID if problem.levelID
     @userCodeProblem.save()
     null
 
@@ -1010,7 +1013,9 @@ module.exports = class SpellView extends CocoView
     lineOffsetPx -= @ace.session.getScrollTop()
     Backbone.Mediator.publish 'tome:show-problem-alert', problem: problem, lineOffsetPx: Math.max lineOffsetPx, 0
 
-    # @saveUserCodeProblem(aether, aetherProblem) # TODO: Enable saving of web-dev user code problems
+    if aether = @spellThang?.aether
+      @saveUserCodeProblem(aether, problem) # TODO: Enable saving of web-dev user code problems
+
     annotations.push problem.annotation if problem.annotation
     @reallySetAnnotations annotations
     Backbone.Mediator.publish 'tome:problems-updated', spell: @spell, problems: @problems, isCast: true