diff --git a/app/lib/services/facebook.coffee b/app/lib/services/facebook.coffee
index 5114ba2a1..29cf2cded 100644
--- a/app/lib/services/facebook.coffee
+++ b/app/lib/services/facebook.coffee
@@ -17,7 +17,7 @@ module.exports = initializeFacebook = ->
       if response.status is 'connected'
 
         # They have logged in to the app.
-        Backbone.Mediator.publish 'facebook-logged-in', response: response
+        Backbone.Mediator.publish 'auth:logged-in-with-facebook', response: response
 
       else if response.status is 'not_authorized'
         #
diff --git a/app/lib/surface/CoordinateDisplay.coffee b/app/lib/surface/CoordinateDisplay.coffee
index 8d235cec9..e9928ed60 100644
--- a/app/lib/surface/CoordinateDisplay.coffee
+++ b/app/lib/surface/CoordinateDisplay.coffee
@@ -53,6 +53,7 @@ module.exports = class CoordinateDisplay extends createjs.Container
     wop = @camera.screenToWorld x: e.x, y: e.y
     wop.x = Math.round wop.x
     wop.y = Math.round wop.y
+    Backbone.Mediator.publish 'tome:focus-editor', {}
     Backbone.Mediator.publish 'surface:coordinate-selected', wop
 
   onZoomUpdated: (e) ->
diff --git a/app/lib/surface/Dimmer.coffee b/app/lib/surface/Dimmer.coffee
index 2d902fb0f..cfac3ba15 100644
--- a/app/lib/surface/Dimmer.coffee
+++ b/app/lib/surface/Dimmer.coffee
@@ -26,7 +26,6 @@ module.exports = class Dimmer extends CocoClass
   build: ->
     @dimLayer = new createjs.Container()
     @dimLayer.mouseEnabled = @dimLayer.mouseChildren = false
-    @dimLayer.layerIndex = -10
     @dimLayer.addChild @dimScreen = new createjs.Shape()
     @dimLayer.addChild @dimMask = new createjs.Shape()
     @dimScreen.graphics.beginFill('rgba(0,0,0,0.5)').rect 0, 0, @camera.canvasWidth, @camera.canvasHeight
diff --git a/app/lib/surface/Mark.coffee b/app/lib/surface/Mark.coffee
index b730cabd8..b9103bcce 100644
--- a/app/lib/surface/Mark.coffee
+++ b/app/lib/surface/Mark.coffee
@@ -45,6 +45,13 @@ module.exports = class Mark extends CocoClass
         @mark.visible = true
     @
 
+  setLayer: (layer) ->
+    return if layer is @layer
+    wasOn = @on
+    @toggle false
+    @layer = layer
+    @toggle true if wasOn
+
   setSprite: (sprite) ->
     return if sprite is @sprite
     @sprite = sprite
@@ -131,7 +138,6 @@ module.exports = class Mark extends CocoClass
     @mark.graphics.endFill()
     @mark.regX = width / 2
     @mark.regY = height / 2
-    @mark.layerIndex = 10
     @mark.cache -1, -1, width + 2, height + 2 # not actually faster than simple ellipse draw
 
   buildRadius: (range) ->
diff --git a/app/lib/surface/PlaybackOverScreen.coffee b/app/lib/surface/PlaybackOverScreen.coffee
index 9bf05fe7b..a50dadc78 100644
--- a/app/lib/surface/PlaybackOverScreen.coffee
+++ b/app/lib/surface/PlaybackOverScreen.coffee
@@ -15,7 +15,6 @@ module.exports = class PlaybackOverScreen extends CocoClass
   build: ->
     @dimLayer = new createjs.Container()
     @dimLayer.mouseEnabled = @dimLayer.mouseChildren = false
-    @dimLayer.layerIndex = -12
     @dimLayer.addChild @dimScreen = new createjs.Shape()
     @dimScreen.graphics.beginFill('rgba(0,0,0,0.4)').rect 0, 0, @camera.canvasWidth, @camera.canvasHeight
     @dimLayer.cache 0, 0, @camera.canvasWidth, @camera.canvasHeight
diff --git a/app/lib/surface/PointChooser.coffee b/app/lib/surface/PointChooser.coffee
index 16bacd5c6..38e72231f 100644
--- a/app/lib/surface/PointChooser.coffee
+++ b/app/lib/surface/PointChooser.coffee
@@ -21,7 +21,6 @@ module.exports = class PointChooser extends CocoClass
     @shape.mouseEnabled = false
     @shape.graphics.setStrokeStyle(1, 'round').beginStroke('#000000').beginFill('#fedcba')
     @shape.graphics.drawCircle(0, 0, 4).endFill()
-    @shape.layerIndex = 100
 
   onMouseDown: (e) =>
     return unless key.shift
diff --git a/app/lib/surface/SpriteBoss.coffee b/app/lib/surface/SpriteBoss.coffee
index 511c2830a..361e17318 100644
--- a/app/lib/surface/SpriteBoss.coffee
+++ b/app/lib/surface/SpriteBoss.coffee
@@ -373,6 +373,11 @@ module.exports = class SpriteBoss extends CocoClass
     @updateTarget()
     return unless @selectionMark
     @selectedSprite = null if @selectedSprite and (@selectedSprite.destroyed or not @selectedSprite.thang)
+    # The selection mark should be on the ground layer, unless we're not a normal sprite (like a wall), in which case we'll place it higher so we can see it.
+    if @selectedSprite and @selectedSprite.imageObject.parent isnt @spriteLayers.Default
+      @selectionMark.setLayer @spriteLayers.Default
+    else if @selectedSprite
+      @selectionMark.setLayer @spriteLayers.Ground
     @selectionMark.toggle @selectedSprite?
     @selectionMark.setSprite @selectedSprite
     @selectionMark.update()
diff --git a/app/lib/surface/Surface.coffee b/app/lib/surface/Surface.coffee
index ea8b1ac0c..315a1a1d2 100644
--- a/app/lib/surface/Surface.coffee
+++ b/app/lib/surface/Surface.coffee
@@ -424,7 +424,7 @@ module.exports = Surface = class Surface extends CocoClass
     oldHeight = parseInt @canvas.attr('height'), 10
     aspectRatio = oldWidth / oldHeight
     pageWidth = $('#page-container').width() - 17  # 17px nano scroll bar
-    if @realTime
+    if @realTime or @options.spectateGame
       pageHeight = $('#page-container').height() - $('#control-bar-view').outerHeight() - $('#playback-view').outerHeight()
       newWidth = Math.min pageWidth, pageHeight * aspectRatio
       newHeight = newWidth / aspectRatio
@@ -483,11 +483,13 @@ module.exports = Surface = class Surface extends CocoClass
     worldPos = @camera.screenToWorld x: e.stageX, y: e.stageY
     event = onBackground: onBackground, x: e.stageX, y: e.stageY, originalEvent: e, worldPos: worldPos
     Backbone.Mediator.publish 'surface:stage-mouse-down', event
+    Backbone.Mediator.publish 'tome:focus-editor', {}
 
   onMouseUp: (e) =>
     return if @disabled
     onBackground = not @stage.hitTest e.stageX, e.stageY
     Backbone.Mediator.publish 'surface:stage-mouse-up', onBackground: onBackground, x: e.stageX, y: e.stageY, originalEvent: e
+    Backbone.Mediator.publish 'tome:focus-editor', {}
 
   onMouseWheel: (e) =>
     # https://github.com/brandonaaron/jquery-mousewheel
diff --git a/app/locale/pt-PT.coffee b/app/locale/pt-PT.coffee
index 3c1bc4872..83049398d 100644
--- a/app/locale/pt-PT.coffee
+++ b/app/locale/pt-PT.coffee
@@ -126,8 +126,8 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
     level_difficulty: "Dificuldade: "
     play_as: "Jogar Como"
     spectate: "Espectar"
-#    players: "players"
-#    hours_played: "hours played"
+    players: "jogadores"
+    hours_played: "horas jogadas"
 
   contact:
     contact_us: "Contacte o CodeCombat"
@@ -513,7 +513,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
     toggle_grid: "Ativar/desativar a sobreposição da grelha."
     toggle_pathfinding: "Ativar/desativar a sobreposição do encontrador de caminho."
     beautify: "Embelezar o código ao estandardizar a formatação."
-#    maximize_editor: "Maximize/minimize code editor."
+    maximize_editor: "Maximizar/minimizar o editor de código."
     move_wizard: "Mover o seu Feiticeiro pelo nível."
 
   admin:
@@ -910,7 +910,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
     unknown: "Erro desconhecido."
 
   resources:
-#    sessions: "Sessions"
+    sessions: "Sessões"
     your_sessions: "As Suas Sessões"
     level: "Nível"
     social_network_apis: "APIs das Redes Sociais"
@@ -926,7 +926,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
     patched_model: "Documento Fonte"
     model: "Modelo"
     system: "Sistema"
-#    systems: "Systems"
+    systems: "Sistemas"
     component: "Componente"
     components: "Componentes"
     thang: "Thang"
@@ -941,16 +941,16 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
     source_document: "Documento Fonte"
     document: "Documento"
     sprite_sheet: "Folha de Sprite"
-#    employers: "Employers"
-#    candidates: "Candidates"
+    employers: "Empregadores"
+    candidates: "Candidatos"
     candidate_sessions: "Sessões de Candidatos"
     user_remark: "Observação do Utilizador"
-#    user_remarks: "User Remarks"
+    user_remarks: "Observações de Utilizador"
     versions: "Versões"
     items: "Itens"
-#    wizard: "Wizard"
-#    achievement: "Achievement"
-#    clas: "CLAs"
+    wizard: "Feiticeiro"
+    achievement: "Conquista"
+    clas: "CLAs"
 #    play_counts: "Play Counts"
 
   delta:
diff --git a/app/models/CocoModel.coffee b/app/models/CocoModel.coffee
index 4e35ba126..3fb7d7a79 100644
--- a/app/models/CocoModel.coffee
+++ b/app/models/CocoModel.coffee
@@ -210,6 +210,11 @@ class CocoModel extends Backbone.Model
 
     return false
 
+  getOwner: ->
+    return null unless permissions = @get 'permissions'
+    ownerPermission = _.find permissions, access: 'owner'
+    ownerPermission?.target
+
   getDelta: ->
     differ = deltasLib.makeJSONDiffer()
     differ.diff @_revertAttributes, @attributes
diff --git a/app/schemas/subscriptions/bus.coffee b/app/schemas/subscriptions/bus.coffee
index f56c18170..53cc6c3f9 100644
--- a/app/schemas/subscriptions/bus.coffee
+++ b/app/schemas/subscriptions/bus.coffee
@@ -23,5 +23,5 @@ module.exports =
     bus: {$ref: 'bus'}
 
   'bus:player-states-changed': c.object {title: 'Player state changes', description: 'State of the players has changed'},
-    states: c.array {}, {type: 'object'}
+    states: {type: 'object', additionalProperties: {type: 'object'}}
     bus: {$ref: 'bus'}
diff --git a/app/schemas/subscriptions/misc.coffee b/app/schemas/subscriptions/misc.coffee
index 0f9d9b0c3..d279489ba 100644
--- a/app/schemas/subscriptions/misc.coffee
+++ b/app/schemas/subscriptions/misc.coffee
@@ -22,7 +22,7 @@ module.exports =
   'router:navigate': c.object {required: ['route']},
     route: {type: 'string'}
     view: {type: 'object'}
-    viewClass: {type: 'object'}
+    viewClass: {type: 'function'}
     viewArgs: {type: 'array'}
 
   'achievements:new': c.object {required: 'earnedAchievements'},
diff --git a/app/schemas/subscriptions/surface.coffee b/app/schemas/subscriptions/surface.coffee
index 7bc8cea8b..2ed519135 100644
--- a/app/schemas/subscriptions/surface.coffee
+++ b/app/schemas/subscriptions/surface.coffee
@@ -66,6 +66,7 @@ module.exports =  # /app/lib/surface
   'surface:coordinate-selected': c.object {required: ['x', 'y']},
     x: {type: 'number'}
     y: {type: 'number'}
+    z: {type: 'number'}
 
   'surface:coordinates-shown': c.object {}
 
diff --git a/app/styles/kinds/search.sass b/app/styles/kinds/search.sass
index 872d346ee..69b8c11df 100644
--- a/app/styles/kinds/search.sass
+++ b/app/styles/kinds/search.sass
@@ -16,6 +16,9 @@
       overflow: hidden
       text-overflow: ellipsis
 
+    tr.mine
+      background-color: #f8ecaa
+
   .loading
     text-align: center
 
diff --git a/app/styles/play/spectate.sass b/app/styles/play/spectate.sass
index 746a6589f..c117b8d71 100644
--- a/app/styles/play/spectate.sass
+++ b/app/styles/play/spectate.sass
@@ -38,17 +38,12 @@
     margin: 0px auto
 
   #canvas-wrapper
-    height: 100%
+    width: 100%
     position: relative
     margin: 0 auto
 
   canvas#surface
     background-color: #333
-    max-height: 93%
-    max-height: -webkit-calc(100% - 60px)
-    max-height: calc(100% - 60px)
-    height: auto
-    max-width: 100%
     display: block
     z-index: 1
     margin: 0 auto
diff --git a/app/templates/editor/article/table.jade b/app/templates/editor/article/table.jade
index 42b431c32..c3654353c 100755
--- a/app/templates/editor/article/table.jade
+++ b/app/templates/editor/article/table.jade
@@ -1,21 +1 @@
-table.table
-  tr
-    th(colspan=3)
-      span(data-i18n="general.results")
-        | Results
-      span
-        |: #{documents.length}
-  
-  tr
-    th(data-i18n="general.name") Name
-    th(data-i18n="general.description") Description
-    th(data-i18n="general.version") Version
-  
-  for data in documents 
-    - data = data.attributes;
-    tr
-      td
-        a(href="/editor/article/#{data.slug || data._id}")
-          | #{data.name}
-      td.body-row #{data.description}
-      td #{data.version.major}.#{data.version.minor}
\ No newline at end of file
+extends /templates/kinds/table
diff --git a/app/templates/editor/level/table.jade b/app/templates/editor/level/table.jade
index 594d09ea4..c3654353c 100755
--- a/app/templates/editor/level/table.jade
+++ b/app/templates/editor/level/table.jade
@@ -1,21 +1 @@
-table.table
-  tr
-    th(colspan=3)
-      span(data-i18n="general.results")
-        | Results
-      span
-        |: #{documents.length}
-  
-  tr
-    th(data-i18n="general.name") Name
-    th(data-i18n="general.description") Description
-    th(data-i18n="general.version") Version
- 
-  for data in documents 
-    - data = data.attributes;
-    tr
-      td
-        a(href="/editor/level/#{data.slug || data._id}")
-          | #{data.name}
-      td.body-row #{data.description}
-      td #{data.version.major}.#{data.version.minor}
+extends /templates/kinds/table
diff --git a/app/templates/editor/thang/table.jade b/app/templates/editor/thang/table.jade
index 6036bacfd..f4fead3cc 100755
--- a/app/templates/editor/thang/table.jade
+++ b/app/templates/editor/thang/table.jade
@@ -1,17 +1,21 @@
-table.table
+extends /templates/kinds/table
+
+block tableResultsHeader
   tr
-    th(colspan=3)
+    th(colspan=4)
       span(data-i18n="general.results")
         | Results
       span
         |: #{documents.length}
   
+block tableHeader
   tr
     th#portrait-col
     th(data-i18n="general.name") Name
     th(data-i18n="general.description") Description
     th(data-i18n="general.version") Version
   
+block tableBody
   for thang in documents 
     tr
       td
diff --git a/app/templates/kinds/table.jade b/app/templates/kinds/table.jade
index 6e1653469..bd768ce42 100755
--- a/app/templates/kinds/table.jade
+++ b/app/templates/kinds/table.jade
@@ -1,10 +1,11 @@
 table.table
-  tr
-    th(colspan=3)
-      span(data-i18n="general.results")
-        | Results
-      span
-        |: #{documents.length}
+  block tableResultsHeader
+    tr
+      th(colspan=3)
+        span(data-i18n="general.results")
+          | Results
+        span
+          |: #{documents.length}
 
   block tableHeader
     tr
@@ -13,9 +14,9 @@ table.table
       th(data-i18n="general.version") Version
 
   block tableBody
-    for data in documents
-      - data = data.attributes;
-      tr
+    for document in documents
+      - var data = document.attributes;
+      tr(class=document.getOwner() == me.id ? 'mine' : '')
         td
           a(href="/editor/#{page}/#{data.slug || data._id}")
             | #{data.name}
diff --git a/app/templates/play/spectate.jade b/app/templates/play/spectate.jade
index 720cd4b30..7867ba9a6 100644
--- a/app/templates/play/spectate.jade
+++ b/app/templates/play/spectate.jade
@@ -3,7 +3,7 @@
 .level-content
   #control-bar-view
   #canvas-wrapper
-    canvas(width=1848, height=1178)#surface
+    canvas(width=924, height=589)#surface
     #canvas-left-gradient.gradient
     #canvas-top-gradient.gradient
   #gold-view.secret.expanded
diff --git a/app/views/editor/article/ArticleSearchView.coffee b/app/views/editor/article/ArticleSearchView.coffee
index b80423011..834b019f2 100644
--- a/app/views/editor/article/ArticleSearchView.coffee
+++ b/app/views/editor/article/ArticleSearchView.coffee
@@ -6,6 +6,7 @@ module.exports = class ArticleSearchView extends SearchView
   model: require 'models/Article'
   modelURL: '/db/article'
   tableTemplate: require 'templates/editor/article/table'
+  page: 'article'
 
   getRenderData: ->
     context = super()
diff --git a/app/views/editor/level/LevelSearchView.coffee b/app/views/editor/level/LevelSearchView.coffee
index a5dfb21c7..d64a79cbe 100644
--- a/app/views/editor/level/LevelSearchView.coffee
+++ b/app/views/editor/level/LevelSearchView.coffee
@@ -6,6 +6,7 @@ module.exports = class LevelSearchView extends SearchView
   model: require 'models/Level'
   modelURL: '/db/level'
   tableTemplate: require 'templates/editor/level/table'
+  page: 'level'
 
   getRenderData: ->
     context = super()
diff --git a/app/views/editor/thang/ThangTypeSearchView.coffee b/app/views/editor/thang/ThangTypeSearchView.coffee
index 52807f331..cc1d3ce48 100644
--- a/app/views/editor/thang/ThangTypeSearchView.coffee
+++ b/app/views/editor/thang/ThangTypeSearchView.coffee
@@ -7,6 +7,7 @@ module.exports = class ThangTypeSearchView extends SearchView
   modelURL: '/db/thang.type'
   tableTemplate: require 'templates/editor/thang/table'
   projection: ['original', 'name', 'version', 'description', 'slug', 'kind', 'rasterIcon']
+  page: 'thang'
 
   getRenderData: ->
     context = super()
diff --git a/app/views/kinds/SearchView.coffee b/app/views/kinds/SearchView.coffee
index 7d5fa8b0f..8bf19c3f9 100644
--- a/app/views/kinds/SearchView.coffee
+++ b/app/views/kinds/SearchView.coffee
@@ -7,11 +7,19 @@ class SearchCollection extends Backbone.Collection
   initialize: (modelURL, @model, @term, @projection) ->
     @url = "#{modelURL}?project="
     if @projection? and not (@projection == [])
-      @url += projection[0]
-      @url += ',' + projected for projected in projection[1..]
+      @url += 'created,permissions'
+      @url += ',' + projected for projected in projection
     else @url += 'true'
     @url += "&term=#{term}" if @term
 
+  comparator: (a, b) ->
+    score = 0
+    score -= 9001900190019001 if a.getOwner() is me.id
+    score += 9001900190019001 if b.getOwner() is me.id
+    score -= new Date(a.get 'created')
+    score -= -(new Date(b.get 'created'))
+    if score < 0 then -1 else (if score > 0 then 1 else 0)
+
 module.exports = class SearchView extends RootView
   template: template
   className: 'search-view'
@@ -67,8 +75,9 @@ module.exports = class SearchView extends RootView
 
   onSearchChange: ->
     @hideLoading()
+    @collection.sort()
     documents = @collection.models
-    table = $(@tableTemplate(documents:documents))
+    table = $(@tableTemplate(documents: documents, me: me, page: @page))
     @$el.find('table').replaceWith(table)
     @$el.find('table').i18n()
 
diff --git a/app/views/modal/WizardSettingsModal.coffee b/app/views/modal/WizardSettingsModal.coffee
index 3e45663c0..8ef6db1d5 100644
--- a/app/views/modal/WizardSettingsModal.coffee
+++ b/app/views/modal/WizardSettingsModal.coffee
@@ -50,10 +50,11 @@ module.exports = class WizardSettingsModal extends ModalView
     res.error =>
       errors = JSON.parse(res.responseText)
       console.warn 'Got errors saving user:', errors
+      return if @destroyed
       forms.applyErrorsToForm(@$el, errors)
       @disableModalInProgress(@$el)
 
     res.success (model, response, options) =>
-      @hide()
+      @hide() unless @destroyed
 
     @enableModalInProgress(@$el)
diff --git a/app/views/play/SpectateView.coffee b/app/views/play/SpectateView.coffee
index 30fb92aca..8cd6a79cb 100644
--- a/app/views/play/SpectateView.coffee
+++ b/app/views/play/SpectateView.coffee
@@ -221,7 +221,6 @@ module.exports = class SpectateLevelView extends RootView
     else
       console.log 'World scripts don\'t exist!'
       nonVictoryPlaybackScripts = []
-    console.log nonVictoryPlaybackScripts
     @scriptManager = new ScriptManager({scripts: nonVictoryPlaybackScripts, view:@, session: @session})
     @scriptManager.loadFromSession()
 
diff --git a/server/commons/Handler.coffee b/server/commons/Handler.coffee
index bec7c9063..6b1c110a6 100644
--- a/server/commons/Handler.coffee
+++ b/server/commons/Handler.coffee
@@ -7,7 +7,7 @@ Patch = require '../patches/Patch'
 User = require '../users/User'
 sendwithus = require '../sendwithus'
 
-PROJECT = {original: 1, name: 1, version: 1, description: 1, slug: 1, kind: 1}
+PROJECT = {original: 1, name: 1, version: 1, description: 1, slug: 1, kind: 1, created: 1, permissions: 1}
 FETCH_LIMIT = 300
 
 module.exports = class Handler