diff --git a/app/assets/javascripts/admin/models/site_setting.js b/app/assets/javascripts/admin/models/site_setting.js
index 7026043ab..155871f72 100644
--- a/app/assets/javascripts/admin/models/site_setting.js
+++ b/app/assets/javascripts/admin/models/site_setting.js
@@ -8,7 +8,7 @@
     @namespace Discourse
     @module Discourse
   **/ 
-  window.Discourse.SiteSetting = Discourse.Model.extend(Discourse.Presence, {
+  window.Discourse.SiteSetting = Discourse.Model.extend({
     
     // Whether a property is short.
     short: (function() {
diff --git a/app/assets/javascripts/admin/routes/admin_user_route.js b/app/assets/javascripts/admin/routes/admin_user_route.js
index a0c2295ca..1e67210d8 100644
--- a/app/assets/javascripts/admin/routes/admin_user_route.js
+++ b/app/assets/javascripts/admin/routes/admin_user_route.js
@@ -1,7 +1,7 @@
 (function() {
 
   /**
-    Handles routes related to users.
+    Handles routes related to users in the admin section.
 
     @class AdminUserRoute    
     @extends Discourse.Route
diff --git a/app/assets/javascripts/admin/views/ace_editor_view.js b/app/assets/javascripts/admin/views/ace_editor_view.js
index f928c7365..f31c19d57 100644
--- a/app/assets/javascripts/admin/views/ace_editor_view.js
+++ b/app/assets/javascripts/admin/views/ace_editor_view.js
@@ -5,11 +5,11 @@
     A view that wraps the ACE editor (http://ace.ajax.org/)
 
     @class AceEditorView    
-    @extends Discourse.View
+    @extends Em.View
     @namespace Discourse
     @module Discourse
   **/ 
-  Discourse.AceEditorView = window.Discourse.View.extend({
+  Discourse.AceEditorView = Discourse.View.extend({
     mode: 'css',
     classNames: ['ace-wrapper'],
 
diff --git a/app/assets/javascripts/admin/views/admin_customize_view.js b/app/assets/javascripts/admin/views/admin_customize_view.js
index 895b0aa89..1ab5532b5 100644
--- a/app/assets/javascripts/admin/views/admin_customize_view.js
+++ b/app/assets/javascripts/admin/views/admin_customize_view.js
@@ -5,11 +5,11 @@
     A view to handle site customizations
 
     @class AdminCustomizeView    
-    @extends Discourse.View
+    @extends Em.View
     @namespace Discourse
     @module Discourse
   **/ 
-  Discourse.AdminCustomizeView = window.Discourse.View.extend({
+  Discourse.AdminCustomizeView = Discourse.View.extend({
     templateName: 'admin/templates/customize',
     classNames: ['customize'],
 
diff --git a/app/assets/javascripts/admin/views/admin_dashboard_view.js b/app/assets/javascripts/admin/views/admin_dashboard_view.js
index 55cbbbc88..48c352cbe 100644
--- a/app/assets/javascripts/admin/views/admin_dashboard_view.js
+++ b/app/assets/javascripts/admin/views/admin_dashboard_view.js
@@ -4,11 +4,11 @@
     The default view in the admin section
 
     @class AdminDashboardView
-    @extends Discourse.View
+    @extends Em.View
     @namespace Discourse
     @module Discourse
   **/
-  Discourse.AdminDashboardView = window.Discourse.View.extend({
+  Discourse.AdminDashboardView = Discourse.View.extend({
     templateName: 'admin/templates/dashboard',
 
     updateIconClasses: function() {
diff --git a/app/assets/javascripts/application.js.erb b/app/assets/javascripts/application.js.erb
index 0efcaf0b0..ad5d61fa5 100644
--- a/app/assets/javascripts/application.js.erb
+++ b/app/assets/javascripts/application.js.erb
@@ -28,8 +28,8 @@
 
 // Stuff we need to load first
 //= require_tree ./discourse/mixins
-//= require ./discourse/components/debounce
 //= require ./discourse/views/view
+//= require ./discourse/components/debounce
 //= require ./discourse/controllers/controller
 //= require ./discourse/views/modal/modal_body_view
 //= require ./discourse/models/model
diff --git a/app/assets/javascripts/discourse/helpers/i18n_helpers.js b/app/assets/javascripts/discourse/helpers/i18n_helpers.js
index 6bb8856d1..1b63efeba 100644
--- a/app/assets/javascripts/discourse/helpers/i18n_helpers.js
+++ b/app/assets/javascripts/discourse/helpers/i18n_helpers.js
@@ -27,7 +27,7 @@
 
   Ember.Handlebars.registerHelper('countI18n', function(key, options) {
     var view;
-    view = Em.View.extend({
+    view = Discourse.View.extend({
       tagName: 'span',
       render: function(buffer) {
         return buffer.push(Ember.String.i18n(key, {
diff --git a/app/assets/javascripts/discourse/mixins/presence.js b/app/assets/javascripts/discourse/mixins/presence.js
index 3857e6e6e..f810095f6 100644
--- a/app/assets/javascripts/discourse/mixins/presence.js
+++ b/app/assets/javascripts/discourse/mixins/presence.js
@@ -1,15 +1,29 @@
 (function() {
 
-  window.Discourse.Presence = Em.Mixin.create({
-    /* Is a property blank?
-    */
+  /**
+    This mixin provides `blank` and `present` to determine whether properties are 
+    there, accounting for more cases than just null and undefined.
 
+    @class Discourse.Presence    
+    @extends Ember.Mixin
+    @namespace Discourse
+    @module Discourse
+  **/ 
+  window.Discourse.Presence = Em.Mixin.create({
+
+    /**
+      Returns whether a property is blank. It considers empty arrays, string, objects, undefined and null
+      to be blank, otherwise true.
+
+      @method blank
+      @param {String} name the name of the property we want to check
+      @return {Boolean}
+    */
     blank: function(name) {
       var prop;
       prop = this.get(name);
-      if (!prop) {
-        return true;
-      }
+      if (!prop) return true;
+
       switch (typeof prop) {
         case "string":
           return prop.trim().isBlank();
@@ -18,6 +32,14 @@
       }
       return false;
     },
+
+    /**
+      Returns whether a property is present. A present property is the opposite of a `blank` one.
+
+      @method present
+      @param {String} name the name of the property we want to check
+      @return {Boolean}
+    */
     present: function(name) {
       return !this.blank(name);
     }
diff --git a/app/assets/javascripts/discourse/models/action_summary.js b/app/assets/javascripts/discourse/models/action_summary.js
index c3e7caf81..655498cd6 100644
--- a/app/assets/javascripts/discourse/models/action_summary.js
+++ b/app/assets/javascripts/discourse/models/action_summary.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.ActionSummary = Em.Object.extend(Discourse.Presence, {
+  window.Discourse.ActionSummary = Discourse.Model.extend({
     /* Description for the action
     */
 
diff --git a/app/assets/javascripts/discourse/models/invite_list.js b/app/assets/javascripts/discourse/models/invite_list.js
index 50e70e820..1ea19fca5 100644
--- a/app/assets/javascripts/discourse/models/invite_list.js
+++ b/app/assets/javascripts/discourse/models/invite_list.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.InviteList = Discourse.Model.extend(Discourse.Presence, {
+  window.Discourse.InviteList = Discourse.Model.extend({
     empty: (function() {
       return this.blank('pending') && this.blank('redeemed');
     }).property('pending.@each', 'redeemed.@each')
diff --git a/app/assets/javascripts/discourse/models/model.js b/app/assets/javascripts/discourse/models/model.js
index acb3d3373..9e5d4fb0c 100644
--- a/app/assets/javascripts/discourse/models/model.js
+++ b/app/assets/javascripts/discourse/models/model.js
@@ -1,30 +1,42 @@
 (function() {
 
-  window.Discourse.Model = Ember.Object.extend({
-    /* Our own AJAX handler that handles erronous responses
-    */
+  /**
+    A base object we can use to handle models in the Discourse client application.
 
+    @class Model    
+    @extends Ember.Object
+    @uses Discourse.Presence
+    @namespace Discourse
+    @module Discourse
+  **/
+  window.Discourse.Model = Ember.Object.extend(Discourse.Presence, {
+
+    /** 
+      Our own AJAX handler that handles erronous responses
+
+      @method ajax
+      @param {String} url The url to contact
+      @param {Object} args The arguments to pass to jQuery.ajax
+    **/
     ajax: function(url, args) {
-      /* Error handler
-      */
-
-      var oldError,
-        _this = this;
-      oldError = args.error;
+      var oldError = args.error;
       args.error = function(xhr) {
         return oldError(jQuery.parseJSON(xhr.responseText).errors);
       };
       return jQuery.ajax(url, args);
     },
-    /* Update our object from another object
-    */
 
+    /**
+      Update our object from another object
+
+      @method mergeAttributes
+      @param {Object} attrs The attributes we want to merge with
+      @param {Object} builders Optional builders to use when merging attributes
+    **/
     mergeAttributes: function(attrs, builders) {
       var _this = this;
       return Object.keys(attrs, function(k, v) {
-        /* If they're in a builder we use that
-        */
-
+        // If they're in a builder we use that
         var builder, col;
         if (typeof v === 'object' && builders && (builder = builders[k])) {
           if (!_this.get(k)) {
@@ -42,9 +54,14 @@
   });
 
   window.Discourse.Model.reopenClass({
-    /* Given an array of values, return them in a hash
-    */
 
+    /**
+      Given an array of values, return them in a hash
+
+      @method extractByKey
+      @param {Object} collection The collection of values
+      @param {Object} klass Optional The class to instantiate
+    **/
     extractByKey: function(collection, klass) {
       var retval;
       retval = {};
diff --git a/app/assets/javascripts/discourse/models/nav_item.js b/app/assets/javascripts/discourse/models/nav_item.js
index de5b8a9af..ee3e9230d 100644
--- a/app/assets/javascripts/discourse/models/nav_item.js
+++ b/app/assets/javascripts/discourse/models/nav_item.js
@@ -10,7 +10,7 @@
 
   validAnon = ['popular', 'category', 'categories'];
 
-  window.Discourse.NavItem = Em.Object.extend({
+  window.Discourse.NavItem = Discourse.Model.extend({
     categoryName: (function() {
       var split;
       split = this.get('name').split('/');
diff --git a/app/assets/javascripts/discourse/models/notification.js b/app/assets/javascripts/discourse/models/notification.js
index fb2fcbc0f..cb0b731f8 100644
--- a/app/assets/javascripts/discourse/models/notification.js
+++ b/app/assets/javascripts/discourse/models/notification.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.Notification = Discourse.Model.extend(Discourse.Presence, {
+  window.Discourse.Notification = Discourse.Model.extend({
     readClass: (function() {
       if (this.read) {
         return 'read';
diff --git a/app/assets/javascripts/discourse/models/post.js b/app/assets/javascripts/discourse/models/post.js
index 65f9d7a34..8c4a58176 100644
--- a/app/assets/javascripts/discourse/models/post.js
+++ b/app/assets/javascripts/discourse/models/post.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.Post = Ember.Object.extend(Discourse.Presence, {
+  window.Discourse.Post = Discourse.Model.extend({
     /* Url to this post
     */
 
diff --git a/app/assets/javascripts/discourse/models/post_action_type.js b/app/assets/javascripts/discourse/models/post_action_type.js
index b54203e8c..eece4210b 100644
--- a/app/assets/javascripts/discourse/models/post_action_type.js
+++ b/app/assets/javascripts/discourse/models/post_action_type.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.PostActionType = Em.Object.extend({
+  window.Discourse.PostActionType = Discourse.Model.extend({
     alsoName: (function() {
       if (this.get('is_flag')) {
         return Em.String.i18n('post.actions.flag');
diff --git a/app/assets/javascripts/discourse/models/site.js b/app/assets/javascripts/discourse/models/site.js
index 3d48484ca..ec5f1cf7d 100644
--- a/app/assets/javascripts/discourse/models/site.js
+++ b/app/assets/javascripts/discourse/models/site.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.Site = Ember.Object.extend({
+  window.Discourse.Site = Discourse.Model.extend({
     notificationLookup: (function() {
       var result;
       result = [];
diff --git a/app/assets/javascripts/discourse/models/topic.js b/app/assets/javascripts/discourse/models/topic.js
index 3dc309f5a..41fed72d0 100644
--- a/app/assets/javascripts/discourse/models/topic.js
+++ b/app/assets/javascripts/discourse/models/topic.js
@@ -1,6 +1,6 @@
 (function() {
 
-  Discourse.Topic = Discourse.Model.extend(Discourse.Presence, {
+  Discourse.Topic = Discourse.Model.extend({
     categoriesBinding: 'Discourse.site.categories',
     fewParticipants: (function() {
       if (!this.present('participants')) {
diff --git a/app/assets/javascripts/discourse/models/user.js b/app/assets/javascripts/discourse/models/user.js
index 51925e06f..320c1395f 100644
--- a/app/assets/javascripts/discourse/models/user.js
+++ b/app/assets/javascripts/discourse/models/user.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.User = Discourse.Model.extend(Discourse.Presence, {
+  window.Discourse.User = Discourse.Model.extend({
     avatarLarge: (function() {
       return Discourse.Utilities.avatarUrl(this.get('username'), 'large', this.get('avatar_template'));
     }).property('username'),
diff --git a/app/assets/javascripts/discourse/routes/application_routes.js b/app/assets/javascripts/discourse/routes/application_routes.js
index 8751b1953..7e8d33a1b 100644
--- a/app/assets/javascripts/discourse/routes/application_routes.js
+++ b/app/assets/javascripts/discourse/routes/application_routes.js
@@ -1,93 +1,49 @@
-
-/* Ways we can filter the topics list
-*/
-
-
 (function() {
 
   Discourse.buildRoutes(function() {
-    var router;
-    this.resource('topic', {
-      path: '/t/:slug/:id'
-    }, function() {
-      this.route('fromParams', {
-        path: '/'
-      });
-      this.route('fromParams', {
-        path: '/:nearPost'
-      });
-      return this.route('bestOf', {
-        path: '/best_of'
-      });
-    });
-    /* Generate static page routes
-    */
+    var router = this;
 
-    router = this;
+    // Topic routes
+    this.resource('topic', { path: '/t/:slug/:id' }, function() {
+      this.route('fromParams', { path: '/' });
+      this.route('fromParams', { path: '/:nearPost' });
+      this.route('bestOf', { path: '/best_of' });
+    });
+
+    // Generate static page routes
     Discourse.StaticController.pages.forEach(function(p) {
-      return router.route(p, {
-        path: "/" + p
-      });
+      router.route(p, { path: "/" + p });
     });
-    this.route('faq', {
-      path: '/faq'
-    });
-    this.route('tos', {
-      path: '/tos'
-    });
-    this.route('privacy', {
-      path: '/privacy'
-    });
-    this.resource('list', {
-      path: '/'
-    }, function() {
-      router = this;
-      /* Generate routes for all our filters
-      */
 
+    this.route('faq', { path: '/faq' });
+    this.route('tos', { path: '/tos' });
+    this.route('privacy', { path: '/privacy' });
+
+    // List routes
+    this.resource('list', { path: '/' }, function() {
+      router = this;
+
+      // Generate routes for all our filters
       Discourse.ListController.filters.forEach(function(r) {
-        router.route(r, {
-          path: "/" + r
-        });
-        return router.route(r, {
-          path: "/" + r + "/more"
-        });
-      });
-      router.route('popular', {
-        path: '/'
-      });
-      router.route('categories', {
-        path: '/categories'
-      });
-      router.route('category', {
-        path: '/category/:slug/more'
-      });
-      return router.route('category', {
-        path: '/category/:slug'
+        router.route(r, { path: "/" + r });
+        router.route(r, { path: "/" + r + "/more" });
       });
+
+      this.route('popular', { path: '/' });
+      this.route('categories', { path: '/categories' });
+      this.route('category', { path: '/category/:slug/more' });
+      this.route('category', { path: '/category/:slug' });
     });
-    return this.resource('user', {
-      path: '/users/:username'
-    }, function() {
-      this.route('activity', {
-        path: '/'
-      });
-      this.resource('preferences', {
-        path: '/preferences'
-      }, function() {
-        this.route('username', {
-          path: '/username'
-        });
-        return this.route('email', {
-          path: '/email'
-        });
-      });
-      this.route('privateMessages', {
-        path: '/private-messages'
-      });
-      return this.route('invited', {
-        path: 'invited'
+
+    // User routes
+    this.resource('user', { path: '/users/:username' }, function() {
+      this.route('activity', { path: '/' });
+      this.resource('preferences', { path: '/preferences' }, function() {
+        this.route('username', { path: '/username' });
+        this.route('email', { path: '/email' });
       });
+      this.route('privateMessages', { path: '/private-messages' });
+      this.route('invited', { path: 'invited' });
     });
   });
 
diff --git a/app/assets/javascripts/discourse/routes/discourse_route.js b/app/assets/javascripts/discourse/routes/discourse_route.js
index 9609d20bd..48246bfa6 100644
--- a/app/assets/javascripts/discourse/routes/discourse_route.js
+++ b/app/assets/javascripts/discourse/routes/discourse_route.js
@@ -1,49 +1,31 @@
 (function() {
 
-  window.Discourse.Route = Em.Route.extend({
-    /* Called every time we enter a route
-    */
+  /**
+    The base admin route for all routes on Discourse. Includes global enter functionality.
 
+    @class Route    
+    @extends Em.Route
+    @namespace Discourse
+    @module Discourse
+  **/
+  Discourse.Route = Em.Route.extend({
+
+    /** 
+      Called every time we enter a route on Discourse.
+
+      @method enter
+    **/
     enter: function(router, context) {
-      /* Close mini profiler
-      */
-
-      var composerController, f, search, shareController;
+      // Close mini profiler
       jQuery('.profiler-results .profiler-result').remove();
-      /* Close stuff that may be open
-      */
 
+      // Close some elements that may be open
       jQuery('.d-dropdown').hide();
       jQuery('header ul.icons li').removeClass('active');
       jQuery('[data-toggle="dropdown"]').parent().removeClass('open');
-      /* TODO: need to adjust these
-      */
-
-      if (false) {
-        if (shareController = router.get('shareController')) {
-          shareController.close();
-        }
-        /* Hide any searches
-        */
-
-        if (search = router.get('searchController')) {
-          search.close();
-        }
-        /* get rid of "save as draft stuff"
-        */
-
-        composerController = Discourse.get('router.composerController');
-        if (composerController) {
-          composerController.closeIfCollapsed();
-        }
-      }
-      f = jQuery('html').data('hide-dropdown');
-      if (f) {
-        return f();
-      }
-      /*return @_super(router, context)
-      */
 
+      var hideDropDownFunction = jQuery('html').data('hide-dropdown');
+      if (hideDropDownFunction) return hideDropDownFunction();
     }
   });
 
diff --git a/app/assets/javascripts/discourse/routes/user_route.js b/app/assets/javascripts/discourse/routes/user_route.js
index 8f1c37a03..698313874 100644
--- a/app/assets/javascripts/discourse/routes/user_route.js
+++ b/app/assets/javascripts/discourse/routes/user_route.js
@@ -1,13 +1,20 @@
 (function() {
 
-  window.Discourse.UserRoute = Discourse.Route.extend({
+  /**
+    Handles routes related to users.
+
+    @class UserRoute    
+    @extends Discourse.Route
+    @namespace Discourse
+    @module Discourse
+  **/
+  Discourse.UserRoute = Discourse.Route.extend({
     model: function(params) {
       return Discourse.User.find(params.username);
     },
+
     serialize: function(params) {
-      return {
-        username: Em.get(params, 'username').toLowerCase()
-      };
+      return { username: Em.get(params, 'username').toLowerCase() };
     }
   });
 
diff --git a/app/assets/javascripts/discourse/views/actions_history_view.js b/app/assets/javascripts/discourse/views/actions_history_view.js
index 768771eee..76d7c94c2 100644
--- a/app/assets/javascripts/discourse/views/actions_history_view.js
+++ b/app/assets/javascripts/discourse/views/actions_history_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.ActionsHistoryView = Em.View.extend(Discourse.Presence, {
+  window.Discourse.ActionsHistoryView = Discourse.View.extend({
     tagName: 'section',
     classNameBindings: [':post-actions', 'hidden'],
     hidden: (function() {
diff --git a/app/assets/javascripts/discourse/views/application_view.js b/app/assets/javascripts/discourse/views/application_view.js
index 55a162128..cb4317bf0 100644
--- a/app/assets/javascripts/discourse/views/application_view.js
+++ b/app/assets/javascripts/discourse/views/application_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.ApplicationView = Ember.View.extend({
+  window.Discourse.ApplicationView = Discourse.View.extend({
     templateName: 'application'
   });
 
diff --git a/app/assets/javascripts/discourse/views/auto_sized_text_view.js b/app/assets/javascripts/discourse/views/auto_sized_text_view.js
index c9d69570f..5ea8e255c 100644
--- a/app/assets/javascripts/discourse/views/auto_sized_text_view.js
+++ b/app/assets/javascripts/discourse/views/auto_sized_text_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  Discourse.AutoSizedTextView = Ember.View.extend({
+  Discourse.AutoSizedTextView = Discourse.View.extend({
     render: function(buffer) {
       return null;
     },
diff --git a/app/assets/javascripts/discourse/views/button_view.js b/app/assets/javascripts/discourse/views/button_view.js
index e318d7c7c..6340b6ae5 100644
--- a/app/assets/javascripts/discourse/views/button_view.js
+++ b/app/assets/javascripts/discourse/views/button_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  Discourse.ButtonView = Ember.View.extend(Discourse.Presence, {
+  Discourse.ButtonView = Discourse.View.extend({
     tagName: 'button',
     classNameBindings: [':btn', ':standard', 'dropDownToggle'],
     attributeBindings: ['data-not-implemented', 'title', 'data-toggle', 'data-share-url'],
diff --git a/app/assets/javascripts/discourse/views/combobox_view.js b/app/assets/javascripts/discourse/views/combobox_view.js
index 3bc9a2b0f..8a22a8113 100644
--- a/app/assets/javascripts/discourse/views/combobox_view.js
+++ b/app/assets/javascripts/discourse/views/combobox_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  Discourse.ComboboxView = window.Ember.View.extend({
+  Discourse.ComboboxView = Discourse.View.extend({
     tagName: 'select',
     classNames: ['combobox'],
     valueAttribute: 'id',
diff --git a/app/assets/javascripts/discourse/views/composer_view.js b/app/assets/javascripts/discourse/views/composer_view.js
index 8de0bd114..a5473c717 100644
--- a/app/assets/javascripts/discourse/views/composer_view.js
+++ b/app/assets/javascripts/discourse/views/composer_view.js
@@ -1,7 +1,7 @@
 /*global Markdown:true assetPath:true */
 (function() {
 
-  window.Discourse.ComposerView = window.Discourse.View.extend({
+  window.Discourse.ComposerView = Discourse.View.extend({
     templateName: 'composer',
     elementId: 'reply-control',
     classNameBindings: ['content.creatingPrivateMessage:private-message', 
diff --git a/app/assets/javascripts/discourse/views/dropdown_button_view.js b/app/assets/javascripts/discourse/views/dropdown_button_view.js
index 48a15c373..65dd614b8 100644
--- a/app/assets/javascripts/discourse/views/dropdown_button_view.js
+++ b/app/assets/javascripts/discourse/views/dropdown_button_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  Discourse.DropdownButtonView = Ember.View.extend(Discourse.Presence, {
+  Discourse.DropdownButtonView = Discourse.View.extend({
     classNames: ['btn-group'],
     attributeBindings: ['data-not-implemented'],
     didInsertElement: function(e) {
diff --git a/app/assets/javascripts/discourse/views/embedded_post_view.js b/app/assets/javascripts/discourse/views/embedded_post_view.js
index f15811396..14b9a4347 100644
--- a/app/assets/javascripts/discourse/views/embedded_post_view.js
+++ b/app/assets/javascripts/discourse/views/embedded_post_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.EmbeddedPostView = Ember.View.extend({
+  window.Discourse.EmbeddedPostView = Discourse.View.extend({
     templateName: 'embedded_post',
     classNames: ['reply'],
     didInsertElement: function() {
diff --git a/app/assets/javascripts/discourse/views/excerpt/excerpt_category_view.js b/app/assets/javascripts/discourse/views/excerpt/excerpt_category_view.js
index 70a7037b6..dde4dc884 100644
--- a/app/assets/javascripts/discourse/views/excerpt/excerpt_category_view.js
+++ b/app/assets/javascripts/discourse/views/excerpt/excerpt_category_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.ExcerptCategoryView = Ember.View.extend({
+  window.Discourse.ExcerptCategoryView = Discourse.View.extend({
     editCategory: function() {
       var cat, _ref;
       this.get('parentView').close();
diff --git a/app/assets/javascripts/discourse/views/excerpt/excerpt_post_view.js b/app/assets/javascripts/discourse/views/excerpt/excerpt_post_view.js
index de30e56d7..b82473096 100644
--- a/app/assets/javascripts/discourse/views/excerpt/excerpt_post_view.js
+++ b/app/assets/javascripts/discourse/views/excerpt/excerpt_post_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.ExcerptPostView = Ember.View.extend({
+  window.Discourse.ExcerptPostView = Discourse.View.extend({
     mute: function() {
       return this.update(true);
     },
diff --git a/app/assets/javascripts/discourse/views/excerpt/excerpt_user_view.js b/app/assets/javascripts/discourse/views/excerpt/excerpt_user_view.js
index 464c78e75..02a1a52c5 100644
--- a/app/assets/javascripts/discourse/views/excerpt/excerpt_user_view.js
+++ b/app/assets/javascripts/discourse/views/excerpt/excerpt_user_view.js
@@ -1,10 +1,10 @@
 (function() {
 
-  window.Discourse.ExcerptUserView = Ember.View.extend({
+  window.Discourse.ExcerptUserView = Discourse.View.extend({
     privateMessage: function(e) {
       var $target, composerController, post, postView, url, username;
       $target = this.get("link");
-      postView = Ember.View.views[$target.closest('.ember-view')[0].id];
+      postView = Discourse.View.views[$target.closest('.ember-view')[0].id];
       post = postView.get("post");
       url = post.get("url");
       username = post.get("username");
diff --git a/app/assets/javascripts/discourse/views/featured_threads_view.js b/app/assets/javascripts/discourse/views/featured_threads_view.js
index e841e60de..94eaeeba4 100644
--- a/app/assets/javascripts/discourse/views/featured_threads_view.js
+++ b/app/assets/javascripts/discourse/views/featured_threads_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.FeaturedTopicsView = Ember.View.extend({
+  window.Discourse.FeaturedTopicsView = Discourse.View.extend({
     templateName: 'featured_topics',
     classNames: ['category-list-item'],
     init: function() {
diff --git a/app/assets/javascripts/discourse/views/featured_topics_view.js b/app/assets/javascripts/discourse/views/featured_topics_view.js
index 8761e08f7..2f845ca58 100644
--- a/app/assets/javascripts/discourse/views/featured_topics_view.js
+++ b/app/assets/javascripts/discourse/views/featured_topics_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.FeaturedTopicsView = Ember.View.extend({
+  window.Discourse.FeaturedTopicsView = Discourse.View.extend({
     templateName: 'featured_topics',
     classNames: ['category-list-item']
   });
diff --git a/app/assets/javascripts/discourse/views/header_view.js b/app/assets/javascripts/discourse/views/header_view.js
index f497ab2c2..beb5a1b0c 100644
--- a/app/assets/javascripts/discourse/views/header_view.js
+++ b/app/assets/javascripts/discourse/views/header_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.HeaderView = Ember.View.extend({
+  window.Discourse.HeaderView = Discourse.View.extend({
     tagName: 'header',
     classNames: ['d-header', 'clearfix'],
     classNameBindings: ['editingTopic'],
diff --git a/app/assets/javascripts/discourse/views/history_view.js b/app/assets/javascripts/discourse/views/history_view.js
index 74b858399..ac8d4a731 100644
--- a/app/assets/javascripts/discourse/views/history_view.js
+++ b/app/assets/javascripts/discourse/views/history_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.HistoryView = Ember.View.extend({
+  window.Discourse.HistoryView = Discourse.View.extend({
     templateName: 'history',
     title: 'History',
     modalClass: 'history-modal',
diff --git a/app/assets/javascripts/discourse/views/image_selector.js b/app/assets/javascripts/discourse/views/image_selector.js
index 6490c0593..0a2f31cfd 100644
--- a/app/assets/javascripts/discourse/views/image_selector.js
+++ b/app/assets/javascripts/discourse/views/image_selector.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.ImageSelectorView = Ember.View.extend({
+  window.Discourse.ImageSelectorView = Discourse.View.extend({
     templateName: 'image_selector',
     classNames: ['image-selector'],
     title: 'Insert Image',
diff --git a/app/assets/javascripts/discourse/views/input_tip_view.js b/app/assets/javascripts/discourse/views/input_tip_view.js
index d41756a15..32a01905d 100644
--- a/app/assets/javascripts/discourse/views/input_tip_view.js
+++ b/app/assets/javascripts/discourse/views/input_tip_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  Discourse.InputTipView = Ember.View.extend(Discourse.Presence, {
+  Discourse.InputTipView = Discourse.View.extend({
     templateName: 'input_tip',
     classNameBindings: [':tip', 'good', 'bad'],
     good: (function() {
diff --git a/app/assets/javascripts/discourse/views/list/list_categories_view.js b/app/assets/javascripts/discourse/views/list/list_categories_view.js
index f8a2fb430..92ec774b6 100644
--- a/app/assets/javascripts/discourse/views/list/list_categories_view.js
+++ b/app/assets/javascripts/discourse/views/list/list_categories_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.ListCategoriesView = Ember.View.extend({
+  window.Discourse.ListCategoriesView = Discourse.View.extend({
     templateName: 'list/categories',
     didInsertElement: function() {
       return Discourse.set('title', Em.String.i18n("category.list"));
diff --git a/app/assets/javascripts/discourse/views/list/list_topics_view.js b/app/assets/javascripts/discourse/views/list/list_topics_view.js
index 2e5cdd7a3..280f09420 100644
--- a/app/assets/javascripts/discourse/views/list/list_topics_view.js
+++ b/app/assets/javascripts/discourse/views/list/list_topics_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.ListTopicsView = Ember.View.extend(Discourse.Scrolling, Discourse.Presence, {
+  window.Discourse.ListTopicsView = Discourse.View.extend(Discourse.Scrolling, {
     templateName: 'list/topics',
     categoryBinding: 'Discourse.router.listController.category',
     filterModeBinding: 'Discourse.router.listController.filterMode',
diff --git a/app/assets/javascripts/discourse/views/list/list_view.js b/app/assets/javascripts/discourse/views/list/list_view.js
index 77aa94656..68c0deb8e 100644
--- a/app/assets/javascripts/discourse/views/list/list_view.js
+++ b/app/assets/javascripts/discourse/views/list/list_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.ListView = Ember.View.extend({
+  window.Discourse.ListView = Discourse.View.extend({
     templateName: 'list/list',
     composeViewBinding: Ember.Binding.oneWay('Discourse.composeView'),
     categoriesBinding: 'Discourse.site.categories',
diff --git a/app/assets/javascripts/discourse/views/list/topic_list_item_view.js b/app/assets/javascripts/discourse/views/list/topic_list_item_view.js
index e2bfd00bd..59b714e10 100644
--- a/app/assets/javascripts/discourse/views/list/topic_list_item_view.js
+++ b/app/assets/javascripts/discourse/views/list/topic_list_item_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.TopicListItemView = Ember.View.extend({
+  window.Discourse.TopicListItemView = Discourse.View.extend({
     tagName: 'tr',
     templateName: 'list/topic_list_item',
     classNameBindings: ['content.archived', ':topic-list-item'],
diff --git a/app/assets/javascripts/discourse/views/modal/create_account_view.js b/app/assets/javascripts/discourse/views/modal/create_account_view.js
index e276bd9ca..5a80c5d41 100644
--- a/app/assets/javascripts/discourse/views/modal/create_account_view.js
+++ b/app/assets/javascripts/discourse/views/modal/create_account_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.CreateAccountView = window.Discourse.ModalBodyView.extend(Discourse.Presence, {
+  window.Discourse.CreateAccountView = Discourse.ModalBodyView.extend({
     templateName: 'modal/create_account',
     title: Em.String.i18n('create_account.title'),
     uniqueUsernameValidation: null,
diff --git a/app/assets/javascripts/discourse/views/modal/forgot_password_view.js b/app/assets/javascripts/discourse/views/modal/forgot_password_view.js
index 5c37111ea..51a8cadbd 100644
--- a/app/assets/javascripts/discourse/views/modal/forgot_password_view.js
+++ b/app/assets/javascripts/discourse/views/modal/forgot_password_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.ForgotPasswordView = window.Discourse.ModalBodyView.extend(Discourse.Presence, {
+  window.Discourse.ForgotPasswordView = Discourse.ModalBodyView.extend({
     templateName: 'modal/forgot_password',
     title: Em.String.i18n('forgot_password.title'),
     /* You need a value in the field to submit it.
diff --git a/app/assets/javascripts/discourse/views/modal/invite_modal_view.js b/app/assets/javascripts/discourse/views/modal/invite_modal_view.js
index de335afc0..31f07fc7f 100644
--- a/app/assets/javascripts/discourse/views/modal/invite_modal_view.js
+++ b/app/assets/javascripts/discourse/views/modal/invite_modal_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.InviteModalView = window.Discourse.ModalBodyView.extend(Discourse.Presence, {
+  window.Discourse.InviteModalView = Discourse.ModalBodyView.extend({
     templateName: 'modal/invite',
     title: Em.String.i18n('topic.invite_reply.title'),
     email: null,
diff --git a/app/assets/javascripts/discourse/views/modal/invite_private_modal_view.js b/app/assets/javascripts/discourse/views/modal/invite_private_modal_view.js
index 8cae7915f..e00195bb9 100644
--- a/app/assets/javascripts/discourse/views/modal/invite_private_modal_view.js
+++ b/app/assets/javascripts/discourse/views/modal/invite_private_modal_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.InvitePrivateModalView = window.Discourse.ModalBodyView.extend(Discourse.Presence, {
+  window.Discourse.InvitePrivateModalView = Discourse.ModalBodyView.extend({
     templateName: 'modal/invite_private',
     title: Em.String.i18n('topic.invite_private.title'),
     email: null,
diff --git a/app/assets/javascripts/discourse/views/modal/login_view.js b/app/assets/javascripts/discourse/views/modal/login_view.js
index 73383dbd7..c655853dc 100644
--- a/app/assets/javascripts/discourse/views/modal/login_view.js
+++ b/app/assets/javascripts/discourse/views/modal/login_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.LoginView = window.Discourse.ModalBodyView.extend(Discourse.Presence, {
+  window.Discourse.LoginView = Discourse.ModalBodyView.extend({
     templateName: 'modal/login',
     siteBinding: 'Discourse.site',
     title: Em.String.i18n('login.title'),
diff --git a/app/assets/javascripts/discourse/views/modal/modal_body_view.js b/app/assets/javascripts/discourse/views/modal/modal_body_view.js
index 3bd7079f5..86d9ff6f3 100644
--- a/app/assets/javascripts/discourse/views/modal/modal_body_view.js
+++ b/app/assets/javascripts/discourse/views/modal/modal_body_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.ModalBodyView = window.Discourse.View.extend({
+  window.Discourse.ModalBodyView = Discourse.View.extend({
     // Focus on first element
     didInsertElement: function() {
       var _this = this;
diff --git a/app/assets/javascripts/discourse/views/modal/move_selected_view.js b/app/assets/javascripts/discourse/views/modal/move_selected_view.js
index 61ff11e0e..409759a72 100644
--- a/app/assets/javascripts/discourse/views/modal/move_selected_view.js
+++ b/app/assets/javascripts/discourse/views/modal/move_selected_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.MoveSelectedView = window.Discourse.ModalBodyView.extend(Discourse.Presence, {
+  window.Discourse.MoveSelectedView = Discourse.ModalBodyView.extend({
     templateName: 'modal/move_selected',
     title: Em.String.i18n('topic.move_selected.title'),
     saving: false,
diff --git a/app/assets/javascripts/discourse/views/modal/option_boolean_view.js b/app/assets/javascripts/discourse/views/modal/option_boolean_view.js
index de375d07d..ebc001bc2 100644
--- a/app/assets/javascripts/discourse/views/modal/option_boolean_view.js
+++ b/app/assets/javascripts/discourse/views/modal/option_boolean_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.OptionBooleanView = Em.View.extend({
+  window.Discourse.OptionBooleanView = Discourse.View.extend({
     classNames: ['archetype-option'],
     composerControllerBinding: 'Discourse.router.composerController',
     templateName: "modal/option_boolean",
diff --git a/app/assets/javascripts/discourse/views/nav_item_view.js b/app/assets/javascripts/discourse/views/nav_item_view.js
index e2e90244d..a19c35afc 100644
--- a/app/assets/javascripts/discourse/views/nav_item_view.js
+++ b/app/assets/javascripts/discourse/views/nav_item_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.NavItemView = Ember.View.extend({
+  window.Discourse.NavItemView = Discourse.View.extend({
     tagName: 'li',
     classNameBindings: ['isActive', 'content.hasIcon:has-icon'],
     attributeBindings: ['title'],
diff --git a/app/assets/javascripts/discourse/views/notifications_view.js b/app/assets/javascripts/discourse/views/notifications_view.js
index b150a2a23..2754f0505 100644
--- a/app/assets/javascripts/discourse/views/notifications_view.js
+++ b/app/assets/javascripts/discourse/views/notifications_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.NotificationsView = Ember.View.extend({
+  window.Discourse.NotificationsView = Discourse.View.extend({
     classNameBindings: ['content.read', ':notifications'],
     templateName: 'notifications'
   });
diff --git a/app/assets/javascripts/discourse/views/participant_view.js b/app/assets/javascripts/discourse/views/participant_view.js
index a72d3779a..655201d09 100644
--- a/app/assets/javascripts/discourse/views/participant_view.js
+++ b/app/assets/javascripts/discourse/views/participant_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.ParticipantView = Ember.View.extend({
+  window.Discourse.ParticipantView = Discourse.View.extend({
     templateName: 'participant',
     toggled: (function() {
       return this.get('controller.userFilters').contains(this.get('participant.username'));
diff --git a/app/assets/javascripts/discourse/views/post_link_view.js b/app/assets/javascripts/discourse/views/post_link_view.js
index cfe1b135d..a4090f6bf 100644
--- a/app/assets/javascripts/discourse/views/post_link_view.js
+++ b/app/assets/javascripts/discourse/views/post_link_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.PostLinkView = Ember.View.extend({
+  window.Discourse.PostLinkView = Discourse.View.extend({
     tagName: 'li',
     classNameBindings: ['direction'],
     direction: (function() {
diff --git a/app/assets/javascripts/discourse/views/post_menu_view.js b/app/assets/javascripts/discourse/views/post_menu_view.js
index 7221106e6..8e41e6c78 100644
--- a/app/assets/javascripts/discourse/views/post_menu_view.js
+++ b/app/assets/javascripts/discourse/views/post_menu_view.js
@@ -13,7 +13,7 @@
 
 (function() {
 
-  window.Discourse.PostMenuView = Ember.View.extend(Discourse.Presence, {
+  window.Discourse.PostMenuView = Discourse.View.extend({
     tagName: 'section',
     classNames: ['post-menu-area', 'clearfix'],
     /* Delegate to render#{button}
diff --git a/app/assets/javascripts/discourse/views/post_view.js b/app/assets/javascripts/discourse/views/post_view.js
index 3b7c81168..6e23cf6e3 100644
--- a/app/assets/javascripts/discourse/views/post_view.js
+++ b/app/assets/javascripts/discourse/views/post_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.PostView = Ember.View.extend({
+  window.Discourse.PostView = Discourse.View.extend({
     classNames: ['topic-post', 'clearfix'],
     templateName: 'post',
     classNameBindings: ['lastPostClass', 'postTypeClass', 'selectedClass', 'post.hidden:hidden', 'isDeleted:deleted', 'parentPost:replies-above'],
diff --git a/app/assets/javascripts/discourse/views/search/search_view.js b/app/assets/javascripts/discourse/views/search/search_view.js
index 93b4de1b9..12f5b4702 100644
--- a/app/assets/javascripts/discourse/views/search/search_view.js
+++ b/app/assets/javascripts/discourse/views/search/search_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.SearchView = Ember.View.extend(Discourse.Presence, {
+  window.Discourse.SearchView = Discourse.View.extend({
     tagName: 'div',
     classNames: ['d-dropdown'],
     elementId: 'search-dropdown',
diff --git a/app/assets/javascripts/discourse/views/selected_posts_view.js b/app/assets/javascripts/discourse/views/selected_posts_view.js
index 888b1b34f..ea2de1a55 100644
--- a/app/assets/javascripts/discourse/views/selected_posts_view.js
+++ b/app/assets/javascripts/discourse/views/selected_posts_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.SelectedPostsView = Ember.View.extend({
+  window.Discourse.SelectedPostsView = Discourse.View.extend({
     elementId: 'selected-posts',
     templateName: 'selected_posts',
     topicBinding: 'controller.content',
diff --git a/app/assets/javascripts/discourse/views/suggested_topic_view.js b/app/assets/javascripts/discourse/views/suggested_topic_view.js
index 702b7543d..9f9333780 100644
--- a/app/assets/javascripts/discourse/views/suggested_topic_view.js
+++ b/app/assets/javascripts/discourse/views/suggested_topic_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  Discourse.SuggestedTopicView = Ember.View.extend({
+  Discourse.SuggestedTopicView = Discourse.View.extend({
     templateName: 'suggested_topic'
   });
 
diff --git a/app/assets/javascripts/discourse/views/topic_admin_menu_view.js b/app/assets/javascripts/discourse/views/topic_admin_menu_view.js
index b3963c6ba..055fdd77d 100644
--- a/app/assets/javascripts/discourse/views/topic_admin_menu_view.js
+++ b/app/assets/javascripts/discourse/views/topic_admin_menu_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.TopicAdminMenuView = Em.View.extend({
+  window.Discourse.TopicAdminMenuView = Discourse.View.extend({
     willDestroyElement: function() {
       return jQuery('html').off('mouseup.discourse-topic-admin-menu');
     },
diff --git a/app/assets/javascripts/discourse/views/topic_summary/topic_links_view.js b/app/assets/javascripts/discourse/views/topic_summary/topic_links_view.js
index 638f72aae..6d9e4e08d 100644
--- a/app/assets/javascripts/discourse/views/topic_summary/topic_links_view.js
+++ b/app/assets/javascripts/discourse/views/topic_summary/topic_links_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.TopicLinksView = Ember.View.extend({
+  window.Discourse.TopicLinksView = Discourse.View.extend({
     templateName: 'topic_summary/links'
   });
 
diff --git a/app/assets/javascripts/discourse/views/topic_summary/topic_summary_view.js b/app/assets/javascripts/discourse/views/topic_summary/topic_summary_view.js
index 5115f790a..05d0f6215 100644
--- a/app/assets/javascripts/discourse/views/topic_summary/topic_summary_view.js
+++ b/app/assets/javascripts/discourse/views/topic_summary/topic_summary_view.js
@@ -66,7 +66,7 @@
       /* If we have a best of view
       */
       if (this.get('controller.showBestOf')) {
-        container.pushObject(Discourse.View.create({
+        container.pushObject(Em.View.create({
           templateName: 'topic_summary/best_of_toggle',
           tagName: 'section',
           classNames: ['information']
@@ -76,7 +76,7 @@
       */
 
       if (this.get('topic.isPrivateMessage')) {
-        return container.pushObject(Discourse.View.create({
+        return container.pushObject(Em.View.create({
           templateName: 'topic_summary/private_message',
           tagName: 'section',
           classNames: ['information']
diff --git a/app/assets/javascripts/discourse/views/topic_view.js b/app/assets/javascripts/discourse/views/topic_view.js
index f7e93d073..75acd9cd2 100644
--- a/app/assets/javascripts/discourse/views/topic_view.js
+++ b/app/assets/javascripts/discourse/views/topic_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.TopicView = Ember.View.extend(Discourse.Scrolling, {
+  window.Discourse.TopicView = Discourse.View.extend(Discourse.Scrolling, {
     templateName: 'topic',
     topicBinding: 'controller.content',
     userFiltersBinding: 'controller.userFilters',
diff --git a/app/assets/javascripts/discourse/views/user/activity_filter_view.js b/app/assets/javascripts/discourse/views/user/activity_filter_view.js
index 8711f582b..0bc19f99a 100644
--- a/app/assets/javascripts/discourse/views/user/activity_filter_view.js
+++ b/app/assets/javascripts/discourse/views/user/activity_filter_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.ActivityFilterView = Em.View.extend(Discourse.Presence, {
+  window.Discourse.ActivityFilterView = Discourse.View.extend({
     tagName: 'li',
     classNameBindings: ['active'],
     active: (function() {
diff --git a/app/assets/javascripts/discourse/views/user/preferences_email_view.js b/app/assets/javascripts/discourse/views/user/preferences_email_view.js
index 083f23eb8..a37a4f02c 100644
--- a/app/assets/javascripts/discourse/views/user/preferences_email_view.js
+++ b/app/assets/javascripts/discourse/views/user/preferences_email_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.PreferencesEmailView = Ember.View.extend({
+  window.Discourse.PreferencesEmailView = Discourse.View.extend({
     templateName: 'user/email',
     classNames: ['user-preferences'],
     didInsertElement: function() {
diff --git a/app/assets/javascripts/discourse/views/user/preferences_username_view.js b/app/assets/javascripts/discourse/views/user/preferences_username_view.js
index ae494609d..6b346f61f 100644
--- a/app/assets/javascripts/discourse/views/user/preferences_username_view.js
+++ b/app/assets/javascripts/discourse/views/user/preferences_username_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.PreferencesUsernameView = Ember.View.extend({
+  window.Discourse.PreferencesUsernameView = Discourse.View.extend({
     templateName: 'user/username',
     classNames: ['user-preferences'],
     didInsertElement: function() {
diff --git a/app/assets/javascripts/discourse/views/user/preferences_view.js b/app/assets/javascripts/discourse/views/user/preferences_view.js
index c85629897..def30f381 100644
--- a/app/assets/javascripts/discourse/views/user/preferences_view.js
+++ b/app/assets/javascripts/discourse/views/user/preferences_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.PreferencesView = Ember.View.extend({
+  window.Discourse.PreferencesView = Discourse.View.extend({
     templateName: 'user/preferences',
     classNames: ['user-preferences']
   });
diff --git a/app/assets/javascripts/discourse/views/user/user_activity_view.js b/app/assets/javascripts/discourse/views/user/user_activity_view.js
index e6a43d2b6..d36f02796 100644
--- a/app/assets/javascripts/discourse/views/user/user_activity_view.js
+++ b/app/assets/javascripts/discourse/views/user/user_activity_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.UserActivityView = Ember.View.extend({
+  window.Discourse.UserActivityView = Discourse.View.extend({
     templateName: 'user/activity',
     currentUserBinding: 'Discourse.currentUser',
     userBinding: 'controller.content',
diff --git a/app/assets/javascripts/discourse/views/user/user_invited_view.js b/app/assets/javascripts/discourse/views/user/user_invited_view.js
index eaa6f3d3c..30988c99b 100644
--- a/app/assets/javascripts/discourse/views/user/user_invited_view.js
+++ b/app/assets/javascripts/discourse/views/user/user_invited_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.UserInvitedView = Ember.View.extend({
+  window.Discourse.UserInvitedView = Discourse.View.extend({
     templateName: 'user/invited'
   });
 
diff --git a/app/assets/javascripts/discourse/views/user/user_private_messages_view.js b/app/assets/javascripts/discourse/views/user/user_private_messages_view.js
index 6d86f8894..db30faee5 100644
--- a/app/assets/javascripts/discourse/views/user/user_private_messages_view.js
+++ b/app/assets/javascripts/discourse/views/user/user_private_messages_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.UserPrivateMessagesView = Ember.View.extend({
+  window.Discourse.UserPrivateMessagesView = Discourse.View.extend({
     templateName: 'user/private_messages',
     selectCurrent: function(evt) {
       var t;
diff --git a/app/assets/javascripts/discourse/views/user/user_stream_view.js b/app/assets/javascripts/discourse/views/user/user_stream_view.js
index f8e309e00..19607ed4c 100644
--- a/app/assets/javascripts/discourse/views/user/user_stream_view.js
+++ b/app/assets/javascripts/discourse/views/user/user_stream_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.UserStreamView = Ember.View.extend(Discourse.Scrolling, {
+  window.Discourse.UserStreamView = Discourse.View.extend(Discourse.Scrolling, {
     templateName: 'user/stream',
     currentUserBinding: 'Discourse.currentUser',
     userBinding: 'controller.content',
diff --git a/app/assets/javascripts/discourse/views/user/user_view.js b/app/assets/javascripts/discourse/views/user/user_view.js
index 484d5d993..57a9aa7bb 100644
--- a/app/assets/javascripts/discourse/views/user/user_view.js
+++ b/app/assets/javascripts/discourse/views/user/user_view.js
@@ -1,6 +1,6 @@
 (function() {
 
-  window.Discourse.UserView = Ember.View.extend({
+  window.Discourse.UserView = Discourse.View.extend({
     templateName: 'user/user',
     userBinding: 'controller.content',
     updateTitle: (function() {
diff --git a/app/assets/javascripts/discourse/views/view.js b/app/assets/javascripts/discourse/views/view.js
index 5731ef99c..c6af2afb1 100644
--- a/app/assets/javascripts/discourse/views/view.js
+++ b/app/assets/javascripts/discourse/views/view.js
@@ -1,13 +1,16 @@
 (function() {
 
-  window.Discourse.View = Ember.View.extend(Discourse.Presence, {
-    /* Overwrite this to do a different display
-    */
+  /**
+    A base view that gives us common functionality, for example `present` and `blank`
 
-    displayErrors: function(errors, callback) {
-      alert(errors.join("\n"));
-      return typeof callback === "function" ? callback() : void 0;
-    }
+    @class View
+    @extends Ember.View
+    @uses Discourse.Presence
+    @namespace Discourse
+    @module Discourse
+  **/ 
+  window.Discourse.View = Ember.View.extend(Discourse.Presence, {
+    
   });
 
 }).call(this);
diff --git a/spec/javascripts/spec.js b/spec/javascripts/spec.js
index bf5b6286a..83c82a970 100644
--- a/spec/javascripts/spec.js
+++ b/spec/javascripts/spec.js
@@ -26,7 +26,6 @@
 // Stuff we need to load first
 //= require_tree ../../app/assets/javascripts/discourse/mixins
 //= require ../../app/assets/javascripts/discourse/components/debounce
-//= require ../../app/assets/javascripts/discourse/views/view
 //= require ../../app/assets/javascripts/discourse/controllers/controller
 //= require ../../app/assets/javascripts/discourse/views/modal/modal_body_view
 //= require ../../app/assets/javascripts/discourse/models/model