diff --git a/app/locale/en.coffee b/app/locale/en.coffee
index 601878898..5443f00f6 100644
--- a/app/locale/en.coffee
+++ b/app/locale/en.coffee
@@ -606,6 +606,7 @@
     me_tab: "Me"
     picture_tab: "Picture"
     upload_picture: "Upload a picture"
+    god_mode: "God Mode"
     password_tab: "Password"
     emails_tab: "Emails"
     admin: "Admin"
diff --git a/app/models/User.coffee b/app/models/User.coffee
index be8243069..2d82c159c 100644
--- a/app/models/User.coffee
+++ b/app/models/User.coffee
@@ -12,6 +12,7 @@ module.exports = class User extends CocoModel
   notyErrors: false
 
   isAdmin: -> 'admin' in @get('permissions', true)
+  isInGodMode: -> 'godmode' in @get('permissions', true)
   isAnonymous: -> @get('anonymous', true)
   displayName: -> @get('name', true)
 
@@ -72,13 +73,16 @@ module.exports = class User extends CocoModel
       return level if tierThreshold >= tier
 
   level: ->
-    User.levelFromExp(@get('points'))
+    totalPoint = @get('points')
+    totalPoint = totalPoint + 1000000 if me.isInGodMode()
+    User.levelFromExp(totalPoint)
 
   tier: ->
     User.tierFromLevel @level()
 
   gems: ->
     gemsEarned = @get('earned')?.gems ? 0
+    gemsEarned = gemsEarned + 100000 if me.isInGodMode()
     gemsPurchased = @get('purchased')?.gems ? 0
     gemsSpent = @get('spent') ? 0
     Math.floor gemsEarned + gemsPurchased - gemsSpent
@@ -89,7 +93,7 @@ module.exports = class User extends CocoModel
     heroes
   items: -> (me.get('earned')?.items ? []).concat(me.get('purchased')?.items ? []).concat([ThangType.items['simple-boots']])
   levels: -> (me.get('earned')?.levels ? []).concat(me.get('purchased')?.levels ? []).concat(Level.levels['dungeons-of-kithgard'])
-  ownsHero: (heroOriginal) -> heroOriginal in @heroes()
+  ownsHero: (heroOriginal) -> me.isInGodMode() || heroOriginal in @heroes()
   ownsItem: (itemOriginal) -> itemOriginal in @items()
   ownsLevel: (levelOriginal) -> levelOriginal in @levels()
 
@@ -166,6 +170,7 @@ module.exports = class User extends CocoModel
     return me.get('testGroupNumber') % numVideos
 
   isPremium: ->
+    return true if me.isInGodMode()
     return false unless stripe = @get('stripe')
     return true if stripe.subscriptionID
     return true if stripe.free is true
diff --git a/app/templates/account/account-settings-view.jade b/app/templates/account/account-settings-view.jade
index 00db82515..c53405651 100644
--- a/app/templates/account/account-settings-view.jade
+++ b/app/templates/account/account-settings-view.jade
@@ -12,6 +12,7 @@ else
             - var name = me.get('name') || '';
             - var email = me.get('email');
             - var admin = me.get('permissions', true).indexOf('admin') != -1;
+            - var godmode = me.get('permissions', true).indexOf('godmode') != -1;
             .form-group
               label.control-label(for="name", data-i18n="general.name") Name
               input#name.form-control(name="name", type="text", value="#{name}")
@@ -22,7 +23,10 @@ else
               .form-group.checkbox
                 label(for="admin", data-i18n="account_settings.admin") Admin
                 input#admin(name="admin", type="checkbox", checked=admin)
-            
+              .form-group.checkbox
+                label(for="godmode", data-i18n="account_settings.god_mode") God Mode
+                input#godmode(name="godmode", type="checkbox", checked=godmode)
+                
     
       .panel.panel-default
         .panel-heading
diff --git a/app/templates/play/campaign-view.jade b/app/templates/play/campaign-view.jade
index dd1688bef..2ed824e18 100644
--- a/app/templates/play/campaign-view.jade
+++ b/app/templates/play/campaign-view.jade
@@ -56,7 +56,8 @@ else
     .portals
       for campaignSlug in ['dungeon', 'forest', 'desert', 'mountain', 'ice', 'volcano']
         - var campaign = campaigns[campaignSlug];
-        div(class="campaign #{campaignSlug}" + (campaign ? "" : " silhouette") + (campaign && campaign.locked ? " locked" : ""), data-campaign-slug=campaignSlug)
+        - var godmode = me.get('permissions', true).indexOf('godmode') != -1;
+        div(class="campaign #{campaignSlug}" + (campaign ? "" : " silhouette") + (campaign && campaign.locked && !godmode ? " locked" : ""), data-campaign-slug=campaignSlug)
           .campaign-label
             h2.campaign-name
               if campaign
@@ -68,7 +69,7 @@ else
                 span= campaign.levelsCompleted
                 | /
                 span= campaign.levelsTotal
-            if campaign && campaign.locked
+            if campaign && campaign.locked && !godmode
               h3.campaign-locked(data-i18n="play.locked") Locked
             else if campaign
               btn(data-i18n="common.play").btn.btn-illustrated.btn-lg.btn-success.play-button
diff --git a/app/views/account/AccountSettingsView.coffee b/app/views/account/AccountSettingsView.coffee
index b24dcac2d..48d913813 100644
--- a/app/views/account/AccountSettingsView.coffee
+++ b/app/views/account/AccountSettingsView.coffee
@@ -158,8 +158,15 @@ module.exports = class AccountSettingsView extends CocoView
 
     me.set('photoURL', @$el.find('#photoURL').val())
 
+    permissions = []
+
     adminCheckbox = @$el.find('#admin')
     if adminCheckbox.length
-      permissions = []
       permissions.push 'admin' if adminCheckbox.prop('checked')
-      me.set('permissions', permissions)
+
+    godmodeCheckbox = @$el.find('#godmode')
+    if godmodeCheckbox.length
+      permissions.push 'godmode' if godmodeCheckbox.prop('checked')
+
+    me.set('permissions', permissions)
+
diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee
index 22dcdc05d..aa2dd4c9b 100644
--- a/app/views/play/CampaignView.coffee
+++ b/app/views/play/CampaignView.coffee
@@ -252,7 +252,9 @@ module.exports = class CampaignView extends RootView
     level.locked = false if @levelStatusMap[level.slug] in ['started', 'complete']
     level.locked = false if @editorMode
     level.locked = false if @campaign?.get('name') is 'Auditions'
+    level.locked = false if me.isInGodMode()
     level.disabled = true if level.adminOnly and @levelStatusMap[level.slug] not in ['started', 'complete']
+    level.disabled = false if me.isInGodMode()
     level.color = 'rgb(255, 80, 60)'
     if level.requiresSubscription
       level.color = 'rgb(80, 130, 200)'
diff --git a/server/users/User.coffee b/server/users/User.coffee
index 65ead42e4..81c11a18b 100644
--- a/server/users/User.coffee
+++ b/server/users/User.coffee
@@ -34,6 +34,10 @@ UserSchema.post('init', ->
   @set('anonymous', false) if @get('email')
 )
 
+UserSchema.methods.isInGodMode = ->
+  p = @get('permissions')
+  return p and 'godmode' in p
+
 UserSchema.methods.isAdmin = ->
   p = @get('permissions')
   return p and 'admin' in p
@@ -77,6 +81,7 @@ UserSchema.methods.setEmailSubscription = (newName, enabled) ->
 
 UserSchema.methods.gems = ->
   gemsEarned = @get('earned')?.gems ? 0
+  gemsEarned = gemsEarned + 100000 if @isInGodMode()
   gemsPurchased = @get('purchased')?.gems ? 0
   gemsSpent = @get('spent') ? 0
   gemsEarned + gemsPurchased - gemsSpent
@@ -194,6 +199,7 @@ UserSchema.methods.register = (done) ->
   @saveActiveUser 'register'
 
 UserSchema.methods.isPremium = ->
+  return true if @isInGodMode()
   return false unless stripeObject = @get('stripe')
   return true if stripeObject.subscriptionID
   return true if stripeObject.free is true