diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee
index f326ed6b1..620912307 100644
--- a/app/lib/LevelLoader.coffee
+++ b/app/lib/LevelLoader.coffee
@@ -116,7 +116,7 @@ module.exports = class LevelLoader extends CocoClass
     flagThang = thangType: '53fa25f25bc220000052c2be', id: 'Placeholder Flag', components: []
     for thang in (@level.get('thangs') or []).concat [flagThang]
       thangIDs.push thang.thangType
-      @loadItemThangsEquippedByLevelThang(thang)
+      @loadThangsRequiredByLevelThang(thang)
       for comp in thang.components or []
         componentVersions.push _.pick(comp, ['original', 'majorVersion'])
 
@@ -160,23 +160,27 @@ module.exports = class LevelLoader extends CocoClass
 
     @worldNecessities = @worldNecessities.concat worldNecessities
 
-  loadItemThangsEquippedByLevelThang: (levelThang) ->
-    @loadItemThangsFromComponentList levelThang.components
+  loadThangsRequiredByLevelThang: (levelThang) ->
+    @loadThangsRequiredFromComponentList levelThang.components
 
-  loadItemThangsEquippedByThangType: (thangType) ->
-    @loadItemThangsFromComponentList thangType.get('components')
+  loadThangsRequiredByThangType: (thangType) ->
+    @loadThangsRequiredFromComponentList thangType.get('components')
 
-  loadItemThangsFromComponentList: (components) ->
-    equipsThangComponent = _.find components, (c) -> c.original is LevelComponent.EquipsID
-    inventory = equipsThangComponent?.config?.inventory
-    for itemThangType in _.values inventory
-      url = "/db/thang.type/#{itemThangType}/version?project=name,components,original"
+  loadThangsRequiredFromComponentList: (components) ->
+    requiredThangTypes = []
+    for component in components when component.config
+      if component.original is LevelComponent.EquipsID
+        requiredThangTypes.push itemThangType for itemThangType in _.values (component.config.inventory ? {})
+      else if component.config.requiredThangTypes
+        requiredThangTypes = requiredThangTypes.concat component.config.requiredThangTypes
+    for thangType in requiredThangTypes
+      url = "/db/thang.type/#{thangType}/version?project=name,components,original"
       @worldNecessities.push @maybeLoadURL(url, ThangType, 'thang')
 
   onThangNamesLoaded: (thangNames) ->
     for thangType in thangNames.models
       @loadDefaultComponentsForThangType(thangType)
-      @loadItemThangsEquippedByThangType(thangType)
+      @loadThangsRequiredByThangType(thangType)
 
   loadDefaultComponentsForThangType: (thangType) ->
     return unless components = thangType.get('components')
@@ -188,7 +192,7 @@ module.exports = class LevelLoader extends CocoClass
     index = @worldNecessities.indexOf(resource)
     if resource.name is 'thang'
       @loadDefaultComponentsForThangType(resource.model)
-      @loadItemThangsEquippedByThangType(resource.model)
+      @loadThangsRequiredByThangType(resource.model)
 
     return unless index >= 0
     @worldNecessities.splice(index, 1)
diff --git a/app/lib/forms.coffee b/app/lib/forms.coffee
index 86fe1530d..f319be0f2 100644
--- a/app/lib/forms.coffee
+++ b/app/lib/forms.coffee
@@ -31,7 +31,7 @@ module.exports.applyErrorsToForm = (el, errors, warning=false) ->
 module.exports.setErrorToField = setErrorToField = (el, message, warning=false) ->
   formGroup = el.closest('.form-group')
   unless formGroup.length
-    return console.error "#{el} did not contain a form group"
+    return console.error el, " did not contain a form group, so couldn't show message:", message
 
   kind = if warning then 'warning' else 'error'
   formGroup.addClass "has-#{kind}"
@@ -40,7 +40,7 @@ module.exports.setErrorToField = setErrorToField = (el, message, warning=false)
 module.exports.setErrorToProperty = setErrorToProperty = (el, property, message, warning=false) ->
   input = $("[name='#{property}']", el)
   unless input.length
-    return console.error "#{property} not found in #{el}"
+    return console.error "#{property} not found in", el, "so couldn't show message:", message
 
   setErrorToField input, message, warning
 
diff --git a/app/models/CocoModel.coffee b/app/models/CocoModel.coffee
index c6518340e..44a99bee3 100644
--- a/app/models/CocoModel.coffee
+++ b/app/models/CocoModel.coffee
@@ -51,16 +51,16 @@ class CocoModel extends Backbone.Model
     @loadFromBackup()
 
   getNormalizedURL: -> "#{@urlRoot}/#{@id}"
-    
+
   attributesWithDefaults: undefined
-    
+
   get: (attribute, withDefault=false) ->
     if withDefault
       if @attributesWithDefaults is undefined then @buildAttributesWithDefaults()
       return @attributesWithDefaults[attribute]
     else
       super(attribute)
-      
+
   set: ->
     delete @attributesWithDefaults
     inFlux = @loading or not @loaded
@@ -180,13 +180,13 @@ class CocoModel extends Backbone.Model
     clone
 
   isPublished: ->
-    for permission in @get('permissions') or []
+    for permission in (@get('permissions', true) ? [])
       return true if permission.target is 'public' and permission.access is 'read'
     false
 
   publish: ->
     if @isPublished() then throw new Error('Can\'t publish what\'s already-published. Can\'t kill what\'s already dead.')
-    @set 'permissions', (@get('permissions') or []).concat({access: 'read', target: 'public'})
+    @set 'permissions', @get('permissions', true).concat({access: 'read', target: 'public'})
 
   @isObjectID: (s) ->
     s.length is 24 and s.match(/[a-f0-9]/gi)?.length is 24
@@ -195,10 +195,9 @@ class CocoModel extends Backbone.Model
     # actor is a User object
     actor ?= me
     return true if actor.isAdmin()
-    if @get('permissions')?
-      for permission in @get('permissions')
-        if permission.target is 'public' or actor.get('_id') is permission.target
-          return true if permission.access in ['owner', 'read']
+    for permission in (@get('permissions', true) ? [])
+      if permission.target is 'public' or actor.get('_id') is permission.target
+        return true if permission.access in ['owner', 'read']
 
     return false
 
@@ -206,16 +205,14 @@ class CocoModel extends Backbone.Model
     # actor is a User object
     actor ?= me
     return true if actor.isAdmin()
-    if @get('permissions')?
-      for permission in @get('permissions')
-        if permission.target is 'public' or actor.get('_id') is permission.target
-          return true if permission.access in ['owner', 'write']
+    for permission in (@get('permissions', true) ? [])
+      if permission.target is 'public' or actor.get('_id') is permission.target
+        return true if permission.access in ['owner', 'write']
 
     return false
 
   getOwner: ->
-    return null unless permissions = @get 'permissions'
-    ownerPermission = _.find permissions, access: 'owner'
+    ownerPermission = _.find @get('permissions', true), access: 'owner'
     ownerPermission?.target
 
   getDelta: ->
diff --git a/app/models/LevelSession.coffee b/app/models/LevelSession.coffee
index 34b03be6d..ba87aef23 100644
--- a/app/models/LevelSession.coffee
+++ b/app/models/LevelSession.coffee
@@ -13,7 +13,7 @@ module.exports = class LevelSession extends CocoModel
       @set('state', state)
 
   updatePermissions: ->
-    permissions = @get 'permissions'
+    permissions = @get 'permissions', true
     permissions = (p for p in permissions when p.target isnt 'public')
     if @get('multiplayer')
       permissions.push {target: 'public', access: 'write'}
diff --git a/app/models/User.coffee b/app/models/User.coffee
index d9af11f11..25071ac26 100644
--- a/app/models/User.coffee
+++ b/app/models/User.coffee
@@ -13,10 +13,7 @@ module.exports = class User extends CocoModel
     CocoModel.pollAchievements() # Check for achievements on login
     super arguments...
 
-  isAdmin: ->
-    permissions = @attributes['permissions'] or []
-    return 'admin' in permissions
-
+  isAdmin: -> 'admin' in @get('permissions', true)
   isAnonymous: -> @get('anonymous', true)
   displayName: -> @get('name', true)
 
diff --git a/app/schemas/models/level_component.coffee b/app/schemas/models/level_component.coffee
index 9907210a6..40e55800e 100644
--- a/app/schemas/models/level_component.coffee
+++ b/app/schemas/models/level_component.coffee
@@ -143,7 +143,7 @@ _.extend LevelComponentSchema.properties,
     format: 'hidden'
   dependencies: c.array {title: 'Dependencies', description: 'An array of Components upon which this Component depends.', uniqueItems: true}, DependencySchema
   propertyDocumentation: c.array {title: 'Property Documentation', description: 'An array of documentation entries for each notable property this Component will add to its Thang which other Components might want to also use.'}, PropertyDocumentationSchema
-  configSchema: _.extend metaschema, {title: 'Configuration Schema', description: 'A schema for validating the arguments that can be passed to this Component as configuration.', default: {type: 'object', additionalProperties: false}}
+  configSchema: _.extend metaschema, {title: 'Configuration Schema', description: 'A schema for validating the arguments that can be passed to this Component as configuration.', default: {type: 'object'}}
   official:
     type: 'boolean'
     title: 'Official'
diff --git a/app/templates/account/settings.jade b/app/templates/account/settings.jade
index cbef47a7c..d07b97d16 100644
--- a/app/templates/account/settings.jade
+++ b/app/templates/account/settings.jade
@@ -32,7 +32,7 @@ block content
           .form
             - var name = me.get('name') || '';
             - var email = me.get('email');
-            - var admin = me.get('permissions').indexOf('admin') != -1;
+            - var admin = me.get('permissions', true).indexOf('admin') != -1;
             .form-group
               label.control-label(for="name", data-i18n="general.name") Name
               input#name.form-control(name="name", type="text", value="#{name}")
diff --git a/app/templates/base.jade b/app/templates/base.jade
index 2d36b5d0e..a80d84c89 100644
--- a/app/templates/base.jade
+++ b/app/templates/base.jade
@@ -67,7 +67,7 @@ body
     .footer.clearfix
       .content
         p.footer-link-text
-          if pathname == "/" || (me.get('permissions') || []).indexOf('employer') != -1
+          if pathname == "/" || (me.get('permissions', true)).indexOf('employer') != -1
             a(href='/employers', title='Home', tabindex=-1, data-i18n="nav.employers") Employers
           else
             a(href='/', title='Home', tabindex=-1, data-i18n="nav.home") Home
diff --git a/app/views/EmployersView.coffee b/app/views/EmployersView.coffee
index bb1292c93..4e9c45e5f 100644
--- a/app/views/EmployersView.coffee
+++ b/app/views/EmployersView.coffee
@@ -197,9 +197,7 @@ module.exports = class EmployersView extends RootView
     ctx.numberOfCandidates = ctx.featuredCandidates.length
     ctx
 
-  isEmployer: ->
-    userPermissions = me.get('permissions') ? []
-    _.contains userPermissions, 'employer'
+  isEmployer: -> 'employer' in me.get('permissions', true)
 
   setUpScrolling: =>
     $('.nano').nanoScroller()
@@ -209,7 +207,7 @@ module.exports = class EmployersView extends RootView
     #  $('.nano').nanoScroller({scrollTo: $(window.location.hash)})
 
   checkForEmployerSignupHash: =>
-    if window.location.hash is '#employerSignupLoggingIn' and not ('employer' in me.get('permissions')) and not me.isAdmin()
+    if window.location.hash is '#employerSignupLoggingIn' and not ('employer' in me.get('permissions', true)) and not me.isAdmin()
       @openModalView new EmployerSignupModal
       window.location.hash = ''
 
diff --git a/app/views/account/JobProfileTreemaView.coffee b/app/views/account/JobProfileTreemaView.coffee
index f5a8e3320..3c3b3a7f6 100644
--- a/app/views/account/JobProfileTreemaView.coffee
+++ b/app/views/account/JobProfileTreemaView.coffee
@@ -82,7 +82,7 @@ module.exports = class JobProfileTreemaView extends CocoView
       {name: 'Provide your name.', weight: 1, fn: modified 'name'}
       {name: 'Choose your city.', weight: 1, fn: modified 'city'}
       {name: 'Pick your country.', weight: 0, fn: exists 'country'}
-      {name: 'List at least five skills.', weight: 2, fn: -> jobProfile.skills.length >= 5}
+      {name: 'List at least five skills.', weight: 2, fn: -> jobProfile.skills?.length >= 5}
       {name: 'Write a short description to summarize yourself at a glance.', weight: 2, fn: modified 'shortDescription'}
       {name: 'Fill in your main description to sell yourself and describe the work you\'re looking for.', weight: 3, fn: modified 'longDescription'}
       {name: 'List your work experience.', weight: 3, fn: listStarted 'work', ['role', 'employer']}
@@ -95,7 +95,7 @@ module.exports = class JobProfileTreemaView extends CocoView
   getData: ->
     return {} unless me.get('jobProfile') or @hasEditedProfile
     _.pick @jobProfileTreema.data, (value, key) => key in @editableSettings
-      
+
   destroy: ->
     @jobProfileTreema?.destroy()
     super()
diff --git a/app/views/admin/CandidatesView.coffee b/app/views/admin/CandidatesView.coffee
index 3216be2dc..39ddca817 100644
--- a/app/views/admin/CandidatesView.coffee
+++ b/app/views/admin/CandidatesView.coffee
@@ -52,9 +52,7 @@ module.exports = class CandidatesView extends RootView
     ctx._ = _
     ctx
 
-  isEmployer: ->
-    userPermissions = me.get('permissions') ? []
-    _.contains userPermissions, "employer"
+  isEmployer: -> 'employer' in me.get('permissions', true)
 
   setUpScrolling: ->
     $(".nano").nanoScroller()
@@ -64,9 +62,9 @@ module.exports = class CandidatesView extends RootView
       $(".nano").nanoScroller({scrollTo:$(window.location.hash)})
 
   checkForEmployerSignupHash: =>
-    if window.location.hash is "#employerSignupLoggingIn" and not ("employer" in me.get("permissions"))
+    if window.location.hash is "#employerSignupLoggingIn" and not ("employer" in me.get('permissions', true))
       @openModalView new EmployerSignupModal
-      window.location.hash = ""
+      window.location.hash = ''
 
   sortTable: ->
     # http://mottie.github.io/tablesorter/docs/example-widget-bootstrap-theme.html
diff --git a/app/views/editor/ForkModal.coffee b/app/views/editor/ForkModal.coffee
index 99e4170ea..63399693f 100644
--- a/app/views/editor/ForkModal.coffee
+++ b/app/views/editor/ForkModal.coffee
@@ -31,7 +31,7 @@ module.exports = class ForkModal extends ModalView
     newModel.unset 'parent'
     newModel.set 'commitMessage', "Forked from #{@model.get('name')}"
     newModel.set 'name', @$el.find('#fork-model-name').val()
-    if @model.get 'permissions'
+    if @model.schema.properties.permissions
       newModel.set 'permissions', [access: 'owner', target: me.id]
     newPathPrefix = "editor/#{@editorPath}/"
     res = newModel.save()
diff --git a/app/views/editor/component/ThangComponentConfigView.coffee b/app/views/editor/component/ThangComponentConfigView.coffee
index 6e6483a24..6b447ab5a 100644
--- a/app/views/editor/component/ThangComponentConfigView.coffee
+++ b/app/views/editor/component/ThangComponentConfigView.coffee
@@ -30,7 +30,7 @@ module.exports = class ThangComponentConfigView extends CocoView
   afterRender: ->
     super()
     @buildTreema()
-    
+
   setConfig: (config) ->
     @handlingChange = true
     @editThangTreema.set('/', config)
@@ -51,7 +51,7 @@ module.exports = class ThangComponentConfigView extends CocoView
     schema = $.extend true, {}, @component.get('configSchema')
     schema.default ?= {}
     _.merge schema.default, @additionalDefaults if @additionalDefaults
-    
+
     if @level?.get('type') is 'hero'
       schema.required = []
     treemaOptions =
@@ -77,6 +77,7 @@ module.exports = class ThangComponentConfigView extends CocoView
         'seconds': nodes.SecondsNode
         'speed': nodes.SpeedNode
         'acceleration': nodes.AccelerationNode
+        'thang-type': nodes.ThangTypeNode
         'item-thang-type': nodes.ItemThangTypeNode
 
     @editThangTreema = @$el.find('.treema').treema treemaOptions
@@ -92,7 +93,7 @@ module.exports = class ThangComponentConfigView extends CocoView
     @trigger 'changed', { component: @component, config: @config }
 
   data: -> @editThangTreema.data
-    
+
   destroy: ->
     @editThangTreema?.destroy()
     super()
diff --git a/app/views/editor/level/LevelFeedbackView.coffee b/app/views/editor/level/LevelFeedbackView.coffee
index 360528d55..fa6a0884a 100644
--- a/app/views/editor/level/LevelFeedbackView.coffee
+++ b/app/views/editor/level/LevelFeedbackView.coffee
@@ -33,16 +33,16 @@ module.exports = class LevelFeedbackView extends CocoView
 
   getRenderData: (context={}) ->
     context = super(context)
+    context.moment = moment
+    context.allFeedback = []
+    context.averageRating = 0
+    context.totalRatings = 0
     if @allFeedback
       context.allFeedback = (m.attributes for m in @allFeedback.models when @allFeedback.models.length < 20 or m.get('review'))
-      context.averageRating = _.reduce((m.get('rating') for m in @allFeedback.models), (acc, x) -> acc + (x ? 5)) / (@allFeedback.models.length or 1)
+      context.averageRating = _.reduce((m.get('rating') for m in @allFeedback.models), (acc, x) -> acc + (x ? 5)) / (@allFeedback.models.length)
       context.totalRatings = @allFeedback.models.length
     else
-      context.allFeedback = []
-      context.averageRating = 0
-      context.totalRatings = 0
       context.loading = true
-    context.moment = moment
     context
 
   onViewSwitched: (e) ->
diff --git a/app/views/editor/level/treema_nodes.coffee b/app/views/editor/level/treema_nodes.coffee
index 33db3c129..989adfa22 100644
--- a/app/views/editor/level/treema_nodes.coffee
+++ b/app/views/editor/level/treema_nodes.coffee
@@ -200,6 +200,9 @@ module.exports.AccelerationNode = class AccelerationNode extends TreemaNode.node
 
 module.exports.ThangTypeNode = class ThangTypeNode extends TreemaNode.nodeMap.string
   valueClass: 'treema-thang-type'
+  @thangTypes: null
+  @thangTypesCollection: null
+
   constructor: (args...) ->
     super args...
     data = @getData()
@@ -223,63 +226,68 @@ module.exports.ThangTypeNode = class ThangTypeNode extends TreemaNode.nodeMap.st
     else
       @data = null
 
-module.exports.ItemThangTypeNode = ItemThangTypeNode = class ItemThangTypeNode extends TreemaNode.nodeMap.string
-  valueClass: 'treema-item-thang-type'
-  @items: null
-  @itemsCollection: null
+module.exports.ThangTypeNode = ThangTypeNode = class ThangTypeNode extends TreemaNode.nodeMap.string
+  valueClass: 'treema-thang-type'
+  @thangTypesCollection: null  # Lives in ThangTypeNode parent class
+  @thangTypes: null  # Lives in ThangTypeNode or subclasses
 
   constructor: ->
     super(arguments...)
-    @getItems() 
-    unless ItemThangTypeNode.itemsCollection.loaded
-      ItemThangTypeNode.itemsCollection.once('sync', @refreshDisplay, @)
-     
+    @getThangTypes()
+    unless ThangTypeNode.thangTypesCollection.loaded
+      ThangTypeNode.thangTypesCollection.once('sync', @refreshDisplay, @)
+
   buildValueForDisplay: (valEl, data) ->
-    @buildValueForDisplaySimply(valEl, @getCurrentItem() or '')
+    @buildValueForDisplaySimply(valEl, @getCurrentThangType() or '')
     valEl
-    
+
   buildValueForEditing: (valEl, data) ->
     super(valEl, data)
-    if ItemThangTypeNode.items
-      source = (item.name for item in ItemThangTypeNode.items when @keyForParent in item.slots)
-      input = valEl.find('input').autocomplete(source: source, minLength: 0, delay: 0, autoFocus: true)
-    input.val(@getCurrentItem() or '')
+    input = valEl.find 'input'
+    if @constructor.thangTypes
+      source = (thangType.name for thangType in @constructor.thangTypes when @filterThangType thangType)
+      input.autocomplete(source: source, minLength: 0, delay: 0, autoFocus: true)
+    input.val(@getCurrentThangType() or '')
     valEl
-    
-  getCurrentItem: ->
-    window.itemData = @getData()
-    window.items = ItemThangTypeNode.items
-    return null unless ItemThangTypeNode.items
-    original = @getData()
-    return null unless original
-    item = _.find ItemThangTypeNode.items, { original: original }
-    item?.name or '...'
-    
-  getItems: ->
-    return if ItemThangTypeNode.itemsCollection
-    ItemThangTypeNode.itemsCollection = new CocoCollection([], {
+
+  filterThangType: (thangType) -> true
+
+  getCurrentThangType: ->
+    return null unless @constructor.thangTypes
+    return null unless original = @getData()
+    thangType = _.find @constructor.thangTypes, { original: original }
+    thangType?.name or '...'
+
+  getThangTypes: ->
+    return if ThangTypeNode.thangTypesCollection
+    ThangTypeNode.thangTypesCollection = new CocoCollection([], {
       url: '/db/thang.type'
       project:['name', 'components', 'original']
       model: ThangType
     })
-    res = ItemThangTypeNode.itemsCollection.fetch()
-    ItemThangTypeNode.itemsCollection.once 'sync', => @processItems(ItemThangTypeNode.itemsCollection)
-    
-  processItems: (itemCollection) ->
-    ItemThangTypeNode.items = []
-    for itemThang in itemCollection.models
-      itemComponent = _.find itemThang.get('components'), {original: LevelComponent.ItemID}
-      continue unless itemComponent
-      slots = itemComponent.config?.slots
-      continue unless slots?.length
-      ItemThangTypeNode.items.push {
-        name: itemThang.get('name')
-        original: itemThang.get('original')
-        slots: slots
-      }
+    res = ThangTypeNode.thangTypesCollection.fetch()
+    ThangTypeNode.thangTypesCollection.once 'sync', => @processThangTypes(ThangTypeNode.thangTypesCollection)
+
+  processThangTypes: (thangTypeCollection) ->
+    @constructor.thangTypes = []
+    @processThangType thangType for thangType in thangTypeCollection.models
+
+  processThangType: (thangType) ->
+    @constructor.thangTypes.push name: thangType.get('name'), original: thangType.get('original')
 
   saveChanges: ->
     thangTypeName = @$el.find('input').val()
-    item = _.find(ItemThangTypeNode.items, {name: thangTypeName})
-    return @remove() unless item
-    @data = item.original
\ No newline at end of file
+    thangType = _.find(@constructor.thangTypes, {name: thangTypeName})
+    return @remove() unless thangType
+    @data = thangType.original
+
+module.exports.ItemThangTypeNode = ItemThangTypeNode = class ItemThangTypeNode extends ThangTypeNode
+  valueClass: 'treema-item-thang-type'
+
+  filterThangType: (thangType) ->
+    @keyForParent in thangType.slots
+
+  processThangType: (thangType) ->
+    return unless itemComponent = _.find thangType.get('components'), {original: LevelComponent.ItemID}
+    return unless itemComponent.config?.slots?.length
+    @constructor.thangTypes.push name: thangType.get('name'), original: thangType.get('original'), slots: itemComponent.config.slots
diff --git a/app/views/modal/AuthModal.coffee b/app/views/modal/AuthModal.coffee
index 67abf2537..251a45a8a 100644
--- a/app/views/modal/AuthModal.coffee
+++ b/app/views/modal/AuthModal.coffee
@@ -75,7 +75,7 @@ module.exports = class AuthModal extends ModalView
     userObject.name = @suggestedName if @suggestedName
     for key, val of me.attributes when key in ['preferredLanguage', 'testGroupNumber', 'dateCreated', 'wizardColor1', 'name', 'music', 'volume', 'emails']
       userObject[key] ?= val
-    subscribe = @$el.find('#signup-subscribe').prop('checked')
+    subscribe = @$el.find('#subscribe').prop('checked')
     userObject.emails ?= {}
     userObject.emails.generalNews ?= {}
     userObject.emails.generalNews.enabled = subscribe
diff --git a/app/views/modal/EmployerSignupModal.coffee b/app/views/modal/EmployerSignupModal.coffee
index 2c5306356..ab13e309b 100644
--- a/app/views/modal/EmployerSignupModal.coffee
+++ b/app/views/modal/EmployerSignupModal.coffee
@@ -57,7 +57,7 @@ module.exports = class EmployerSignupModal extends ModalView
   getRenderData: ->
     context = super()
     context.userIsAuthorized = @authorizedWithLinkedIn
-    context.userHasSignedContract = 'employer' in me.get('permissions')
+    context.userHasSignedContract = 'employer' in me.get('permissions', true)
     context.userIsAnonymous = context.me.get('anonymous')
     context.sentMoreInfoEmail = @sentMoreInfoEmail
     context
diff --git a/app/views/play/level/tome/Spell.coffee b/app/views/play/level/tome/Spell.coffee
index 5d56e131d..cfde25fe7 100644
--- a/app/views/play/level/tome/Spell.coffee
+++ b/app/views/play/level/tome/Spell.coffee
@@ -159,5 +159,5 @@ module.exports = class Spell
     return true if @spectateView  # Use transpiled code for both teams if we're just spectating.
     return true if @isEnemySpell()  # Use transpiled for enemy spells.
     # Players without permissions can't view the raw code.
-    return true if @session.get('creator') isnt me.id and not (me.isAdmin() or 'employer' in me.get('permissions'))
+    return true if @session.get('creator') isnt me.id and not (me.isAdmin() or 'employer' in me.get('permissions', true))
     false
diff --git a/app/views/user/JobProfileView.coffee b/app/views/user/JobProfileView.coffee
index 8a176782e..9edc938fd 100644
--- a/app/views/user/JobProfileView.coffee
+++ b/app/views/user/JobProfileView.coffee
@@ -72,7 +72,7 @@ module.exports = class JobProfileView extends UserView
   finishInit: ->
     return unless @userID
     @uploadFilePath = "db/user/#{@userID}"
-    
+
     if @user?.get('firstName')
       jobProfile = @user.get('jobProfile')
       jobProfile ?= {}
@@ -81,7 +81,7 @@ module.exports = class JobProfileView extends UserView
         @user.set('jobProfile', jobProfile)
 
     @highlightedContainers = []
-    if me.isAdmin() or 'employer' in me.get('permissions')
+    if me.isAdmin() or 'employer' in me.get('permissions', true)
       $.post "/db/user/#{me.id}/track/view_candidate"
       $.post "/db/user/#{@userID}/track/viewed_by_employer" unless me.isAdmin()
     @sessions = @supermodel.loadCollection(new LevelSessionsCollection(@userID), 'candidate_sessions').model
@@ -235,7 +235,7 @@ module.exports = class JobProfileView extends UserView
     context.rawProfile = @user.get('jobProfile') or {}
     context.user = @user
     context.myProfile = @isMe()
-    context.allowedToViewJobProfile = @user and (me.isAdmin() or 'employer' in me.get('permissions') or (context.myProfile && !me.get('anonymous')))
+    context.allowedToViewJobProfile = @user and (me.isAdmin() or 'employer' in me.get('permissions', true) or (context.myProfile && !me.get('anonymous')))
     context.allowedToEditJobProfile = @user and (me.isAdmin() or (context.myProfile && !me.get('anonymous')))
     context.profileApproved = @user?.get 'jobProfileApproved'
     context.progress = @progress ? @updateProgress()
@@ -589,4 +589,4 @@ module.exports = class JobProfileView extends UserView
 
   destroy: ->
     @remarkTreema?.destroy()
-    super()
\ No newline at end of file
+    super()
diff --git a/server/users/user_handler.coffee b/server/users/user_handler.coffee
index f3d40b649..40eed11ea 100644
--- a/server/users/user_handler.coffee
+++ b/server/users/user_handler.coffee
@@ -224,7 +224,7 @@ UserHandler = class UserHandler extends Handler
       res.end()
 
   getLevelSessionsForEmployer: (req, res, userID) ->
-    return @sendUnauthorizedError(res) unless req.user._id+'' is userID or req.user.isAdmin() or ('employer' in req.user.get('permissions'))
+    return @sendUnauthorizedError(res) unless req.user._id+'' is userID or req.user.isAdmin() or ('employer' in (req.user.get('permissions') ? []))
     query = creator: userID, levelID: {$in: ['gridmancer', 'greed', 'dungeon-arena', 'brawlwood', 'gold-rush']}
     projection = 'levelName levelID team playtime codeLanguage submitted code totalScore teamSpells level'
     LevelSession.find(query).select(projection).exec (err, documents) =>
@@ -280,7 +280,7 @@ UserHandler = class UserHandler extends Handler
     return @sendMethodNotAllowed res unless req.method is 'POST'
     isMe = userID is req.user._id + ''
     isAuthorized = isMe or req.user.isAdmin()
-    isAuthorized ||= ('employer' in req.user.get('permissions')) and (activityName in ['viewed_by_employer', 'contacted_by_employer'])
+    isAuthorized ||= ('employer' in (req.user.get('permissions') ? [])) and (activityName in ['viewed_by_employer', 'contacted_by_employer'])
     return @sendUnauthorizedError res unless isAuthorized
     updateUser = (user) =>
       activity = user.trackActivity activityName, increment
@@ -303,7 +303,7 @@ UserHandler = class UserHandler extends Handler
     if not profileData.id or not profileData.positions or not profileData.emailAddress or not profileData.firstName or not profileData.lastName
       return errors.badInput(res, 'You need to have a more complete profile to sign up for this service.')
     @modelClass.findById(req.user.id).exec (err, user) =>
-      if user.get('employerAt') or user.get('signedEmployerAgreement') or 'employer' in user.get('permissions')
+      if user.get('employerAt') or user.get('signedEmployerAgreement') or 'employer' in (user.get('permissions') ? [])
         return errors.conflict(res, 'You already have signed the agreement!')
       #TODO: Search for the current position
       employerAt = _.filter(profileData.positions.values, 'isCurrent')[0]?.company.name ? 'Not available'
@@ -322,7 +322,7 @@ UserHandler = class UserHandler extends Handler
         res.end()
 
   getCandidates: (req, res) ->
-    authorized = req.user.isAdmin() or ('employer' in req.user.get('permissions'))
+    authorized = req.user.isAdmin() or ('employer' in (req.user.get('permissions') ? []))
     months = if req.user.isAdmin() then 12 else 2
     since = (new Date((new Date()) - months * 30.4 * 86400 * 1000)).toISOString()
     query = {'jobProfile.updated': {$gt: since}}